diff options
| author | Lang Hames <lhames@gmail.com> | 2018-08-28 20:20:31 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2018-08-28 20:20:31 +0000 |
| commit | 37a66413c107373b52714ace3e9548f929f23539 (patch) | |
| tree | 26b0430087dc662fc511642809bbef2f0a3103e5 /llvm/tools/lli | |
| parent | 9401fd0ed24166e10fa34ae90ac6a2409a93097c (diff) | |
| download | bcm5719-llvm-37a66413c107373b52714ace3e9548f929f23539.tar.gz bcm5719-llvm-37a66413c107373b52714ace3e9548f929f23539.zip | |
[ORC] Add an addObjectFile method to LLJIT.
The addObjectFile method adds the given object file to the JIT session, making
its code available for execution.
Support for the -extra-object flag is added to lli when operating in
-jit-kind=orc-lazy mode to support testing of this feature.
llvm-svn: 340870
Diffstat (limited to 'llvm/tools/lli')
| -rw-r--r-- | llvm/tools/lli/lli.cpp | 63 |
1 files changed, 38 insertions, 25 deletions
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index 7c2360b0247..66860847ba5 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -337,8 +337,7 @@ static void reportError(SMDiagnostic Err, const char *ProgName) { exit(1); } -int runOrcLazyJIT(LLVMContext &Ctx, std::vector<std::unique_ptr<Module>> Ms, - const std::vector<std::string> &Args); +int runOrcLazyJIT(const char *ProgName); //===----------------------------------------------------------------------===// // main Driver function @@ -362,6 +361,9 @@ int main(int argc, char **argv, char * const *envp) { if (DisableCoreFiles) sys::Process::PreventCoreFiles(); + if (UseJITKind == JITKind::OrcLazy) + return runOrcLazyJIT(argv[0]); + LLVMContext Context; // Load the bitcode... @@ -371,21 +373,6 @@ int main(int argc, char **argv, char * const *envp) { if (!Mod) reportError(Err, argv[0]); - if (UseJITKind == JITKind::OrcLazy) { - std::vector<std::unique_ptr<Module>> Ms; - Ms.push_back(std::move(Owner)); - for (auto &ExtraMod : ExtraModules) { - Ms.push_back(parseIRFile(ExtraMod, Err, Context)); - if (!Ms.back()) - reportError(Err, argv[0]); - } - std::vector<std::string> Args; - Args.push_back(InputFile); - for (auto &Arg : InputArgv) - Args.push_back(Arg); - return runOrcLazyJIT(Context, std::move(Ms), Args); - } - if (EnableCacheManager) { std::string CacheName("file:"); CacheName.append(InputFile); @@ -736,13 +723,10 @@ static orc::IRTransformLayer2::TransformFunction createDebugDumper() { llvm_unreachable("Unknown DumpKind"); } -int runOrcLazyJIT(LLVMContext &Ctx, std::vector<std::unique_ptr<Module>> Ms, - const std::vector<std::string> &Args) { - // Bail out early if no modules loaded. - if (Ms.empty()) - return 0; +int runOrcLazyJIT(const char *ProgName) { + // Start setting up the JIT environment. - // Add lli's symbols into the JIT's search space. + // First add lli's symbols into the JIT's search space. std::string ErrMsg; sys::DynamicLibrary LibLLI = sys::DynamicLibrary::getPermanentLibrary(nullptr, &ErrMsg); @@ -751,7 +735,14 @@ int runOrcLazyJIT(LLVMContext &Ctx, std::vector<std::unique_ptr<Module>> Ms, return 1; } - const auto &TT = Ms.front()->getTargetTriple(); + // Parse the main module. + LLVMContext Ctx; + SMDiagnostic Err; + auto MainModule = parseIRFile(InputFile, Err, Ctx); + if (!MainModule) + reportError(Err, ProgName); + + const auto &TT = MainModule->getTargetTriple(); orc::JITTargetMachineBuilder TMD = TT.empty() ? ExitOnErr(orc::JITTargetMachineBuilder::detectHost()) : orc::JITTargetMachineBuilder(Triple(TT)); @@ -789,13 +780,35 @@ int runOrcLazyJIT(LLVMContext &Ctx, std::vector<std::unique_ptr<Module>> Ms, orc::LocalCXXRuntimeOverrides2 CXXRuntimeOverrides; ExitOnErr(CXXRuntimeOverrides.enable(J->getMainJITDylib(), Mangle)); - for (auto &M : Ms) { + // Add the main module. + ExitOnErr(J->addLazyIRModule(std::move(MainModule))); + + // Add any extra modules. + for (auto &ModulePath : ExtraModules) { + auto M = parseIRFile(ModulePath, Err, Ctx); + if (!M) + reportError(Err, ProgName); + orc::makeAllSymbolsExternallyAccessible(*M); ExitOnErr(J->addLazyIRModule(std::move(M))); } + // Add the objects. + for (auto &ObjPath : ExtraObjects) { + auto Obj = ExitOnErr(errorOrToExpected(MemoryBuffer::getFile(ObjPath))); + ExitOnErr(J->addObjectFile(std::move(Obj))); + } + + // Generate a argument string. + std::vector<std::string> Args; + Args.push_back(InputFile); + for (auto &Arg : InputArgv) + Args.push_back(Arg); + + // Run any static constructors. ExitOnErr(J->runConstructors()); + // Run main. auto MainSym = ExitOnErr(J->lookup("main")); typedef int (*MainFnPtr)(int, const char *[]); std::vector<const char *> ArgV; |

