Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 1 | //===- Debugger.h - LLVM debugger library interface -------------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 84e66db | 2007-12-29 19:59:42 +0000 | [diff] [blame^] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Dan Gohman | f17a25c | 2007-07-18 16:29:46 +0000 | [diff] [blame] | 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file defines the LLVM source-level debugger library interface. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #ifndef LLVM_DEBUGGER_DEBUGGER_H |
| 15 | #define LLVM_DEBUGGER_DEBUGGER_H |
| 16 | |
| 17 | #include <string> |
| 18 | #include <vector> |
| 19 | |
| 20 | namespace llvm { |
| 21 | class Module; |
| 22 | class InferiorProcess; |
| 23 | |
| 24 | /// Debugger class - This class implements the LLVM source-level debugger. |
| 25 | /// This allows clients to handle the user IO processing without having to |
| 26 | /// worry about how the debugger itself works. |
| 27 | /// |
| 28 | class Debugger { |
| 29 | // State the debugger needs when starting and stopping the program. |
| 30 | std::vector<std::string> ProgramArguments; |
| 31 | |
| 32 | // The environment to run the program with. This should eventually be |
| 33 | // changed to vector of strings when we allow the user to edit the |
| 34 | // environment. |
| 35 | const char * const *Environment; |
| 36 | |
| 37 | // Program - The currently loaded program, or null if none is loaded. |
| 38 | Module *Program; |
| 39 | |
| 40 | // Process - The currently executing inferior process. |
| 41 | InferiorProcess *Process; |
| 42 | |
| 43 | Debugger(const Debugger &); // DO NOT IMPLEMENT |
| 44 | void operator=(const Debugger &); // DO NOT IMPLEMENT |
| 45 | public: |
| 46 | Debugger(); |
| 47 | ~Debugger(); |
| 48 | |
| 49 | //===------------------------------------------------------------------===// |
| 50 | // Methods for manipulating and inspecting the execution environment. |
| 51 | // |
| 52 | |
| 53 | /// initializeEnvironment - Specify the environment the program should run |
| 54 | /// with. This is used to initialize the environment of the program to the |
| 55 | /// environment of the debugger. |
| 56 | void initializeEnvironment(const char *const *envp) { |
| 57 | Environment = envp; |
| 58 | } |
| 59 | |
| 60 | /// setWorkingDirectory - Specify the working directory for the program to |
| 61 | /// be started from. |
| 62 | void setWorkingDirectory(const std::string &Dir) { |
| 63 | // FIXME: implement |
| 64 | } |
| 65 | |
| 66 | template<typename It> |
| 67 | void setProgramArguments(It I, It E) { |
| 68 | ProgramArguments.assign(I, E); |
| 69 | } |
| 70 | unsigned getNumProgramArguments() const { return ProgramArguments.size(); } |
| 71 | const std::string &getProgramArgument(unsigned i) const { |
| 72 | return ProgramArguments[i]; |
| 73 | } |
| 74 | |
| 75 | |
| 76 | //===------------------------------------------------------------------===// |
| 77 | // Methods for manipulating and inspecting the program currently loaded. |
| 78 | // |
| 79 | |
| 80 | /// isProgramLoaded - Return true if there is a program currently loaded. |
| 81 | /// |
| 82 | bool isProgramLoaded() const { return Program != 0; } |
| 83 | |
| 84 | /// getProgram - Return the LLVM module corresponding to the program. |
| 85 | /// |
| 86 | Module *getProgram() const { return Program; } |
| 87 | |
| 88 | /// getProgramPath - Get the path of the currently loaded program, or an |
| 89 | /// empty string if none is loaded. |
| 90 | std::string getProgramPath() const; |
| 91 | |
| 92 | /// loadProgram - If a program is currently loaded, unload it. Then search |
| 93 | /// the PATH for the specified program, loading it when found. If the |
| 94 | /// specified program cannot be found, an exception is thrown to indicate |
| 95 | /// the error. |
| 96 | void loadProgram(const std::string &Path); |
| 97 | |
| 98 | /// unloadProgram - If a program is running, kill it, then unload all traces |
| 99 | /// of the current program. If no program is loaded, this method silently |
| 100 | /// succeeds. |
| 101 | void unloadProgram(); |
| 102 | |
| 103 | //===------------------------------------------------------------------===// |
| 104 | // Methods for manipulating and inspecting the program currently running. |
| 105 | // |
| 106 | // If the program is running, and the debugger is active, then we know that |
| 107 | // the program has stopped. This being the case, we can inspect the |
| 108 | // program, ask it for its source location, set breakpoints, etc. |
| 109 | // |
| 110 | |
| 111 | /// isProgramRunning - Return true if a program is loaded and has a |
| 112 | /// currently active instance. |
| 113 | bool isProgramRunning() const { return Process != 0; } |
| 114 | |
| 115 | /// getRunningProcess - If there is no program running, throw an exception. |
| 116 | /// Otherwise return the running process so that it can be inspected by the |
| 117 | /// debugger. |
| 118 | const InferiorProcess &getRunningProcess() const { |
| 119 | if (Process == 0) throw "No process running."; |
| 120 | return *Process; |
| 121 | } |
| 122 | |
| 123 | /// createProgram - Create an instance of the currently loaded program, |
| 124 | /// killing off any existing one. This creates the program and stops it at |
| 125 | /// the first possible moment. If there is no program loaded or if there is |
| 126 | /// a problem starting the program, this method throws an exception. |
| 127 | void createProgram(); |
| 128 | |
| 129 | /// killProgram - If the program is currently executing, kill off the |
| 130 | /// process and free up any state related to the currently running program. |
| 131 | /// If there is no program currently running, this just silently succeeds. |
| 132 | /// If something horrible happens when killing the program, an exception |
| 133 | /// gets thrown. |
| 134 | void killProgram(); |
| 135 | |
| 136 | |
| 137 | //===------------------------------------------------------------------===// |
| 138 | // Methods for continuing execution. These methods continue the execution |
| 139 | // of the program by some amount. If the program is successfully stopped, |
| 140 | // execution returns, otherwise an exception is thrown. |
| 141 | // |
| 142 | // NOTE: These methods should always be used in preference to directly |
| 143 | // accessing the Dbg object, because these will delete the Process object if |
| 144 | // the process unexpectedly dies. |
| 145 | // |
| 146 | |
| 147 | /// stepProgram - Implement the 'step' command, continuing execution until |
| 148 | /// the next possible stop point. |
| 149 | void stepProgram(); |
| 150 | |
| 151 | /// nextProgram - Implement the 'next' command, continuing execution until |
| 152 | /// the next possible stop point that is in the current function. |
| 153 | void nextProgram(); |
| 154 | |
| 155 | /// finishProgram - Implement the 'finish' command, continuing execution |
| 156 | /// until the specified frame ID returns. |
| 157 | void finishProgram(void *Frame); |
| 158 | |
| 159 | /// contProgram - Implement the 'cont' command, continuing execution until |
| 160 | /// the next breakpoint is encountered. |
| 161 | void contProgram(); |
| 162 | }; |
| 163 | |
| 164 | class NonErrorException { |
| 165 | std::string Message; |
| 166 | public: |
| 167 | NonErrorException(const std::string &M) : Message(M) {} |
| 168 | const std::string &getMessage() const { return Message; } |
| 169 | }; |
| 170 | |
| 171 | } // end namespace llvm |
| 172 | |
| 173 | #endif |