diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp --- a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp @@ -70,13 +70,16 @@ } void fixPLTEdge(Edge &E, Symbol &PLTStubs) { - assert(E.getKind() == R_RISCV_CALL_PLT && "Not a R_RISCV_CALL_PLT edge?"); + assert((E.getKind() == R_RISCV_CALL || E.getKind() == R_RISCV_CALL_PLT || + E.getKind() == CallRelaxable) && + "Not a PLT edge?"); E.setKind(R_RISCV_CALL); E.setTarget(PLTStubs); } bool isExternalBranchEdge(Edge &E) const { - return (E.getKind() == R_RISCV_CALL || E.getKind() == R_RISCV_CALL_PLT) && + return (E.getKind() == R_RISCV_CALL || E.getKind() == R_RISCV_CALL_PLT || + E.getKind() == CallRelaxable) && !E.getTarget().isDefined(); } diff --git a/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_riscv64_got_plt_reloc.s b/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_riscv64_got_plt_reloc.s --- a/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_riscv64_got_plt_reloc.s +++ b/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_riscv64_got_plt_reloc.s @@ -6,6 +6,13 @@ # RUN: -abs external_func=0x1 -abs external_data=0x2 \ # RUN: -check %s %t/elf_riscv64_got_plt_reloc.o +## Run the same tests with relaxation enabled. +# RUN: llvm-mc -triple=riscv64 -position-independent -filetype=obj \ +# RUN: -mattr=+relax -o %t/elf_riscv64_got_plt_reloc.o %s +# RUN: llvm-jitlink -noexec \ +# RUN: -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 \ +# RUN: -abs external_func=0x1 -abs external_data=0x2 \ +# RUN: -check %s %t/elf_riscv64_got_plt_reloc.o .text .file "testcase.c"