From 368c4223b8182fcdf87aa5c5d4a1487de1ccf654 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 2 Aug 2016 21:00:40 +0000 Subject: [PATCH] [lli] Add the ability for OrcLazyJIT to accept multiple input modules. LLI already supported passing multiple input modules to MCJIT via the -extra-module option. This patch adds the plumbing to pass these modules to the OrcLazy JIT too. This functionality will be used in an upcoming test case for weak symbol handling. llvm-svn: 277521 --- llvm/tools/lli/OrcLazyJIT.cpp | 8 +++++--- llvm/tools/lli/OrcLazyJIT.h | 3 ++- llvm/tools/lli/lli.cpp | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/llvm/tools/lli/OrcLazyJIT.cpp b/llvm/tools/lli/OrcLazyJIT.cpp index 552f5791a103..a36d57315998 100644 --- a/llvm/tools/lli/OrcLazyJIT.cpp +++ b/llvm/tools/lli/OrcLazyJIT.cpp @@ -105,7 +105,8 @@ static PtrTy fromTargetAddress(JITTargetAddress Addr) { return reinterpret_cast(static_cast(Addr)); } -int llvm::runOrcLazyJIT(std::unique_ptr M, int ArgC, char* ArgV[]) { +int llvm::runOrcLazyJIT(std::vector> Ms, int ArgC, + char* ArgV[]) { // Add the program's symbols into the JIT's search space. if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) { errs() << "Error loading program symbols.\n"; @@ -143,8 +144,9 @@ int llvm::runOrcLazyJIT(std::unique_ptr M, int ArgC, char* ArgV[]) { OrcInlineStubs); // Add the module, look up main and run it. - auto MainHandle = J.addModule(std::move(M)); - auto MainSym = J.findSymbolIn(MainHandle, "main"); + for (auto &M : Ms) + J.addModule(std::move(M)); + auto MainSym = J.findSymbol("main"); if (!MainSym) { errs() << "Could not find main function.\n"; diff --git a/llvm/tools/lli/OrcLazyJIT.h b/llvm/tools/lli/OrcLazyJIT.h index 72f35ad6ab61..26be63de53e0 100644 --- a/llvm/tools/lli/OrcLazyJIT.h +++ b/llvm/tools/lli/OrcLazyJIT.h @@ -156,7 +156,8 @@ private: std::vector> IRStaticDestructorRunners; }; -int runOrcLazyJIT(std::unique_ptr M, int ArgC, char* ArgV[]); +int runOrcLazyJIT(std::vector> Ms, int ArgC, + char* ArgV[]); } // end namespace llvm diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index be22cc927c20..31979097b930 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -397,8 +397,18 @@ int main(int argc, char **argv, char * const *envp) { return 1; } - if (UseJITKind == JITKind::OrcLazy) - return runOrcLazyJIT(std::move(Owner), argc, argv); + if (UseJITKind == JITKind::OrcLazy) { + std::vector> Ms; + Ms.push_back(std::move(Owner)); + for (auto &ExtraMod : ExtraModules) { + Ms.push_back(parseIRFile(ExtraMod, Err, Context)); + if (!Ms.back()) { + Err.print(argv[0], errs()); + return 1; + } + } + return runOrcLazyJIT(std::move(Ms), argc, argv); + } if (EnableCacheManager) { std::string CacheName("file:");