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"), |
Chris Lattner | 19669f3 | 2003-05-12 14:31:57 +0000 | [diff] [blame] | 35 | cl::init(false)); |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 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 | // |
John Criswell | 69582b3 | 2003-08-21 21:12:30 +0000 | [diff] [blame] | 49 | int main(int argc, char** argv, const char ** envp) { |
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 | |
Brian Gaeke | 82d8277 | 2003-09-03 20:34:19 +0000 | [diff] [blame^] | 62 | ExecutionEngine *EE = |
| 63 | ExecutionEngine::create (M, ForceInterpreter, DebugMode, TraceMode); |
| 64 | assert (EE && "Couldn't create an ExecutionEngine, not even an interpreter?"); |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 65 | |
| 66 | // Add the module name to the start of the argv vector... |
Brian Gaeke | 6ae73dc | 2003-05-23 20:28:07 +0000 | [diff] [blame] | 67 | // But delete .bc first, since programs (and users) might not expect to |
| 68 | // see it. |
| 69 | const std::string ByteCodeFileSuffix (".bc"); |
| 70 | if (InputFile.rfind (ByteCodeFileSuffix) == |
| 71 | InputFile.length () - ByteCodeFileSuffix.length ()) { |
| 72 | InputFile.erase (InputFile.length () - ByteCodeFileSuffix.length ()); |
| 73 | } |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 74 | InputArgv.insert(InputArgv.begin(), InputFile); |
| 75 | |
| 76 | // Run the main function! |
John Criswell | 69582b3 | 2003-08-21 21:12:30 +0000 | [diff] [blame] | 77 | int ExitCode = EE->run(MainFunction, InputArgv, envp); |
Chris Lattner | fe11a97 | 2002-12-23 23:59:41 +0000 | [diff] [blame] | 78 | |
| 79 | // Now that we are done executing the program, shut down the execution engine |
| 80 | delete EE; |
| 81 | return ExitCode; |
Chris Lattner | 92101ac | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 82 | } |