# REQUIRES: riscv # RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t.o # RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=RELOC %s # RUN: ld.lld -e absolute %t.o -o %t # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefixes=CHECK,PC %s # RUN: llvm-readelf -x .data %t | FileCheck --check-prefixes=HEX %s # RUN: ld.lld -e absolute %t.o -o %t --export-dynamic # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefixes=CHECK,PLT %s # RUN: llvm-readelf -x .data %t | FileCheck --check-prefixes=HEX %s .weak target .global absolute, relative, branch ## Absolute relocations are resolved to 0. # RELOC: 0x0 R_RISCV_HI20 target 0x1 # RELOC-NEXT: 0x4 R_RISCV_LO12_I target 0x1 # CHECK-LABEL: : # CHECK-NEXT: lui t0, 0 # CHECK-NEXT: addi t0, t0, 1 absolute: lui t0, %hi(target+1) addi t0, t0, %lo(target+1) ## Currently, PC-relative relocations are resolved to 0. # RELOC-NEXT: 0x8 R_RISCV_PCREL_HI20 target 0x0 # RELOC-NEXT: 0xC R_RISCV_PCREL_LO12_I .Lpcrel_hi0 0x0 # RELOC-NEXT: 0x10 R_RISCV_PCREL_HI20 target 0x2 # RELOC-NEXT: 0x14 R_RISCV_PCREL_LO12_S .Lpcrel_hi1 0x0 ## 1048559 should be -0x11. # CHECK-LABEL: : # CHECK-NEXT: 11{{...}}: auipc a1, 1048559 # PC-NEXT: addi a1, a1, -352 # PLT-NEXT: addi a1, a1, -792 # CHECK-LABEL: <.Lpcrel_hi1>: # CHECK-NEXT: 11{{...}}: auipc t1, 1048559 # PC-NEXT: sd a2, -358(t1) # PLT-NEXT: sd a2, -798(t1) relative: la a1, target sd a2, target+2, t1 ## Branch relocations ## If .dynsym does not exist, an undefined weak symbol is non-preemptible. ## Treat them as PC relative relocations. # RELOC: 0x18 R_RISCV_CALL target 0x0 # RELOC-NEXT: 0x20 R_RISCV_JAL target 0x0 # PC-LABEL: : # PC-NEXT: auipc ra, 1048559 # PC-NEXT: jalr -368(ra) # PC-NEXT: j 0x0 ## If .dynsym exists, an undefined weak symbol is preemptible. ## We create a PLT entry and redirect the reference to it. # PLT-LABEL: : # PLT-NEXT: auipc ra, 0 # PLT-NEXT: jalr 56(ra) # PLT-NEXT: j 0x0 branch: call target jal x0, target ## Absolute relocations are resolved to 0. # RELOC: 0x0 R_RISCV_64 target 0x3 # RELOC-NEXT: 0x8 R_RISCV_32 target 0x4 # HEX: section '.data': # HEX-NEXT: 03000000 00000000 04000000 .data .p2align 3 .quad target+3 .long target+4 # PC-NOT: .plt: # PLT: .plt: