OSDN Git Service

[lli] Add the ability for OrcLazyJIT to accept multiple input modules.
authorLang Hames <lhames@gmail.com>
Tue, 2 Aug 2016 21:00:40 +0000 (21:00 +0000)
committerLang Hames <lhames@gmail.com>
Tue, 2 Aug 2016 21:00:40 +0000 (21:00 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277521 91177308-0d34-0410-b5e6-96231b3b80d8

tools/lli/OrcLazyJIT.cpp
tools/lli/OrcLazyJIT.h
tools/lli/lli.cpp

index 552f579..a36d573 100644 (file)
@@ -105,7 +105,8 @@ static PtrTy fromTargetAddress(JITTargetAddress Addr) {
   return reinterpret_cast<PtrTy>(static_cast<uintptr_t>(Addr));
 }
 
-int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]) {
+int llvm::runOrcLazyJIT(std::vector<std::unique_ptr<Module>> 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<Module> 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";
index 72f35ad..26be63d 100644 (file)
@@ -156,7 +156,8 @@ private:
   std::vector<orc::CtorDtorRunner<CODLayerT>> IRStaticDestructorRunners;
 };
 
-int runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]);
+int runOrcLazyJIT(std::vector<std::unique_ptr<Module>> Ms, int ArgC,
+                  char* ArgV[]);
 
 } // end namespace llvm
 
index be22cc9..3197909 100644 (file)
@@ -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<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()) {
+        Err.print(argv[0], errs());
+        return 1;
+      }
+    }
+    return runOrcLazyJIT(std::move(Ms), argc, argv);
+  }
 
   if (EnableCacheManager) {
     std::string CacheName("file:");