lli.cpp revision d6840ac046715061d42e4dd5375cd9ed6dd3dca4
1//===- lli.cpp - LLVM Interpreter / Dynamic compiler ----------------------===//
2//
3// This utility provides a way to execute LLVM bytecode without static
4// compilation.  This consists of a very simple and slow (but portable)
5// interpreter, along with capability for system specific dynamic compilers.  At
6// runtime, the fastest (stable) execution engine is selected to run the
7// program.  This means the JIT compiler for the current platform if it's
8// available.
9//
10//===----------------------------------------------------------------------===//
11
12#include "ExecutionEngine.h"
13#include "Support/CommandLine.h"
14#include "llvm/Bytecode/Reader.h"
15#include "llvm/Module.h"
16#include "llvm/Target/TargetMachineImpls.h"
17
18namespace {
19  cl::opt<std::string>
20  InputFile(cl::desc("<input bytecode>"), cl::Positional, cl::init("-"));
21
22  cl::list<std::string>
23  InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>..."));
24
25  cl::opt<std::string>
26  MainFunction ("f", cl::desc("Function to execute"), cl::init("main"),
27		cl::value_desc("function name"));
28
29  cl::opt<bool> DebugMode("d", cl::desc("Start program in debugger"));
30
31  cl::opt<bool> TraceMode("trace", cl::desc("Enable Tracing"));
32
33  cl::opt<bool> ForceInterpreter("force-interpreter",
34				 cl::desc("Force interpretation: disable JIT"),
35				 cl::init(true));
36}
37
38//===----------------------------------------------------------------------===//
39// ExecutionEngine Class Implementation
40//
41
42ExecutionEngine::~ExecutionEngine() {
43  delete &CurMod;
44}
45
46//===----------------------------------------------------------------------===//
47// main Driver function
48//
49int main(int argc, char** argv) {
50  cl::ParseCommandLineOptions(argc, argv,
51			      " llvm interpreter & dynamic compiler\n");
52
53  // Load the bytecode...
54  std::string ErrorMsg;
55  Module *M = ParseBytecodeFile(InputFile, &ErrorMsg);
56  if (M == 0) {
57    std::cout << "Error parsing '" << InputFile << "': "
58              << ErrorMsg << "\n";
59    exit(1);
60  }
61
62#if 0
63  // Link in the runtime library for LLI...
64  std::string RuntimeLib = getCurrentExecutablePath();
65  if (!RuntimeLib.empty()) RuntimeLib += "/";
66  RuntimeLib += "RuntimeLib.bc";
67
68  if (Module *SupportLib = ParseBytecodeFile(RuntimeLib, &ErrorMsg)) {
69    if (LinkModules(M, SupportLib, &ErrorMsg))
70      std::cerr << "Error Linking runtime library into current module: "
71                << ErrorMsg << "\n";
72  } else {
73    std::cerr << "Error loading runtime library '"+RuntimeLib+"': "
74              << ErrorMsg << "\n";
75  }
76#endif
77
78  // FIXME: This should look at the PointerSize and endianness of the bytecode
79  // file to determine the endianness and pointer size of target machine to use.
80  unsigned Config = TM::PtrSize64 | TM::BigEndian;
81
82  ExecutionEngine *EE = 0;
83
84  // If there is nothing that is forcing us to use the interpreter, make a JIT.
85  if (!ForceInterpreter && !DebugMode && !TraceMode)
86    EE = ExecutionEngine::createJIT(M, Config);
87
88  // If we can't make a JIT, make an interpreter instead.
89  if (EE == 0)
90    EE = ExecutionEngine::createInterpreter(M, Config, DebugMode, TraceMode);
91
92  // Add the module name to the start of the argv vector...
93  InputArgv.insert(InputArgv.begin(), InputFile);
94
95  // Run the main function!
96  int ExitCode = EE->run(MainFunction, InputArgv);
97
98  // Now that we are done executing the program, shut down the execution engine
99  delete EE;
100  return ExitCode;
101}
102