[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