Files
clang-p2996/llvm/test/MC/ELF/RISCV/subsection.s
Fangrui Song e6fed06335 [RISCV] Make linker-relaxable instructions terminate MCDataFragment
`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
2023-06-29 09:39:57 -07:00

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