diff options
Diffstat (limited to 'tools/lli/lli.cpp')
| -rw-r--r-- | tools/lli/lli.cpp | 40 | 
1 files changed, 28 insertions, 12 deletions
diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 4c377805e6a3..a756459ecc23 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -23,16 +23,26 @@  #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/Support/raw_ostream.h" -#include "llvm/System/Process.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Signals.h"  #include "llvm/Target/TargetSelect.h"  #include <cerrno> + +#ifdef __CYGWIN__ +#include <cygwin/version.h> +#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<bool> UseMCJIT( +    "use-mcjit", cl::desc("Enable use of the MC-based JIT (if available)"), +    cl::init(false)); +    // Determine optimization level.    cl::opt<char>    OptLevel("O", @@ -99,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  }  //===----------------------------------------------------------------------===// @@ -125,20 +142,15 @@ int main(int argc, char **argv, char * const *envp) {      sys::Process::PreventCoreFiles();    // Load the bitcode... -  std::string ErrorMsg; -  Module *Mod = NULL; -  if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFile,&ErrorMsg)){ -    Mod = getLazyBitcodeModule(Buffer, Context, &ErrorMsg); -    if (!Mod) delete Buffer; -  } -   +  SMDiagnostic Err; +  Module *Mod = ParseIRFile(InputFile, Err, Context);    if (!Mod) { -    errs() << argv[0] << ": error loading program '" << InputFile << "': " -           << ErrorMsg << "\n"; -    exit(1); +    Err.Print(argv[0], errs()); +    return 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"; @@ -160,6 +172,10 @@ int main(int argc, char **argv, char * const *envp) {    if (!TargetTriple.empty())      Mod->setTargetTriple(Triple::normalize(TargetTriple)); +  // Enable MCJIT, if desired. +  if (UseMCJIT) +    builder.setUseMCJIT(true); +    CodeGenOpt::Level OLvl = CodeGenOpt::Default;    switch (OptLevel) {    default:  | 
