54a48111f86b50263e8f3ebe5a0963270f6ce011
[oota-llvm.git] / tools / bugpoint / ToolRunner.cpp
1 //===-- ToolRunner.cpp ----------------------------------------------------===//
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 implements the interfaces described in the ToolRunner.h file.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "toolrunner"
15 #include "ToolRunner.h"
16 #include "llvm/Config/config.h"   // for HAVE_LINK_R
17 #include "llvm/Support/CommandLine.h"
18 #include "llvm/Support/Debug.h"
19 #include "llvm/Support/FileUtilities.h"
20 #include "llvm/Support/Program.h"
21 #include "llvm/Support/raw_ostream.h"
22 #include <fstream>
23 #include <sstream>
24 using namespace llvm;
25
26 namespace llvm {
27   cl::opt<bool>
28   SaveTemps("save-temps", cl::init(false), cl::desc("Save temporary files"));
29 }
30
31 namespace {
32   cl::opt<std::string>
33   RemoteClient("remote-client",
34                cl::desc("Remote execution client (rsh/ssh)"));
35
36   cl::opt<std::string>
37   RemoteHost("remote-host",
38              cl::desc("Remote execution (rsh/ssh) host"));
39
40   cl::opt<std::string>
41   RemotePort("remote-port",
42              cl::desc("Remote execution (rsh/ssh) port"));
43
44   cl::opt<std::string>
45   RemoteUser("remote-user",
46              cl::desc("Remote execution (rsh/ssh) user id"));
47
48   cl::opt<std::string>
49   RemoteExtra("remote-extra-options",
50           cl::desc("Remote execution (rsh/ssh) extra options"));
51 }
52
53 /// RunProgramWithTimeout - This function provides an alternate interface
54 /// to the sys::Program::ExecuteAndWait interface.
55 /// @see sys::Program::ExecuteAndWait
56 static int RunProgramWithTimeout(const sys::Path &ProgramPath,
57                                  const char **Args,
58                                  const sys::Path &StdInFile,
59                                  const sys::Path &StdOutFile,
60                                  const sys::Path &StdErrFile,
61                                  unsigned NumSeconds = 0,
62                                  unsigned MemoryLimit = 0,
63                                  std::string *ErrMsg = 0) {
64   const sys::Path* redirects[3];
65   redirects[0] = &StdInFile;
66   redirects[1] = &StdOutFile;
67   redirects[2] = &StdErrFile;
68
69 #if 0 // For debug purposes
70   {
71     errs() << "RUN:";
72     for (unsigned i = 0; Args[i]; ++i)
73       errs() << " " << Args[i];
74     errs() << "\n";
75   }
76 #endif
77
78   return sys::ExecuteAndWait(ProgramPath, Args, 0, redirects, NumSeconds,
79                              MemoryLimit, ErrMsg);
80 }
81
82 /// RunProgramRemotelyWithTimeout - This function runs the given program
83 /// remotely using the given remote client and the sys::Program::ExecuteAndWait.
84 /// Returns the remote program exit code or reports a remote client error if it
85 /// fails. Remote client is required to return 255 if it failed or program exit
86 /// code otherwise.
87 /// @see sys::Program::ExecuteAndWait
88 static int RunProgramRemotelyWithTimeout(const sys::Path &RemoteClientPath,
89                                          const char **Args,
90                                          const sys::Path &StdInFile,
91                                          const sys::Path &StdOutFile,
92                                          const sys::Path &StdErrFile,
93                                          unsigned NumSeconds = 0,
94                                          unsigned MemoryLimit = 0) {
95   const sys::Path* redirects[3];
96   redirects[0] = &StdInFile;
97   redirects[1] = &StdOutFile;
98   redirects[2] = &StdErrFile;
99
100 #if 0 // For debug purposes
101   {
102     errs() << "RUN:";
103     for (unsigned i = 0; Args[i]; ++i)
104       errs() << " " << Args[i];
105     errs() << "\n";
106   }
107 #endif
108
109   // Run the program remotely with the remote client
110   int ReturnCode = sys::ExecuteAndWait(RemoteClientPath, Args, 0, redirects,
111                                        NumSeconds, MemoryLimit);
112
113   // Has the remote client fail?
114   if (255 == ReturnCode) {
115     std::ostringstream OS;
116     OS << "\nError running remote client:\n ";
117     for (const char **Arg = Args; *Arg; ++Arg)
118       OS << " " << *Arg;
119     OS << "\n";
120
121     // The error message is in the output file, let's print it out from there.
122     std::ifstream ErrorFile(StdOutFile.c_str());
123     if (ErrorFile) {
124       std::copy(std::istreambuf_iterator<char>(ErrorFile),
125                 std::istreambuf_iterator<char>(),
126                 std::ostreambuf_iterator<char>(OS));
127       ErrorFile.close();
128     }
129
130     errs() << OS.str();
131   }
132
133   return ReturnCode;
134 }
135
136 static std::string ProcessFailure(sys::Path ProgPath, const char** Args,
137                                   unsigned Timeout = 0,
138                                   unsigned MemoryLimit = 0) {
139   std::ostringstream OS;
140   OS << "\nError running tool:\n ";
141   for (const char **Arg = Args; *Arg; ++Arg)
142     OS << " " << *Arg;
143   OS << "\n";
144
145   // Rerun the compiler, capturing any error messages to print them.
146   sys::Path ErrorFilename("bugpoint.program_error_messages");
147   std::string ErrMsg;
148   if (ErrorFilename.makeUnique(true, &ErrMsg)) {
149     errs() << "Error making unique filename: " << ErrMsg << "\n";
150     exit(1);
151   }
152   RunProgramWithTimeout(ProgPath, Args, sys::Path(""), ErrorFilename,
153                         ErrorFilename, Timeout, MemoryLimit);
154   // FIXME: check return code ?
155
156   // Print out the error messages generated by GCC if possible...
157   std::ifstream ErrorFile(ErrorFilename.c_str());
158   if (ErrorFile) {
159     std::copy(std::istreambuf_iterator<char>(ErrorFile),
160               std::istreambuf_iterator<char>(),
161               std::ostreambuf_iterator<char>(OS));
162     ErrorFile.close();
163   }
164
165   ErrorFilename.eraseFromDisk();
166   return OS.str();
167 }
168
169 //===---------------------------------------------------------------------===//
170 // LLI Implementation of AbstractIntepreter interface
171 //
172 namespace {
173   class LLI : public AbstractInterpreter {
174     std::string LLIPath;          // The path to the LLI executable
175     std::vector<std::string> ToolArgs; // Args to pass to LLI
176   public:
177     LLI(const std::string &Path, const std::vector<std::string> *Args)
178       : LLIPath(Path) {
179       ToolArgs.clear ();
180       if (Args) { ToolArgs = *Args; }
181     }
182
183     virtual int ExecuteProgram(const std::string &Bitcode,
184                                const std::vector<std::string> &Args,
185                                const std::string &InputFile,
186                                const std::string &OutputFile,
187                                std::string *Error,
188                                const std::vector<std::string> &GCCArgs,
189                                const std::vector<std::string> &SharedLibs =
190                                std::vector<std::string>(),
191                                unsigned Timeout = 0,
192                                unsigned MemoryLimit = 0);
193   };
194 }
195
196 int LLI::ExecuteProgram(const std::string &Bitcode,
197                         const std::vector<std::string> &Args,
198                         const std::string &InputFile,
199                         const std::string &OutputFile,
200                         std::string *Error,
201                         const std::vector<std::string> &GCCArgs,
202                         const std::vector<std::string> &SharedLibs,
203                         unsigned Timeout,
204                         unsigned MemoryLimit) {
205   std::vector<const char*> LLIArgs;
206   LLIArgs.push_back(LLIPath.c_str());
207   LLIArgs.push_back("-force-interpreter=true");
208
209   for (std::vector<std::string>::const_iterator i = SharedLibs.begin(),
210          e = SharedLibs.end(); i != e; ++i) {
211     LLIArgs.push_back("-load");
212     LLIArgs.push_back((*i).c_str());
213   }
214
215   // Add any extra LLI args.
216   for (unsigned i = 0, e = ToolArgs.size(); i != e; ++i)
217     LLIArgs.push_back(ToolArgs[i].c_str());
218
219   LLIArgs.push_back(Bitcode.c_str());
220   // Add optional parameters to the running program from Argv
221   for (unsigned i=0, e = Args.size(); i != e; ++i)
222     LLIArgs.push_back(Args[i].c_str());
223   LLIArgs.push_back(0);
224
225   outs() << "<lli>"; outs().flush();
226   DEBUG(errs() << "\nAbout to run:\t";
227         for (unsigned i=0, e = LLIArgs.size()-1; i != e; ++i)
228           errs() << " " << LLIArgs[i];
229         errs() << "\n";
230         );
231   return RunProgramWithTimeout(sys::Path(LLIPath), &LLIArgs[0],
232       sys::Path(InputFile), sys::Path(OutputFile), sys::Path(OutputFile),
233       Timeout, MemoryLimit, Error);
234 }
235
236 void AbstractInterpreter::anchor() { }
237
238 // LLI create method - Try to find the LLI executable
239 AbstractInterpreter *AbstractInterpreter::createLLI(const char *Argv0,
240                                                     std::string &Message,
241                                      const std::vector<std::string> *ToolArgs) {
242   std::string LLIPath =
243     PrependMainExecutablePath("lli", Argv0, (void *)(intptr_t)&createLLI).str();
244   if (!LLIPath.empty()) {
245     Message = "Found lli: " + LLIPath + "\n";
246     return new LLI(LLIPath, ToolArgs);
247   }
248
249   Message = "Cannot find `lli' in executable directory!\n";
250   return 0;
251 }
252
253 //===---------------------------------------------------------------------===//
254 // Custom compiler command implementation of AbstractIntepreter interface
255 //
256 // Allows using a custom command for compiling the bitcode, thus allows, for
257 // example, to compile a bitcode fragment without linking or executing, then
258 // using a custom wrapper script to check for compiler errors.
259 namespace {
260   class CustomCompiler : public AbstractInterpreter {
261     std::string CompilerCommand;
262     std::vector<std::string> CompilerArgs;
263   public:
264     CustomCompiler(
265       const std::string &CompilerCmd, std::vector<std::string> CompArgs) :
266       CompilerCommand(CompilerCmd), CompilerArgs(CompArgs) {}
267
268     virtual void compileProgram(const std::string &Bitcode,
269                                 std::string *Error,
270                                 unsigned Timeout = 0,
271                                 unsigned MemoryLimit = 0);
272
273     virtual int ExecuteProgram(const std::string &Bitcode,
274                                const std::vector<std::string> &Args,
275                                const std::string &InputFile,
276                                const std::string &OutputFile,
277                                std::string *Error,
278                                const std::vector<std::string> &GCCArgs =
279                                std::vector<std::string>(),
280                                const std::vector<std::string> &SharedLibs =
281                                std::vector<std::string>(),
282                                unsigned Timeout = 0,
283                                unsigned MemoryLimit = 0) {
284       *Error = "Execution not supported with -compile-custom";
285       return -1;
286     }
287   };
288 }
289
290 void CustomCompiler::compileProgram(const std::string &Bitcode,
291                                     std::string *Error,
292                                     unsigned Timeout,
293                                     unsigned MemoryLimit) {
294
295   std::vector<const char*> ProgramArgs;
296   ProgramArgs.push_back(CompilerCommand.c_str());
297
298   for (std::size_t i = 0; i < CompilerArgs.size(); ++i)
299     ProgramArgs.push_back(CompilerArgs.at(i).c_str());
300   ProgramArgs.push_back(Bitcode.c_str());
301   ProgramArgs.push_back(0);
302
303   // Add optional parameters to the running program from Argv
304   for (unsigned i = 0, e = CompilerArgs.size(); i != e; ++i)
305     ProgramArgs.push_back(CompilerArgs[i].c_str());
306
307   if (RunProgramWithTimeout( sys::Path(CompilerCommand), &ProgramArgs[0],
308                              sys::Path(), sys::Path(), sys::Path(),
309                              Timeout, MemoryLimit, Error))
310     *Error = ProcessFailure(sys::Path(CompilerCommand), &ProgramArgs[0],
311                            Timeout, MemoryLimit);
312 }
313
314 //===---------------------------------------------------------------------===//
315 // Custom execution command implementation of AbstractIntepreter interface
316 //
317 // Allows using a custom command for executing the bitcode, thus allows,
318 // for example, to invoke a cross compiler for code generation followed by
319 // a simulator that executes the generated binary.
320 namespace {
321   class CustomExecutor : public AbstractInterpreter {
322     std::string ExecutionCommand;
323     std::vector<std::string> ExecutorArgs;
324   public:
325     CustomExecutor(
326       const std::string &ExecutionCmd, std::vector<std::string> ExecArgs) :
327       ExecutionCommand(ExecutionCmd), ExecutorArgs(ExecArgs) {}
328
329     virtual int ExecuteProgram(const std::string &Bitcode,
330                                const std::vector<std::string> &Args,
331                                const std::string &InputFile,
332                                const std::string &OutputFile,
333                                std::string *Error,
334                                const std::vector<std::string> &GCCArgs,
335                                const std::vector<std::string> &SharedLibs =
336                                  std::vector<std::string>(),
337                                unsigned Timeout = 0,
338                                unsigned MemoryLimit = 0);
339   };
340 }
341
342 int CustomExecutor::ExecuteProgram(const std::string &Bitcode,
343                         const std::vector<std::string> &Args,
344                         const std::string &InputFile,
345                         const std::string &OutputFile,
346                         std::string *Error,
347                         const std::vector<std::string> &GCCArgs,
348                         const std::vector<std::string> &SharedLibs,
349                         unsigned Timeout,
350                         unsigned MemoryLimit) {
351
352   std::vector<const char*> ProgramArgs;
353   ProgramArgs.push_back(ExecutionCommand.c_str());
354
355   for (std::size_t i = 0; i < ExecutorArgs.size(); ++i)
356     ProgramArgs.push_back(ExecutorArgs.at(i).c_str());
357   ProgramArgs.push_back(Bitcode.c_str());
358   ProgramArgs.push_back(0);
359
360   // Add optional parameters to the running program from Argv
361   for (unsigned i = 0, e = Args.size(); i != e; ++i)
362     ProgramArgs.push_back(Args[i].c_str());
363
364   return RunProgramWithTimeout(
365     sys::Path(ExecutionCommand),
366     &ProgramArgs[0], sys::Path(InputFile), sys::Path(OutputFile),
367     sys::Path(OutputFile), Timeout, MemoryLimit, Error);
368 }
369
370 // Tokenize the CommandLine to the command and the args to allow
371 // defining a full command line as the command instead of just the
372 // executed program. We cannot just pass the whole string after the command
373 // as a single argument because then program sees only a single
374 // command line argument (with spaces in it: "foo bar" instead
375 // of "foo" and "bar").
376 //
377 // code borrowed from:
378 // http://oopweb.com/CPP/Documents/CPPHOWTO/Volume/C++Programming-HOWTO-7.html
379 static void lexCommand(std::string &Message, const std::string &CommandLine,
380                        std::string &CmdPath, std::vector<std::string> Args) {
381
382   std::string Command = "";
383   std::string delimiters = " ";
384
385   std::string::size_type lastPos = CommandLine.find_first_not_of(delimiters, 0);
386   std::string::size_type pos = CommandLine.find_first_of(delimiters, lastPos);
387
388   while (std::string::npos != pos || std::string::npos != lastPos) {
389     std::string token = CommandLine.substr(lastPos, pos - lastPos);
390     if (Command == "")
391        Command = token;
392     else
393        Args.push_back(token);
394     // Skip delimiters.  Note the "not_of"
395     lastPos = CommandLine.find_first_not_of(delimiters, pos);
396     // Find next "non-delimiter"
397     pos = CommandLine.find_first_of(delimiters, lastPos);
398   }
399
400   CmdPath = sys::FindProgramByName(Command).str();
401   if (CmdPath.empty()) {
402     Message =
403       std::string("Cannot find '") + Command +
404       "' in PATH!\n";
405     return;
406   }
407
408   Message = "Found command in: " + CmdPath + "\n";
409 }
410
411 // Custom execution environment create method, takes the execution command
412 // as arguments
413 AbstractInterpreter *AbstractInterpreter::createCustomCompiler(
414                     std::string &Message,
415                     const std::string &CompileCommandLine) {
416
417   std::string CmdPath;
418   std::vector<std::string> Args;
419   lexCommand(Message, CompileCommandLine, CmdPath, Args);
420   if (CmdPath.empty())
421     return 0;
422
423   return new CustomCompiler(CmdPath, Args);
424 }
425
426 // Custom execution environment create method, takes the execution command
427 // as arguments
428 AbstractInterpreter *AbstractInterpreter::createCustomExecutor(
429                     std::string &Message,
430                     const std::string &ExecCommandLine) {
431
432
433   std::string CmdPath;
434   std::vector<std::string> Args;
435   lexCommand(Message, ExecCommandLine, CmdPath, Args);
436   if (CmdPath.empty())
437     return 0;
438
439   return new CustomExecutor(CmdPath, Args);
440 }
441
442 //===----------------------------------------------------------------------===//
443 // LLC Implementation of AbstractIntepreter interface
444 //
445 GCC::FileType LLC::OutputCode(const std::string &Bitcode,
446                               sys::Path &OutputAsmFile, std::string &Error,
447                               unsigned Timeout, unsigned MemoryLimit) {
448   const char *Suffix = (UseIntegratedAssembler ? ".llc.o" : ".llc.s");
449   sys::Path uniqueFile(Bitcode + Suffix);
450   std::string ErrMsg;
451   if (uniqueFile.makeUnique(true, &ErrMsg)) {
452     errs() << "Error making unique filename: " << ErrMsg << "\n";
453     exit(1);
454   }
455   OutputAsmFile = uniqueFile;
456   std::vector<const char *> LLCArgs;
457   LLCArgs.push_back(LLCPath.c_str());
458
459   // Add any extra LLC args.
460   for (unsigned i = 0, e = ToolArgs.size(); i != e; ++i)
461     LLCArgs.push_back(ToolArgs[i].c_str());
462
463   LLCArgs.push_back("-o");
464   LLCArgs.push_back(OutputAsmFile.c_str()); // Output to the Asm file
465   LLCArgs.push_back(Bitcode.c_str());      // This is the input bitcode
466
467   if (UseIntegratedAssembler)
468     LLCArgs.push_back("-filetype=obj");
469
470   LLCArgs.push_back (0);
471
472   outs() << (UseIntegratedAssembler ? "<llc-ia>" : "<llc>");
473   outs().flush();
474   DEBUG(errs() << "\nAbout to run:\t";
475         for (unsigned i = 0, e = LLCArgs.size()-1; i != e; ++i)
476           errs() << " " << LLCArgs[i];
477         errs() << "\n";
478         );
479   if (RunProgramWithTimeout(sys::Path(LLCPath), &LLCArgs[0],
480                             sys::Path(), sys::Path(), sys::Path(),
481                             Timeout, MemoryLimit))
482     Error = ProcessFailure(sys::Path(LLCPath), &LLCArgs[0],
483                            Timeout, MemoryLimit);
484   return UseIntegratedAssembler ? GCC::ObjectFile : GCC::AsmFile;
485 }
486
487 void LLC::compileProgram(const std::string &Bitcode, std::string *Error,
488                          unsigned Timeout, unsigned MemoryLimit) {
489   sys::Path OutputAsmFile;
490   OutputCode(Bitcode, OutputAsmFile, *Error, Timeout, MemoryLimit);
491   OutputAsmFile.eraseFromDisk();
492 }
493
494 int LLC::ExecuteProgram(const std::string &Bitcode,
495                         const std::vector<std::string> &Args,
496                         const std::string &InputFile,
497                         const std::string &OutputFile,
498                         std::string *Error,
499                         const std::vector<std::string> &ArgsForGCC,
500                         const std::vector<std::string> &SharedLibs,
501                         unsigned Timeout,
502                         unsigned MemoryLimit) {
503
504   sys::Path OutputAsmFile;
505   GCC::FileType FileKind = OutputCode(Bitcode, OutputAsmFile, *Error, Timeout,
506                                       MemoryLimit);
507   FileRemover OutFileRemover(OutputAsmFile.str(), !SaveTemps);
508
509   std::vector<std::string> GCCArgs(ArgsForGCC);
510   GCCArgs.insert(GCCArgs.end(), SharedLibs.begin(), SharedLibs.end());
511
512   // Assuming LLC worked, compile the result with GCC and run it.
513   return gcc->ExecuteProgram(OutputAsmFile.str(), Args, FileKind,
514                              InputFile, OutputFile, Error, GCCArgs,
515                              Timeout, MemoryLimit);
516 }
517
518 /// createLLC - Try to find the LLC executable
519 ///
520 LLC *AbstractInterpreter::createLLC(const char *Argv0,
521                                     std::string &Message,
522                                     const std::string &GCCBinary,
523                                     const std::vector<std::string> *Args,
524                                     const std::vector<std::string> *GCCArgs,
525                                     bool UseIntegratedAssembler) {
526   std::string LLCPath =
527     PrependMainExecutablePath("llc", Argv0, (void *)(intptr_t)&createLLC).str();
528   if (LLCPath.empty()) {
529     Message = "Cannot find `llc' in executable directory!\n";
530     return 0;
531   }
532
533   GCC *gcc = GCC::create(Message, GCCBinary, GCCArgs);
534   if (!gcc) {
535     errs() << Message << "\n";
536     exit(1);
537   }
538   Message = "Found llc: " + LLCPath + "\n";
539   return new LLC(LLCPath, gcc, Args, UseIntegratedAssembler);
540 }
541
542 //===---------------------------------------------------------------------===//
543 // JIT Implementation of AbstractIntepreter interface
544 //
545 namespace {
546   class JIT : public AbstractInterpreter {
547     std::string LLIPath;          // The path to the LLI executable
548     std::vector<std::string> ToolArgs; // Args to pass to LLI
549   public:
550     JIT(const std::string &Path, const std::vector<std::string> *Args)
551       : LLIPath(Path) {
552       ToolArgs.clear ();
553       if (Args) { ToolArgs = *Args; }
554     }
555
556     virtual int ExecuteProgram(const std::string &Bitcode,
557                                const std::vector<std::string> &Args,
558                                const std::string &InputFile,
559                                const std::string &OutputFile,
560                                std::string *Error,
561                                const std::vector<std::string> &GCCArgs =
562                                  std::vector<std::string>(),
563                                const std::vector<std::string> &SharedLibs =
564                                  std::vector<std::string>(),
565                                unsigned Timeout = 0,
566                                unsigned MemoryLimit = 0);
567   };
568 }
569
570 int JIT::ExecuteProgram(const std::string &Bitcode,
571                         const std::vector<std::string> &Args,
572                         const std::string &InputFile,
573                         const std::string &OutputFile,
574                         std::string *Error,
575                         const std::vector<std::string> &GCCArgs,
576                         const std::vector<std::string> &SharedLibs,
577                         unsigned Timeout,
578                         unsigned MemoryLimit) {
579   // Construct a vector of parameters, incorporating those from the command-line
580   std::vector<const char*> JITArgs;
581   JITArgs.push_back(LLIPath.c_str());
582   JITArgs.push_back("-force-interpreter=false");
583
584   // Add any extra LLI args.
585   for (unsigned i = 0, e = ToolArgs.size(); i != e; ++i)
586     JITArgs.push_back(ToolArgs[i].c_str());
587
588   for (unsigned i = 0, e = SharedLibs.size(); i != e; ++i) {
589     JITArgs.push_back("-load");
590     JITArgs.push_back(SharedLibs[i].c_str());
591   }
592   JITArgs.push_back(Bitcode.c_str());
593   // Add optional parameters to the running program from Argv
594   for (unsigned i=0, e = Args.size(); i != e; ++i)
595     JITArgs.push_back(Args[i].c_str());
596   JITArgs.push_back(0);
597
598   outs() << "<jit>"; outs().flush();
599   DEBUG(errs() << "\nAbout to run:\t";
600         for (unsigned i=0, e = JITArgs.size()-1; i != e; ++i)
601           errs() << " " << JITArgs[i];
602         errs() << "\n";
603         );
604   DEBUG(errs() << "\nSending output to " << OutputFile << "\n");
605   return RunProgramWithTimeout(sys::Path(LLIPath), &JITArgs[0],
606       sys::Path(InputFile), sys::Path(OutputFile), sys::Path(OutputFile),
607       Timeout, MemoryLimit, Error);
608 }
609
610 /// createJIT - Try to find the LLI executable
611 ///
612 AbstractInterpreter *AbstractInterpreter::createJIT(const char *Argv0,
613                    std::string &Message, const std::vector<std::string> *Args) {
614   std::string LLIPath =
615     PrependMainExecutablePath("lli", Argv0, (void *)(intptr_t)&createJIT).str();
616   if (!LLIPath.empty()) {
617     Message = "Found lli: " + LLIPath + "\n";
618     return new JIT(LLIPath, Args);
619   }
620
621   Message = "Cannot find `lli' in executable directory!\n";
622   return 0;
623 }
624
625 //===---------------------------------------------------------------------===//
626 // GCC abstraction
627 //
628
629 static bool IsARMArchitecture(std::vector<const char*> Args) {
630   for (std::vector<const char*>::const_iterator
631          I = Args.begin(), E = Args.end(); I != E; ++I) {
632     if (StringRef(*I).equals_lower("-arch")) {
633       ++I;
634       if (I != E && StringRef(*I).substr(0, strlen("arm")).equals_lower("arm"))
635         return true;
636     }
637   }
638
639   return false;
640 }
641
642 int GCC::ExecuteProgram(const std::string &ProgramFile,
643                         const std::vector<std::string> &Args,
644                         FileType fileType,
645                         const std::string &InputFile,
646                         const std::string &OutputFile,
647                         std::string *Error,
648                         const std::vector<std::string> &ArgsForGCC,
649                         unsigned Timeout,
650                         unsigned MemoryLimit) {
651   std::vector<const char*> GCCArgs;
652
653   GCCArgs.push_back(GCCPath.c_str());
654
655   if (TargetTriple.getArch() == Triple::x86)
656     GCCArgs.push_back("-m32");
657
658   for (std::vector<std::string>::const_iterator
659          I = gccArgs.begin(), E = gccArgs.end(); I != E; ++I)
660     GCCArgs.push_back(I->c_str());
661
662   // Specify -x explicitly in case the extension is wonky
663   if (fileType != ObjectFile) {
664     GCCArgs.push_back("-x");
665     if (fileType == CFile) {
666       GCCArgs.push_back("c");
667       GCCArgs.push_back("-fno-strict-aliasing");
668     } else {
669       GCCArgs.push_back("assembler");
670
671       // For ARM architectures we don't want this flag. bugpoint isn't
672       // explicitly told what architecture it is working on, so we get
673       // it from gcc flags
674       if (TargetTriple.isOSDarwin() && !IsARMArchitecture(GCCArgs))
675         GCCArgs.push_back("-force_cpusubtype_ALL");
676     }
677   }
678
679   GCCArgs.push_back(ProgramFile.c_str());  // Specify the input filename.
680
681   GCCArgs.push_back("-x");
682   GCCArgs.push_back("none");
683   GCCArgs.push_back("-o");
684   sys::Path OutputBinary (ProgramFile+".gcc.exe");
685   std::string ErrMsg;
686   if (OutputBinary.makeUnique(true, &ErrMsg)) {
687     errs() << "Error making unique filename: " << ErrMsg << "\n";
688     exit(1);
689   }
690   GCCArgs.push_back(OutputBinary.c_str()); // Output to the right file...
691
692   // Add any arguments intended for GCC. We locate them here because this is
693   // most likely -L and -l options that need to come before other libraries but
694   // after the source. Other options won't be sensitive to placement on the
695   // command line, so this should be safe.
696   for (unsigned i = 0, e = ArgsForGCC.size(); i != e; ++i)
697     GCCArgs.push_back(ArgsForGCC[i].c_str());
698
699   GCCArgs.push_back("-lm");                // Hard-code the math library...
700   GCCArgs.push_back("-O2");                // Optimize the program a bit...
701 #if defined (HAVE_LINK_R)
702   GCCArgs.push_back("-Wl,-R.");            // Search this dir for .so files
703 #endif
704   if (TargetTriple.getArch() == Triple::sparc)
705     GCCArgs.push_back("-mcpu=v9");
706   GCCArgs.push_back(0);                    // NULL terminator
707
708   outs() << "<gcc>"; outs().flush();
709   DEBUG(errs() << "\nAbout to run:\t";
710         for (unsigned i = 0, e = GCCArgs.size()-1; i != e; ++i)
711           errs() << " " << GCCArgs[i];
712         errs() << "\n";
713         );
714   if (RunProgramWithTimeout(GCCPath, &GCCArgs[0], sys::Path(), sys::Path(),
715         sys::Path())) {
716     *Error = ProcessFailure(GCCPath, &GCCArgs[0]);
717     return -1;
718   }
719
720   std::vector<const char*> ProgramArgs;
721
722   // Declared here so that the destructor only runs after
723   // ProgramArgs is used.
724   std::string Exec;
725
726   if (RemoteClientPath.isEmpty())
727     ProgramArgs.push_back(OutputBinary.c_str());
728   else {
729     ProgramArgs.push_back(RemoteClientPath.c_str());
730     ProgramArgs.push_back(RemoteHost.c_str());
731     if (!RemoteUser.empty()) {
732       ProgramArgs.push_back("-l");
733       ProgramArgs.push_back(RemoteUser.c_str());
734     }
735     if (!RemotePort.empty()) {
736       ProgramArgs.push_back("-p");
737       ProgramArgs.push_back(RemotePort.c_str());
738     }
739     if (!RemoteExtra.empty()) {
740       ProgramArgs.push_back(RemoteExtra.c_str());
741     }
742
743     // Full path to the binary. We need to cd to the exec directory because
744     // there is a dylib there that the exec expects to find in the CWD
745     char* env_pwd = getenv("PWD");
746     Exec = "cd ";
747     Exec += env_pwd;
748     Exec += "; ./";
749     Exec += OutputBinary.c_str();
750     ProgramArgs.push_back(Exec.c_str());
751   }
752
753   // Add optional parameters to the running program from Argv
754   for (unsigned i = 0, e = Args.size(); i != e; ++i)
755     ProgramArgs.push_back(Args[i].c_str());
756   ProgramArgs.push_back(0);                // NULL terminator
757
758   // Now that we have a binary, run it!
759   outs() << "<program>"; outs().flush();
760   DEBUG(errs() << "\nAbout to run:\t";
761         for (unsigned i = 0, e = ProgramArgs.size()-1; i != e; ++i)
762           errs() << " " << ProgramArgs[i];
763         errs() << "\n";
764         );
765
766   FileRemover OutputBinaryRemover(OutputBinary.str(), !SaveTemps);
767
768   if (RemoteClientPath.isEmpty()) {
769     DEBUG(errs() << "<run locally>");
770     int ExitCode = RunProgramWithTimeout(OutputBinary, &ProgramArgs[0],
771         sys::Path(InputFile), sys::Path(OutputFile), sys::Path(OutputFile),
772         Timeout, MemoryLimit, Error);
773     // Treat a signal (usually SIGSEGV) or timeout as part of the program output
774     // so that crash-causing miscompilation is handled seamlessly.
775     if (ExitCode < -1) {
776       std::ofstream outFile(OutputFile.c_str(), std::ios_base::app);
777       outFile << *Error << '\n';
778       outFile.close();
779       Error->clear();
780     }
781     return ExitCode;
782   } else {
783     outs() << "<run remotely>"; outs().flush();
784     return RunProgramRemotelyWithTimeout(sys::Path(RemoteClientPath),
785         &ProgramArgs[0], sys::Path(InputFile), sys::Path(OutputFile),
786         sys::Path(OutputFile), Timeout, MemoryLimit);
787   }
788 }
789
790 int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType,
791                           std::string &OutputFile,
792                           const std::vector<std::string> &ArgsForGCC,
793                           std::string &Error) {
794   sys::Path uniqueFilename(InputFile+LTDL_SHLIB_EXT);
795   std::string ErrMsg;
796   if (uniqueFilename.makeUnique(true, &ErrMsg)) {
797     errs() << "Error making unique filename: " << ErrMsg << "\n";
798     exit(1);
799   }
800   OutputFile = uniqueFilename.str();
801
802   std::vector<const char*> GCCArgs;
803
804   GCCArgs.push_back(GCCPath.c_str());
805
806   if (TargetTriple.getArch() == Triple::x86)
807     GCCArgs.push_back("-m32");
808
809   for (std::vector<std::string>::const_iterator
810          I = gccArgs.begin(), E = gccArgs.end(); I != E; ++I)
811     GCCArgs.push_back(I->c_str());
812
813   // Compile the C/asm file into a shared object
814   if (fileType != ObjectFile) {
815     GCCArgs.push_back("-x");
816     GCCArgs.push_back(fileType == AsmFile ? "assembler" : "c");
817   }
818   GCCArgs.push_back("-fno-strict-aliasing");
819   GCCArgs.push_back(InputFile.c_str());   // Specify the input filename.
820   GCCArgs.push_back("-x");
821   GCCArgs.push_back("none");
822   if (TargetTriple.getArch() == Triple::sparc)
823     GCCArgs.push_back("-G");       // Compile a shared library, `-G' for Sparc
824   else if (TargetTriple.isOSDarwin()) {
825     // link all source files into a single module in data segment, rather than
826     // generating blocks. dynamic_lookup requires that you set
827     // MACOSX_DEPLOYMENT_TARGET=10.3 in your env.  FIXME: it would be better for
828     // bugpoint to just pass that in the environment of GCC.
829     GCCArgs.push_back("-single_module");
830     GCCArgs.push_back("-dynamiclib");   // `-dynamiclib' for MacOS X/PowerPC
831     GCCArgs.push_back("-undefined");
832     GCCArgs.push_back("dynamic_lookup");
833   } else
834     GCCArgs.push_back("-shared");  // `-shared' for Linux/X86, maybe others
835
836   if (TargetTriple.getArch() == Triple::x86_64)
837     GCCArgs.push_back("-fPIC");   // Requires shared objs to contain PIC
838
839   if (TargetTriple.getArch() == Triple::sparc)
840     GCCArgs.push_back("-mcpu=v9");
841
842   GCCArgs.push_back("-o");
843   GCCArgs.push_back(OutputFile.c_str()); // Output to the right filename.
844   GCCArgs.push_back("-O2");              // Optimize the program a bit.
845
846
847
848   // Add any arguments intended for GCC. We locate them here because this is
849   // most likely -L and -l options that need to come before other libraries but
850   // after the source. Other options won't be sensitive to placement on the
851   // command line, so this should be safe.
852   for (unsigned i = 0, e = ArgsForGCC.size(); i != e; ++i)
853     GCCArgs.push_back(ArgsForGCC[i].c_str());
854   GCCArgs.push_back(0);                    // NULL terminator
855
856
857
858   outs() << "<gcc>"; outs().flush();
859   DEBUG(errs() << "\nAbout to run:\t";
860         for (unsigned i = 0, e = GCCArgs.size()-1; i != e; ++i)
861           errs() << " " << GCCArgs[i];
862         errs() << "\n";
863         );
864   if (RunProgramWithTimeout(GCCPath, &GCCArgs[0], sys::Path(), sys::Path(),
865                             sys::Path())) {
866     Error = ProcessFailure(GCCPath, &GCCArgs[0]);
867     return 1;
868   }
869   return 0;
870 }
871
872 /// create - Try to find the `gcc' executable
873 ///
874 GCC *GCC::create(std::string &Message,
875                  const std::string &GCCBinary,
876                  const std::vector<std::string> *Args) {
877   sys::Path GCCPath = sys::FindProgramByName(GCCBinary);
878   if (GCCPath.isEmpty()) {
879     Message = "Cannot find `"+ GCCBinary +"' in PATH!\n";
880     return 0;
881   }
882
883   sys::Path RemoteClientPath;
884   if (!RemoteClient.empty())
885     RemoteClientPath = sys::FindProgramByName(RemoteClient);
886
887   Message = "Found gcc: " + GCCPath.str() + "\n";
888   return new GCC(GCCPath, RemoteClientPath, Args);
889 }