[llvm] r340870 - [ORC] Add an addObjectFile method to LLJIT.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 28 13:20:32 PDT 2018


Author: lhames
Date: Tue Aug 28 13:20:31 2018
New Revision: 340870

URL: http://llvm.org/viewvc/llvm-project?rev=340870&view=rev
Log:
[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.

Added:
    llvm/trunk/test/ExecutionEngine/OrcLazy/Inputs/basic-object-source.ll
    llvm/trunk/test/ExecutionEngine/OrcLazy/basic-object-file-loading.ll
Modified:
    llvm/trunk/include/llvm/ExecutionEngine/Orc/LLJIT.h
    llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp
    llvm/trunk/tools/lli/lli.cpp

Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LLJIT.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LLJIT.h?rev=340870&r1=340869&r2=340870&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/LLJIT.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LLJIT.h Tue Aug 28 13:20:31 2018
@@ -51,6 +51,14 @@ public:
     return addIRModule(Main, std::move(M));
   }
 
+  /// Adds an object file to the given JITDylib.
+  Error addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj);
+
+  /// Adds an object file to the given JITDylib.
+  Error addObjectFile(std::unique_ptr<MemoryBuffer> Obj) {
+    return addObjectFile(Main, std::move(Obj));
+  }
+
   /// 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,

Modified: llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp?rev=340870&r1=340869&r2=340870&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/LLJIT.cpp Tue Aug 28 13:20:31 2018
@@ -38,6 +38,13 @@ Error LLJIT::addIRModule(JITDylib &JD, s
   return CompileLayer.add(JD, K, std::move(M));
 }
 
+Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {
+  assert(Obj && "Can not add null object");
+
+  auto K = ES->allocateVModule();
+  return ObjLinkingLayer.add(JD, K, std::move(Obj));
+}
+
 Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD,
                                                         StringRef Name) {
   return llvm::orc::lookup({&JD}, ES->getSymbolStringPool().intern(Name));

Added: llvm/trunk/test/ExecutionEngine/OrcLazy/Inputs/basic-object-source.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcLazy/Inputs/basic-object-source.ll?rev=340870&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/OrcLazy/Inputs/basic-object-source.ll (added)
+++ llvm/trunk/test/ExecutionEngine/OrcLazy/Inputs/basic-object-source.ll Tue Aug 28 13:20:31 2018
@@ -0,0 +1,5 @@
+define i32 @foo() {
+entry:
+  ret i32 0
+}
+

Added: llvm/trunk/test/ExecutionEngine/OrcLazy/basic-object-file-loading.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcLazy/basic-object-file-loading.ll?rev=340870&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/OrcLazy/basic-object-file-loading.ll (added)
+++ llvm/trunk/test/ExecutionEngine/OrcLazy/basic-object-file-loading.ll Tue Aug 28 13:20:31 2018
@@ -0,0 +1,13 @@
+; RUN: llc -filetype=obj -o %t %p/Inputs/basic-object-source.ll
+; RUN: lli -jit-kind=orc-lazy -extra-object %t %s
+;
+; Check that we can load an object file and call a function in it.
+
+declare i32 @foo()
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = call i32 @foo()
+  ret i32 %0
+}
+

Modified: llvm/trunk/tools/lli/lli.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/lli.cpp?rev=340870&r1=340869&r2=340870&view=diff
==============================================================================
--- llvm/trunk/tools/lli/lli.cpp (original)
+++ llvm/trunk/tools/lli/lli.cpp Tue Aug 28 13:20:31 2018
@@ -337,8 +337,7 @@ static void reportError(SMDiagnostic Err
   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 * c
   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 * c
   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::Transform
   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:
     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:
   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;




More information about the llvm-commits mailing list