Add possibility of using arbitrary to to execute stuff from bugpoint.
[oota-llvm.git] / tools / bugpoint / ToolRunner.h
1 //===-- tools/bugpoint/ToolRunner.h -----------------------------*- 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 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 bitcode 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   static AbstractInterpreter* createCustom(const std::string &ProgramPath,
102                                            std::string &Message,
103                                            const std::string &ExecCommandLine);
104
105
106   virtual ~AbstractInterpreter() {}
107
108   /// compileProgram - Compile the specified program from bitcode to executable
109   /// code.  This does not produce any output, it is only used when debugging
110   /// the code generator.  If the code generator fails, an exception should be
111   /// thrown, otherwise, this function will just return.
112   virtual void compileProgram(const std::string &Bitcode) {}
113
114   /// OutputCode - Compile the specified program from bitcode to code
115   /// understood by the GCC driver (either C or asm).  If the code generator
116   /// fails, an exception should be thrown, otherwise, this function returns the
117   /// type of code emitted.
118   virtual GCC::FileType OutputCode(const std::string &Bitcode,
119                                    sys::Path &OutFile) {
120     throw std::string("OutputCode not supported by this AbstractInterpreter!");
121   }
122   
123   /// ExecuteProgram - Run the specified bitcode file, emitting output to the
124   /// specified filename.  This returns the exit code of the program.
125   ///
126   virtual int ExecuteProgram(const std::string &Bitcode,
127                              const std::vector<std::string> &Args,
128                              const std::string &InputFile,
129                              const std::string &OutputFile,
130                              const std::vector<std::string> &GCCArgs =
131                                std::vector<std::string>(),
132                              const std::vector<std::string> &SharedLibs =
133                                std::vector<std::string>(),
134                              unsigned Timeout = 0,
135                              unsigned MemoryLimit = 0) = 0;
136 };
137
138 //===---------------------------------------------------------------------===//
139 // CBE Implementation of AbstractIntepreter interface
140 //
141 class CBE : public AbstractInterpreter {
142   sys::Path LLCPath;          // The path to the `llc' executable
143   std::vector<std::string> ToolArgs; // Extra args to pass to LLC
144   GCC *gcc;
145 public:
146   CBE(const sys::Path &llcPath, GCC *Gcc,
147       const std::vector<std::string> *Args) : LLCPath(llcPath), gcc(Gcc) {
148     ToolArgs.clear ();
149     if (Args) { ToolArgs = *Args; }
150   }
151   ~CBE() { delete gcc; }
152
153   /// compileProgram - Compile the specified program from bitcode to executable
154   /// code.  This does not produce any output, it is only used when debugging
155   /// the code generator.  If the code generator fails, an exception should be
156   /// thrown, otherwise, this function will just return.
157   virtual void compileProgram(const std::string &Bitcode);
158
159   virtual int ExecuteProgram(const std::string &Bitcode,
160                              const std::vector<std::string> &Args,
161                              const std::string &InputFile,
162                              const std::string &OutputFile,
163                              const std::vector<std::string> &GCCArgs =
164                                std::vector<std::string>(),
165                              const std::vector<std::string> &SharedLibs =
166                                std::vector<std::string>(),
167                              unsigned Timeout = 0,
168                              unsigned MemoryLimit = 0);
169
170   /// OutputCode - Compile the specified program from bitcode to code
171   /// understood by the GCC driver (either C or asm).  If the code generator
172   /// fails, an exception should be thrown, otherwise, this function returns the
173   /// type of code emitted.
174   virtual GCC::FileType OutputCode(const std::string &Bitcode,
175                                    sys::Path &OutFile);
176 };
177
178
179 //===---------------------------------------------------------------------===//
180 // LLC Implementation of AbstractIntepreter interface
181 //
182 class LLC : public AbstractInterpreter {
183   std::string LLCPath;          // The path to the LLC executable
184   std::vector<std::string> ToolArgs; // Extra args to pass to LLC
185   GCC *gcc;
186 public:
187   LLC(const std::string &llcPath, GCC *Gcc,
188     const std::vector<std::string> *Args) : LLCPath(llcPath), gcc(Gcc) {
189     ToolArgs.clear ();
190     if (Args) { ToolArgs = *Args; }
191   }
192   ~LLC() { delete gcc; }
193
194   /// compileProgram - Compile the specified program from bitcode to executable
195   /// code.  This does not produce any output, it is only used when debugging
196   /// the code generator.  If the code generator fails, an exception should be
197   /// thrown, otherwise, this function will just return.
198   virtual void compileProgram(const std::string &Bitcode);
199
200   virtual int ExecuteProgram(const std::string &Bitcode,
201                              const std::vector<std::string> &Args,
202                              const std::string &InputFile,
203                              const std::string &OutputFile,
204                              const std::vector<std::string> &GCCArgs =
205                                std::vector<std::string>(),
206                              const std::vector<std::string> &SharedLibs =
207                                 std::vector<std::string>(),
208                              unsigned Timeout = 0,
209                              unsigned MemoryLimit = 0);
210
211   virtual GCC::FileType OutputCode(const std::string &Bitcode,
212                                    sys::Path &OutFile);
213   
214 };
215
216 } // End llvm namespace
217
218 #endif