`MCExpr::evaluateAsAbsolute` has a longstanding bug. When the MCAssembler is non-null and the MCAsmLayout is null, it may incorrectly fold A-B even if A and B are separated by a linker-relaxable instruction. This behavior can suppress some ADD/SUB relocations and lead to wrong results if the linker performs relaxation. To fix the bug, ensure that linker-relaxable instructions only appear at the end of an MCDataFragment, thereby making them terminate the fragment. When computing A-B, suppress folding if A and B are separated by a linker-relaxable instruction. * `.subsection` now correctly give errors for non-foldable expressions. * gen-dwarf.s will pass even if we add back the .debug_line or .eh_frame/.debug_frame code from D150004 * This will fix suppressed relocation when we add R_RISCV_SET_ULEB128/R_RISCV_SUB_ULEB128. In the future, we should investigate the desired behavior for `MCExpr::evaluateAsAbsolute` when both MCAssembler and MCAsmLayout are non-null. (Note: MCRelaxableFragment is only for assembler-relaxation. If we ever need linker-relaxable MCRelaxableFragment, we would need to adjust RISCVMCExpr.cpp (D58943/D73211).) Depends on D153096 Differential Revision: https://reviews.llvm.org/D153097
39 lines
1.5 KiB
ArmAsm
39 lines
1.5 KiB
ArmAsm
# RUN: not llvm-mc -filetype=obj -triple=riscv64 -mattr=-relax %s -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR,NORELAX --implicit-check-not=error:
|
|
# RUN: not llvm-mc -filetype=obj -triple=riscv64 -mattr=+relax %s -o /dev/null 2>&1 | FileCheck %s --check-prefixes=ERR,RELAX --implicit-check-not=error:
|
|
|
|
a:
|
|
nop
|
|
b:
|
|
call foo@plt
|
|
c:
|
|
nop
|
|
d:
|
|
|
|
.data
|
|
## Positive subsection numbers
|
|
## With relaxation, report an error as c-b is not an assemble-time constant.
|
|
# RELAX: :[[#@LINE+1]]:14: error: cannot evaluate subsection number
|
|
.subsection c-b
|
|
# RELAX: :[[#@LINE+1]]:14: error: cannot evaluate subsection number
|
|
.subsection d-b
|
|
# RELAX: :[[#@LINE+1]]:14: error: cannot evaluate subsection number
|
|
.subsection c-a
|
|
|
|
.subsection b-a
|
|
.subsection d-c
|
|
|
|
## Negative subsection numbers
|
|
# NORELAX: :[[#@LINE+2]]:14: error: subsection number -8 is not within [0,2147483647]
|
|
# RELAX: :[[#@LINE+1]]:14: error: cannot evaluate subsection number
|
|
.subsection b-c
|
|
# NORELAX: :[[#@LINE+2]]:14: error: subsection number -12 is not within [0,2147483647]
|
|
# RELAX: :[[#@LINE+1]]:14: error: cannot evaluate subsection number
|
|
.subsection b-d
|
|
# NORELAX: :[[#@LINE+2]]:14: error: subsection number -12 is not within [0,2147483647]
|
|
# RELAX: :[[#@LINE+1]]:14: error: cannot evaluate subsection number
|
|
.subsection a-c
|
|
# ERR: :[[#@LINE+1]]:14: error: subsection number -4 is not within [0,2147483647]
|
|
.subsection a-b
|
|
# ERR: :[[#@LINE+1]]:14: error: subsection number -4 is not within [0,2147483647]
|
|
.subsection c-d
|