Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 1 | //===- lli.cpp - LLVM Interpreter / Dynamic compiler ----------------------===// |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 2 | // |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 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. |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 9 | // |
| 10 | //===----------------------------------------------------------------------===// |
| 11 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 12 | #include "ExecutionEngine.h" |
Chris Lattner | cee8f9a | 2001-11-27 00:03:19 +0000 | [diff] [blame] | 13 | #include "Support/CommandLine.h" |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 14 | #include "llvm/Bytecode/Reader.h" |
| 15 | #include "llvm/Module.h" |
| 16 | #include "llvm/Target/TargetMachineImpls.h" |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 17 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 18 | namespace { |
| 19 | cl::opt<std::string> |
| 20 | InputFile(cl::desc("<input bytecode>"), cl::Positional, cl::init("-")); |
Chris Lattner | 5ff62e9 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 21 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 22 | cl::list<std::string> |
| 23 | InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>...")); |
Chris Lattner | 5ff62e9 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 24 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 25 | cl::opt<std::string> |
| 26 | MainFunction ("f", cl::desc("Function to execute"), cl::init("main"), |
| 27 | cl::value_desc("function name")); |
Chris Lattner | 5ff62e9 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 28 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 29 | cl::opt<bool> DebugMode("d", cl::desc("Start program in debugger")); |
Chris Lattner | 5ff62e9 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 30 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 31 | cl::opt<bool> TraceMode("trace", cl::desc("Enable Tracing")); |
Chris Lattner | 5ff62e9 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 32 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 33 | cl::opt<bool> ForceInterpreter("force-interpreter", |
| 34 | cl::desc("Force interpretation: disable JIT"), |
| 35 | cl::init(true)); |
| 36 | } |
Chris Lattner | 43e3f7c | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 37 | |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 38 | //===----------------------------------------------------------------------===// |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 39 | // ExecutionEngine Class Implementation |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 40 | // |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 41 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 42 | ExecutionEngine::~ExecutionEngine() { |
| 43 | delete &CurMod; |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 44 | } |
| 45 | |
| 46 | //===----------------------------------------------------------------------===// |
| 47 | // main Driver function |
| 48 | // |
| 49 | int main(int argc, char** argv) { |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 50 | cl::ParseCommandLineOptions(argc, argv, |
| 51 | " llvm interpreter & dynamic compiler\n"); |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 52 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 53 | // Load the bytecode... |
Chris Lattner | d6840ac | 2002-12-24 00:39:16 +0000 | [diff] [blame^] | 54 | std::string ErrorMsg; |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 55 | Module *M = ParseBytecodeFile(InputFile, &ErrorMsg); |
| 56 | if (M == 0) { |
Chris Lattner | d6840ac | 2002-12-24 00:39:16 +0000 | [diff] [blame^] | 57 | std::cout << "Error parsing '" << InputFile << "': " |
| 58 | << ErrorMsg << "\n"; |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 59 | exit(1); |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 60 | } |
| 61 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 62 | #if 0 |
| 63 | // Link in the runtime library for LLI... |
Chris Lattner | d6840ac | 2002-12-24 00:39:16 +0000 | [diff] [blame^] | 64 | std::string RuntimeLib = getCurrentExecutablePath(); |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 65 | if (!RuntimeLib.empty()) RuntimeLib += "/"; |
| 66 | RuntimeLib += "RuntimeLib.bc"; |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 67 | |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 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; |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 101 | } |