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