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), Args(_Args),
28 TranslatedArgs(_TranslatedArgs), Redirects(nullptr),
29 ForDiagnostics(
false) {}
32 delete TranslatedArgs;
36 for (llvm::DenseMap<std::pair<const ToolChain*, const char*>,
37 DerivedArgList*>::iterator it = TCArgs.begin(),
38 ie = TCArgs.end(); it != ie; ++it)
39 if (it->second != TranslatedArgs)
43 for (ActionList::iterator it = Actions.begin(), ie = Actions.end();
56 const char *BoundArch) {
58 TC = &DefaultToolChain;
60 DerivedArgList *&Entry = TCArgs[std::make_pair(TC, BoundArch)];
64 Entry = TranslatedArgs;
84 if (!llvm::sys::fs::can_write(File) || !llvm::sys::fs::is_regular_file(File))
87 if (std::error_code EC = llvm::sys::fs::remove(File)) {
101 bool IssueErrors)
const {
103 for (ArgStringList::const_iterator
104 it = Files.begin(), ie = Files.end(); it != ie; ++it)
111 bool IssueErrors)
const {
113 for (ArgStringMap::const_iterator
114 it = Files.begin(), ie = Files.end(); it != ie; ++it) {
118 if (JA && it->first != JA)
126 const Command *&FailingCommand)
const {
129 raw_ostream *OS = &llvm::errs();
135 OS =
new llvm::raw_fd_ostream(
getDriver().CCPrintOptionsFilename, EC,
136 llvm::sys::fs::F_Append |
137 llvm::sys::fs::F_Text);
139 getDriver().
Diag(clang::diag::err_drv_cc_print_options_failure)
148 *OS <<
"[Logging clang options]";
152 if (OS != &llvm::errs())
157 bool ExecutionFailed;
158 int Res = C.
Execute(Redirects, &Error, &ExecutionFailed);
159 if (!Error.empty()) {
160 assert(Res &&
"Error string set with 0 result code!");
161 getDriver().
Diag(clang::diag::err_drv_command_failure) << Error;
167 return ExecutionFailed ? 1 : Res;
175 if (FailingCommands.empty())
178 for (FailingCommandList::const_iterator CI = FailingCommands.begin(),
179 CE = FailingCommands.end(); CI != CE; ++CI)
180 if (A == &(CI->second->getSource()))
197 for (
const auto &Job : Jobs) {
198 if (!
InputsOk(Job, FailingCommands))
200 const Command *FailingCommand =
nullptr;
202 FailingCommands.push_back(std::make_pair(Res, FailingCommand));
207 ForDiagnostics =
true;
210 DeleteContainerPointers(Actions);
216 FailureResultFiles.clear();
220 OptSpecifier OutputOpts[] = { options::OPT_o, options::OPT_MD,
222 for (
unsigned i = 0, e = llvm::array_lengthof(OutputOpts); i != e; ++i) {
223 if (TranslatedArgs->hasArg(OutputOpts[i]))
224 TranslatedArgs->eraseArg(OutputOpts[i]);
226 TranslatedArgs->ClaimAllArgs();
229 Redirects =
new const StringRef*[3]();
230 Redirects[0] =
nullptr;
231 Redirects[1] =
new StringRef();
232 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
virtual void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote, CrashReportInfo *CrashInfo=nullptr) const
const llvm::opt::DerivedArgList & getArgs() const
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
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
const llvm::opt::DerivedArgList & getArgsForToolChain(const ToolChain *TC, const char *BoundArch)
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
int ExecuteCommand(const Command &C, const Command *&FailingCommand) const
StringRef getSysRoot() const
Returns the sysroot path.
void initCompilationForDiagnostics()