diff options
author | Eli Bendersky <eli.bendersky@intel.com> | 2012-01-16 08:56:09 +0000 |
---|---|---|
committer | Eli Bendersky <eli.bendersky@intel.com> | 2012-01-16 08:56:09 +0000 |
commit | a66a18505e07a4e72d6fa7e85663937a257577f3 (patch) | |
tree | 1c14e0bc22014ae756f795ee8c9a3108bbcb8df1 /tools/lli | |
parent | 810d6d3354a31f24125abef831e4afccbbbe973d (diff) |
Adding a basic ELF dynamic loader and MC-JIT for ELF. Functionality is currently basic and will be enhanced with future patches.
Patch developed by Andy Kaylor and Daniel Malea. Reviewed on llvm-commits.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148231 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/lli')
-rw-r--r-- | tools/lli/lli.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 23025b4931..0e8d1d8953 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -95,12 +95,12 @@ namespace { "of the executable"), cl::value_desc("function"), cl::init("main")); - + cl::opt<std::string> FakeArgv0("fake-argv0", cl::desc("Override the 'argv[0]' value passed into the executing" " program"), cl::value_desc("executable")); - + cl::opt<bool> DisableCoreFiles("disable-core-files", cl::Hidden, cl::desc("Disable emission of core files if possible")); @@ -159,7 +159,7 @@ static void do_shutdown() { int main(int argc, char **argv, char * const *envp) { sys::PrintStackTraceOnErrorSignal(); PrettyStackTraceProgram X(argc, argv); - + LLVMContext &Context = getGlobalContext(); atexit(do_shutdown); // Call llvm_shutdown() on exit. @@ -174,7 +174,7 @@ int main(int argc, char **argv, char * const *envp) { // If the user doesn't want core files, disable them. if (DisableCoreFiles) sys::Process::PreventCoreFiles(); - + // Load the bitcode... SMDiagnostic Err; Module *Mod = ParseIRFile(InputFile, Err, Context); @@ -210,9 +210,11 @@ int main(int argc, char **argv, char * const *envp) { if (!TargetTriple.empty()) Mod->setTargetTriple(Triple::normalize(TargetTriple)); - // Enable MCJIT, if desired. - if (UseMCJIT) + // Enable MCJIT if desired. + if (UseMCJIT && !ForceInterpreter) { builder.setUseMCJIT(true); + builder.setJITMemoryManager(JITMemoryManager::CreateDefaultMemManager()); + } CodeGenOpt::Level OLvl = CodeGenOpt::Default; switch (OptLevel) { @@ -265,15 +267,15 @@ int main(int argc, char **argv, char * const *envp) { return -1; } - // If the program doesn't explicitly call exit, we will need the Exit - // function later on to make an explicit call, so get the function now. + // If the program doesn't explicitly call exit, we will need the Exit + // function later on to make an explicit call, so get the function now. Constant *Exit = Mod->getOrInsertFunction("exit", Type::getVoidTy(Context), Type::getInt32Ty(Context), NULL); - + // Reset errno to zero on entry to main. errno = 0; - + // Run static constructors. EE->runStaticConstructorsDestructors(false); @@ -290,8 +292,8 @@ int main(int argc, char **argv, char * const *envp) { // Run static destructors. EE->runStaticConstructorsDestructors(true); - - // If the program didn't call exit explicitly, we should call it now. + + // If the program didn't call exit explicitly, we should call it now. // This ensures that any atexit handlers get called correctly. if (Function *ExitF = dyn_cast<Function>(Exit)) { std::vector<GenericValue> Args; |