llvm-project/llvm/test/CodeGen/RISCV/option-relax-relocation.ll
Sam Elliott 4e3699b4c6
[RISCV] Mark More Relocs as Relaxable (#151422)
Since this code was last reviewed, more relaxations have been added to
the psABI for existing standard relocations that LLVM didn't have marked
as relaxable.

This change ensures that LLVM marks the following relocations (and their
respective fixups) as relaxable:
- `R_RISCV_JAL`
- `R_RISCV_GOT_HI20`
- `R_RISCV_TPREL_HI20`
- `R_RISCV_TLSDESC_HI20`

This also updates the linker relaxation test to use `-NEXT` to check all
the output lines.

There are lots more emitted relocations, not only due to JAL being
relaxable, but branches are now also marked linker relaxable because
they can be turned into `b<cc>; jal` during assembly relaxation, which
may also be marked relaxable.
2026-01-08 09:28:29 -08:00

51 lines
1.6 KiB
LLVM

; RUN: llc -mtriple=riscv64 -mattr=-relax -filetype=obj < %s \
; RUN: | llvm-objdump -d -r - | FileCheck %s --check-prefixes=CHECK,NORELAX
; RUN: llc -mtriple=riscv64 -mattr=+relax -filetype=obj < %s \
; RUN: | llvm-objdump -d -r - | FileCheck %s --check-prefixes=CHECK,RELAX
;; With +relax, All `j` instructions below need a relocation to ensure the target is correct
;; after linker relaxation. See https://github.com/ClangBuiltLinux/linux/issues/1965
; CHECK: j {{.*}}
; RELAX-NEXT: R_RISCV_JAL {{.*}}
; RELAX-NOT: R_RISCV_RELAX
; CHECK-NEXT: auipc ra, 0x0
; CHECK-NEXT: R_RISCV_CALL_PLT f
; RELAX-NEXT: R_RISCV_RELAX *ABS*
; CHECK-NEXT: jalr ra
; CHECK-NEXT: j {{.*}}
; RELAX-NEXT: R_RISCV_JAL {{.*}}
; RELAX-NOT: R_RISCV_RELAX
; CHECK-NEXT: j {{.*}}
; RELAX-NEXT: R_RISCV_JAL {{.*}}
; RELAX-NEXT: R_RISCV_RELAX *ABS*
; NORELAX-NEXT: li a0, 0x0
; RELAX-EMPTY:
define dso_local noundef signext i32 @main() local_unnamed_addr #0 {
entry:
callbr void asm sideeffect "
.option push
.option norelax
j $0
.option pop",
"!i"() to label %asm.fallthrough [label %label]
asm.fallthrough: ; preds = %entry
tail call void @f()
callbr void asm sideeffect "
.option push
.option norelax
j $0
.option pop",
"!i"() to label %asm.fallthrough [label %label]
br label %label
label: ; preds = %asm.fallthrough, %entry
ret i32 0
}
declare void @f()
attributes #0 = { nounwind "target-features"="-c,+relax" }