# RUN: llvm-mc -triple riscv32 -mattr=-relax -filetype obj %s \ # RUN: | llvm-objdump -M no-aliases -d -r - \ # RUN: | FileCheck --check-prefix NORELAX %s # RUN: llvm-mc -triple riscv32 -mattr=+relax -filetype obj %s \ # RUN: | llvm-objdump -M no-aliases -d -r - \ # RUN: | FileCheck --check-prefix RELAX %s # RUN: llvm-mc -triple riscv64 -mattr=-relax -filetype obj %s \ # RUN: | llvm-objdump -M no-aliases -d -r - \ # RUN: | FileCheck --check-prefix NORELAX %s # RUN: llvm-mc -triple riscv64 -mattr=+relax -filetype obj %s \ # RUN: | llvm-objdump -M no-aliases -d -r - \ # RUN: | FileCheck --check-prefix RELAX %s # Fixups for %pcrel_hi / %pcrel_lo can be evaluated within a section, # regardless of the fragment containing the target address, provided symbol # binding allows it. function: .Lpcrel_label1: auipc a0, %pcrel_hi(local_function) addi a1, a0, %pcrel_lo(.Lpcrel_label1) # NORELAX: auipc a0, 0 # NORELAX-NOT: R_RISCV # NORELAX: addi a1, a0, 16 # NORELAX-NOT: R_RISCV # RELAX: auipc a0, 0 # RELAX: R_RISCV_PCREL_HI20 local_function # RELAX: R_RISCV_RELAX *ABS* # RELAX: addi a1, a0, 0 # RELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label1 # RELAX: R_RISCV_RELAX *ABS* .p2align 2 # Cause a new fragment be emitted here .Lpcrel_label2: auipc a0, %pcrel_hi(local_function) addi a1, a0, %pcrel_lo(.Lpcrel_label2) # NORELAX: auipc a0, 0 # NORELAX-NOT: R_RISCV # NORELAX: addi a1, a0, 8 # NORELAX-NOT: R_RISCV # RELAX: auipc a0, 0 # RELAX: R_RISCV_PCREL_HI20 local_function # RELAX: R_RISCV_RELAX *ABS* # RELAX: addi a1, a0, 0 # RELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label2 # RELAX: R_RISCV_RELAX *ABS* .type local_function,@function local_function: ret # Check we correctly evaluate when fixups are in different fragments .Lpcrel_label3: auipc a0, %pcrel_hi(local_function) .p2align 2 # Cause a new fragment be emitted here addi a1, a0, %pcrel_lo(.Lpcrel_label3) # NORELAX: auipc a0, 0 # NORELAX-NOT: R_RISCV # NORELAX: addi a1, a0, -4 # NORELAX-NOT: R_RISCV # RELAX: auipc a0, 0 # RELAX: R_RISCV_PCREL_HI20 local_function # RELAX: R_RISCV_RELAX *ABS* # RELAX: addi a1, a0, 0 # RELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label3 # RELAX: R_RISCV_RELAX *ABS* # Check handling of symbol binding. .Lpcrel_label4: auipc a0, %pcrel_hi(global_function) addi a1, a0, %pcrel_lo(.Lpcrel_label4) # NORELAX: auipc a0, 0 # NORELAX: R_RISCV_PCREL_HI20 global_function # NORELAX: addi a1, a0, 0 # NORELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label4 # RELAX: auipc a0, 0 # RELAX: R_RISCV_PCREL_HI20 global_function # RELAX: R_RISCV_RELAX *ABS* # RELAX: addi a1, a0, 0 # RELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label4 # RELAX: R_RISCV_RELAX *ABS* .Lpcrel_label5: auipc a0, %pcrel_hi(weak_function) addi a1, a0, %pcrel_lo(.Lpcrel_label5) # NORELAX: auipc a0, 0 # NORELAX: R_RISCV_PCREL_HI20 weak_function # NORELAX: addi a1, a0, 0 # NORELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label5 # RELAX: auipc a0, 0 # RELAX: R_RISCV_PCREL_HI20 weak_function # RELAX: R_RISCV_RELAX *ABS* # RELAX: addi a1, a0, 0 # RELAX: R_RISCV_PCREL_LO12_I .Lpcrel_label5 # RELAX: R_RISCV_RELAX *ABS* .global global_function .type global_function,@function global_function: ret .weak weak_function .type weak_function,@function weak_function: ret