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> |
| 24 | DebugMode("debug", cl::desc("Start program in debugger")); |
| 25 | |
| 26 | static cl::alias |
| 27 | DebugModeA("d", cl::desc("Alias for -debug"), cl::aliasopt(DebugMode)); |
| 28 | |
| 29 | static cl::opt<bool> |
| 30 | TraceMode("trace", cl::desc("Enable Tracing")); |
| 31 | |
| 32 | static cl::opt<bool> |
| 33 | ProfileMode("profile", cl::desc("Enable Profiling [unimp]")); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 34 | |
Chris Lattner | 009f810 | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 35 | |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 36 | //===----------------------------------------------------------------------===// |
| 37 | // Interpreter ctor - Initialize stuff |
| 38 | // |
Chris Lattner | 009f810 | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 39 | Interpreter::Interpreter() : ExitCode(0), Profile(ProfileMode), |
| 40 | Trace(TraceMode), CurFrame(-1) { |
Chris Lattner | c62e2e5 | 2001-10-15 05:51:48 +0000 | [diff] [blame] | 41 | CurMod = 0; |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 42 | loadModule(InputFile); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 43 | |
| 44 | // Initialize the "backend" |
| 45 | initializeExecutionEngine(); |
Chris Lattner | 3f741a5 | 2001-10-30 20:28:46 +0000 | [diff] [blame] | 46 | initializeExternalMethods(); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 47 | } |
| 48 | |
| 49 | //===----------------------------------------------------------------------===// |
| 50 | // main Driver function |
| 51 | // |
| 52 | int main(int argc, char** argv) { |
| 53 | cl::ParseCommandLineOptions(argc, argv, " llvm interpreter\n"); |
| 54 | |
Chris Lattner | f5cad15 | 2002-07-22 02:10:13 +0000 | [diff] [blame] | 55 | // Add the module name to the start of the argv vector... |
| 56 | // |
| 57 | InputArgv.insert(InputArgv.begin(), InputFile); |
| 58 | |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 59 | // Create the interpreter... |
| 60 | Interpreter I; |
| 61 | |
| 62 | // Handle alternate names of the program. If started as llp, enable profiling |
| 63 | // if started as ldb, enable debugging... |
| 64 | // |
| 65 | if (argv[0] == "ldb") // TODO: Obviously incorrect, but you get the idea |
| 66 | DebugMode = true; |
| 67 | else if (argv[0] == "llp") |
| 68 | ProfileMode = true; |
| 69 | |
| 70 | // If running with the profiler, enable it now... |
| 71 | if (ProfileMode) I.enableProfiling(); |
Chris Lattner | 009f810 | 2001-10-27 08:43:52 +0000 | [diff] [blame] | 72 | if (TraceMode) I.enableTracing(); |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 73 | |
| 74 | // Start interpreter into the main function... |
| 75 | // |
Chris Lattner | 6642eec | 2001-10-27 05:54:31 +0000 | [diff] [blame] | 76 | if (!I.callMainMethod(MainFunction, InputArgv) && !DebugMode) { |
Chris Lattner | d7ff578 | 2001-08-23 17:05:04 +0000 | [diff] [blame] | 77 | // If not in debug mode and if the call succeeded, run the code now... |
| 78 | I.run(); |
| 79 | } |
| 80 | |
| 81 | // If debug mode, allow the user to interact... also, if the user pressed |
| 82 | // ctrl-c or execution hit an error, enter the event loop... |
| 83 | if (DebugMode || I.isStopped()) |
| 84 | I.handleUserInput(); |
| 85 | |
| 86 | // Return the status code of the program executed... |
| 87 | return I.getExitCode(); |
| 88 | } |