16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/Option/ArgList.h"
18 #include "llvm/Support/FileSystem.h"
19 #include "llvm/Support/raw_ostream.h"
21 using namespace clang::driver;
22 using namespace clang;
23 using namespace llvm::opt;
26 InputArgList *_Args, DerivedArgList *_TranslatedArgs)
27 : TheDriver(D), DefaultToolChain(_DefaultToolChain),
28 CudaHostToolChain(&DefaultToolChain), CudaDeviceToolChain(nullptr),
29 Args(_Args), TranslatedArgs(_TranslatedArgs), Redirects(nullptr),
30 ForDiagnostics(
false) {}
33 delete TranslatedArgs;
37 for (llvm::DenseMap<std::pair<const ToolChain*, const char*>,
38 DerivedArgList*>::
iterator it = TCArgs.begin(),
39 ie = TCArgs.end(); it != ie; ++it)
40 if (it->second != TranslatedArgs)
52 const char *BoundArch) {
54 TC = &DefaultToolChain;
56 DerivedArgList *&Entry = TCArgs[std::make_pair(TC, BoundArch)];
60 Entry = TranslatedArgs;
80 if (!llvm::sys::fs::can_write(File) || !llvm::sys::fs::is_regular_file(File))
83 if (std::error_code EC = llvm::sys::fs::remove(File)) {
97 bool IssueErrors)
const {
99 for (ArgStringList::const_iterator
100 it = Files.begin(), ie = Files.end(); it != ie; ++it)
107 bool IssueErrors)
const {
109 for (ArgStringMap::const_iterator
110 it = Files.begin(), ie = Files.end(); it != ie; ++it) {
114 if (JA && it->first != JA)
122 const Command *&FailingCommand)
const {
125 raw_ostream *OS = &llvm::errs();
131 OS =
new llvm::raw_fd_ostream(
getDriver().CCPrintOptionsFilename, EC,
132 llvm::sys::fs::F_Append |
133 llvm::sys::fs::F_Text);
135 getDriver().
Diag(clang::diag::err_drv_cc_print_options_failure)
144 *OS <<
"[Logging clang options]";
148 if (OS != &llvm::errs())
153 bool ExecutionFailed;
154 int Res = C.
Execute(Redirects, &Error, &ExecutionFailed);
155 if (!Error.empty()) {
156 assert(Res &&
"Error string set with 0 result code!");
157 getDriver().
Diag(clang::diag::err_drv_command_failure) << Error;
163 return ExecutionFailed ? 1 : Res;
171 if (FailingCommands.empty())
174 for (FailingCommandList::const_iterator CI = FailingCommands.begin(),
175 CE = FailingCommands.end(); CI != CE; ++CI)
176 if (A == &(CI->second->getSource()))
193 for (
const auto &Job : Jobs) {
194 if (!
InputsOk(Job, FailingCommands))
196 const Command *FailingCommand =
nullptr;
198 FailingCommands.push_back(std::make_pair(Res, FailingCommand));
203 ForDiagnostics =
true;
213 FailureResultFiles.clear();
217 OptSpecifier OutputOpts[] = { options::OPT_o, options::OPT_MD,
219 for (
unsigned i = 0, e = llvm::array_lengthof(OutputOpts); i != e; ++i) {
220 if (TranslatedArgs->hasArg(OutputOpts[i]))
221 TranslatedArgs->eraseArg(OutputOpts[i]);
223 TranslatedArgs->ClaimAllArgs();
226 Redirects =
new const StringRef*[3]();
227 Redirects[0] =
nullptr;
228 Redirects[1] =
new StringRef();
229 Redirects[2] =
new StringRef();
const Driver & getDriver() const
DiagnosticBuilder Diag(unsigned DiagID) const
static bool InputsOk(const Command &C, const FailingCommandList &FailingCommands)
bool CleanupFile(const char *File, bool IssueErrors=false) const
CleanupFile - Delete a given file.
virtual void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote, CrashReportInfo *CrashInfo=nullptr) const
Action - Represent an abstract compilation step to perform.
const llvm::opt::DerivedArgList & getArgs() const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
const Action & getSource() const
getSource - Return the Action which caused the creation of this job.
Compilation(const Driver &D, const ToolChain &DefaultToolChain, llvm::opt::InputArgList *Args, llvm::opt::DerivedArgList *TranslatedArgs)
bool CleanupFileList(const llvm::opt::ArgStringList &Files, bool IssueErrors=false) const
CleanupFileList - Remove the files in the given list.
virtual int Execute(const StringRef **Redirects, std::string *ErrMsg, bool *ExecutionFailed) const
JobList - A sequence of jobs to perform.
ActionList::const_iterator const_iterator
llvm::DenseMap< const JobAction *, const char * > ArgStringMap
ArgStringMap - Type used to map a JobAction to its result file.
SmallVectorImpl< std::pair< int, const Command * > > FailingCommandList
void clear()
Clear the job list.
bool CleanupFileMap(const ArgStringMap &Files, const JobAction *JA, bool IssueErrors=false) const
CleanupFileMap - Remove the files in the given map.
Command - An executable path/name and argument vector to execute.
const llvm::opt::DerivedArgList & getArgsForToolChain(const ToolChain *TC, const char *BoundArch)
getArgsForToolChain - Return the derived argument list for the tool chain TC (or the default tool cha...
Represents a template argument.
static bool ActionFailed(const Action *A, const FailingCommandList &FailingCommands)
std::string SysRoot
sysroot, if present
void ExecuteJobs(const JobList &Jobs, SmallVectorImpl< std::pair< int, const Command * >> &FailingCommands) const
ExecuteJob - Execute a single job.
int ExecuteCommand(const Command &C, const Command *&FailingCommand) const
ExecuteCommand - Execute an actual command.
StringRef getSysRoot() const
Returns the sysroot path.
void initCompilationForDiagnostics()
initCompilationForDiagnostics - Remove stale state and suppress output so compilation can be reexecut...