[ORC] Add MachOPlatform::Create overload -- Pass ORC runtime as def generator.
The existing Create method took a path to the ORC runtime and created a StaticLibraryDefinitionGenerator for it. The new overload takes a std::unique_ptr<DefinitionGenerator> directly instead. This provides more flexibility when constructing MachOPlatforms. E.g. The runtime archive can be embedded in a special section in the ORC controller executable or library, rather than being on-disk.
This commit is contained in:
@@ -78,6 +78,12 @@ public:
|
||||
/// RuntimeAliases function, in which case the client is responsible for
|
||||
/// setting up all aliases (including the required ones).
|
||||
static Expected<std::unique_ptr<MachOPlatform>>
|
||||
Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
|
||||
JITDylib &PlatformJD, std::unique_ptr<DefinitionGenerator> OrcRuntime,
|
||||
std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
|
||||
|
||||
/// Construct using a path to the ORC runtime.
|
||||
static Expected<std::unique_ptr<MachOPlatform>>
|
||||
Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
|
||||
JITDylib &PlatformJD, const char *OrcRuntimePath,
|
||||
std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
|
||||
|
||||
@@ -254,7 +254,8 @@ namespace orc {
|
||||
|
||||
Expected<std::unique_ptr<MachOPlatform>>
|
||||
MachOPlatform::Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
|
||||
JITDylib &PlatformJD, const char *OrcRuntimePath,
|
||||
JITDylib &PlatformJD,
|
||||
std::unique_ptr<DefinitionGenerator> OrcRuntime,
|
||||
std::optional<SymbolAliasMap> RuntimeAliases) {
|
||||
|
||||
auto &EPC = ES.getExecutorProcessControl();
|
||||
@@ -283,22 +284,32 @@ MachOPlatform::Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
|
||||
JITSymbolFlags::Exported}}})))
|
||||
return std::move(Err);
|
||||
|
||||
// Create a generator for the ORC runtime archive.
|
||||
auto OrcRuntimeArchiveGenerator = StaticLibraryDefinitionGenerator::Load(
|
||||
ObjLinkingLayer, OrcRuntimePath, EPC.getTargetTriple());
|
||||
if (!OrcRuntimeArchiveGenerator)
|
||||
return OrcRuntimeArchiveGenerator.takeError();
|
||||
|
||||
// Create the instance.
|
||||
Error Err = Error::success();
|
||||
auto P = std::unique_ptr<MachOPlatform>(
|
||||
new MachOPlatform(ES, ObjLinkingLayer, PlatformJD,
|
||||
std::move(*OrcRuntimeArchiveGenerator), Err));
|
||||
auto P = std::unique_ptr<MachOPlatform>(new MachOPlatform(
|
||||
ES, ObjLinkingLayer, PlatformJD, std::move(OrcRuntime), Err));
|
||||
if (Err)
|
||||
return std::move(Err);
|
||||
return std::move(P);
|
||||
}
|
||||
|
||||
Expected<std::unique_ptr<MachOPlatform>>
|
||||
MachOPlatform::Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
|
||||
JITDylib &PlatformJD, const char *OrcRuntimePath,
|
||||
std::optional<SymbolAliasMap> RuntimeAliases) {
|
||||
|
||||
// Create a generator for the ORC runtime archive.
|
||||
auto OrcRuntimeArchiveGenerator = StaticLibraryDefinitionGenerator::Load(
|
||||
ObjLinkingLayer, OrcRuntimePath,
|
||||
ES.getExecutorProcessControl().getTargetTriple());
|
||||
if (!OrcRuntimeArchiveGenerator)
|
||||
return OrcRuntimeArchiveGenerator.takeError();
|
||||
|
||||
return Create(ES, ObjLinkingLayer, PlatformJD,
|
||||
std::move(*OrcRuntimeArchiveGenerator),
|
||||
std::move(RuntimeAliases));
|
||||
}
|
||||
|
||||
Error MachOPlatform::setupJITDylib(JITDylib &JD) {
|
||||
if (auto Err = JD.define(std::make_unique<MachOHeaderMaterializationUnit>(
|
||||
*this, MachOHeaderStartSymbol)))
|
||||
|
||||
Reference in New Issue
Block a user