Don't attribute in file headers anymore. See llvmdev for the
[oota-llvm.git] / include / llvm / Debugger / Debugger.h
1 //===- Debugger.h - LLVM debugger library interface -------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
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