diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp index a556d89c36400..898e3e45b9e72 100644 --- a/lld/ELF/Arch/RISCV.cpp +++ b/lld/ELF/Arch/RISCV.cpp @@ -591,7 +591,7 @@ static void initSymbolAnchors() { // Relax R_RISCV_CALL/R_RISCV_CALL_PLT auipc+jalr to c.j, c.jal, or jal. static void relaxCall(const InputSection &sec, size_t i, uint64_t loc, Relocation &r, uint32_t &remove) { - const bool rvc = config->eflags & EF_RISCV_RVC; + const bool rvc = getEFlags(sec.file) & EF_RISCV_RVC; const Symbol &sym = *r.sym; const uint64_t insnPair = read64le(sec.content().data() + r.offset); const uint32_t rd = extractBits(insnPair, 32 + 11, 32 + 7); diff --git a/lld/test/ELF/riscv-relax-call-mixed-rvc.s b/lld/test/ELF/riscv-relax-call-mixed-rvc.s new file mode 100644 index 0000000000000..bd8bfcadb90b5 --- /dev/null +++ b/lld/test/ELF/riscv-relax-call-mixed-rvc.s @@ -0,0 +1,32 @@ +# REQUIRES: riscv +# RUN: rm -rf %t && split-file %s %t && cd %t +# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+c,+relax a.s -o a.o +# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=-c,+relax b.s -o b.o + +# RUN: ld.lld a.o b.o --shared -o a -Ttext=0x10000 +# RUN: llvm-objdump -d --no-show-raw-insn -M no-aliases a | FileCheck %s + +## This needs to be a *uncompressed* jal instruction since it came from the +## source file which does not enable C +# CHECK-LABEL: : +# CHECK-NEXT: 10000: jal zero, {{.*}} +# CHECK-NEXT: 10004: sub zero, zero, zero + +# w/ C +#--- a.s + .text + .attribute 4, 16 + .attribute 5, "rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_zicsr2p0_zifencei2p0" + +# w/o C +#--- b.s + .text + .attribute 4, 16 + .attribute 5, "rv64i2p1_m2p0_a2p1_f2p2_d2p2_zicsr2p0_zifencei2p0" + .p2align 5 + .type foo,@function +foo: + tail foo + # Pick a non-canonical nop to ensure test output can't be confused + # with riscv_align padding + sub zero, zero, zero