From 26ee8947702d79ce2cab8e577f713685a5ca4a55 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Mon, 8 May 2023 10:05:46 +0200 Subject: [PATCH] [JITLink][RISCV] Only generate PLT entries for external symbols R_RISCV_CALL has been deprecated. [1] Both GCC and LLVM seem to not generate it anymore and always use R_RISCV_CALL_PLT (even for calls that do not need a PLT entry). Generating PLT entries based on relocation type is not recommended and a better heuristic is to only generate them when the target symbol is preemptable [2]. This patch implements this by only generating PLT entries for undefined symbols. [1] https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/340 [2] https://github.com/riscv-non-isa/riscv-elf-psabi-doc/issues/98 Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D149525 --- .../lib/ExecutionEngine/JITLink/ELF_riscv.cpp | 3 +- .../JITLink/RISCV/ELF_pc_indirect.s | 32 +++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp index b636e8742342..e4dfbe10b358 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp @@ -76,7 +76,8 @@ public: } 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.getTarget().isDefined(); } private: diff --git a/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_pc_indirect.s b/llvm/test/ExecutionEngine/JITLink/RISCV/ELF_pc_indirect.s index 01249005d0dd..d173e23ac204 100644 --- 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 @@ test_pcrel32_s: .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 -- 2.34.1