From f2ab75d423da56407e50227a41bd974ba5e20396 Mon Sep 17 00:00:00 2001 From: Kai Luo Date: Tue, 10 Oct 2023 12:34:27 +0800 Subject: [PATCH] Support R_PPC64_GOT_PCREL34 --- llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h | 5 +++++ llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp | 6 ++++++ llvm/lib/ExecutionEngine/JITLink/ppc64.cpp | 2 ++ .../JITLink/ppc64/ELF_ppc64_relocations.s | 15 +++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h b/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h index 88af15d61e714..6d27841bff611 100644 --- a/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h @@ -51,6 +51,7 @@ enum EdgeKind_ppc64 : Edge::Kind { TOCDelta16HI, TOCDelta16LO, TOCDelta16LODS, + RequestGOTAndTransformToDelta34, CallBranchDelta, // Need to restore r2 after the bl, suggesting the bl is followed by a nop. CallBranchDeltaRestoreTOC, @@ -170,6 +171,10 @@ class TOCTableManager : public TableManager> { // Create TOC section if TOC relocation, PLT or GOT is used. getOrCreateTOCSection(G); return false; + case RequestGOTAndTransformToDelta34: + E.setKind(ppc64::Delta34); + E.setTarget(createEntry(G, E.getTarget())); + return true; default: return false; } diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp index 5ce7a5bda8402..4818837e7cb79 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp @@ -234,6 +234,9 @@ class ELFLinkGraphBuilder_ppc64 if (ELFReloc == ELF::R_PPC64_TLSLD) return make_error("Local-dynamic TLS model is not supported", inconvertibleErrorCode()); + if (ELFReloc == ELF::R_PPC64_PCREL_OPT) + // TODO: Support PCREL optimization, now ignore it. + return Error::success(); auto ObjSymbol = Base::Obj.getRelocationSymbol(Rel, Base::SymTabSec); if (!ObjSymbol) @@ -360,6 +363,9 @@ class ELFLinkGraphBuilder_ppc64 case ELF::R_PPC64_PCREL34: Kind = ppc64::Delta34; break; + case ELF::R_PPC64_GOT_PCREL34: + Kind = ppc64::RequestGOTAndTransformToDelta34; + break; case ELF::R_PPC64_GOT_TLSGD16_HA: Kind = ppc64::RequestTLSDescInGOTAndTransformToTOCDelta16HA; break; diff --git a/llvm/lib/ExecutionEngine/JITLink/ppc64.cpp b/llvm/lib/ExecutionEngine/JITLink/ppc64.cpp index b147ffc8dac21..ac4a62a503919 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ppc64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ppc64.cpp @@ -120,6 +120,8 @@ const char *getEdgeKindName(Edge::Kind K) { return "TOCDelta16LO"; case TOCDelta16LODS: return "TOCDelta16LODS"; + case RequestGOTAndTransformToDelta34: + return "RequestGOTAndTransformToDelta34"; case CallBranchDelta: return "CallBranchDelta"; case CallBranchDeltaRestoreTOC: diff --git a/llvm/test/ExecutionEngine/JITLink/ppc64/ELF_ppc64_relocations.s b/llvm/test/ExecutionEngine/JITLink/ppc64/ELF_ppc64_relocations.s index 7e39a20ef6ab8..bcee29d1d34f6 100644 --- a/llvm/test/ExecutionEngine/JITLink/ppc64/ELF_ppc64_relocations.s +++ b/llvm/test/ExecutionEngine/JITLink/ppc64/ELF_ppc64_relocations.s @@ -8,6 +8,7 @@ # RUN: --abs external_addr14_func=0x0880 \ # RUN: --abs external_addr16_data=0x6000 \ # RUN: --abs external_addr32_data=0x36668840 \ +# RUN: --abs pcrel_external_var=0x36668860 \ # RUN: --check %s %t/elf_reloc.o # RUN: llvm-mc --triple=powerpc64-unknown-linux-gnu --filetype=obj -o \ # RUN: %t/elf_reloc.o %s @@ -18,6 +19,7 @@ # RUN: --abs external_addr14_func=0x0880 \ # RUN: --abs external_addr16_data=0x6000 \ # RUN: --abs external_addr32_data=0x36668840 \ +# RUN: --abs pcrel_external_var=0x36668860 \ # RUN: --check %s %t/elf_reloc.o # jitlink-check: section_addr(elf_reloc.o, $__GOT) + 0x8000 = __TOC__ @@ -240,6 +242,19 @@ reloc_rel16: blr .size reloc_rel16, .-reloc_rel16 +# Check R_PPC64_GOT_PCREL34 +# jitlink-check: (got_addr(elf_reloc.o, pcrel_external_var) - reloc_got_pcrel34)[33:0] = \ +# jitlink-check: ((((*{4}(reloc_got_pcrel34)) & 0x3ffff) << 16) | ((*{4}(reloc_got_pcrel34 + 4)) & 0xffff))[33:0] + .global reloc_got_pcrel34 + .p2align 4 + .type reloc_got_pcrel34,@function +reloc_got_pcrel34: + pld 3,pcrel_external_var@got@pcrel(0),1 +.Lpcrel0: + .reloc .Lpcrel0-8,R_PPC64_PCREL_OPT,.-(.Lpcrel0-8) + blr + .size reloc_got_pcrel34,.-reloc_got_pcrel34 + .type .L.str,@object .section .rodata.str1.1,"aMS",@progbits,1 .L.str: