Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 1 | //===----------------------------------------------------------------------===// |
| 2 | // LLVM INTERPRETER/DEBUGGER/PROFILER UTILITY |
| 3 | // |
| 4 | // This utility is an interactive frontend to almost all other LLVM |
| 5 | // functionality. It may be used as an interpreter to run code, a debugger to |
| 6 | // find problems, or a profiler to analyze execution frequencies. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "Interpreter.h" |
Chris Lattner | 5de2204 | 2001-11-27 00:03:19 +0000 | [diff] [blame] | 11 | #include "Support/CommandLine.h" |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 12 | |
Chris Lattner | 6d044b5 | 2002-07-25 16:39:56 +0000 | [diff] [blame] | 13 | static cl::opt<std::string> |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 14 | InputFile(cl::desc("<input bytecode>"), cl::Positional, cl::init("-")); |
| 15 | |
| 16 | static cl::list<std::string> |
| 17 | InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>...")); |
| 18 | |
Chris Lattner | 6d044b5 | 2002-07-25 16:39:56 +0000 | [diff] [blame] | 19 | static cl::opt<std::string> |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 20 | MainFunction ("f", cl::desc("Function to execute"), cl::init("main"), |
| 21 | cl::value_desc("function name")); |
| 22 | |
| 23 | static cl::opt<bool> |
Chris Lattner | 4f96aa4 | 2002-12-08 05:51:08 +0000 | [diff] [blame] | 24 | DebugMode("d", cl::desc("Start program in debugger")); |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 25 | |
| 26 | static cl::opt<bool> |
| 27 | TraceMode("trace", cl::desc("Enable Tracing")); |
| 28 | |
| 29 | static cl::opt<bool> |
| 30 | ProfileMode("profile", cl::desc("Enable Profiling [unimp]")); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 31 | |
Chris Lattner | 009f810 | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 32 | |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 33 | //===----------------------------------------------------------------------===// |
| 34 | // Interpreter ctor - Initialize stuff |
| 35 | // |
Chris Lattner | 009f810 | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 36 | Interpreter::Interpreter() : ExitCode(0), Profile(ProfileMode), |
| 37 | Trace(TraceMode), CurFrame(-1) { |
Chris Lattner | c62e2e5 | 2001-10-15 05:51:48 +0000 | [diff] [blame] | 38 | CurMod = 0; |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 39 | loadModule(InputFile); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 40 | |
| 41 | // Initialize the "backend" |
| 42 | initializeExecutionEngine(); |
Chris Lattner | 3f741a5 | 2001-10-30 20:28:46 +0000 | [diff] [blame] | 43 | initializeExternalMethods(); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 44 | } |
| 45 | |
| 46 | //===----------------------------------------------------------------------===// |
| 47 | // main Driver function |
| 48 | // |
| 49 | int main(int argc, char** argv) { |
| 50 | cl::ParseCommandLineOptions(argc, argv, " llvm interpreter\n"); |
| 51 | |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 52 | // Add the module name to the start of the argv vector... |
| 53 | // |
| 54 | InputArgv.insert(InputArgv.begin(), InputFile); |
| 55 | |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 56 | // Create the interpreter... |
| 57 | Interpreter I; |
| 58 | |
| 59 | // Handle alternate names of the program. If started as llp, enable profiling |
| 60 | // if started as ldb, enable debugging... |
| 61 | // |
| 62 | if (argv[0] == "ldb") // TODO: Obviously incorrect, but you get the idea |
| 63 | DebugMode = true; |
| 64 | else if (argv[0] == "llp") |
| 65 | ProfileMode = true; |
| 66 | |
| 67 | // If running with the profiler, enable it now... |
| 68 | if (ProfileMode) I.enableProfiling(); |
Chris Lattner | 009f810 | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 69 | if (TraceMode) I.enableTracing(); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 70 | |
| 71 | // Start interpreter into the main function... |
| 72 | // |
Chris Lattner | 6642eec | 2001-10-27 05:54:31 +0000 | [diff] [blame] | 73 | if (!I.callMainMethod(MainFunction, InputArgv) && !DebugMode) { |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 74 | // If not in debug mode and if the call succeeded, run the code now... |
| 75 | I.run(); |
| 76 | } |
| 77 | |
| 78 | // If debug mode, allow the user to interact... also, if the user pressed |
| 79 | // ctrl-c or execution hit an error, enter the event loop... |
| 80 | if (DebugMode || I.isStopped()) |
| 81 | I.handleUserInput(); |
| 82 | |
| 83 | // Return the status code of the program executed... |
| 84 | return I.getExitCode(); |
| 85 | } |