X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flli%2Flli.cpp;h=a756459ecc230660ef5e90c5baa010d6e3bde01e;hb=a75ce9f5d2236d93c117e861e60e6f3f748c9555;hp=f9d86d75b1a70a3f67a65bde62ddcb8abb934ceb;hpb=81ce3ed08c4df0c246b378c8972062d2f49f1ce9;p=oota-llvm.git diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index f9d86d75b1a..a756459ecc2 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -15,24 +15,34 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" -#include "llvm/ModuleProvider.h" #include "llvm/Type.h" +#include "llvm/ADT/Triple.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/ExecutionEngine/JIT.h" #include "llvm/ExecutionEngine/JITEventListener.h" +#include "llvm/ExecutionEngine/MCJIT.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/IRReader.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" -#include "llvm/System/Process.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Signals.h" #include "llvm/Target/TargetSelect.h" -#include #include + +#ifdef __CYGWIN__ +#include +#if defined(CYGWIN_VERSION_DLL_MAJOR) && CYGWIN_VERSION_DLL_MAJOR<1007 +#define DO_NOTHING_ATEXIT 1 +#endif +#endif + using namespace llvm; namespace { @@ -46,6 +56,10 @@ namespace { cl::desc("Force interpretation: disable JIT"), cl::init(false)); + cl::opt UseMCJIT( + "use-mcjit", cl::desc("Enable use of the MC-based JIT (if available)"), + cl::init(false)); + // Determine optimization level. cl::opt OptLevel("O", @@ -58,6 +72,22 @@ namespace { cl::opt TargetTriple("mtriple", cl::desc("Override target triple for module")); + cl::opt + MArch("march", + cl::desc("Architecture to generate assembly for (see --version)")); + + cl::opt + MCPU("mcpu", + cl::desc("Target a specific cpu type (-mcpu=help for details)"), + cl::value_desc("cpu-name"), + cl::init("")); + + cl::list + MAttrs("mattr", + cl::CommaSeparated, + cl::desc("Target specific attributes (-mattr=help for details)"), + cl::value_desc("a1,+a2,-a3,...")); + cl::opt EntryFunc("entry-function", cl::desc("Specify the entry function (default = 'main') " @@ -83,8 +113,11 @@ namespace { static ExecutionEngine *EE = 0; static void do_shutdown() { + // Cygwin-1.5 invokes DLL's dtors before atexit handler. +#ifndef DO_NOTHING_ATEXIT delete EE; llvm_shutdown(); +#endif } //===----------------------------------------------------------------------===// @@ -109,29 +142,27 @@ int main(int argc, char **argv, char * const *envp) { sys::Process::PreventCoreFiles(); // Load the bitcode... - std::string ErrorMsg; - ModuleProvider *MP = NULL; - if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFile,&ErrorMsg)){ - MP = getBitcodeModuleProvider(Buffer, Context, &ErrorMsg); - if (!MP) delete Buffer; - } - - if (!MP) { - errs() << argv[0] << ": error loading program '" << InputFile << "': " - << ErrorMsg << "\n"; - exit(1); + SMDiagnostic Err; + Module *Mod = ParseIRFile(InputFile, Err, Context); + if (!Mod) { + Err.Print(argv[0], errs()); + return 1; } - // Get the module as the MP could go away once EE takes over. - Module *Mod = NoLazyCompilation - ? MP->materializeModule(&ErrorMsg) : MP->getModule(); - if (!Mod) { - errs() << argv[0] << ": bitcode didn't read correctly.\n"; - errs() << "Reason: " << ErrorMsg << "\n"; - exit(1); + // If not jitting lazily, load the whole bitcode file eagerly too. + std::string ErrorMsg; + if (NoLazyCompilation) { + if (Mod->MaterializeAllPermanently(&ErrorMsg)) { + errs() << argv[0] << ": bitcode didn't read correctly.\n"; + errs() << "Reason: " << ErrorMsg << "\n"; + exit(1); + } } - EngineBuilder builder(MP); + EngineBuilder builder(Mod); + builder.setMArch(MArch); + builder.setMCPU(MCPU); + builder.setMAttrs(MAttrs); builder.setErrorStr(&ErrorMsg); builder.setEngineKind(ForceInterpreter ? EngineKind::Interpreter @@ -139,7 +170,11 @@ int main(int argc, char **argv, char * const *envp) { // If we are supposed to override the target triple, do so now. if (!TargetTriple.empty()) - Mod->setTargetTriple(TargetTriple); + Mod->setTargetTriple(Triple::normalize(TargetTriple)); + + // Enable MCJIT, if desired. + if (UseMCJIT) + builder.setUseMCJIT(true); CodeGenOpt::Level OLvl = CodeGenOpt::Default; switch (OptLevel) { @@ -148,7 +183,7 @@ int main(int argc, char **argv, char * const *envp) { return 1; case ' ': break; case '0': OLvl = CodeGenOpt::None; break; - case '1': + case '1': OLvl = CodeGenOpt::Less; break; case '2': OLvl = CodeGenOpt::Default; break; case '3': OLvl = CodeGenOpt::Aggressive; break; } @@ -163,11 +198,9 @@ int main(int argc, char **argv, char * const *envp) { exit(1); } - EE->RegisterJITEventListener(createMacOSJITEventListener()); EE->RegisterJITEventListener(createOProfileJITEventListener()); - if (NoLazyCompilation) - EE->DisableLazyCompilation(); + EE->DisableLazyCompilation(NoLazyCompilation); // If the user specifically requested an argv[0] to pass into the program, // do it now. @@ -176,7 +209,7 @@ int main(int argc, char **argv, char * const *envp) { } else { // Otherwise, if there is a .bc suffix on the executable strip it off, it // might confuse the program. - if (InputFile.rfind(".bc") == InputFile.length() - 3) + if (StringRef(InputFile).endswith(".bc")) InputFile.erase(InputFile.length() - 3); } @@ -196,8 +229,9 @@ int main(int argc, char **argv, char * const *envp) { // 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::VoidTy, - Type::Int32Ty, NULL); + Constant *Exit = Mod->getOrInsertFunction("exit", Type::getVoidTy(Context), + Type::getInt32Ty(Context), + NULL); // Reset errno to zero on entry to main. errno = 0;