[ORC] Make mangling convenience methods part of the public API of LLJIT.

This saves clients from having to manually construct a MangleAndInterner.
This commit is contained in:
Lang Hames 2020-04-08 19:23:02 -07:00
parent d314b7d5ca
commit 5877d6f5f4
2 changed files with 52 additions and 38 deletions

View File

@ -107,7 +107,14 @@ public:
/// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to /// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to
/// look up symbols based on their IR name use the lookup function instead). /// look up symbols based on their IR name use the lookup function instead).
Expected<JITEvaluatedSymbol> lookupLinkerMangled(JITDylib &JD, Expected<JITEvaluatedSymbol> lookupLinkerMangled(JITDylib &JD,
StringRef Name); SymbolStringPtr Name);
/// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to
/// look up symbols based on their IR name use the lookup function instead).
Expected<JITEvaluatedSymbol> lookupLinkerMangled(JITDylib &JD,
StringRef Name) {
return lookupLinkerMangled(JD, ES->intern(Name));
}
/// Look up a symbol in the main JITDylib by the symbol's linker-mangled name /// Look up a symbol in the main JITDylib by the symbol's linker-mangled name
/// (to look up symbols based on their IR name use the lookup function /// (to look up symbols based on their IR name use the lookup function
@ -166,6 +173,14 @@ public:
/// Returns a reference to the IR compile layer. /// Returns a reference to the IR compile layer.
IRCompileLayer &getIRCompileLayer() { return *CompileLayer; } IRCompileLayer &getIRCompileLayer() { return *CompileLayer; }
/// Returns a linker-mangled version of UnmangledName.
std::string mangle(StringRef UnmangledName) const;
/// Returns an interned, linker-mangled version of UnmangledName.
SymbolStringPtr mangleAndIntern(StringRef UnmangledName) const {
return ES->intern(mangle(UnmangledName));
}
protected: protected:
static std::unique_ptr<ObjectLayer> static std::unique_ptr<ObjectLayer>
createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES); createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES);
@ -176,8 +191,6 @@ protected:
/// Create an LLJIT instance with a single compile thread. /// Create an LLJIT instance with a single compile thread.
LLJIT(LLJITBuilderState &S, Error &Err); LLJIT(LLJITBuilderState &S, Error &Err);
std::string mangle(StringRef UnmangledName);
Error applyDataLayout(Module &M); Error applyDataLayout(Module &M);
void recordCtorDtors(Module &M); void recordCtorDtors(Module &M);

View File

@ -122,23 +122,22 @@ private:
class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport { class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
public: public:
// GenericLLVMIRPlatform &P) : P(P) { // GenericLLVMIRPlatform &P) : P(P) {
GenericLLVMIRPlatformSupport(LLJIT &J) : J(J) { GenericLLVMIRPlatformSupport(LLJIT &J)
: J(J), InitFunctionPrefix(J.mangle("__orc_init_func.")) {
MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout());
InitFunctionPrefix = Mangle("__orc_init_func.");
getExecutionSession().setPlatform( getExecutionSession().setPlatform(
std::make_unique<GenericLLVMIRPlatform>(*this)); std::make_unique<GenericLLVMIRPlatform>(*this));
setInitTransform(J, GlobalCtorDtorScraper(*this, *InitFunctionPrefix)); setInitTransform(J, GlobalCtorDtorScraper(*this, InitFunctionPrefix));
SymbolMap StdInterposes; SymbolMap StdInterposes;
StdInterposes[Mangle("__lljit.platform_support_instance")] = StdInterposes[J.mangleAndIntern("__lljit.platform_support_instance")] =
JITEvaluatedSymbol(pointerToJITTargetAddress(this), JITEvaluatedSymbol(pointerToJITTargetAddress(this),
JITSymbolFlags::Exported); JITSymbolFlags::Exported);
StdInterposes[Mangle("__lljit.cxa_atexit_helper")] = JITEvaluatedSymbol( StdInterposes[J.mangleAndIntern("__lljit.cxa_atexit_helper")] =
pointerToJITTargetAddress(registerAtExitHelper), JITSymbolFlags()); JITEvaluatedSymbol(pointerToJITTargetAddress(registerAtExitHelper),
JITSymbolFlags());
cantFail( cantFail(
J.getMainJITDylib().define(absoluteSymbols(std::move(StdInterposes)))); J.getMainJITDylib().define(absoluteSymbols(std::move(StdInterposes))));
@ -152,10 +151,10 @@ public:
Error setupJITDylib(JITDylib &JD) { Error setupJITDylib(JITDylib &JD) {
// Add per-jitdylib standard interposes. // Add per-jitdylib standard interposes.
MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout());
SymbolMap PerJDInterposes; SymbolMap PerJDInterposes;
PerJDInterposes[Mangle("__lljit.run_atexits_helper")] = JITEvaluatedSymbol( PerJDInterposes[J.mangleAndIntern("__lljit.run_atexits_helper")] =
pointerToJITTargetAddress(runAtExitsHelper), JITSymbolFlags()); JITEvaluatedSymbol(pointerToJITTargetAddress(runAtExitsHelper),
JITSymbolFlags());
cantFail(JD.define(absoluteSymbols(std::move(PerJDInterposes)))); cantFail(JD.define(absoluteSymbols(std::move(PerJDInterposes))));
auto Ctx = std::make_unique<LLVMContext>(); auto Ctx = std::make_unique<LLVMContext>();
@ -197,7 +196,7 @@ public:
// will trigger a lookup to materialize the module) and the InitFunctions // will trigger a lookup to materialize the module) and the InitFunctions
// map (which holds the names of the symbols to execute). // map (which holds the names of the symbols to execute).
for (auto &KV : MU.getSymbols()) for (auto &KV : MU.getSymbols())
if ((*KV.first).startswith(*InitFunctionPrefix)) { if ((*KV.first).startswith(InitFunctionPrefix)) {
InitSymbols[&JD].add(KV.first, InitSymbols[&JD].add(KV.first,
SymbolLookupFlags::WeaklyReferencedSymbol); SymbolLookupFlags::WeaklyReferencedSymbol);
InitFunctions[&JD].add(KV.first); InitFunctions[&JD].add(KV.first);
@ -308,8 +307,7 @@ private:
Expected<std::vector<JITTargetAddress>> getDeinitializers(JITDylib &JD) { Expected<std::vector<JITTargetAddress>> getDeinitializers(JITDylib &JD) {
auto &ES = getExecutionSession(); auto &ES = getExecutionSession();
MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout()); auto LLJITRunAtExits = J.mangleAndIntern("__lljit_run_atexits");
auto LLJITRunAtExits = Mangle("__lljit_run_atexits");
DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols; DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols;
std::vector<JITDylib *> DFSLinkOrder; std::vector<JITDylib *> DFSLinkOrder;
@ -459,7 +457,7 @@ private:
} }
LLJIT &J; LLJIT &J;
SymbolStringPtr InitFunctionPrefix; std::string InitFunctionPrefix;
DenseMap<JITDylib *, SymbolLookupSet> InitSymbols; DenseMap<JITDylib *, SymbolLookupSet> InitSymbols;
DenseMap<JITDylib *, SymbolLookupSet> InitFunctions; DenseMap<JITDylib *, SymbolLookupSet> InitFunctions;
DenseMap<JITDylib *, SymbolLookupSet> DeInitFunctions; DenseMap<JITDylib *, SymbolLookupSet> DeInitFunctions;
@ -653,26 +651,31 @@ private:
MachOPlatformSupport(LLJIT &J, JITDylib &PlatformJITDylib, DlFcnValues DlFcn) MachOPlatformSupport(LLJIT &J, JITDylib &PlatformJITDylib, DlFcnValues DlFcn)
: J(J), MP(setupPlatform(J)), DlFcn(std::move(DlFcn)) { : J(J), MP(setupPlatform(J)), DlFcn(std::move(DlFcn)) {
MangleAndInterner Mangle(J.getExecutionSession(), J.getDataLayout());
SymbolMap HelperSymbols; SymbolMap HelperSymbols;
// platform and atexit helpers. // platform and atexit helpers.
HelperSymbols[Mangle("__lljit.platform_support_instance")] = HelperSymbols[J.mangleAndIntern("__lljit.platform_support_instance")] =
JITEvaluatedSymbol(pointerToJITTargetAddress(this), JITSymbolFlags()); JITEvaluatedSymbol(pointerToJITTargetAddress(this), JITSymbolFlags());
HelperSymbols[Mangle("__lljit.cxa_atexit_helper")] = JITEvaluatedSymbol( HelperSymbols[J.mangleAndIntern("__lljit.cxa_atexit_helper")] =
pointerToJITTargetAddress(registerAtExitHelper), JITSymbolFlags()); JITEvaluatedSymbol(pointerToJITTargetAddress(registerAtExitHelper),
HelperSymbols[Mangle("__lljit.run_atexits_helper")] = JITEvaluatedSymbol( JITSymbolFlags());
pointerToJITTargetAddress(runAtExitsHelper), JITSymbolFlags()); HelperSymbols[J.mangleAndIntern("__lljit.run_atexits_helper")] =
JITEvaluatedSymbol(pointerToJITTargetAddress(runAtExitsHelper),
JITSymbolFlags());
// dlfcn helpers. // dlfcn helpers.
HelperSymbols[Mangle("__lljit.dlopen_helper")] = JITEvaluatedSymbol( HelperSymbols[J.mangleAndIntern("__lljit.dlopen_helper")] =
pointerToJITTargetAddress(dlopenHelper), JITSymbolFlags()); JITEvaluatedSymbol(pointerToJITTargetAddress(dlopenHelper),
HelperSymbols[Mangle("__lljit.dlclose_helper")] = JITEvaluatedSymbol( JITSymbolFlags());
pointerToJITTargetAddress(dlcloseHelper), JITSymbolFlags()); HelperSymbols[J.mangleAndIntern("__lljit.dlclose_helper")] =
HelperSymbols[Mangle("__lljit.dlsym_helper")] = JITEvaluatedSymbol( JITEvaluatedSymbol(pointerToJITTargetAddress(dlcloseHelper),
pointerToJITTargetAddress(dlsymHelper), JITSymbolFlags()); JITSymbolFlags());
HelperSymbols[Mangle("__lljit.dlerror_helper")] = JITEvaluatedSymbol( HelperSymbols[J.mangleAndIntern("__lljit.dlsym_helper")] =
pointerToJITTargetAddress(dlerrorHelper), JITSymbolFlags()); JITEvaluatedSymbol(pointerToJITTargetAddress(dlsymHelper),
JITSymbolFlags());
HelperSymbols[J.mangleAndIntern("__lljit.dlerror_helper")] =
JITEvaluatedSymbol(pointerToJITTargetAddress(dlerrorHelper),
JITSymbolFlags());
cantFail( cantFail(
PlatformJITDylib.define(absoluteSymbols(std::move(HelperSymbols)))); PlatformJITDylib.define(absoluteSymbols(std::move(HelperSymbols))));
@ -859,8 +862,7 @@ private:
} }
if (!JITSymSearchOrder.empty()) { if (!JITSymSearchOrder.empty()) {
MangleAndInterner Mangle(J.getExecutionSession(), J.getDataLayout()); auto MangledName = J.mangleAndIntern(Name);
auto MangledName = Mangle(Name);
SymbolLookupSet Syms(MangledName, SymbolLookupSet Syms(MangledName,
SymbolLookupFlags::WeaklyReferencedSymbol); SymbolLookupFlags::WeaklyReferencedSymbol);
if (auto Result = J.getExecutionSession().lookup(JITSymSearchOrder, Syms, if (auto Result = J.getExecutionSession().lookup(JITSymSearchOrder, Syms,
@ -987,10 +989,9 @@ Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {
} }
Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD,
StringRef Name) { SymbolStringPtr Name) {
return ES->lookup( return ES->lookup(
makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), Name);
ES->intern(Name));
} }
std::unique_ptr<ObjectLayer> std::unique_ptr<ObjectLayer>
@ -1093,7 +1094,7 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err)
setUpGenericLLVMIRPlatform(*this); setUpGenericLLVMIRPlatform(*this);
} }
std::string LLJIT::mangle(StringRef UnmangledName) { std::string LLJIT::mangle(StringRef UnmangledName) const {
std::string MangledName; std::string MangledName;
{ {
raw_string_ostream MangledNameStream(MangledName); raw_string_ostream MangledNameStream(MangledName);