[llvm] 500afbd - [JITLink][ORC] Add ppc64 to generic stub API; use it in DLLImportDefinitionGenerator (#207968)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 15 01:34:30 PDT 2026
Author: mkovacevic99
Date: 2026-08-15T18:34:25+10:00
New Revision: 500afbdbc4b28414912fdb7eef5edc9fbc90a7cb
URL: https://github.com/llvm/llvm-project/commit/500afbdbc4b28414912fdb7eef5edc9fbc90a7cb
DIFF: https://github.com/llvm/llvm-project/commit/500afbdbc4b28414912fdb7eef5edc9fbc90a7cb.diff
LOG: [JITLink][ORC] Add ppc64 to generic stub API; use it in DLLImportDefinitionGenerator (#207968)
`getAnonymousPointerCreator` and `getPointerJumpStubCreator` provide
arch-neutral factory functions for pointer slots and PLT jump stubs, but
ppc64/ppc64le were missing from both switch tables.
Add ppc64 support: `createAnonymousPointer` maps directly, while
`createAnonymousPointerJumpStub` requires a lambda wrapper to fix the
endianness template parameter and supply _LongBranchSaveR2_ as the stub
kind (the correct default for external calls that must preserve the TOC
pointer). Callers needing a different stub kind can construct a
`PointerJumpStubCreator` lambda directly. Update
`DLLImportDefinitionGenerator::createStubsGraph` to use these
arch-neutral factories instead of calling jitlink::x86_64:: directly,
completing part of the work tracked in issue
https://github.com/llvm/llvm-project/issues/57162
Added:
Modified:
llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
llvm/lib/ExecutionEngine/JITLink/JITLink.cpp
llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h b/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
index 9e375b5a592f5..63ea139055a90 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
@@ -155,6 +155,19 @@ inline Symbol &createAnonymousPointerJumpStub(LinkGraph &G,
return G.addAnonymousSymbol(B, 0, StubInfo.Content.size(), true, false);
}
+// LongBranchSaveR2 is the default for external calls: saves the TOC
+// pointer (r2) before branching, as required when the callee sets its
+// own TOC. Callers needing a
diff erent stub kind (e.g. LongBranchNoTOC)
+// should call createAnonymousPointerJumpStub directly with the desired
+// PLTCallStubKind.
+template <llvm::endianness Endianness>
+inline Symbol &createDefaultAnonymousPointerJumpStub(LinkGraph &G,
+ Section &StubSection,
+ Symbol &PointerSymbol) {
+ return createAnonymousPointerJumpStub<Endianness>(
+ G, StubSection, PointerSymbol, LongBranchSaveR2);
+}
+
template <llvm::endianness Endianness>
class TOCTableManager : public TableManager<TOCTableManager<Endianness>> {
public:
diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp
index d98ded1ee4c32..329414a5e1275 100644
--- a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp
@@ -16,6 +16,7 @@
#include "llvm/ExecutionEngine/JITLink/XCOFF.h"
#include "llvm/ExecutionEngine/JITLink/aarch64.h"
#include "llvm/ExecutionEngine/JITLink/loongarch.h"
+#include "llvm/ExecutionEngine/JITLink/ppc64.h"
#include "llvm/ExecutionEngine/JITLink/systemz.h"
#include "llvm/ExecutionEngine/JITLink/x86.h"
#include "llvm/ExecutionEngine/JITLink/x86_64.h"
@@ -482,6 +483,9 @@ AnonymousPointerCreator getAnonymousPointerCreator(const Triple &TT) {
return loongarch::createAnonymousPointer;
case Triple::systemz:
return systemz::createAnonymousPointer;
+ case Triple::ppc64:
+ case Triple::ppc64le:
+ return ppc64::createAnonymousPointer;
default:
return nullptr;
}
@@ -500,6 +504,11 @@ PointerJumpStubCreator getPointerJumpStubCreator(const Triple &TT) {
return loongarch::createAnonymousPointerJumpStub;
case Triple::systemz:
return systemz::createAnonymousPointerJumpStub;
+ case Triple::ppc64:
+ return ppc64::createDefaultAnonymousPointerJumpStub<llvm::endianness::big>;
+ case Triple::ppc64le:
+ return ppc64::createDefaultAnonymousPointerJumpStub<
+ llvm::endianness::little>;
default:
return nullptr;
}
diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
index 6794e7621f0ca..957694b5e12f8 100644
--- a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
@@ -553,9 +553,23 @@ Error DLLImportDefinitionGenerator::tryToGenerate(
Expected<std::unique_ptr<jitlink::LinkGraph>>
DLLImportDefinitionGenerator::createStubsGraph(const SymbolMap &Resolved) {
+ Triple TT = ES.getTargetTriple();
+
+ auto CreatePointer = jitlink::getAnonymousPointerCreator(TT);
+ if (!CreatePointer)
+ return make_error<StringError>(
+ "DLLImportDefinitionGenerator: no pointer creator for " + TT.str(),
+ inconvertibleErrorCode());
+
+ auto CreateStub = jitlink::getPointerJumpStubCreator(TT);
+ if (!CreateStub)
+ return make_error<StringError>(
+ "DLLImportDefinitionGenerator: no stub creator for " + TT.str(),
+ inconvertibleErrorCode());
+
auto G = std::make_unique<jitlink::LinkGraph>(
- "<DLLIMPORT_STUBS>", ES.getSymbolStringPool(), ES.getTargetTriple(),
- SubtargetFeatures(), jitlink::getGenericEdgeKindName);
+ "<DLLIMPORT_STUBS>", ES.getSymbolStringPool(), TT, SubtargetFeatures(),
+ jitlink::getGenericEdgeKindName);
jitlink::Section &Sec =
G->createSection(getSectionName(), MemProt::Read | MemProt::Exec);
@@ -565,19 +579,17 @@ DLLImportDefinitionGenerator::createStubsGraph(const SymbolMap &Resolved) {
jitlink::Linkage::Strong, jitlink::Scope::Local, false);
// Create __imp_ symbol
- jitlink::Symbol &Ptr =
- jitlink::x86_64::createAnonymousPointer(*G, Sec, &Target);
+ jitlink::Symbol &Ptr = CreatePointer(*G, Sec, &Target, 0);
Ptr.setName(G->intern((Twine(getImpPrefix()) + *KV.first).str()));
Ptr.setLinkage(jitlink::Linkage::Strong);
Ptr.setScope(jitlink::Scope::Default);
// Create PLT stub
// FIXME: check PLT stub of data symbol is not accessed
- jitlink::Block &StubBlock =
- jitlink::x86_64::createPointerJumpStubBlock(*G, Sec, Ptr);
- G->addDefinedSymbol(StubBlock, 0, *KV.first, StubBlock.getSize(),
- jitlink::Linkage::Strong, jitlink::Scope::Default, true,
- false);
+ jitlink::Symbol &Stub = CreateStub(*G, Sec, Ptr);
+ Stub.setName(G->intern(*KV.first));
+ Stub.setLinkage(jitlink::Linkage::Strong);
+ Stub.setScope(jitlink::Scope::Default);
}
return std::move(G);
More information about the llvm-commits
mailing list