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.
51 lines
1.6 KiB
LLVM
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" }
|