a4dc9150ca0b789d8d9f4e6c527dceb09fc388c3
[oota-llvm.git] / tools / bugpoint / ToolRunner.h
1 //===-- tools/bugpoint/ToolRunner.h -----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file exposes an abstraction around a platform C compiler, used to
11 // compile C and assembly code.  It also exposes an "AbstractIntepreter"
12 // interface, which is used to execute code using one of the LLVM execution
13 // engines.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #ifndef BUGPOINT_TOOLRUNNER_H
18 #define BUGPOINT_TOOLRUNNER_H
19
20 #include "llvm/Support/SystemUtils.h"
21 #include <exception>
22 #include <vector>
23
24 namespace llvm {
25
26 class CBE;
27 class LLC;
28
29 /// ToolExecutionError - An instance of this class is thrown by the
30 /// AbstractInterpreter instances if there is an error running a tool (e.g., LLC
31 /// crashes) which prevents execution of the program.
32 ///
33 class ToolExecutionError : std::exception {
34   std::string Message;
35 public:
36   explicit ToolExecutionError(const std::string &M) : Message(M) {}
37   virtual ~ToolExecutionError() throw();
38   virtual const char* what() const throw() { return Message.c_str(); }
39 };
40
41
42 //===---------------------------------------------------------------------===//
43 // GCC abstraction
44 //
45 class GCC {
46   sys::Path GCCPath;          // The path to the gcc executable
47   sys::Path RSHPath;          // The path to the rsh executable
48   GCC(const sys::Path &gccPath, const sys::Path &rshPath)
49     : GCCPath(gccPath), RSHPath(rshPath) { }
50 public:
51   enum FileType { AsmFile, CFile };
52
53   static GCC *create(const std::string &ProgramPath, std::string &Message);
54
55   /// ExecuteProgram - Execute the program specified by "ProgramFile" (which is
56   /// either a .s file, or a .c file, specified by FileType), with the specified
57   /// arguments.  Standard input is specified with InputFile, and standard
58   /// Output is captured to the specified OutputFile location.  The SharedLibs
59   /// option specifies optional native shared objects that can be loaded into
60   /// the program for execution.
61   ///
62   int ExecuteProgram(const std::string &ProgramFile,
63                      const std::vector<std::string> &Args,
64                      FileType fileType,
65                      const std::string &InputFile,
66                      const std::string &OutputFile,
67                      const std::vector<std::string> &GCCArgs =
68                          std::vector<std::string>(), 
69                      unsigned Timeout = 0,
70                      unsigned MemoryLimit = 0);
71
72   /// MakeSharedObject - This compiles the specified file (which is either a .c
73   /// file or a .s file) into a shared object.
74   ///
75   int MakeSharedObject(const std::string &InputFile, FileType fileType,
76                        std::string &OutputFile,
77                        const std::vector<std::string> &ArgsForGCC);
78 };
79
80
81 //===---------------------------------------------------------------------===//
82 /// AbstractInterpreter Class - Subclasses of this class are used to execute
83 /// LLVM bytecode in a variety of ways.  This abstract interface hides this
84 /// complexity behind a simple interface.
85 ///
86 class AbstractInterpreter {
87 public:
88   static CBE *createCBE(const std::string &ProgramPath, std::string &Message,
89                         const std::vector<std::string> *Args = 0);
90   static LLC *createLLC(const std::string &ProgramPath, std::string &Message,
91                         const std::vector<std::string> *Args = 0);
92
93   static AbstractInterpreter* createLLI(const std::string &ProgramPath,
94                                         std::string &Message,
95                                         const std::vector<std::string> *Args=0);
96
97   static AbstractInterpreter* createJIT(const std::string &ProgramPath,
98                                         std::string &Message,
99                                         const std::vector<std::string> *Args=0);
100
101
102   virtual ~AbstractInterpreter() {}
103
104   /// compileProgram - Compile the specified program from bytecode to executable
105   /// code.  This does not produce any output, it is only used when debugging
106   /// the code generator.  If the code generator fails, an exception should be
107   /// thrown, otherwise, this function will just return.
108   virtual void compileProgram(const std::string &Bytecode) {}
109
110   /// OutputCode - Compile the specified program from bytecode to code
111   /// understood by the GCC driver (either C or asm).  If the code generator
112   /// fails, an exception should be thrown, otherwise, this function returns the
113   /// type of code emitted.
114   virtual GCC::FileType OutputCode(const std::string &Bytecode,
115                                    sys::Path &OutFile) {
116     throw std::string("OutputCode not supported by this AbstractInterpreter!");
117   }
118   
119   /// ExecuteProgram - Run the specified bytecode file, emitting output to the
120   /// specified filename.  This returns the exit code of the program.
121   ///
122   virtual int ExecuteProgram(const std::string &Bytecode,
123                              const std::vector<std::string> &Args,
124                              const std::string &InputFile,
125                              const std::string &OutputFile,
126                              const std::vector<std::string> &GCCArgs =
127                                std::vector<std::string>(),
128                              const std::vector<std::string> &SharedLibs =
129                                std::vector<std::string>(),
130                              unsigned Timeout = 0,
131                              unsigned MemoryLimit = 0) = 0;
132 };
133
134 //===---------------------------------------------------------------------===//
135 // CBE Implementation of AbstractIntepreter interface
136 //
137 class CBE : public AbstractInterpreter {
138   sys::Path LLCPath;          // The path to the `llc' executable
139   std::vector<std::string> ToolArgs; // Extra args to pass to LLC
140   GCC *gcc;
141 public:
142   CBE(const sys::Path &llcPath, GCC *Gcc,
143       const std::vector<std::string> *Args) : LLCPath(llcPath), gcc(Gcc) {
144     ToolArgs.clear ();
145     if (Args) { ToolArgs = *Args; }
146   }
147   ~CBE() { delete gcc; }
148
149   /// compileProgram - Compile the specified program from bytecode to executable
150   /// code.  This does not produce any output, it is only used when debugging
151   /// the code generator.  If the code generator fails, an exception should be
152   /// thrown, otherwise, this function will just return.
153   virtual void compileProgram(const std::string &Bytecode);
154
155   virtual int ExecuteProgram(const std::string &Bytecode,
156                              const std::vector<std::string> &Args,
157                              const std::string &InputFile,
158                              const std::string &OutputFile,
159                              const std::vector<std::string> &GCCArgs =
160                                std::vector<std::string>(),
161                              const std::vector<std::string> &SharedLibs =
162                                std::vector<std::string>(),
163                              unsigned Timeout = 0,
164                              unsigned MemoryLimit = 0);
165
166   /// OutputCode - Compile the specified program from bytecode to code
167   /// understood by the GCC driver (either C or asm).  If the code generator
168   /// fails, an exception should be thrown, otherwise, this function returns the
169   /// type of code emitted.
170   virtual GCC::FileType OutputCode(const std::string &Bytecode,
171                                    sys::Path &OutFile);
172 };
173
174
175 //===---------------------------------------------------------------------===//
176 // LLC Implementation of AbstractIntepreter interface
177 //
178 class LLC : public AbstractInterpreter {
179   std::string LLCPath;          // The path to the LLC executable
180   std::vector<std::string> ToolArgs; // Extra args to pass to LLC
181   GCC *gcc;
182 public:
183   LLC(const std::string &llcPath, GCC *Gcc,
184     const std::vector<std::string> *Args) : LLCPath(llcPath), gcc(Gcc) {
185     ToolArgs.clear ();
186     if (Args) { ToolArgs = *Args; }
187   }
188   ~LLC() { delete gcc; }
189
190   /// compileProgram - Compile the specified program from bytecode to executable
191   /// code.  This does not produce any output, it is only used when debugging
192   /// the code generator.  If the code generator fails, an exception should be
193   /// thrown, otherwise, this function will just return.
194   virtual void compileProgram(const std::string &Bytecode);
195
196   virtual int ExecuteProgram(const std::string &Bytecode,
197                              const std::vector<std::string> &Args,
198                              const std::string &InputFile,
199                              const std::string &OutputFile,
200                              const std::vector<std::string> &GCCArgs =
201                                std::vector<std::string>(),
202                              const std::vector<std::string> &SharedLibs =
203                                 std::vector<std::string>(),
204                              unsigned Timeout = 0,
205                              unsigned MemoryLimit = 0);
206
207   virtual GCC::FileType OutputCode(const std::string &Bytecode,
208                                    sys::Path &OutFile);
209   
210 };
211
212 } // End llvm namespace
213
214 #endif