summaryrefslogtreecommitdiffstats
path: root/llvm/tools/lli
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-08-28 20:20:31 +0000
committerLang Hames <lhames@gmail.com>2018-08-28 20:20:31 +0000
commit37a66413c107373b52714ace3e9548f929f23539 (patch)
tree26b0430087dc662fc511642809bbef2f0a3103e5 /llvm/tools/lli
parent9401fd0ed24166e10fa34ae90ac6a2409a93097c (diff)
downloadbcm5719-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.cpp63
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;
OpenPOWER on IntegriCloud