18 #include "llvm/ADT/None.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/ADT/Triple.h"
22 #include "llvm/Option/ArgList.h"
23 #include "llvm/Option/OptSpecifier.h"
24 #include "llvm/Option/Option.h"
25 #include "llvm/Support/FileSystem.h"
26 #include "llvm/Support/raw_ostream.h"
29 #include <system_error>
32 using namespace clang;
33 using namespace driver;
37 InputArgList *_Args, DerivedArgList *_TranslatedArgs,
39 : TheDriver(D), DefaultToolChain(_DefaultToolChain), Args(_Args),
40 TranslatedArgs(_TranslatedArgs), ContainsError(ContainsError) {
42 OrderedOffloadingToolchains.insert(
52 delete TranslatedArgs;
56 for (
auto Arg : TCArgs)
57 if (Arg.second != TranslatedArgs)
61 const DerivedArgList &
65 TC = &DefaultToolChain;
67 DerivedArgList *&Entry = TCArgs[{TC, BoundArch, DeviceOffloadKind}];
70 DerivedArgList *OpenMPArgs =
nullptr;
73 const ToolChain *HostTC = getSingleOffloadToolChain<Action::OFK_Host>();
76 *TranslatedArgs, SameTripleAsHost, AllocatedArgs);
79 DerivedArgList *NewDAL =
nullptr;
82 DeviceOffloadKind, &AllocatedArgs);
93 Entry = TC->
TranslateArgs(*TranslatedArgs, BoundArch, DeviceOffloadKind);
95 Entry = TranslatedArgs;
97 Entry = TC->
TranslateArgs(*NewDAL, BoundArch, DeviceOffloadKind);
105 for (
auto ArgPtr : AllocatedArgs)
106 Entry->AddSynthesizedArg(ArgPtr);
126 if (!llvm::sys::fs::can_write(
File) || !llvm::sys::fs::is_regular_file(
File))
143 bool IssueErrors)
const {
145 for (
const auto &
File: Files)
152 bool IssueErrors)
const {
154 for (
const auto &
File : Files) {
157 if (JA &&
File.first != JA)
165 const Command *&FailingCommand)
const {
168 raw_ostream *OS = &llvm::errs();
169 std::unique_ptr<llvm::raw_fd_ostream> OwnedStream;
174 !
getDriver().CCPrintOptionsFilename.empty()) {
176 OwnedStream.reset(
new llvm::raw_fd_ostream(
177 getDriver().CCPrintOptionsFilename.c_str(), EC,
178 llvm::sys::fs::OF_Append | llvm::sys::fs::OF_TextWithCRLF));
185 OS = OwnedStream.get();
189 *OS <<
"[Logging clang options]\n";
191 C.Print(*OS,
"\n",
getDriver().CCPrintOptions);
195 bool ExecutionFailed;
196 int Res = C.Execute(Redirects, &
Error, &ExecutionFailed);
198 PostCallback(C, Res);
199 if (!
Error.empty()) {
200 assert(Res &&
"Error string set with 0 result code!");
207 return ExecutionFailed ? 1 : Res;
214 if (FailingCommands.empty())
223 for (
const auto &CI : FailingCommands)
224 if (A == &(CI.second->getSource()))
227 for (
const auto *AI : A->
inputs())
245 for (
const auto &Job : Jobs) {
246 if (!
InputsOk(Job, FailingCommands))
248 const Command *FailingCommand =
nullptr;
250 FailingCommands.push_back(std::make_pair(Res, FailingCommand));
259 ForDiagnostics =
true;
273 FailureResultFiles.clear();
277 OptSpecifier OutputOpts[] = {
278 options::OPT_o, options::OPT_MD, options::OPT_MMD, options::OPT_M,
279 options::OPT_MM, options::OPT_MF, options::OPT_MG, options::OPT_MJ,
280 options::OPT_MQ, options::OPT_MT, options::OPT_MV};
281 for (
unsigned i = 0, e = llvm::array_lengthof(OutputOpts); i != e; ++i) {
282 if (TranslatedArgs->hasArg(OutputOpts[i]))
283 TranslatedArgs->eraseArg(OutputOpts[i]);
285 TranslatedArgs->ClaimAllArgs();
289 for (
auto Arg : TCArgs)
290 if (Arg.second != TranslatedArgs)
295 Redirects = {None, {
""}, {
""}};
298 ForceKeepTempFiles =
true;
306 this->Redirects = Redirects;