Skip to content

Commit 5877d6f

Browse files
committed
[ORC] Make mangling convenience methods part of the public API of LLJIT.
This saves clients from having to manually construct a MangleAndInterner.
1 parent d314b7d commit 5877d6f

File tree

2 files changed

+52
-38
lines changed

2 files changed

+52
-38
lines changed

llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,14 @@ class LLJIT {
107107
/// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to
108108
/// look up symbols based on their IR name use the lookup function instead).
109109
Expected<JITEvaluatedSymbol> lookupLinkerMangled(JITDylib &JD,
110-
StringRef Name);
110+
SymbolStringPtr Name);
111+
112+
/// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to
113+
/// look up symbols based on their IR name use the lookup function instead).
114+
Expected<JITEvaluatedSymbol> lookupLinkerMangled(JITDylib &JD,
115+
StringRef Name) {
116+
return lookupLinkerMangled(JD, ES->intern(Name));
117+
}
111118

112119
/// Look up a symbol in the main JITDylib by the symbol's linker-mangled name
113120
/// (to look up symbols based on their IR name use the lookup function
@@ -166,6 +173,14 @@ class LLJIT {
166173
/// Returns a reference to the IR compile layer.
167174
IRCompileLayer &getIRCompileLayer() { return *CompileLayer; }
168175

176+
/// Returns a linker-mangled version of UnmangledName.
177+
std::string mangle(StringRef UnmangledName) const;
178+
179+
/// Returns an interned, linker-mangled version of UnmangledName.
180+
SymbolStringPtr mangleAndIntern(StringRef UnmangledName) const {
181+
return ES->intern(mangle(UnmangledName));
182+
}
183+
169184
protected:
170185
static std::unique_ptr<ObjectLayer>
171186
createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES);
@@ -176,8 +191,6 @@ class LLJIT {
176191
/// Create an LLJIT instance with a single compile thread.
177192
LLJIT(LLJITBuilderState &S, Error &Err);
178193

179-
std::string mangle(StringRef UnmangledName);
180-
181194
Error applyDataLayout(Module &M);
182195

183196
void recordCtorDtors(Module &M);

llvm/lib/ExecutionEngine/Orc/LLJIT.cpp

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,22 @@ class GlobalCtorDtorScraper {
122122
class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
123123
public:
124124
// GenericLLVMIRPlatform &P) : P(P) {
125-
GenericLLVMIRPlatformSupport(LLJIT &J) : J(J) {
126-
127-
MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout());
128-
InitFunctionPrefix = Mangle("__orc_init_func.");
125+
GenericLLVMIRPlatformSupport(LLJIT &J)
126+
: J(J), InitFunctionPrefix(J.mangle("__orc_init_func.")) {
129127

130128
getExecutionSession().setPlatform(
131129
std::make_unique<GenericLLVMIRPlatform>(*this));
132130

133-
setInitTransform(J, GlobalCtorDtorScraper(*this, *InitFunctionPrefix));
131+
setInitTransform(J, GlobalCtorDtorScraper(*this, InitFunctionPrefix));
134132

135133
SymbolMap StdInterposes;
136134

137-
StdInterposes[Mangle("__lljit.platform_support_instance")] =
135+
StdInterposes[J.mangleAndIntern("__lljit.platform_support_instance")] =
138136
JITEvaluatedSymbol(pointerToJITTargetAddress(this),
139137
JITSymbolFlags::Exported);
140-
StdInterposes[Mangle("__lljit.cxa_atexit_helper")] = JITEvaluatedSymbol(
141-
pointerToJITTargetAddress(registerAtExitHelper), JITSymbolFlags());
138+
StdInterposes[J.mangleAndIntern("__lljit.cxa_atexit_helper")] =
139+
JITEvaluatedSymbol(pointerToJITTargetAddress(registerAtExitHelper),
140+
JITSymbolFlags());
142141

143142
cantFail(
144143
J.getMainJITDylib().define(absoluteSymbols(std::move(StdInterposes))));
@@ -152,10 +151,10 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
152151
Error setupJITDylib(JITDylib &JD) {
153152

154153
// Add per-jitdylib standard interposes.
155-
MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout());
156154
SymbolMap PerJDInterposes;
157-
PerJDInterposes[Mangle("__lljit.run_atexits_helper")] = JITEvaluatedSymbol(
158-
pointerToJITTargetAddress(runAtExitsHelper), JITSymbolFlags());
155+
PerJDInterposes[J.mangleAndIntern("__lljit.run_atexits_helper")] =
156+
JITEvaluatedSymbol(pointerToJITTargetAddress(runAtExitsHelper),
157+
JITSymbolFlags());
159158
cantFail(JD.define(absoluteSymbols(std::move(PerJDInterposes))));
160159

161160
auto Ctx = std::make_unique<LLVMContext>();
@@ -197,7 +196,7 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
197196
// will trigger a lookup to materialize the module) and the InitFunctions
198197
// map (which holds the names of the symbols to execute).
199198
for (auto &KV : MU.getSymbols())
200-
if ((*KV.first).startswith(*InitFunctionPrefix)) {
199+
if ((*KV.first).startswith(InitFunctionPrefix)) {
201200
InitSymbols[&JD].add(KV.first,
202201
SymbolLookupFlags::WeaklyReferencedSymbol);
203202
InitFunctions[&JD].add(KV.first);
@@ -308,8 +307,7 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
308307
Expected<std::vector<JITTargetAddress>> getDeinitializers(JITDylib &JD) {
309308
auto &ES = getExecutionSession();
310309

311-
MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout());
312-
auto LLJITRunAtExits = Mangle("__lljit_run_atexits");
310+
auto LLJITRunAtExits = J.mangleAndIntern("__lljit_run_atexits");
313311

314312
DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols;
315313
std::vector<JITDylib *> DFSLinkOrder;
@@ -459,7 +457,7 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
459457
}
460458

461459
LLJIT &J;
462-
SymbolStringPtr InitFunctionPrefix;
460+
std::string InitFunctionPrefix;
463461
DenseMap<JITDylib *, SymbolLookupSet> InitSymbols;
464462
DenseMap<JITDylib *, SymbolLookupSet> InitFunctions;
465463
DenseMap<JITDylib *, SymbolLookupSet> DeInitFunctions;
@@ -653,26 +651,31 @@ class MachOPlatformSupport : public LLJIT::PlatformSupport {
653651
MachOPlatformSupport(LLJIT &J, JITDylib &PlatformJITDylib, DlFcnValues DlFcn)
654652
: J(J), MP(setupPlatform(J)), DlFcn(std::move(DlFcn)) {
655653

656-
MangleAndInterner Mangle(J.getExecutionSession(), J.getDataLayout());
657654
SymbolMap HelperSymbols;
658655

659656
// platform and atexit helpers.
660-
HelperSymbols[Mangle("__lljit.platform_support_instance")] =
657+
HelperSymbols[J.mangleAndIntern("__lljit.platform_support_instance")] =
661658
JITEvaluatedSymbol(pointerToJITTargetAddress(this), JITSymbolFlags());
662-
HelperSymbols[Mangle("__lljit.cxa_atexit_helper")] = JITEvaluatedSymbol(
663-
pointerToJITTargetAddress(registerAtExitHelper), JITSymbolFlags());
664-
HelperSymbols[Mangle("__lljit.run_atexits_helper")] = JITEvaluatedSymbol(
665-
pointerToJITTargetAddress(runAtExitsHelper), JITSymbolFlags());
659+
HelperSymbols[J.mangleAndIntern("__lljit.cxa_atexit_helper")] =
660+
JITEvaluatedSymbol(pointerToJITTargetAddress(registerAtExitHelper),
661+
JITSymbolFlags());
662+
HelperSymbols[J.mangleAndIntern("__lljit.run_atexits_helper")] =
663+
JITEvaluatedSymbol(pointerToJITTargetAddress(runAtExitsHelper),
664+
JITSymbolFlags());
666665

667666
// dlfcn helpers.
668-
HelperSymbols[Mangle("__lljit.dlopen_helper")] = JITEvaluatedSymbol(
669-
pointerToJITTargetAddress(dlopenHelper), JITSymbolFlags());
670-
HelperSymbols[Mangle("__lljit.dlclose_helper")] = JITEvaluatedSymbol(
671-
pointerToJITTargetAddress(dlcloseHelper), JITSymbolFlags());
672-
HelperSymbols[Mangle("__lljit.dlsym_helper")] = JITEvaluatedSymbol(
673-
pointerToJITTargetAddress(dlsymHelper), JITSymbolFlags());
674-
HelperSymbols[Mangle("__lljit.dlerror_helper")] = JITEvaluatedSymbol(
675-
pointerToJITTargetAddress(dlerrorHelper), JITSymbolFlags());
667+
HelperSymbols[J.mangleAndIntern("__lljit.dlopen_helper")] =
668+
JITEvaluatedSymbol(pointerToJITTargetAddress(dlopenHelper),
669+
JITSymbolFlags());
670+
HelperSymbols[J.mangleAndIntern("__lljit.dlclose_helper")] =
671+
JITEvaluatedSymbol(pointerToJITTargetAddress(dlcloseHelper),
672+
JITSymbolFlags());
673+
HelperSymbols[J.mangleAndIntern("__lljit.dlsym_helper")] =
674+
JITEvaluatedSymbol(pointerToJITTargetAddress(dlsymHelper),
675+
JITSymbolFlags());
676+
HelperSymbols[J.mangleAndIntern("__lljit.dlerror_helper")] =
677+
JITEvaluatedSymbol(pointerToJITTargetAddress(dlerrorHelper),
678+
JITSymbolFlags());
676679

677680
cantFail(
678681
PlatformJITDylib.define(absoluteSymbols(std::move(HelperSymbols))));
@@ -859,8 +862,7 @@ class MachOPlatformSupport : public LLJIT::PlatformSupport {
859862
}
860863

861864
if (!JITSymSearchOrder.empty()) {
862-
MangleAndInterner Mangle(J.getExecutionSession(), J.getDataLayout());
863-
auto MangledName = Mangle(Name);
865+
auto MangledName = J.mangleAndIntern(Name);
864866
SymbolLookupSet Syms(MangledName,
865867
SymbolLookupFlags::WeaklyReferencedSymbol);
866868
if (auto Result = J.getExecutionSession().lookup(JITSymSearchOrder, Syms,
@@ -987,10 +989,9 @@ Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {
987989
}
988990

989991
Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD,
990-
StringRef Name) {
992+
SymbolStringPtr Name) {
991993
return ES->lookup(
992-
makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols),
993-
ES->intern(Name));
994+
makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), Name);
994995
}
995996

996997
std::unique_ptr<ObjectLayer>
@@ -1093,7 +1094,7 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)
10931094
setUpGenericLLVMIRPlatform(*this);
10941095
}
10951096

1096-
std::string LLJIT::mangle(StringRef UnmangledName) {
1097+
std::string LLJIT::mangle(StringRef UnmangledName) const {
10971098
std::string MangledName;
10981099
{
10991100
raw_string_ostream MangledNameStream(MangledName);

0 commit comments

Comments
 (0)