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 @@ -76,7 +76,8 @@ } bool isExternalBranchEdge(Edge &E) const { - return E.getKind() == R_RISCV_CALL_PLT; + return (E.getKind() == R_RISCV_CALL || E.getKind() == R_RISCV_CALL_PLT) && + E.hasTarget() && E.getTarget().isExternal(); } private: diff --git a/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_pc_indirect.s b/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_pc_indirect.s --- a/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_pc_indirect.s +++ b/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_pc_indirect.s @@ -5,11 +5,11 @@ # RUN: -o %t/elf_riscv32_sm_pic_reloc.o %s # RUN: llvm-jitlink -noexec \ # RUN: -slab-allocate 100Kb -slab-address 0x1ff00000 -slab-page-size 4096 \ -# RUN: -abs external_func=0x1 -abs external_data=0x2 \ +# RUN: -abs external_data=0x2 \ # RUN: -check %s %t/elf_riscv64_sm_pic_reloc.o # RUN: llvm-jitlink -noexec \ # RUN: -slab-allocate 100Kb -slab-address 0x1ff00000 -slab-page-size 4096 \ -# RUN: -abs external_func=0x1 -abs external_data=0x2 \ +# RUN: -abs external_data=0x2 \ # RUN: -check %s %t/elf_riscv32_sm_pic_reloc.o # # Test ELF small/PIC relocations @@ -51,14 +51,34 @@ .size test_pcrel32_s, .-test_pcrel32_s # Test R_RISCV_CALL -# jitlink-check: decode_operand(test_call, 1) = ((external_func - test_call) + 0x800)[31:12] -# jitlink-check: decode_operand(test_call+4, 2)[11:0] = (external_func - test_call)[11:0] - .globl test_call, external_func +# jitlink-check: decode_operand(test_call, 1) = ((internal_func - test_call) + 0x800)[31:12] +# jitlink-check: decode_operand(test_call+4, 2)[11:0] = (internal_func - test_call)[11:0] + .globl test_call .p2align 1 .type test_call,@function test_call: - .reloc ., R_RISCV_CALL, external_func + .reloc ., R_RISCV_CALL, internal_func auipc ra, 0 jalr ra ret .size test_call, .-test_call + +# Test R_RISCV_CALL_PLT +# jitlink-check: decode_operand(test_call_plt, 1) = ((internal_func - test_call_plt) + 0x800)[31:12] +# jitlink-check: decode_operand(test_call_plt+4, 2)[11:0] = (internal_func - test_call_plt)[11:0] + .globl test_call_plt + .p2align 1 + .type test_call_plt,@function +test_call_plt: + .reloc ., R_RISCV_CALL_PLT, internal_func + auipc ra, 0 + jalr ra + ret + .size test_call_plt, .-test_call_plt + + .globl internal_func + .p2align 1 + .type internal_func,@function +internal_func: + ret + .size internal_func, .-internal_func