1*67e74705SXin Li //===--- Driver.cpp - Clang GCC Compatible Driver -------------------------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li
10*67e74705SXin Li #include "clang/Driver/Driver.h"
11*67e74705SXin Li #include "InputInfo.h"
12*67e74705SXin Li #include "ToolChains.h"
13*67e74705SXin Li #include "clang/Basic/Version.h"
14*67e74705SXin Li #include "clang/Basic/VirtualFileSystem.h"
15*67e74705SXin Li #include "clang/Config/config.h"
16*67e74705SXin Li #include "clang/Driver/Action.h"
17*67e74705SXin Li #include "clang/Driver/Compilation.h"
18*67e74705SXin Li #include "clang/Driver/DriverDiagnostic.h"
19*67e74705SXin Li #include "clang/Driver/Job.h"
20*67e74705SXin Li #include "clang/Driver/Options.h"
21*67e74705SXin Li #include "clang/Driver/SanitizerArgs.h"
22*67e74705SXin Li #include "clang/Driver/Tool.h"
23*67e74705SXin Li #include "clang/Driver/ToolChain.h"
24*67e74705SXin Li #include "llvm/ADT/ArrayRef.h"
25*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
26*67e74705SXin Li #include "llvm/ADT/SmallSet.h"
27*67e74705SXin Li #include "llvm/ADT/StringExtras.h"
28*67e74705SXin Li #include "llvm/ADT/StringSet.h"
29*67e74705SXin Li #include "llvm/ADT/StringSwitch.h"
30*67e74705SXin Li #include "llvm/Option/Arg.h"
31*67e74705SXin Li #include "llvm/Option/ArgList.h"
32*67e74705SXin Li #include "llvm/Option/OptSpecifier.h"
33*67e74705SXin Li #include "llvm/Option/OptTable.h"
34*67e74705SXin Li #include "llvm/Option/Option.h"
35*67e74705SXin Li #include "llvm/Support/Debug.h"
36*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
37*67e74705SXin Li #include "llvm/Support/FileSystem.h"
38*67e74705SXin Li #include "llvm/Support/Path.h"
39*67e74705SXin Li #include "llvm/Support/PrettyStackTrace.h"
40*67e74705SXin Li #include "llvm/Support/Process.h"
41*67e74705SXin Li #include "llvm/Support/Program.h"
42*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
43*67e74705SXin Li #include <map>
44*67e74705SXin Li #include <memory>
45*67e74705SXin Li #include <utility>
46*67e74705SXin Li
47*67e74705SXin Li using namespace clang::driver;
48*67e74705SXin Li using namespace clang;
49*67e74705SXin Li using namespace llvm::opt;
50*67e74705SXin Li
Driver(StringRef ClangExecutable,StringRef DefaultTargetTriple,DiagnosticsEngine & Diags,IntrusiveRefCntPtr<vfs::FileSystem> VFS)51*67e74705SXin Li Driver::Driver(StringRef ClangExecutable, StringRef DefaultTargetTriple,
52*67e74705SXin Li DiagnosticsEngine &Diags,
53*67e74705SXin Li IntrusiveRefCntPtr<vfs::FileSystem> VFS)
54*67e74705SXin Li : Opts(createDriverOptTable()), Diags(Diags), VFS(std::move(VFS)),
55*67e74705SXin Li Mode(GCCMode), SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone),
56*67e74705SXin Li LTOMode(LTOK_None), ClangExecutable(ClangExecutable),
57*67e74705SXin Li SysRoot(DEFAULT_SYSROOT), UseStdLib(true),
58*67e74705SXin Li DefaultTargetTriple(DefaultTargetTriple),
59*67e74705SXin Li DriverTitle("clang LLVM compiler"), CCPrintOptionsFilename(nullptr),
60*67e74705SXin Li CCPrintHeadersFilename(nullptr), CCLogDiagnosticsFilename(nullptr),
61*67e74705SXin Li CCCPrintBindings(false), CCPrintHeaders(false), CCLogDiagnostics(false),
62*67e74705SXin Li CCGenDiagnostics(false), CCCGenericGCCName(""), CheckInputsExist(true),
63*67e74705SXin Li CCCUsePCH(true), SuppressMissingInputWarning(false) {
64*67e74705SXin Li
65*67e74705SXin Li // Provide a sane fallback if no VFS is specified.
66*67e74705SXin Li if (!this->VFS)
67*67e74705SXin Li this->VFS = vfs::getRealFileSystem();
68*67e74705SXin Li
69*67e74705SXin Li Name = llvm::sys::path::filename(ClangExecutable);
70*67e74705SXin Li Dir = llvm::sys::path::parent_path(ClangExecutable);
71*67e74705SXin Li InstalledDir = Dir; // Provide a sensible default installed dir.
72*67e74705SXin Li
73*67e74705SXin Li // Compute the path to the resource directory.
74*67e74705SXin Li StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
75*67e74705SXin Li SmallString<128> P(Dir);
76*67e74705SXin Li if (ClangResourceDir != "") {
77*67e74705SXin Li llvm::sys::path::append(P, ClangResourceDir);
78*67e74705SXin Li } else {
79*67e74705SXin Li StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX);
80*67e74705SXin Li llvm::sys::path::append(P, "..", Twine("lib") + ClangLibdirSuffix, "clang",
81*67e74705SXin Li CLANG_VERSION_STRING);
82*67e74705SXin Li }
83*67e74705SXin Li ResourceDir = P.str();
84*67e74705SXin Li }
85*67e74705SXin Li
~Driver()86*67e74705SXin Li Driver::~Driver() {
87*67e74705SXin Li delete Opts;
88*67e74705SXin Li
89*67e74705SXin Li llvm::DeleteContainerSeconds(ToolChains);
90*67e74705SXin Li }
91*67e74705SXin Li
ParseDriverMode(ArrayRef<const char * > Args)92*67e74705SXin Li void Driver::ParseDriverMode(ArrayRef<const char *> Args) {
93*67e74705SXin Li const std::string OptName =
94*67e74705SXin Li getOpts().getOption(options::OPT_driver_mode).getPrefixedName();
95*67e74705SXin Li
96*67e74705SXin Li for (const char *ArgPtr : Args) {
97*67e74705SXin Li // Ingore nullptrs, they are response file's EOL markers
98*67e74705SXin Li if (ArgPtr == nullptr)
99*67e74705SXin Li continue;
100*67e74705SXin Li const StringRef Arg = ArgPtr;
101*67e74705SXin Li if (!Arg.startswith(OptName))
102*67e74705SXin Li continue;
103*67e74705SXin Li
104*67e74705SXin Li const StringRef Value = Arg.drop_front(OptName.size());
105*67e74705SXin Li const unsigned M = llvm::StringSwitch<unsigned>(Value)
106*67e74705SXin Li .Case("gcc", GCCMode)
107*67e74705SXin Li .Case("g++", GXXMode)
108*67e74705SXin Li .Case("cpp", CPPMode)
109*67e74705SXin Li .Case("cl", CLMode)
110*67e74705SXin Li .Default(~0U);
111*67e74705SXin Li
112*67e74705SXin Li if (M != ~0U)
113*67e74705SXin Li Mode = static_cast<DriverMode>(M);
114*67e74705SXin Li else
115*67e74705SXin Li Diag(diag::err_drv_unsupported_option_argument) << OptName << Value;
116*67e74705SXin Li }
117*67e74705SXin Li }
118*67e74705SXin Li
ParseArgStrings(ArrayRef<const char * > ArgStrings)119*67e74705SXin Li InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings) {
120*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
121*67e74705SXin Li
122*67e74705SXin Li unsigned IncludedFlagsBitmask;
123*67e74705SXin Li unsigned ExcludedFlagsBitmask;
124*67e74705SXin Li std::tie(IncludedFlagsBitmask, ExcludedFlagsBitmask) =
125*67e74705SXin Li getIncludeExcludeOptionFlagMasks();
126*67e74705SXin Li
127*67e74705SXin Li unsigned MissingArgIndex, MissingArgCount;
128*67e74705SXin Li InputArgList Args =
129*67e74705SXin Li getOpts().ParseArgs(ArgStrings, MissingArgIndex, MissingArgCount,
130*67e74705SXin Li IncludedFlagsBitmask, ExcludedFlagsBitmask);
131*67e74705SXin Li
132*67e74705SXin Li // Check for missing argument error.
133*67e74705SXin Li if (MissingArgCount)
134*67e74705SXin Li Diag(clang::diag::err_drv_missing_argument)
135*67e74705SXin Li << Args.getArgString(MissingArgIndex) << MissingArgCount;
136*67e74705SXin Li
137*67e74705SXin Li // Check for unsupported options.
138*67e74705SXin Li for (const Arg *A : Args) {
139*67e74705SXin Li if (A->getOption().hasFlag(options::Unsupported)) {
140*67e74705SXin Li Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(Args);
141*67e74705SXin Li continue;
142*67e74705SXin Li }
143*67e74705SXin Li
144*67e74705SXin Li // Warn about -mcpu= without an argument.
145*67e74705SXin Li if (A->getOption().matches(options::OPT_mcpu_EQ) && A->containsValue("")) {
146*67e74705SXin Li Diag(clang::diag::warn_drv_empty_joined_argument) << A->getAsString(Args);
147*67e74705SXin Li }
148*67e74705SXin Li }
149*67e74705SXin Li
150*67e74705SXin Li for (const Arg *A : Args.filtered(options::OPT_UNKNOWN))
151*67e74705SXin Li Diags.Report(IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl :
152*67e74705SXin Li diag::err_drv_unknown_argument)
153*67e74705SXin Li << A->getAsString(Args);
154*67e74705SXin Li
155*67e74705SXin Li return Args;
156*67e74705SXin Li }
157*67e74705SXin Li
158*67e74705SXin Li // Determine which compilation mode we are in. We look for options which
159*67e74705SXin Li // affect the phase, starting with the earliest phases, and record which
160*67e74705SXin Li // option we used to determine the final phase.
getFinalPhase(const DerivedArgList & DAL,Arg ** FinalPhaseArg) const161*67e74705SXin Li phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
162*67e74705SXin Li Arg **FinalPhaseArg) const {
163*67e74705SXin Li Arg *PhaseArg = nullptr;
164*67e74705SXin Li phases::ID FinalPhase;
165*67e74705SXin Li
166*67e74705SXin Li // -{E,EP,P,M,MM} only run the preprocessor.
167*67e74705SXin Li if (CCCIsCPP() || (PhaseArg = DAL.getLastArg(options::OPT_E)) ||
168*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT__SLASH_EP)) ||
169*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM)) ||
170*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT__SLASH_P))) {
171*67e74705SXin Li FinalPhase = phases::Preprocess;
172*67e74705SXin Li
173*67e74705SXin Li // -{fsyntax-only,-analyze,emit-ast} only run up to the compiler.
174*67e74705SXin Li } else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
175*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT_module_file_info)) ||
176*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT_verify_pch)) ||
177*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) ||
178*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT_rewrite_legacy_objc)) ||
179*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT__migrate)) ||
180*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT__analyze,
181*67e74705SXin Li options::OPT__analyze_auto)) ||
182*67e74705SXin Li (PhaseArg = DAL.getLastArg(options::OPT_emit_ast))) {
183*67e74705SXin Li FinalPhase = phases::Compile;
184*67e74705SXin Li
185*67e74705SXin Li // -S only runs up to the backend.
186*67e74705SXin Li } else if ((PhaseArg = DAL.getLastArg(options::OPT_S))) {
187*67e74705SXin Li FinalPhase = phases::Backend;
188*67e74705SXin Li
189*67e74705SXin Li // -c compilation only runs up to the assembler.
190*67e74705SXin Li } else if ((PhaseArg = DAL.getLastArg(options::OPT_c))) {
191*67e74705SXin Li FinalPhase = phases::Assemble;
192*67e74705SXin Li
193*67e74705SXin Li // Otherwise do everything.
194*67e74705SXin Li } else
195*67e74705SXin Li FinalPhase = phases::Link;
196*67e74705SXin Li
197*67e74705SXin Li if (FinalPhaseArg)
198*67e74705SXin Li *FinalPhaseArg = PhaseArg;
199*67e74705SXin Li
200*67e74705SXin Li return FinalPhase;
201*67e74705SXin Li }
202*67e74705SXin Li
MakeInputArg(DerivedArgList & Args,OptTable * Opts,StringRef Value)203*67e74705SXin Li static Arg *MakeInputArg(DerivedArgList &Args, OptTable *Opts,
204*67e74705SXin Li StringRef Value) {
205*67e74705SXin Li Arg *A = new Arg(Opts->getOption(options::OPT_INPUT), Value,
206*67e74705SXin Li Args.getBaseArgs().MakeIndex(Value), Value.data());
207*67e74705SXin Li Args.AddSynthesizedArg(A);
208*67e74705SXin Li A->claim();
209*67e74705SXin Li return A;
210*67e74705SXin Li }
211*67e74705SXin Li
TranslateInputArgs(const InputArgList & Args) const212*67e74705SXin Li DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
213*67e74705SXin Li DerivedArgList *DAL = new DerivedArgList(Args);
214*67e74705SXin Li
215*67e74705SXin Li bool HasNostdlib = Args.hasArg(options::OPT_nostdlib);
216*67e74705SXin Li bool HasNodefaultlib = Args.hasArg(options::OPT_nodefaultlibs);
217*67e74705SXin Li for (Arg *A : Args) {
218*67e74705SXin Li // Unfortunately, we have to parse some forwarding options (-Xassembler,
219*67e74705SXin Li // -Xlinker, -Xpreprocessor) because we either integrate their functionality
220*67e74705SXin Li // (assembler and preprocessor), or bypass a previous driver ('collect2').
221*67e74705SXin Li
222*67e74705SXin Li // Rewrite linker options, to replace --no-demangle with a custom internal
223*67e74705SXin Li // option.
224*67e74705SXin Li if ((A->getOption().matches(options::OPT_Wl_COMMA) ||
225*67e74705SXin Li A->getOption().matches(options::OPT_Xlinker)) &&
226*67e74705SXin Li A->containsValue("--no-demangle")) {
227*67e74705SXin Li // Add the rewritten no-demangle argument.
228*67e74705SXin Li DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle));
229*67e74705SXin Li
230*67e74705SXin Li // Add the remaining values as Xlinker arguments.
231*67e74705SXin Li for (StringRef Val : A->getValues())
232*67e74705SXin Li if (Val != "--no-demangle")
233*67e74705SXin Li DAL->AddSeparateArg(A, Opts->getOption(options::OPT_Xlinker), Val);
234*67e74705SXin Li
235*67e74705SXin Li continue;
236*67e74705SXin Li }
237*67e74705SXin Li
238*67e74705SXin Li // Rewrite preprocessor options, to replace -Wp,-MD,FOO which is used by
239*67e74705SXin Li // some build systems. We don't try to be complete here because we don't
240*67e74705SXin Li // care to encourage this usage model.
241*67e74705SXin Li if (A->getOption().matches(options::OPT_Wp_COMMA) &&
242*67e74705SXin Li (A->getValue(0) == StringRef("-MD") ||
243*67e74705SXin Li A->getValue(0) == StringRef("-MMD"))) {
244*67e74705SXin Li // Rewrite to -MD/-MMD along with -MF.
245*67e74705SXin Li if (A->getValue(0) == StringRef("-MD"))
246*67e74705SXin Li DAL->AddFlagArg(A, Opts->getOption(options::OPT_MD));
247*67e74705SXin Li else
248*67e74705SXin Li DAL->AddFlagArg(A, Opts->getOption(options::OPT_MMD));
249*67e74705SXin Li if (A->getNumValues() == 2)
250*67e74705SXin Li DAL->AddSeparateArg(A, Opts->getOption(options::OPT_MF),
251*67e74705SXin Li A->getValue(1));
252*67e74705SXin Li continue;
253*67e74705SXin Li }
254*67e74705SXin Li
255*67e74705SXin Li // Rewrite reserved library names.
256*67e74705SXin Li if (A->getOption().matches(options::OPT_l)) {
257*67e74705SXin Li StringRef Value = A->getValue();
258*67e74705SXin Li
259*67e74705SXin Li // Rewrite unless -nostdlib is present.
260*67e74705SXin Li if (!HasNostdlib && !HasNodefaultlib && Value == "stdc++") {
261*67e74705SXin Li DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_reserved_lib_stdcxx));
262*67e74705SXin Li continue;
263*67e74705SXin Li }
264*67e74705SXin Li
265*67e74705SXin Li // Rewrite unconditionally.
266*67e74705SXin Li if (Value == "cc_kext") {
267*67e74705SXin Li DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_reserved_lib_cckext));
268*67e74705SXin Li continue;
269*67e74705SXin Li }
270*67e74705SXin Li }
271*67e74705SXin Li
272*67e74705SXin Li // Pick up inputs via the -- option.
273*67e74705SXin Li if (A->getOption().matches(options::OPT__DASH_DASH)) {
274*67e74705SXin Li A->claim();
275*67e74705SXin Li for (StringRef Val : A->getValues())
276*67e74705SXin Li DAL->append(MakeInputArg(*DAL, Opts, Val));
277*67e74705SXin Li continue;
278*67e74705SXin Li }
279*67e74705SXin Li
280*67e74705SXin Li DAL->append(A);
281*67e74705SXin Li }
282*67e74705SXin Li
283*67e74705SXin Li // Enforce -static if -miamcu is present.
284*67e74705SXin Li if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false))
285*67e74705SXin Li DAL->AddFlagArg(0, Opts->getOption(options::OPT_static));
286*67e74705SXin Li
287*67e74705SXin Li // Add a default value of -mlinker-version=, if one was given and the user
288*67e74705SXin Li // didn't specify one.
289*67e74705SXin Li #if defined(HOST_LINK_VERSION)
290*67e74705SXin Li if (!Args.hasArg(options::OPT_mlinker_version_EQ) &&
291*67e74705SXin Li strlen(HOST_LINK_VERSION) > 0) {
292*67e74705SXin Li DAL->AddJoinedArg(0, Opts->getOption(options::OPT_mlinker_version_EQ),
293*67e74705SXin Li HOST_LINK_VERSION);
294*67e74705SXin Li DAL->getLastArg(options::OPT_mlinker_version_EQ)->claim();
295*67e74705SXin Li }
296*67e74705SXin Li #endif
297*67e74705SXin Li
298*67e74705SXin Li return DAL;
299*67e74705SXin Li }
300*67e74705SXin Li
301*67e74705SXin Li /// \brief Compute target triple from args.
302*67e74705SXin Li ///
303*67e74705SXin Li /// This routine provides the logic to compute a target triple from various
304*67e74705SXin Li /// args passed to the driver and the default triple string.
computeTargetTriple(const Driver & D,StringRef DefaultTargetTriple,const ArgList & Args,StringRef DarwinArchName="")305*67e74705SXin Li static llvm::Triple computeTargetTriple(const Driver &D,
306*67e74705SXin Li StringRef DefaultTargetTriple,
307*67e74705SXin Li const ArgList &Args,
308*67e74705SXin Li StringRef DarwinArchName = "") {
309*67e74705SXin Li // FIXME: Already done in Compilation *Driver::BuildCompilation
310*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT_target))
311*67e74705SXin Li DefaultTargetTriple = A->getValue();
312*67e74705SXin Li
313*67e74705SXin Li llvm::Triple Target(llvm::Triple::normalize(DefaultTargetTriple));
314*67e74705SXin Li
315*67e74705SXin Li // Handle Apple-specific options available here.
316*67e74705SXin Li if (Target.isOSBinFormatMachO()) {
317*67e74705SXin Li // If an explict Darwin arch name is given, that trumps all.
318*67e74705SXin Li if (!DarwinArchName.empty()) {
319*67e74705SXin Li tools::darwin::setTripleTypeForMachOArchName(Target, DarwinArchName);
320*67e74705SXin Li return Target;
321*67e74705SXin Li }
322*67e74705SXin Li
323*67e74705SXin Li // Handle the Darwin '-arch' flag.
324*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT_arch)) {
325*67e74705SXin Li StringRef ArchName = A->getValue();
326*67e74705SXin Li tools::darwin::setTripleTypeForMachOArchName(Target, ArchName);
327*67e74705SXin Li }
328*67e74705SXin Li }
329*67e74705SXin Li
330*67e74705SXin Li // Handle pseudo-target flags '-mlittle-endian'/'-EL' and
331*67e74705SXin Li // '-mbig-endian'/'-EB'.
332*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
333*67e74705SXin Li options::OPT_mbig_endian)) {
334*67e74705SXin Li if (A->getOption().matches(options::OPT_mlittle_endian)) {
335*67e74705SXin Li llvm::Triple LE = Target.getLittleEndianArchVariant();
336*67e74705SXin Li if (LE.getArch() != llvm::Triple::UnknownArch)
337*67e74705SXin Li Target = std::move(LE);
338*67e74705SXin Li } else {
339*67e74705SXin Li llvm::Triple BE = Target.getBigEndianArchVariant();
340*67e74705SXin Li if (BE.getArch() != llvm::Triple::UnknownArch)
341*67e74705SXin Li Target = std::move(BE);
342*67e74705SXin Li }
343*67e74705SXin Li }
344*67e74705SXin Li
345*67e74705SXin Li // Skip further flag support on OSes which don't support '-m32' or '-m64'.
346*67e74705SXin Li if (Target.getArch() == llvm::Triple::tce ||
347*67e74705SXin Li Target.getOS() == llvm::Triple::Minix)
348*67e74705SXin Li return Target;
349*67e74705SXin Li
350*67e74705SXin Li // Handle pseudo-target flags '-m64', '-mx32', '-m32' and '-m16'.
351*67e74705SXin Li Arg *A = Args.getLastArg(options::OPT_m64, options::OPT_mx32,
352*67e74705SXin Li options::OPT_m32, options::OPT_m16);
353*67e74705SXin Li if (A) {
354*67e74705SXin Li llvm::Triple::ArchType AT = llvm::Triple::UnknownArch;
355*67e74705SXin Li
356*67e74705SXin Li if (A->getOption().matches(options::OPT_m64)) {
357*67e74705SXin Li AT = Target.get64BitArchVariant().getArch();
358*67e74705SXin Li if (Target.getEnvironment() == llvm::Triple::GNUX32)
359*67e74705SXin Li Target.setEnvironment(llvm::Triple::GNU);
360*67e74705SXin Li } else if (A->getOption().matches(options::OPT_mx32) &&
361*67e74705SXin Li Target.get64BitArchVariant().getArch() == llvm::Triple::x86_64) {
362*67e74705SXin Li AT = llvm::Triple::x86_64;
363*67e74705SXin Li Target.setEnvironment(llvm::Triple::GNUX32);
364*67e74705SXin Li } else if (A->getOption().matches(options::OPT_m32)) {
365*67e74705SXin Li AT = Target.get32BitArchVariant().getArch();
366*67e74705SXin Li if (Target.getEnvironment() == llvm::Triple::GNUX32)
367*67e74705SXin Li Target.setEnvironment(llvm::Triple::GNU);
368*67e74705SXin Li } else if (A->getOption().matches(options::OPT_m16) &&
369*67e74705SXin Li Target.get32BitArchVariant().getArch() == llvm::Triple::x86) {
370*67e74705SXin Li AT = llvm::Triple::x86;
371*67e74705SXin Li Target.setEnvironment(llvm::Triple::CODE16);
372*67e74705SXin Li }
373*67e74705SXin Li
374*67e74705SXin Li if (AT != llvm::Triple::UnknownArch && AT != Target.getArch())
375*67e74705SXin Li Target.setArch(AT);
376*67e74705SXin Li }
377*67e74705SXin Li
378*67e74705SXin Li // Handle -miamcu flag.
379*67e74705SXin Li if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) {
380*67e74705SXin Li if (Target.get32BitArchVariant().getArch() != llvm::Triple::x86)
381*67e74705SXin Li D.Diag(diag::err_drv_unsupported_opt_for_target) << "-miamcu"
382*67e74705SXin Li << Target.str();
383*67e74705SXin Li
384*67e74705SXin Li if (A && !A->getOption().matches(options::OPT_m32))
385*67e74705SXin Li D.Diag(diag::err_drv_argument_not_allowed_with)
386*67e74705SXin Li << "-miamcu" << A->getBaseArg().getAsString(Args);
387*67e74705SXin Li
388*67e74705SXin Li Target.setArch(llvm::Triple::x86);
389*67e74705SXin Li Target.setArchName("i586");
390*67e74705SXin Li Target.setEnvironment(llvm::Triple::UnknownEnvironment);
391*67e74705SXin Li Target.setEnvironmentName("");
392*67e74705SXin Li Target.setOS(llvm::Triple::ELFIAMCU);
393*67e74705SXin Li Target.setVendor(llvm::Triple::UnknownVendor);
394*67e74705SXin Li Target.setVendorName("intel");
395*67e74705SXin Li }
396*67e74705SXin Li
397*67e74705SXin Li return Target;
398*67e74705SXin Li }
399*67e74705SXin Li
400*67e74705SXin Li // \brief Parse the LTO options and record the type of LTO compilation
401*67e74705SXin Li // based on which -f(no-)?lto(=.*)? option occurs last.
setLTOMode(const llvm::opt::ArgList & Args)402*67e74705SXin Li void Driver::setLTOMode(const llvm::opt::ArgList &Args) {
403*67e74705SXin Li LTOMode = LTOK_None;
404*67e74705SXin Li if (!Args.hasFlag(options::OPT_flto, options::OPT_flto_EQ,
405*67e74705SXin Li options::OPT_fno_lto, false))
406*67e74705SXin Li return;
407*67e74705SXin Li
408*67e74705SXin Li StringRef LTOName("full");
409*67e74705SXin Li
410*67e74705SXin Li const Arg *A = Args.getLastArg(options::OPT_flto_EQ);
411*67e74705SXin Li if (A)
412*67e74705SXin Li LTOName = A->getValue();
413*67e74705SXin Li
414*67e74705SXin Li LTOMode = llvm::StringSwitch<LTOKind>(LTOName)
415*67e74705SXin Li .Case("full", LTOK_Full)
416*67e74705SXin Li .Case("thin", LTOK_Thin)
417*67e74705SXin Li .Default(LTOK_Unknown);
418*67e74705SXin Li
419*67e74705SXin Li if (LTOMode == LTOK_Unknown) {
420*67e74705SXin Li assert(A);
421*67e74705SXin Li Diag(diag::err_drv_unsupported_option_argument) << A->getOption().getName()
422*67e74705SXin Li << A->getValue();
423*67e74705SXin Li }
424*67e74705SXin Li }
425*67e74705SXin Li
CreateOffloadingDeviceToolChains(Compilation & C,InputList & Inputs)426*67e74705SXin Li void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
427*67e74705SXin Li InputList &Inputs) {
428*67e74705SXin Li
429*67e74705SXin Li //
430*67e74705SXin Li // CUDA
431*67e74705SXin Li //
432*67e74705SXin Li // We need to generate a CUDA toolchain if any of the inputs has a CUDA type.
433*67e74705SXin Li if (llvm::any_of(Inputs, [](std::pair<types::ID, const llvm::opt::Arg *> &I) {
434*67e74705SXin Li return types::isCuda(I.first);
435*67e74705SXin Li })) {
436*67e74705SXin Li const ToolChain &TC = getToolChain(
437*67e74705SXin Li C.getInputArgs(),
438*67e74705SXin Li llvm::Triple(C.getOffloadingHostToolChain()->getTriple().isArch64Bit()
439*67e74705SXin Li ? "nvptx64-nvidia-cuda"
440*67e74705SXin Li : "nvptx-nvidia-cuda"));
441*67e74705SXin Li C.addOffloadDeviceToolChain(&TC, Action::OFK_Cuda);
442*67e74705SXin Li }
443*67e74705SXin Li
444*67e74705SXin Li //
445*67e74705SXin Li // TODO: Add support for other offloading programming models here.
446*67e74705SXin Li //
447*67e74705SXin Li
448*67e74705SXin Li return;
449*67e74705SXin Li }
450*67e74705SXin Li
BuildCompilation(ArrayRef<const char * > ArgList)451*67e74705SXin Li Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
452*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Compilation construction");
453*67e74705SXin Li
454*67e74705SXin Li // FIXME: Handle environment options which affect driver behavior, somewhere
455*67e74705SXin Li // (client?). GCC_EXEC_PREFIX, LPATH, CC_PRINT_OPTIONS.
456*67e74705SXin Li
457*67e74705SXin Li if (char *env = ::getenv("COMPILER_PATH")) {
458*67e74705SXin Li StringRef CompilerPath = env;
459*67e74705SXin Li while (!CompilerPath.empty()) {
460*67e74705SXin Li std::pair<StringRef, StringRef> Split =
461*67e74705SXin Li CompilerPath.split(llvm::sys::EnvPathSeparator);
462*67e74705SXin Li PrefixDirs.push_back(Split.first);
463*67e74705SXin Li CompilerPath = Split.second;
464*67e74705SXin Li }
465*67e74705SXin Li }
466*67e74705SXin Li
467*67e74705SXin Li // We look for the driver mode option early, because the mode can affect
468*67e74705SXin Li // how other options are parsed.
469*67e74705SXin Li ParseDriverMode(ArgList.slice(1));
470*67e74705SXin Li
471*67e74705SXin Li // FIXME: What are we going to do with -V and -b?
472*67e74705SXin Li
473*67e74705SXin Li // FIXME: This stuff needs to go into the Compilation, not the driver.
474*67e74705SXin Li bool CCCPrintPhases;
475*67e74705SXin Li
476*67e74705SXin Li InputArgList Args = ParseArgStrings(ArgList.slice(1));
477*67e74705SXin Li
478*67e74705SXin Li // Silence driver warnings if requested
479*67e74705SXin Li Diags.setIgnoreAllWarnings(Args.hasArg(options::OPT_w));
480*67e74705SXin Li
481*67e74705SXin Li // -no-canonical-prefixes is used very early in main.
482*67e74705SXin Li Args.ClaimAllArgs(options::OPT_no_canonical_prefixes);
483*67e74705SXin Li
484*67e74705SXin Li // Ignore -pipe.
485*67e74705SXin Li Args.ClaimAllArgs(options::OPT_pipe);
486*67e74705SXin Li
487*67e74705SXin Li // Extract -ccc args.
488*67e74705SXin Li //
489*67e74705SXin Li // FIXME: We need to figure out where this behavior should live. Most of it
490*67e74705SXin Li // should be outside in the client; the parts that aren't should have proper
491*67e74705SXin Li // options, either by introducing new ones or by overloading gcc ones like -V
492*67e74705SXin Li // or -b.
493*67e74705SXin Li CCCPrintPhases = Args.hasArg(options::OPT_ccc_print_phases);
494*67e74705SXin Li CCCPrintBindings = Args.hasArg(options::OPT_ccc_print_bindings);
495*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT_ccc_gcc_name))
496*67e74705SXin Li CCCGenericGCCName = A->getValue();
497*67e74705SXin Li CCCUsePCH =
498*67e74705SXin Li Args.hasFlag(options::OPT_ccc_pch_is_pch, options::OPT_ccc_pch_is_pth);
499*67e74705SXin Li // FIXME: DefaultTargetTriple is used by the target-prefixed calls to as/ld
500*67e74705SXin Li // and getToolChain is const.
501*67e74705SXin Li if (IsCLMode()) {
502*67e74705SXin Li // clang-cl targets MSVC-style Win32.
503*67e74705SXin Li llvm::Triple T(DefaultTargetTriple);
504*67e74705SXin Li T.setOS(llvm::Triple::Win32);
505*67e74705SXin Li T.setVendor(llvm::Triple::PC);
506*67e74705SXin Li T.setEnvironment(llvm::Triple::MSVC);
507*67e74705SXin Li DefaultTargetTriple = T.str();
508*67e74705SXin Li }
509*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT_target))
510*67e74705SXin Li DefaultTargetTriple = A->getValue();
511*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT_ccc_install_dir))
512*67e74705SXin Li Dir = InstalledDir = A->getValue();
513*67e74705SXin Li for (const Arg *A : Args.filtered(options::OPT_B)) {
514*67e74705SXin Li A->claim();
515*67e74705SXin Li PrefixDirs.push_back(A->getValue(0));
516*67e74705SXin Li }
517*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
518*67e74705SXin Li SysRoot = A->getValue();
519*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ))
520*67e74705SXin Li DyldPrefix = A->getValue();
521*67e74705SXin Li if (Args.hasArg(options::OPT_nostdlib))
522*67e74705SXin Li UseStdLib = false;
523*67e74705SXin Li
524*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT_resource_dir))
525*67e74705SXin Li ResourceDir = A->getValue();
526*67e74705SXin Li
527*67e74705SXin Li if (const Arg *A = Args.getLastArg(options::OPT_save_temps_EQ)) {
528*67e74705SXin Li SaveTemps = llvm::StringSwitch<SaveTempsMode>(A->getValue())
529*67e74705SXin Li .Case("cwd", SaveTempsCwd)
530*67e74705SXin Li .Case("obj", SaveTempsObj)
531*67e74705SXin Li .Default(SaveTempsCwd);
532*67e74705SXin Li }
533*67e74705SXin Li
534*67e74705SXin Li setLTOMode(Args);
535*67e74705SXin Li
536*67e74705SXin Li // Ignore -fembed-bitcode options with LTO
537*67e74705SXin Li // since the output will be bitcode anyway.
538*67e74705SXin Li if (getLTOMode() == LTOK_None) {
539*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT_fembed_bitcode_EQ)) {
540*67e74705SXin Li StringRef Name = A->getValue();
541*67e74705SXin Li unsigned Model = llvm::StringSwitch<unsigned>(Name)
542*67e74705SXin Li .Case("off", EmbedNone)
543*67e74705SXin Li .Case("all", EmbedBitcode)
544*67e74705SXin Li .Case("bitcode", EmbedBitcode)
545*67e74705SXin Li .Case("marker", EmbedMarker)
546*67e74705SXin Li .Default(~0U);
547*67e74705SXin Li if (Model == ~0U) {
548*67e74705SXin Li Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args)
549*67e74705SXin Li << Name;
550*67e74705SXin Li } else
551*67e74705SXin Li BitcodeEmbed = static_cast<BitcodeEmbedMode>(Model);
552*67e74705SXin Li }
553*67e74705SXin Li } else {
554*67e74705SXin Li // claim the bitcode option under LTO so no warning is issued.
555*67e74705SXin Li Args.ClaimAllArgs(options::OPT_fembed_bitcode_EQ);
556*67e74705SXin Li }
557*67e74705SXin Li
558*67e74705SXin Li std::unique_ptr<llvm::opt::InputArgList> UArgs =
559*67e74705SXin Li llvm::make_unique<InputArgList>(std::move(Args));
560*67e74705SXin Li
561*67e74705SXin Li // Perform the default argument translations.
562*67e74705SXin Li DerivedArgList *TranslatedArgs = TranslateInputArgs(*UArgs);
563*67e74705SXin Li
564*67e74705SXin Li // Owned by the host.
565*67e74705SXin Li const ToolChain &TC = getToolChain(
566*67e74705SXin Li *UArgs, computeTargetTriple(*this, DefaultTargetTriple, *UArgs));
567*67e74705SXin Li
568*67e74705SXin Li // The compilation takes ownership of Args.
569*67e74705SXin Li Compilation *C = new Compilation(*this, TC, UArgs.release(), TranslatedArgs);
570*67e74705SXin Li
571*67e74705SXin Li if (!HandleImmediateArgs(*C))
572*67e74705SXin Li return C;
573*67e74705SXin Li
574*67e74705SXin Li // Construct the list of inputs.
575*67e74705SXin Li InputList Inputs;
576*67e74705SXin Li BuildInputs(C->getDefaultToolChain(), *TranslatedArgs, Inputs);
577*67e74705SXin Li
578*67e74705SXin Li // Populate the tool chains for the offloading devices, if any.
579*67e74705SXin Li CreateOffloadingDeviceToolChains(*C, Inputs);
580*67e74705SXin Li
581*67e74705SXin Li // Construct the list of abstract actions to perform for this compilation. On
582*67e74705SXin Li // MachO targets this uses the driver-driver and universal actions.
583*67e74705SXin Li if (TC.getTriple().isOSBinFormatMachO())
584*67e74705SXin Li BuildUniversalActions(*C, C->getDefaultToolChain(), Inputs);
585*67e74705SXin Li else
586*67e74705SXin Li BuildActions(*C, C->getArgs(), Inputs, C->getActions());
587*67e74705SXin Li
588*67e74705SXin Li if (CCCPrintPhases) {
589*67e74705SXin Li PrintActions(*C);
590*67e74705SXin Li return C;
591*67e74705SXin Li }
592*67e74705SXin Li
593*67e74705SXin Li BuildJobs(*C);
594*67e74705SXin Li
595*67e74705SXin Li return C;
596*67e74705SXin Li }
597*67e74705SXin Li
printArgList(raw_ostream & OS,const llvm::opt::ArgList & Args)598*67e74705SXin Li static void printArgList(raw_ostream &OS, const llvm::opt::ArgList &Args) {
599*67e74705SXin Li llvm::opt::ArgStringList ASL;
600*67e74705SXin Li for (const auto *A : Args)
601*67e74705SXin Li A->render(Args, ASL);
602*67e74705SXin Li
603*67e74705SXin Li for (auto I = ASL.begin(), E = ASL.end(); I != E; ++I) {
604*67e74705SXin Li if (I != ASL.begin())
605*67e74705SXin Li OS << ' ';
606*67e74705SXin Li Command::printArg(OS, *I, true);
607*67e74705SXin Li }
608*67e74705SXin Li OS << '\n';
609*67e74705SXin Li }
610*67e74705SXin Li
611*67e74705SXin Li // When clang crashes, produce diagnostic information including the fully
612*67e74705SXin Li // preprocessed source file(s). Request that the developer attach the
613*67e74705SXin Li // diagnostic information to a bug report.
generateCompilationDiagnostics(Compilation & C,const Command & FailingCommand)614*67e74705SXin Li void Driver::generateCompilationDiagnostics(Compilation &C,
615*67e74705SXin Li const Command &FailingCommand) {
616*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_fno_crash_diagnostics))
617*67e74705SXin Li return;
618*67e74705SXin Li
619*67e74705SXin Li // Don't try to generate diagnostics for link or dsymutil jobs.
620*67e74705SXin Li if (FailingCommand.getCreator().isLinkJob() ||
621*67e74705SXin Li FailingCommand.getCreator().isDsymutilJob())
622*67e74705SXin Li return;
623*67e74705SXin Li
624*67e74705SXin Li // Print the version of the compiler.
625*67e74705SXin Li PrintVersion(C, llvm::errs());
626*67e74705SXin Li
627*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
628*67e74705SXin Li << "PLEASE submit a bug report to " BUG_REPORT_URL " and include the "
629*67e74705SXin Li "crash backtrace, preprocessed source, and associated run script.";
630*67e74705SXin Li
631*67e74705SXin Li // Suppress driver output and emit preprocessor output to temp file.
632*67e74705SXin Li Mode = CPPMode;
633*67e74705SXin Li CCGenDiagnostics = true;
634*67e74705SXin Li
635*67e74705SXin Li // Save the original job command(s).
636*67e74705SXin Li Command Cmd = FailingCommand;
637*67e74705SXin Li
638*67e74705SXin Li // Keep track of whether we produce any errors while trying to produce
639*67e74705SXin Li // preprocessed sources.
640*67e74705SXin Li DiagnosticErrorTrap Trap(Diags);
641*67e74705SXin Li
642*67e74705SXin Li // Suppress tool output.
643*67e74705SXin Li C.initCompilationForDiagnostics();
644*67e74705SXin Li
645*67e74705SXin Li // Construct the list of inputs.
646*67e74705SXin Li InputList Inputs;
647*67e74705SXin Li BuildInputs(C.getDefaultToolChain(), C.getArgs(), Inputs);
648*67e74705SXin Li
649*67e74705SXin Li for (InputList::iterator it = Inputs.begin(), ie = Inputs.end(); it != ie;) {
650*67e74705SXin Li bool IgnoreInput = false;
651*67e74705SXin Li
652*67e74705SXin Li // Ignore input from stdin or any inputs that cannot be preprocessed.
653*67e74705SXin Li // Check type first as not all linker inputs have a value.
654*67e74705SXin Li if (types::getPreprocessedType(it->first) == types::TY_INVALID) {
655*67e74705SXin Li IgnoreInput = true;
656*67e74705SXin Li } else if (!strcmp(it->second->getValue(), "-")) {
657*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
658*67e74705SXin Li << "Error generating preprocessed source(s) - "
659*67e74705SXin Li "ignoring input from stdin.";
660*67e74705SXin Li IgnoreInput = true;
661*67e74705SXin Li }
662*67e74705SXin Li
663*67e74705SXin Li if (IgnoreInput) {
664*67e74705SXin Li it = Inputs.erase(it);
665*67e74705SXin Li ie = Inputs.end();
666*67e74705SXin Li } else {
667*67e74705SXin Li ++it;
668*67e74705SXin Li }
669*67e74705SXin Li }
670*67e74705SXin Li
671*67e74705SXin Li if (Inputs.empty()) {
672*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
673*67e74705SXin Li << "Error generating preprocessed source(s) - "
674*67e74705SXin Li "no preprocessable inputs.";
675*67e74705SXin Li return;
676*67e74705SXin Li }
677*67e74705SXin Li
678*67e74705SXin Li // Don't attempt to generate preprocessed files if multiple -arch options are
679*67e74705SXin Li // used, unless they're all duplicates.
680*67e74705SXin Li llvm::StringSet<> ArchNames;
681*67e74705SXin Li for (const Arg *A : C.getArgs()) {
682*67e74705SXin Li if (A->getOption().matches(options::OPT_arch)) {
683*67e74705SXin Li StringRef ArchName = A->getValue();
684*67e74705SXin Li ArchNames.insert(ArchName);
685*67e74705SXin Li }
686*67e74705SXin Li }
687*67e74705SXin Li if (ArchNames.size() > 1) {
688*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
689*67e74705SXin Li << "Error generating preprocessed source(s) - cannot generate "
690*67e74705SXin Li "preprocessed source with multiple -arch options.";
691*67e74705SXin Li return;
692*67e74705SXin Li }
693*67e74705SXin Li
694*67e74705SXin Li // Construct the list of abstract actions to perform for this compilation. On
695*67e74705SXin Li // Darwin OSes this uses the driver-driver and builds universal actions.
696*67e74705SXin Li const ToolChain &TC = C.getDefaultToolChain();
697*67e74705SXin Li if (TC.getTriple().isOSBinFormatMachO())
698*67e74705SXin Li BuildUniversalActions(C, TC, Inputs);
699*67e74705SXin Li else
700*67e74705SXin Li BuildActions(C, C.getArgs(), Inputs, C.getActions());
701*67e74705SXin Li
702*67e74705SXin Li BuildJobs(C);
703*67e74705SXin Li
704*67e74705SXin Li // If there were errors building the compilation, quit now.
705*67e74705SXin Li if (Trap.hasErrorOccurred()) {
706*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
707*67e74705SXin Li << "Error generating preprocessed source(s).";
708*67e74705SXin Li return;
709*67e74705SXin Li }
710*67e74705SXin Li
711*67e74705SXin Li // Generate preprocessed output.
712*67e74705SXin Li SmallVector<std::pair<int, const Command *>, 4> FailingCommands;
713*67e74705SXin Li C.ExecuteJobs(C.getJobs(), FailingCommands);
714*67e74705SXin Li
715*67e74705SXin Li // If any of the preprocessing commands failed, clean up and exit.
716*67e74705SXin Li if (!FailingCommands.empty()) {
717*67e74705SXin Li if (!isSaveTempsEnabled())
718*67e74705SXin Li C.CleanupFileList(C.getTempFiles(), true);
719*67e74705SXin Li
720*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
721*67e74705SXin Li << "Error generating preprocessed source(s).";
722*67e74705SXin Li return;
723*67e74705SXin Li }
724*67e74705SXin Li
725*67e74705SXin Li const ArgStringList &TempFiles = C.getTempFiles();
726*67e74705SXin Li if (TempFiles.empty()) {
727*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
728*67e74705SXin Li << "Error generating preprocessed source(s).";
729*67e74705SXin Li return;
730*67e74705SXin Li }
731*67e74705SXin Li
732*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
733*67e74705SXin Li << "\n********************\n\n"
734*67e74705SXin Li "PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:\n"
735*67e74705SXin Li "Preprocessed source(s) and associated run script(s) are located at:";
736*67e74705SXin Li
737*67e74705SXin Li SmallString<128> VFS;
738*67e74705SXin Li for (const char *TempFile : TempFiles) {
739*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg) << TempFile;
740*67e74705SXin Li if (StringRef(TempFile).endswith(".cache")) {
741*67e74705SXin Li // In some cases (modules) we'll dump extra data to help with reproducing
742*67e74705SXin Li // the crash into a directory next to the output.
743*67e74705SXin Li VFS = llvm::sys::path::filename(TempFile);
744*67e74705SXin Li llvm::sys::path::append(VFS, "vfs", "vfs.yaml");
745*67e74705SXin Li }
746*67e74705SXin Li }
747*67e74705SXin Li
748*67e74705SXin Li // Assume associated files are based off of the first temporary file.
749*67e74705SXin Li CrashReportInfo CrashInfo(TempFiles[0], VFS);
750*67e74705SXin Li
751*67e74705SXin Li std::string Script = CrashInfo.Filename.rsplit('.').first.str() + ".sh";
752*67e74705SXin Li std::error_code EC;
753*67e74705SXin Li llvm::raw_fd_ostream ScriptOS(Script, EC, llvm::sys::fs::F_Excl);
754*67e74705SXin Li if (EC) {
755*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
756*67e74705SXin Li << "Error generating run script: " + Script + " " + EC.message();
757*67e74705SXin Li } else {
758*67e74705SXin Li ScriptOS << "# Crash reproducer for " << getClangFullVersion() << "\n"
759*67e74705SXin Li << "# Driver args: ";
760*67e74705SXin Li printArgList(ScriptOS, C.getInputArgs());
761*67e74705SXin Li ScriptOS << "# Original command: ";
762*67e74705SXin Li Cmd.Print(ScriptOS, "\n", /*Quote=*/true);
763*67e74705SXin Li Cmd.Print(ScriptOS, "\n", /*Quote=*/true, &CrashInfo);
764*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg) << Script;
765*67e74705SXin Li }
766*67e74705SXin Li
767*67e74705SXin Li for (const auto &A : C.getArgs().filtered(options::OPT_frewrite_map_file,
768*67e74705SXin Li options::OPT_frewrite_map_file_EQ))
769*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg) << A->getValue();
770*67e74705SXin Li
771*67e74705SXin Li Diag(clang::diag::note_drv_command_failed_diag_msg)
772*67e74705SXin Li << "\n\n********************";
773*67e74705SXin Li }
774*67e74705SXin Li
setUpResponseFiles(Compilation & C,Command & Cmd)775*67e74705SXin Li void Driver::setUpResponseFiles(Compilation &C, Command &Cmd) {
776*67e74705SXin Li // Since commandLineFitsWithinSystemLimits() may underestimate system's capacity
777*67e74705SXin Li // if the tool does not support response files, there is a chance/ that things
778*67e74705SXin Li // will just work without a response file, so we silently just skip it.
779*67e74705SXin Li if (Cmd.getCreator().getResponseFilesSupport() == Tool::RF_None ||
780*67e74705SXin Li llvm::sys::commandLineFitsWithinSystemLimits(Cmd.getExecutable(), Cmd.getArguments()))
781*67e74705SXin Li return;
782*67e74705SXin Li
783*67e74705SXin Li std::string TmpName = GetTemporaryPath("response", "txt");
784*67e74705SXin Li Cmd.setResponseFile(
785*67e74705SXin Li C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str())));
786*67e74705SXin Li }
787*67e74705SXin Li
ExecuteCompilation(Compilation & C,SmallVectorImpl<std::pair<int,const Command * >> & FailingCommands)788*67e74705SXin Li int Driver::ExecuteCompilation(
789*67e74705SXin Li Compilation &C,
790*67e74705SXin Li SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands) {
791*67e74705SXin Li // Just print if -### was present.
792*67e74705SXin Li if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
793*67e74705SXin Li C.getJobs().Print(llvm::errs(), "\n", true);
794*67e74705SXin Li return 0;
795*67e74705SXin Li }
796*67e74705SXin Li
797*67e74705SXin Li // If there were errors building the compilation, quit now.
798*67e74705SXin Li if (Diags.hasErrorOccurred())
799*67e74705SXin Li return 1;
800*67e74705SXin Li
801*67e74705SXin Li // Set up response file names for each command, if necessary
802*67e74705SXin Li for (auto &Job : C.getJobs())
803*67e74705SXin Li setUpResponseFiles(C, Job);
804*67e74705SXin Li
805*67e74705SXin Li C.ExecuteJobs(C.getJobs(), FailingCommands);
806*67e74705SXin Li
807*67e74705SXin Li // Remove temp files.
808*67e74705SXin Li C.CleanupFileList(C.getTempFiles());
809*67e74705SXin Li
810*67e74705SXin Li // If the command succeeded, we are done.
811*67e74705SXin Li if (FailingCommands.empty())
812*67e74705SXin Li return 0;
813*67e74705SXin Li
814*67e74705SXin Li // Otherwise, remove result files and print extra information about abnormal
815*67e74705SXin Li // failures.
816*67e74705SXin Li for (const auto &CmdPair : FailingCommands) {
817*67e74705SXin Li int Res = CmdPair.first;
818*67e74705SXin Li const Command *FailingCommand = CmdPair.second;
819*67e74705SXin Li
820*67e74705SXin Li // Remove result files if we're not saving temps.
821*67e74705SXin Li if (!isSaveTempsEnabled()) {
822*67e74705SXin Li const JobAction *JA = cast<JobAction>(&FailingCommand->getSource());
823*67e74705SXin Li C.CleanupFileMap(C.getResultFiles(), JA, true);
824*67e74705SXin Li
825*67e74705SXin Li // Failure result files are valid unless we crashed.
826*67e74705SXin Li if (Res < 0)
827*67e74705SXin Li C.CleanupFileMap(C.getFailureResultFiles(), JA, true);
828*67e74705SXin Li }
829*67e74705SXin Li
830*67e74705SXin Li // Print extra information about abnormal failures, if possible.
831*67e74705SXin Li //
832*67e74705SXin Li // This is ad-hoc, but we don't want to be excessively noisy. If the result
833*67e74705SXin Li // status was 1, assume the command failed normally. In particular, if it
834*67e74705SXin Li // was the compiler then assume it gave a reasonable error code. Failures
835*67e74705SXin Li // in other tools are less common, and they generally have worse
836*67e74705SXin Li // diagnostics, so always print the diagnostic there.
837*67e74705SXin Li const Tool &FailingTool = FailingCommand->getCreator();
838*67e74705SXin Li
839*67e74705SXin Li if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) {
840*67e74705SXin Li // FIXME: See FIXME above regarding result code interpretation.
841*67e74705SXin Li if (Res < 0)
842*67e74705SXin Li Diag(clang::diag::err_drv_command_signalled)
843*67e74705SXin Li << FailingTool.getShortName();
844*67e74705SXin Li else
845*67e74705SXin Li Diag(clang::diag::err_drv_command_failed) << FailingTool.getShortName()
846*67e74705SXin Li << Res;
847*67e74705SXin Li }
848*67e74705SXin Li }
849*67e74705SXin Li return 0;
850*67e74705SXin Li }
851*67e74705SXin Li
PrintHelp(bool ShowHidden) const852*67e74705SXin Li void Driver::PrintHelp(bool ShowHidden) const {
853*67e74705SXin Li unsigned IncludedFlagsBitmask;
854*67e74705SXin Li unsigned ExcludedFlagsBitmask;
855*67e74705SXin Li std::tie(IncludedFlagsBitmask, ExcludedFlagsBitmask) =
856*67e74705SXin Li getIncludeExcludeOptionFlagMasks();
857*67e74705SXin Li
858*67e74705SXin Li ExcludedFlagsBitmask |= options::NoDriverOption;
859*67e74705SXin Li if (!ShowHidden)
860*67e74705SXin Li ExcludedFlagsBitmask |= HelpHidden;
861*67e74705SXin Li
862*67e74705SXin Li getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(),
863*67e74705SXin Li IncludedFlagsBitmask, ExcludedFlagsBitmask);
864*67e74705SXin Li }
865*67e74705SXin Li
PrintVersion(const Compilation & C,raw_ostream & OS) const866*67e74705SXin Li void Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const {
867*67e74705SXin Li // FIXME: The following handlers should use a callback mechanism, we don't
868*67e74705SXin Li // know what the client would like to do.
869*67e74705SXin Li OS << getClangFullVersion() << '\n';
870*67e74705SXin Li const ToolChain &TC = C.getDefaultToolChain();
871*67e74705SXin Li OS << "Target: " << TC.getTripleString() << '\n';
872*67e74705SXin Li
873*67e74705SXin Li // Print the threading model.
874*67e74705SXin Li if (Arg *A = C.getArgs().getLastArg(options::OPT_mthread_model)) {
875*67e74705SXin Li // Don't print if the ToolChain would have barfed on it already
876*67e74705SXin Li if (TC.isThreadModelSupported(A->getValue()))
877*67e74705SXin Li OS << "Thread model: " << A->getValue();
878*67e74705SXin Li } else
879*67e74705SXin Li OS << "Thread model: " << TC.getThreadModel();
880*67e74705SXin Li OS << '\n';
881*67e74705SXin Li
882*67e74705SXin Li // Print out the install directory.
883*67e74705SXin Li OS << "InstalledDir: " << InstalledDir << '\n';
884*67e74705SXin Li }
885*67e74705SXin Li
886*67e74705SXin Li /// PrintDiagnosticCategories - Implement the --print-diagnostic-categories
887*67e74705SXin Li /// option.
PrintDiagnosticCategories(raw_ostream & OS)888*67e74705SXin Li static void PrintDiagnosticCategories(raw_ostream &OS) {
889*67e74705SXin Li // Skip the empty category.
890*67e74705SXin Li for (unsigned i = 1, max = DiagnosticIDs::getNumberOfCategories(); i != max;
891*67e74705SXin Li ++i)
892*67e74705SXin Li OS << i << ',' << DiagnosticIDs::getCategoryNameFromID(i) << '\n';
893*67e74705SXin Li }
894*67e74705SXin Li
HandleImmediateArgs(const Compilation & C)895*67e74705SXin Li bool Driver::HandleImmediateArgs(const Compilation &C) {
896*67e74705SXin Li // The order these options are handled in gcc is all over the place, but we
897*67e74705SXin Li // don't expect inconsistencies w.r.t. that to matter in practice.
898*67e74705SXin Li
899*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_dumpmachine)) {
900*67e74705SXin Li llvm::outs() << C.getDefaultToolChain().getTripleString() << '\n';
901*67e74705SXin Li return false;
902*67e74705SXin Li }
903*67e74705SXin Li
904*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_dumpversion)) {
905*67e74705SXin Li // Since -dumpversion is only implemented for pedantic GCC compatibility, we
906*67e74705SXin Li // return an answer which matches our definition of __VERSION__.
907*67e74705SXin Li //
908*67e74705SXin Li // If we want to return a more correct answer some day, then we should
909*67e74705SXin Li // introduce a non-pedantically GCC compatible mode to Clang in which we
910*67e74705SXin Li // provide sensible definitions for -dumpversion, __VERSION__, etc.
911*67e74705SXin Li llvm::outs() << "4.2.1\n";
912*67e74705SXin Li return false;
913*67e74705SXin Li }
914*67e74705SXin Li
915*67e74705SXin Li if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) {
916*67e74705SXin Li PrintDiagnosticCategories(llvm::outs());
917*67e74705SXin Li return false;
918*67e74705SXin Li }
919*67e74705SXin Li
920*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_help) ||
921*67e74705SXin Li C.getArgs().hasArg(options::OPT__help_hidden)) {
922*67e74705SXin Li PrintHelp(C.getArgs().hasArg(options::OPT__help_hidden));
923*67e74705SXin Li return false;
924*67e74705SXin Li }
925*67e74705SXin Li
926*67e74705SXin Li if (C.getArgs().hasArg(options::OPT__version)) {
927*67e74705SXin Li // Follow gcc behavior and use stdout for --version and stderr for -v.
928*67e74705SXin Li PrintVersion(C, llvm::outs());
929*67e74705SXin Li return false;
930*67e74705SXin Li }
931*67e74705SXin Li
932*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_v) ||
933*67e74705SXin Li C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
934*67e74705SXin Li PrintVersion(C, llvm::errs());
935*67e74705SXin Li SuppressMissingInputWarning = true;
936*67e74705SXin Li }
937*67e74705SXin Li
938*67e74705SXin Li const ToolChain &TC = C.getDefaultToolChain();
939*67e74705SXin Li
940*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_v))
941*67e74705SXin Li TC.printVerboseInfo(llvm::errs());
942*67e74705SXin Li
943*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_print_search_dirs)) {
944*67e74705SXin Li llvm::outs() << "programs: =";
945*67e74705SXin Li bool separator = false;
946*67e74705SXin Li for (const std::string &Path : TC.getProgramPaths()) {
947*67e74705SXin Li if (separator)
948*67e74705SXin Li llvm::outs() << ':';
949*67e74705SXin Li llvm::outs() << Path;
950*67e74705SXin Li separator = true;
951*67e74705SXin Li }
952*67e74705SXin Li llvm::outs() << "\n";
953*67e74705SXin Li llvm::outs() << "libraries: =" << ResourceDir;
954*67e74705SXin Li
955*67e74705SXin Li StringRef sysroot = C.getSysRoot();
956*67e74705SXin Li
957*67e74705SXin Li for (const std::string &Path : TC.getFilePaths()) {
958*67e74705SXin Li // Always print a separator. ResourceDir was the first item shown.
959*67e74705SXin Li llvm::outs() << ':';
960*67e74705SXin Li // Interpretation of leading '=' is needed only for NetBSD.
961*67e74705SXin Li if (Path[0] == '=')
962*67e74705SXin Li llvm::outs() << sysroot << Path.substr(1);
963*67e74705SXin Li else
964*67e74705SXin Li llvm::outs() << Path;
965*67e74705SXin Li }
966*67e74705SXin Li llvm::outs() << "\n";
967*67e74705SXin Li return false;
968*67e74705SXin Li }
969*67e74705SXin Li
970*67e74705SXin Li // FIXME: The following handlers should use a callback mechanism, we don't
971*67e74705SXin Li // know what the client would like to do.
972*67e74705SXin Li if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) {
973*67e74705SXin Li llvm::outs() << GetFilePath(A->getValue(), TC) << "\n";
974*67e74705SXin Li return false;
975*67e74705SXin Li }
976*67e74705SXin Li
977*67e74705SXin Li if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) {
978*67e74705SXin Li llvm::outs() << GetProgramPath(A->getValue(), TC) << "\n";
979*67e74705SXin Li return false;
980*67e74705SXin Li }
981*67e74705SXin Li
982*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) {
983*67e74705SXin Li llvm::outs() << GetFilePath("libgcc.a", TC) << "\n";
984*67e74705SXin Li return false;
985*67e74705SXin Li }
986*67e74705SXin Li
987*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_print_multi_lib)) {
988*67e74705SXin Li for (const Multilib &Multilib : TC.getMultilibs())
989*67e74705SXin Li llvm::outs() << Multilib << "\n";
990*67e74705SXin Li return false;
991*67e74705SXin Li }
992*67e74705SXin Li
993*67e74705SXin Li if (C.getArgs().hasArg(options::OPT_print_multi_directory)) {
994*67e74705SXin Li for (const Multilib &Multilib : TC.getMultilibs()) {
995*67e74705SXin Li if (Multilib.gccSuffix().empty())
996*67e74705SXin Li llvm::outs() << ".\n";
997*67e74705SXin Li else {
998*67e74705SXin Li StringRef Suffix(Multilib.gccSuffix());
999*67e74705SXin Li assert(Suffix.front() == '/');
1000*67e74705SXin Li llvm::outs() << Suffix.substr(1) << "\n";
1001*67e74705SXin Li }
1002*67e74705SXin Li }
1003*67e74705SXin Li return false;
1004*67e74705SXin Li }
1005*67e74705SXin Li return true;
1006*67e74705SXin Li }
1007*67e74705SXin Li
1008*67e74705SXin Li // Display an action graph human-readably. Action A is the "sink" node
1009*67e74705SXin Li // and latest-occuring action. Traversal is in pre-order, visiting the
1010*67e74705SXin Li // inputs to each action before printing the action itself.
PrintActions1(const Compilation & C,Action * A,std::map<Action *,unsigned> & Ids)1011*67e74705SXin Li static unsigned PrintActions1(const Compilation &C, Action *A,
1012*67e74705SXin Li std::map<Action *, unsigned> &Ids) {
1013*67e74705SXin Li if (Ids.count(A)) // A was already visited.
1014*67e74705SXin Li return Ids[A];
1015*67e74705SXin Li
1016*67e74705SXin Li std::string str;
1017*67e74705SXin Li llvm::raw_string_ostream os(str);
1018*67e74705SXin Li
1019*67e74705SXin Li os << Action::getClassName(A->getKind()) << ", ";
1020*67e74705SXin Li if (InputAction *IA = dyn_cast<InputAction>(A)) {
1021*67e74705SXin Li os << "\"" << IA->getInputArg().getValue() << "\"";
1022*67e74705SXin Li } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) {
1023*67e74705SXin Li os << '"' << BIA->getArchName() << '"' << ", {"
1024*67e74705SXin Li << PrintActions1(C, *BIA->input_begin(), Ids) << "}";
1025*67e74705SXin Li } else if (CudaDeviceAction *CDA = dyn_cast<CudaDeviceAction>(A)) {
1026*67e74705SXin Li CudaArch Arch = CDA->getGpuArch();
1027*67e74705SXin Li if (Arch != CudaArch::UNKNOWN)
1028*67e74705SXin Li os << "'" << CudaArchToString(Arch) << "', ";
1029*67e74705SXin Li os << "{" << PrintActions1(C, *CDA->input_begin(), Ids) << "}";
1030*67e74705SXin Li } else {
1031*67e74705SXin Li const ActionList *AL;
1032*67e74705SXin Li if (CudaHostAction *CHA = dyn_cast<CudaHostAction>(A)) {
1033*67e74705SXin Li os << "{" << PrintActions1(C, *CHA->input_begin(), Ids) << "}"
1034*67e74705SXin Li << ", gpu binaries ";
1035*67e74705SXin Li AL = &CHA->getDeviceActions();
1036*67e74705SXin Li } else
1037*67e74705SXin Li AL = &A->getInputs();
1038*67e74705SXin Li
1039*67e74705SXin Li if (AL->size()) {
1040*67e74705SXin Li const char *Prefix = "{";
1041*67e74705SXin Li for (Action *PreRequisite : *AL) {
1042*67e74705SXin Li os << Prefix << PrintActions1(C, PreRequisite, Ids);
1043*67e74705SXin Li Prefix = ", ";
1044*67e74705SXin Li }
1045*67e74705SXin Li os << "}";
1046*67e74705SXin Li } else
1047*67e74705SXin Li os << "{}";
1048*67e74705SXin Li }
1049*67e74705SXin Li
1050*67e74705SXin Li unsigned Id = Ids.size();
1051*67e74705SXin Li Ids[A] = Id;
1052*67e74705SXin Li llvm::errs() << Id << ": " << os.str() << ", "
1053*67e74705SXin Li << types::getTypeName(A->getType()) << "\n";
1054*67e74705SXin Li
1055*67e74705SXin Li return Id;
1056*67e74705SXin Li }
1057*67e74705SXin Li
1058*67e74705SXin Li // Print the action graphs in a compilation C.
1059*67e74705SXin Li // For example "clang -c file1.c file2.c" is composed of two subgraphs.
PrintActions(const Compilation & C) const1060*67e74705SXin Li void Driver::PrintActions(const Compilation &C) const {
1061*67e74705SXin Li std::map<Action *, unsigned> Ids;
1062*67e74705SXin Li for (Action *A : C.getActions())
1063*67e74705SXin Li PrintActions1(C, A, Ids);
1064*67e74705SXin Li }
1065*67e74705SXin Li
1066*67e74705SXin Li /// \brief Check whether the given input tree contains any compilation or
1067*67e74705SXin Li /// assembly actions.
ContainsCompileOrAssembleAction(const Action * A)1068*67e74705SXin Li static bool ContainsCompileOrAssembleAction(const Action *A) {
1069*67e74705SXin Li if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A) ||
1070*67e74705SXin Li isa<AssembleJobAction>(A))
1071*67e74705SXin Li return true;
1072*67e74705SXin Li
1073*67e74705SXin Li for (const Action *Input : A->inputs())
1074*67e74705SXin Li if (ContainsCompileOrAssembleAction(Input))
1075*67e74705SXin Li return true;
1076*67e74705SXin Li
1077*67e74705SXin Li return false;
1078*67e74705SXin Li }
1079*67e74705SXin Li
BuildUniversalActions(Compilation & C,const ToolChain & TC,const InputList & BAInputs) const1080*67e74705SXin Li void Driver::BuildUniversalActions(Compilation &C, const ToolChain &TC,
1081*67e74705SXin Li const InputList &BAInputs) const {
1082*67e74705SXin Li DerivedArgList &Args = C.getArgs();
1083*67e74705SXin Li ActionList &Actions = C.getActions();
1084*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Building universal build actions");
1085*67e74705SXin Li // Collect the list of architectures. Duplicates are allowed, but should only
1086*67e74705SXin Li // be handled once (in the order seen).
1087*67e74705SXin Li llvm::StringSet<> ArchNames;
1088*67e74705SXin Li SmallVector<const char *, 4> Archs;
1089*67e74705SXin Li for (Arg *A : Args) {
1090*67e74705SXin Li if (A->getOption().matches(options::OPT_arch)) {
1091*67e74705SXin Li // Validate the option here; we don't save the type here because its
1092*67e74705SXin Li // particular spelling may participate in other driver choices.
1093*67e74705SXin Li llvm::Triple::ArchType Arch =
1094*67e74705SXin Li tools::darwin::getArchTypeForMachOArchName(A->getValue());
1095*67e74705SXin Li if (Arch == llvm::Triple::UnknownArch) {
1096*67e74705SXin Li Diag(clang::diag::err_drv_invalid_arch_name) << A->getAsString(Args);
1097*67e74705SXin Li continue;
1098*67e74705SXin Li }
1099*67e74705SXin Li
1100*67e74705SXin Li A->claim();
1101*67e74705SXin Li if (ArchNames.insert(A->getValue()).second)
1102*67e74705SXin Li Archs.push_back(A->getValue());
1103*67e74705SXin Li }
1104*67e74705SXin Li }
1105*67e74705SXin Li
1106*67e74705SXin Li // When there is no explicit arch for this platform, make sure we still bind
1107*67e74705SXin Li // the architecture (to the default) so that -Xarch_ is handled correctly.
1108*67e74705SXin Li if (!Archs.size())
1109*67e74705SXin Li Archs.push_back(Args.MakeArgString(TC.getDefaultUniversalArchName()));
1110*67e74705SXin Li
1111*67e74705SXin Li ActionList SingleActions;
1112*67e74705SXin Li BuildActions(C, Args, BAInputs, SingleActions);
1113*67e74705SXin Li
1114*67e74705SXin Li // Add in arch bindings for every top level action, as well as lipo and
1115*67e74705SXin Li // dsymutil steps if needed.
1116*67e74705SXin Li for (Action* Act : SingleActions) {
1117*67e74705SXin Li // Make sure we can lipo this kind of output. If not (and it is an actual
1118*67e74705SXin Li // output) then we disallow, since we can't create an output file with the
1119*67e74705SXin Li // right name without overwriting it. We could remove this oddity by just
1120*67e74705SXin Li // changing the output names to include the arch, which would also fix
1121*67e74705SXin Li // -save-temps. Compatibility wins for now.
1122*67e74705SXin Li
1123*67e74705SXin Li if (Archs.size() > 1 && !types::canLipoType(Act->getType()))
1124*67e74705SXin Li Diag(clang::diag::err_drv_invalid_output_with_multiple_archs)
1125*67e74705SXin Li << types::getTypeName(Act->getType());
1126*67e74705SXin Li
1127*67e74705SXin Li ActionList Inputs;
1128*67e74705SXin Li for (unsigned i = 0, e = Archs.size(); i != e; ++i)
1129*67e74705SXin Li Inputs.push_back(C.MakeAction<BindArchAction>(Act, Archs[i]));
1130*67e74705SXin Li
1131*67e74705SXin Li // Lipo if necessary, we do it this way because we need to set the arch flag
1132*67e74705SXin Li // so that -Xarch_ gets overwritten.
1133*67e74705SXin Li if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing)
1134*67e74705SXin Li Actions.append(Inputs.begin(), Inputs.end());
1135*67e74705SXin Li else
1136*67e74705SXin Li Actions.push_back(C.MakeAction<LipoJobAction>(Inputs, Act->getType()));
1137*67e74705SXin Li
1138*67e74705SXin Li // Handle debug info queries.
1139*67e74705SXin Li Arg *A = Args.getLastArg(options::OPT_g_Group);
1140*67e74705SXin Li if (A && !A->getOption().matches(options::OPT_g0) &&
1141*67e74705SXin Li !A->getOption().matches(options::OPT_gstabs) &&
1142*67e74705SXin Li ContainsCompileOrAssembleAction(Actions.back())) {
1143*67e74705SXin Li
1144*67e74705SXin Li // Add a 'dsymutil' step if necessary, when debug info is enabled and we
1145*67e74705SXin Li // have a compile input. We need to run 'dsymutil' ourselves in such cases
1146*67e74705SXin Li // because the debug info will refer to a temporary object file which
1147*67e74705SXin Li // will be removed at the end of the compilation process.
1148*67e74705SXin Li if (Act->getType() == types::TY_Image) {
1149*67e74705SXin Li ActionList Inputs;
1150*67e74705SXin Li Inputs.push_back(Actions.back());
1151*67e74705SXin Li Actions.pop_back();
1152*67e74705SXin Li Actions.push_back(
1153*67e74705SXin Li C.MakeAction<DsymutilJobAction>(Inputs, types::TY_dSYM));
1154*67e74705SXin Li }
1155*67e74705SXin Li
1156*67e74705SXin Li // Verify the debug info output.
1157*67e74705SXin Li if (Args.hasArg(options::OPT_verify_debug_info)) {
1158*67e74705SXin Li Action* LastAction = Actions.back();
1159*67e74705SXin Li Actions.pop_back();
1160*67e74705SXin Li Actions.push_back(C.MakeAction<VerifyDebugInfoJobAction>(
1161*67e74705SXin Li LastAction, types::TY_Nothing));
1162*67e74705SXin Li }
1163*67e74705SXin Li }
1164*67e74705SXin Li }
1165*67e74705SXin Li }
1166*67e74705SXin Li
1167*67e74705SXin Li /// \brief Check that the file referenced by Value exists. If it doesn't,
1168*67e74705SXin Li /// issue a diagnostic and return false.
DiagnoseInputExistence(const Driver & D,const DerivedArgList & Args,StringRef Value,types::ID Ty)1169*67e74705SXin Li static bool DiagnoseInputExistence(const Driver &D, const DerivedArgList &Args,
1170*67e74705SXin Li StringRef Value, types::ID Ty) {
1171*67e74705SXin Li if (!D.getCheckInputsExist())
1172*67e74705SXin Li return true;
1173*67e74705SXin Li
1174*67e74705SXin Li // stdin always exists.
1175*67e74705SXin Li if (Value == "-")
1176*67e74705SXin Li return true;
1177*67e74705SXin Li
1178*67e74705SXin Li SmallString<64> Path(Value);
1179*67e74705SXin Li if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) {
1180*67e74705SXin Li if (!llvm::sys::path::is_absolute(Path)) {
1181*67e74705SXin Li SmallString<64> Directory(WorkDir->getValue());
1182*67e74705SXin Li llvm::sys::path::append(Directory, Value);
1183*67e74705SXin Li Path.assign(Directory);
1184*67e74705SXin Li }
1185*67e74705SXin Li }
1186*67e74705SXin Li
1187*67e74705SXin Li if (llvm::sys::fs::exists(Twine(Path)))
1188*67e74705SXin Li return true;
1189*67e74705SXin Li
1190*67e74705SXin Li if (D.IsCLMode()) {
1191*67e74705SXin Li if (!llvm::sys::path::is_absolute(Twine(Path)) &&
1192*67e74705SXin Li llvm::sys::Process::FindInEnvPath("LIB", Value))
1193*67e74705SXin Li return true;
1194*67e74705SXin Li
1195*67e74705SXin Li if (Args.hasArg(options::OPT__SLASH_link) && Ty == types::TY_Object) {
1196*67e74705SXin Li // Arguments to the /link flag might cause the linker to search for object
1197*67e74705SXin Li // and library files in paths we don't know about. Don't error in such
1198*67e74705SXin Li // cases.
1199*67e74705SXin Li return true;
1200*67e74705SXin Li }
1201*67e74705SXin Li }
1202*67e74705SXin Li
1203*67e74705SXin Li D.Diag(clang::diag::err_drv_no_such_file) << Path;
1204*67e74705SXin Li return false;
1205*67e74705SXin Li }
1206*67e74705SXin Li
1207*67e74705SXin Li // Construct a the list of inputs and their types.
BuildInputs(const ToolChain & TC,DerivedArgList & Args,InputList & Inputs) const1208*67e74705SXin Li void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
1209*67e74705SXin Li InputList &Inputs) const {
1210*67e74705SXin Li // Track the current user specified (-x) input. We also explicitly track the
1211*67e74705SXin Li // argument used to set the type; we only want to claim the type when we
1212*67e74705SXin Li // actually use it, so we warn about unused -x arguments.
1213*67e74705SXin Li types::ID InputType = types::TY_Nothing;
1214*67e74705SXin Li Arg *InputTypeArg = nullptr;
1215*67e74705SXin Li
1216*67e74705SXin Li // The last /TC or /TP option sets the input type to C or C++ globally.
1217*67e74705SXin Li if (Arg *TCTP = Args.getLastArgNoClaim(options::OPT__SLASH_TC,
1218*67e74705SXin Li options::OPT__SLASH_TP)) {
1219*67e74705SXin Li InputTypeArg = TCTP;
1220*67e74705SXin Li InputType = TCTP->getOption().matches(options::OPT__SLASH_TC)
1221*67e74705SXin Li ? types::TY_C
1222*67e74705SXin Li : types::TY_CXX;
1223*67e74705SXin Li
1224*67e74705SXin Li arg_iterator it =
1225*67e74705SXin Li Args.filtered_begin(options::OPT__SLASH_TC, options::OPT__SLASH_TP);
1226*67e74705SXin Li const arg_iterator ie = Args.filtered_end();
1227*67e74705SXin Li Arg *Previous = *it++;
1228*67e74705SXin Li bool ShowNote = false;
1229*67e74705SXin Li while (it != ie) {
1230*67e74705SXin Li Diag(clang::diag::warn_drv_overriding_flag_option)
1231*67e74705SXin Li << Previous->getSpelling() << (*it)->getSpelling();
1232*67e74705SXin Li Previous = *it++;
1233*67e74705SXin Li ShowNote = true;
1234*67e74705SXin Li }
1235*67e74705SXin Li if (ShowNote)
1236*67e74705SXin Li Diag(clang::diag::note_drv_t_option_is_global);
1237*67e74705SXin Li
1238*67e74705SXin Li // No driver mode exposes -x and /TC or /TP; we don't support mixing them.
1239*67e74705SXin Li assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed");
1240*67e74705SXin Li }
1241*67e74705SXin Li
1242*67e74705SXin Li for (Arg *A : Args) {
1243*67e74705SXin Li if (A->getOption().getKind() == Option::InputClass) {
1244*67e74705SXin Li const char *Value = A->getValue();
1245*67e74705SXin Li types::ID Ty = types::TY_INVALID;
1246*67e74705SXin Li
1247*67e74705SXin Li // Infer the input type if necessary.
1248*67e74705SXin Li if (InputType == types::TY_Nothing) {
1249*67e74705SXin Li // If there was an explicit arg for this, claim it.
1250*67e74705SXin Li if (InputTypeArg)
1251*67e74705SXin Li InputTypeArg->claim();
1252*67e74705SXin Li
1253*67e74705SXin Li // stdin must be handled specially.
1254*67e74705SXin Li if (memcmp(Value, "-", 2) == 0) {
1255*67e74705SXin Li // If running with -E, treat as a C input (this changes the builtin
1256*67e74705SXin Li // macros, for example). This may be overridden by -ObjC below.
1257*67e74705SXin Li //
1258*67e74705SXin Li // Otherwise emit an error but still use a valid type to avoid
1259*67e74705SXin Li // spurious errors (e.g., no inputs).
1260*67e74705SXin Li if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP())
1261*67e74705SXin Li Diag(IsCLMode() ? clang::diag::err_drv_unknown_stdin_type_clang_cl
1262*67e74705SXin Li : clang::diag::err_drv_unknown_stdin_type);
1263*67e74705SXin Li Ty = types::TY_C;
1264*67e74705SXin Li } else {
1265*67e74705SXin Li // Otherwise lookup by extension.
1266*67e74705SXin Li // Fallback is C if invoked as C preprocessor or Object otherwise.
1267*67e74705SXin Li // We use a host hook here because Darwin at least has its own
1268*67e74705SXin Li // idea of what .s is.
1269*67e74705SXin Li if (const char *Ext = strrchr(Value, '.'))
1270*67e74705SXin Li Ty = TC.LookupTypeForExtension(Ext + 1);
1271*67e74705SXin Li
1272*67e74705SXin Li if (Ty == types::TY_INVALID) {
1273*67e74705SXin Li if (CCCIsCPP())
1274*67e74705SXin Li Ty = types::TY_C;
1275*67e74705SXin Li else
1276*67e74705SXin Li Ty = types::TY_Object;
1277*67e74705SXin Li }
1278*67e74705SXin Li
1279*67e74705SXin Li // If the driver is invoked as C++ compiler (like clang++ or c++) it
1280*67e74705SXin Li // should autodetect some input files as C++ for g++ compatibility.
1281*67e74705SXin Li if (CCCIsCXX()) {
1282*67e74705SXin Li types::ID OldTy = Ty;
1283*67e74705SXin Li Ty = types::lookupCXXTypeForCType(Ty);
1284*67e74705SXin Li
1285*67e74705SXin Li if (Ty != OldTy)
1286*67e74705SXin Li Diag(clang::diag::warn_drv_treating_input_as_cxx)
1287*67e74705SXin Li << getTypeName(OldTy) << getTypeName(Ty);
1288*67e74705SXin Li }
1289*67e74705SXin Li }
1290*67e74705SXin Li
1291*67e74705SXin Li // -ObjC and -ObjC++ override the default language, but only for "source
1292*67e74705SXin Li // files". We just treat everything that isn't a linker input as a
1293*67e74705SXin Li // source file.
1294*67e74705SXin Li //
1295*67e74705SXin Li // FIXME: Clean this up if we move the phase sequence into the type.
1296*67e74705SXin Li if (Ty != types::TY_Object) {
1297*67e74705SXin Li if (Args.hasArg(options::OPT_ObjC))
1298*67e74705SXin Li Ty = types::TY_ObjC;
1299*67e74705SXin Li else if (Args.hasArg(options::OPT_ObjCXX))
1300*67e74705SXin Li Ty = types::TY_ObjCXX;
1301*67e74705SXin Li }
1302*67e74705SXin Li } else {
1303*67e74705SXin Li assert(InputTypeArg && "InputType set w/o InputTypeArg");
1304*67e74705SXin Li if (!InputTypeArg->getOption().matches(options::OPT_x)) {
1305*67e74705SXin Li // If emulating cl.exe, make sure that /TC and /TP don't affect input
1306*67e74705SXin Li // object files.
1307*67e74705SXin Li const char *Ext = strrchr(Value, '.');
1308*67e74705SXin Li if (Ext && TC.LookupTypeForExtension(Ext + 1) == types::TY_Object)
1309*67e74705SXin Li Ty = types::TY_Object;
1310*67e74705SXin Li }
1311*67e74705SXin Li if (Ty == types::TY_INVALID) {
1312*67e74705SXin Li Ty = InputType;
1313*67e74705SXin Li InputTypeArg->claim();
1314*67e74705SXin Li }
1315*67e74705SXin Li }
1316*67e74705SXin Li
1317*67e74705SXin Li if (DiagnoseInputExistence(*this, Args, Value, Ty))
1318*67e74705SXin Li Inputs.push_back(std::make_pair(Ty, A));
1319*67e74705SXin Li
1320*67e74705SXin Li } else if (A->getOption().matches(options::OPT__SLASH_Tc)) {
1321*67e74705SXin Li StringRef Value = A->getValue();
1322*67e74705SXin Li if (DiagnoseInputExistence(*this, Args, Value, types::TY_C)) {
1323*67e74705SXin Li Arg *InputArg = MakeInputArg(Args, Opts, A->getValue());
1324*67e74705SXin Li Inputs.push_back(std::make_pair(types::TY_C, InputArg));
1325*67e74705SXin Li }
1326*67e74705SXin Li A->claim();
1327*67e74705SXin Li } else if (A->getOption().matches(options::OPT__SLASH_Tp)) {
1328*67e74705SXin Li StringRef Value = A->getValue();
1329*67e74705SXin Li if (DiagnoseInputExistence(*this, Args, Value, types::TY_CXX)) {
1330*67e74705SXin Li Arg *InputArg = MakeInputArg(Args, Opts, A->getValue());
1331*67e74705SXin Li Inputs.push_back(std::make_pair(types::TY_CXX, InputArg));
1332*67e74705SXin Li }
1333*67e74705SXin Li A->claim();
1334*67e74705SXin Li } else if (A->getOption().hasFlag(options::LinkerInput)) {
1335*67e74705SXin Li // Just treat as object type, we could make a special type for this if
1336*67e74705SXin Li // necessary.
1337*67e74705SXin Li Inputs.push_back(std::make_pair(types::TY_Object, A));
1338*67e74705SXin Li
1339*67e74705SXin Li } else if (A->getOption().matches(options::OPT_x)) {
1340*67e74705SXin Li InputTypeArg = A;
1341*67e74705SXin Li InputType = types::lookupTypeForTypeSpecifier(A->getValue());
1342*67e74705SXin Li A->claim();
1343*67e74705SXin Li
1344*67e74705SXin Li // Follow gcc behavior and treat as linker input for invalid -x
1345*67e74705SXin Li // options. Its not clear why we shouldn't just revert to unknown; but
1346*67e74705SXin Li // this isn't very important, we might as well be bug compatible.
1347*67e74705SXin Li if (!InputType) {
1348*67e74705SXin Li Diag(clang::diag::err_drv_unknown_language) << A->getValue();
1349*67e74705SXin Li InputType = types::TY_Object;
1350*67e74705SXin Li }
1351*67e74705SXin Li }
1352*67e74705SXin Li }
1353*67e74705SXin Li if (CCCIsCPP() && Inputs.empty()) {
1354*67e74705SXin Li // If called as standalone preprocessor, stdin is processed
1355*67e74705SXin Li // if no other input is present.
1356*67e74705SXin Li Arg *A = MakeInputArg(Args, Opts, "-");
1357*67e74705SXin Li Inputs.push_back(std::make_pair(types::TY_C, A));
1358*67e74705SXin Li }
1359*67e74705SXin Li }
1360*67e74705SXin Li
1361*67e74705SXin Li // For each unique --cuda-gpu-arch= argument creates a TY_CUDA_DEVICE
1362*67e74705SXin Li // input action and then wraps each in CudaDeviceAction paired with
1363*67e74705SXin Li // appropriate GPU arch name. In case of partial (i.e preprocessing
1364*67e74705SXin Li // only) or device-only compilation, each device action is added to /p
1365*67e74705SXin Li // Actions and /p Current is released. Otherwise the function creates
1366*67e74705SXin Li // and returns a new CudaHostAction which wraps /p Current and device
1367*67e74705SXin Li // side actions.
buildCudaActions(Compilation & C,DerivedArgList & Args,const Arg * InputArg,Action * HostAction,ActionList & Actions)1368*67e74705SXin Li static Action *buildCudaActions(Compilation &C, DerivedArgList &Args,
1369*67e74705SXin Li const Arg *InputArg, Action *HostAction,
1370*67e74705SXin Li ActionList &Actions) {
1371*67e74705SXin Li Arg *PartialCompilationArg = Args.getLastArg(
1372*67e74705SXin Li options::OPT_cuda_host_only, options::OPT_cuda_device_only,
1373*67e74705SXin Li options::OPT_cuda_compile_host_device);
1374*67e74705SXin Li bool CompileHostOnly =
1375*67e74705SXin Li PartialCompilationArg &&
1376*67e74705SXin Li PartialCompilationArg->getOption().matches(options::OPT_cuda_host_only);
1377*67e74705SXin Li bool CompileDeviceOnly =
1378*67e74705SXin Li PartialCompilationArg &&
1379*67e74705SXin Li PartialCompilationArg->getOption().matches(options::OPT_cuda_device_only);
1380*67e74705SXin Li
1381*67e74705SXin Li if (CompileHostOnly)
1382*67e74705SXin Li return C.MakeAction<CudaHostAction>(HostAction, ActionList());
1383*67e74705SXin Li
1384*67e74705SXin Li // Collect all cuda_gpu_arch parameters, removing duplicates.
1385*67e74705SXin Li SmallVector<CudaArch, 4> GpuArchList;
1386*67e74705SXin Li llvm::SmallSet<CudaArch, 4> GpuArchs;
1387*67e74705SXin Li for (Arg *A : Args) {
1388*67e74705SXin Li if (!A->getOption().matches(options::OPT_cuda_gpu_arch_EQ))
1389*67e74705SXin Li continue;
1390*67e74705SXin Li A->claim();
1391*67e74705SXin Li
1392*67e74705SXin Li const auto &ArchStr = A->getValue();
1393*67e74705SXin Li CudaArch Arch = StringToCudaArch(ArchStr);
1394*67e74705SXin Li if (Arch == CudaArch::UNKNOWN)
1395*67e74705SXin Li C.getDriver().Diag(clang::diag::err_drv_cuda_bad_gpu_arch) << ArchStr;
1396*67e74705SXin Li else if (GpuArchs.insert(Arch).second)
1397*67e74705SXin Li GpuArchList.push_back(Arch);
1398*67e74705SXin Li }
1399*67e74705SXin Li
1400*67e74705SXin Li // Default to sm_20 which is the lowest common denominator for supported GPUs.
1401*67e74705SXin Li // sm_20 code should work correctly, if suboptimally, on all newer GPUs.
1402*67e74705SXin Li if (GpuArchList.empty())
1403*67e74705SXin Li GpuArchList.push_back(CudaArch::SM_20);
1404*67e74705SXin Li
1405*67e74705SXin Li // Replicate inputs for each GPU architecture.
1406*67e74705SXin Li Driver::InputList CudaDeviceInputs;
1407*67e74705SXin Li for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I)
1408*67e74705SXin Li CudaDeviceInputs.push_back(std::make_pair(types::TY_CUDA_DEVICE, InputArg));
1409*67e74705SXin Li
1410*67e74705SXin Li // Build actions for all device inputs.
1411*67e74705SXin Li assert(C.getSingleOffloadToolChain<Action::OFK_Cuda>() &&
1412*67e74705SXin Li "Missing toolchain for device-side compilation.");
1413*67e74705SXin Li ActionList CudaDeviceActions;
1414*67e74705SXin Li C.getDriver().BuildActions(C, Args, CudaDeviceInputs, CudaDeviceActions);
1415*67e74705SXin Li assert(GpuArchList.size() == CudaDeviceActions.size() &&
1416*67e74705SXin Li "Failed to create actions for all devices");
1417*67e74705SXin Li
1418*67e74705SXin Li // Check whether any of device actions stopped before they could generate PTX.
1419*67e74705SXin Li bool PartialCompilation =
1420*67e74705SXin Li llvm::any_of(CudaDeviceActions, [](const Action *a) {
1421*67e74705SXin Li return a->getKind() != Action::AssembleJobClass;
1422*67e74705SXin Li });
1423*67e74705SXin Li
1424*67e74705SXin Li // Figure out what to do with device actions -- pass them as inputs to the
1425*67e74705SXin Li // host action or run each of them independently.
1426*67e74705SXin Li if (PartialCompilation || CompileDeviceOnly) {
1427*67e74705SXin Li // In case of partial or device-only compilation results of device actions
1428*67e74705SXin Li // are not consumed by the host action device actions have to be added to
1429*67e74705SXin Li // top-level actions list with AtTopLevel=true and run independently.
1430*67e74705SXin Li
1431*67e74705SXin Li // -o is ambiguous if we have more than one top-level action.
1432*67e74705SXin Li if (Args.hasArg(options::OPT_o) &&
1433*67e74705SXin Li (!CompileDeviceOnly || GpuArchList.size() > 1)) {
1434*67e74705SXin Li C.getDriver().Diag(
1435*67e74705SXin Li clang::diag::err_drv_output_argument_with_multiple_files);
1436*67e74705SXin Li return nullptr;
1437*67e74705SXin Li }
1438*67e74705SXin Li
1439*67e74705SXin Li for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I)
1440*67e74705SXin Li Actions.push_back(C.MakeAction<CudaDeviceAction>(CudaDeviceActions[I],
1441*67e74705SXin Li GpuArchList[I],
1442*67e74705SXin Li /* AtTopLevel */ true));
1443*67e74705SXin Li // Kill host action in case of device-only compilation.
1444*67e74705SXin Li if (CompileDeviceOnly)
1445*67e74705SXin Li return nullptr;
1446*67e74705SXin Li return HostAction;
1447*67e74705SXin Li }
1448*67e74705SXin Li
1449*67e74705SXin Li // If we're not a partial or device-only compilation, we compile each arch to
1450*67e74705SXin Li // ptx and assemble to cubin, then feed the cubin *and* the ptx into a device
1451*67e74705SXin Li // "link" action, which uses fatbinary to combine these cubins into one
1452*67e74705SXin Li // fatbin. The fatbin is then an input to the host compilation.
1453*67e74705SXin Li ActionList DeviceActions;
1454*67e74705SXin Li for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I) {
1455*67e74705SXin Li Action* AssembleAction = CudaDeviceActions[I];
1456*67e74705SXin Li assert(AssembleAction->getType() == types::TY_Object);
1457*67e74705SXin Li assert(AssembleAction->getInputs().size() == 1);
1458*67e74705SXin Li
1459*67e74705SXin Li Action* BackendAction = AssembleAction->getInputs()[0];
1460*67e74705SXin Li assert(BackendAction->getType() == types::TY_PP_Asm);
1461*67e74705SXin Li
1462*67e74705SXin Li for (const auto& A : {AssembleAction, BackendAction}) {
1463*67e74705SXin Li DeviceActions.push_back(C.MakeAction<CudaDeviceAction>(
1464*67e74705SXin Li A, GpuArchList[I], /* AtTopLevel */ false));
1465*67e74705SXin Li }
1466*67e74705SXin Li }
1467*67e74705SXin Li auto FatbinAction = C.MakeAction<CudaDeviceAction>(
1468*67e74705SXin Li C.MakeAction<LinkJobAction>(DeviceActions, types::TY_CUDA_FATBIN),
1469*67e74705SXin Li CudaArch::UNKNOWN,
1470*67e74705SXin Li /* AtTopLevel = */ false);
1471*67e74705SXin Li // Return a new host action that incorporates original host action and all
1472*67e74705SXin Li // device actions.
1473*67e74705SXin Li return C.MakeAction<CudaHostAction>(std::move(HostAction),
1474*67e74705SXin Li ActionList({FatbinAction}));
1475*67e74705SXin Li }
1476*67e74705SXin Li
BuildActions(Compilation & C,DerivedArgList & Args,const InputList & Inputs,ActionList & Actions) const1477*67e74705SXin Li void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
1478*67e74705SXin Li const InputList &Inputs, ActionList &Actions) const {
1479*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Building compilation actions");
1480*67e74705SXin Li
1481*67e74705SXin Li if (!SuppressMissingInputWarning && Inputs.empty()) {
1482*67e74705SXin Li Diag(clang::diag::err_drv_no_input_files);
1483*67e74705SXin Li return;
1484*67e74705SXin Li }
1485*67e74705SXin Li
1486*67e74705SXin Li Arg *FinalPhaseArg;
1487*67e74705SXin Li phases::ID FinalPhase = getFinalPhase(Args, &FinalPhaseArg);
1488*67e74705SXin Li
1489*67e74705SXin Li if (FinalPhase == phases::Link && Args.hasArg(options::OPT_emit_llvm)) {
1490*67e74705SXin Li Diag(clang::diag::err_drv_emit_llvm_link);
1491*67e74705SXin Li }
1492*67e74705SXin Li
1493*67e74705SXin Li // Reject -Z* at the top level, these options should never have been exposed
1494*67e74705SXin Li // by gcc.
1495*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT_Z_Joined))
1496*67e74705SXin Li Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args);
1497*67e74705SXin Li
1498*67e74705SXin Li // Diagnose misuse of /Fo.
1499*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fo)) {
1500*67e74705SXin Li StringRef V = A->getValue();
1501*67e74705SXin Li if (Inputs.size() > 1 && !V.empty() &&
1502*67e74705SXin Li !llvm::sys::path::is_separator(V.back())) {
1503*67e74705SXin Li // Check whether /Fo tries to name an output file for multiple inputs.
1504*67e74705SXin Li Diag(clang::diag::err_drv_out_file_argument_with_multiple_sources)
1505*67e74705SXin Li << A->getSpelling() << V;
1506*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Fo);
1507*67e74705SXin Li }
1508*67e74705SXin Li }
1509*67e74705SXin Li
1510*67e74705SXin Li // Diagnose misuse of /Fa.
1511*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fa)) {
1512*67e74705SXin Li StringRef V = A->getValue();
1513*67e74705SXin Li if (Inputs.size() > 1 && !V.empty() &&
1514*67e74705SXin Li !llvm::sys::path::is_separator(V.back())) {
1515*67e74705SXin Li // Check whether /Fa tries to name an asm file for multiple inputs.
1516*67e74705SXin Li Diag(clang::diag::err_drv_out_file_argument_with_multiple_sources)
1517*67e74705SXin Li << A->getSpelling() << V;
1518*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Fa);
1519*67e74705SXin Li }
1520*67e74705SXin Li }
1521*67e74705SXin Li
1522*67e74705SXin Li // Diagnose misuse of /o.
1523*67e74705SXin Li if (Arg *A = Args.getLastArg(options::OPT__SLASH_o)) {
1524*67e74705SXin Li if (A->getValue()[0] == '\0') {
1525*67e74705SXin Li // It has to have a value.
1526*67e74705SXin Li Diag(clang::diag::err_drv_missing_argument) << A->getSpelling() << 1;
1527*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_o);
1528*67e74705SXin Li }
1529*67e74705SXin Li }
1530*67e74705SXin Li
1531*67e74705SXin Li // Diagnose unsupported forms of /Yc /Yu. Ignore /Yc/Yu for now if:
1532*67e74705SXin Li // * no filename after it
1533*67e74705SXin Li // * both /Yc and /Yu passed but with different filenames
1534*67e74705SXin Li // * corresponding file not also passed as /FI
1535*67e74705SXin Li Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
1536*67e74705SXin Li Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
1537*67e74705SXin Li if (YcArg && YcArg->getValue()[0] == '\0') {
1538*67e74705SXin Li Diag(clang::diag::warn_drv_ycyu_no_arg_clang_cl) << YcArg->getSpelling();
1539*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yc);
1540*67e74705SXin Li YcArg = nullptr;
1541*67e74705SXin Li }
1542*67e74705SXin Li if (YuArg && YuArg->getValue()[0] == '\0') {
1543*67e74705SXin Li Diag(clang::diag::warn_drv_ycyu_no_arg_clang_cl) << YuArg->getSpelling();
1544*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yu);
1545*67e74705SXin Li YuArg = nullptr;
1546*67e74705SXin Li }
1547*67e74705SXin Li if (YcArg && YuArg && strcmp(YcArg->getValue(), YuArg->getValue()) != 0) {
1548*67e74705SXin Li Diag(clang::diag::warn_drv_ycyu_different_arg_clang_cl);
1549*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yc);
1550*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yu);
1551*67e74705SXin Li YcArg = YuArg = nullptr;
1552*67e74705SXin Li }
1553*67e74705SXin Li if (YcArg || YuArg) {
1554*67e74705SXin Li StringRef Val = YcArg ? YcArg->getValue() : YuArg->getValue();
1555*67e74705SXin Li bool FoundMatchingInclude = false;
1556*67e74705SXin Li for (const Arg *Inc : Args.filtered(options::OPT_include)) {
1557*67e74705SXin Li // FIXME: Do case-insensitive matching and consider / and \ as equal.
1558*67e74705SXin Li if (Inc->getValue() == Val)
1559*67e74705SXin Li FoundMatchingInclude = true;
1560*67e74705SXin Li }
1561*67e74705SXin Li if (!FoundMatchingInclude) {
1562*67e74705SXin Li Diag(clang::diag::warn_drv_ycyu_no_fi_arg_clang_cl)
1563*67e74705SXin Li << (YcArg ? YcArg : YuArg)->getSpelling();
1564*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yc);
1565*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yu);
1566*67e74705SXin Li YcArg = YuArg = nullptr;
1567*67e74705SXin Li }
1568*67e74705SXin Li }
1569*67e74705SXin Li if (YcArg && Inputs.size() > 1) {
1570*67e74705SXin Li Diag(clang::diag::warn_drv_yc_multiple_inputs_clang_cl);
1571*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yc);
1572*67e74705SXin Li YcArg = nullptr;
1573*67e74705SXin Li }
1574*67e74705SXin Li if (Args.hasArg(options::OPT__SLASH_Y_)) {
1575*67e74705SXin Li // /Y- disables all pch handling. Rather than check for it everywhere,
1576*67e74705SXin Li // just remove clang-cl pch-related flags here.
1577*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Fp);
1578*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yc);
1579*67e74705SXin Li Args.eraseArg(options::OPT__SLASH_Yu);
1580*67e74705SXin Li YcArg = YuArg = nullptr;
1581*67e74705SXin Li }
1582*67e74705SXin Li
1583*67e74705SXin Li // Construct the actions to perform.
1584*67e74705SXin Li ActionList LinkerInputs;
1585*67e74705SXin Li
1586*67e74705SXin Li llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PL;
1587*67e74705SXin Li for (auto &I : Inputs) {
1588*67e74705SXin Li types::ID InputType = I.first;
1589*67e74705SXin Li const Arg *InputArg = I.second;
1590*67e74705SXin Li
1591*67e74705SXin Li PL.clear();
1592*67e74705SXin Li types::getCompilationPhases(InputType, PL);
1593*67e74705SXin Li
1594*67e74705SXin Li // If the first step comes after the final phase we are doing as part of
1595*67e74705SXin Li // this compilation, warn the user about it.
1596*67e74705SXin Li phases::ID InitialPhase = PL[0];
1597*67e74705SXin Li if (InitialPhase > FinalPhase) {
1598*67e74705SXin Li // Claim here to avoid the more general unused warning.
1599*67e74705SXin Li InputArg->claim();
1600*67e74705SXin Li
1601*67e74705SXin Li // Suppress all unused style warnings with -Qunused-arguments
1602*67e74705SXin Li if (Args.hasArg(options::OPT_Qunused_arguments))
1603*67e74705SXin Li continue;
1604*67e74705SXin Li
1605*67e74705SXin Li // Special case when final phase determined by binary name, rather than
1606*67e74705SXin Li // by a command-line argument with a corresponding Arg.
1607*67e74705SXin Li if (CCCIsCPP())
1608*67e74705SXin Li Diag(clang::diag::warn_drv_input_file_unused_by_cpp)
1609*67e74705SXin Li << InputArg->getAsString(Args) << getPhaseName(InitialPhase);
1610*67e74705SXin Li // Special case '-E' warning on a previously preprocessed file to make
1611*67e74705SXin Li // more sense.
1612*67e74705SXin Li else if (InitialPhase == phases::Compile &&
1613*67e74705SXin Li FinalPhase == phases::Preprocess &&
1614*67e74705SXin Li getPreprocessedType(InputType) == types::TY_INVALID)
1615*67e74705SXin Li Diag(clang::diag::warn_drv_preprocessed_input_file_unused)
1616*67e74705SXin Li << InputArg->getAsString(Args) << !!FinalPhaseArg
1617*67e74705SXin Li << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : "");
1618*67e74705SXin Li else
1619*67e74705SXin Li Diag(clang::diag::warn_drv_input_file_unused)
1620*67e74705SXin Li << InputArg->getAsString(Args) << getPhaseName(InitialPhase)
1621*67e74705SXin Li << !!FinalPhaseArg
1622*67e74705SXin Li << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : "");
1623*67e74705SXin Li continue;
1624*67e74705SXin Li }
1625*67e74705SXin Li
1626*67e74705SXin Li if (YcArg) {
1627*67e74705SXin Li // Add a separate precompile phase for the compile phase.
1628*67e74705SXin Li if (FinalPhase >= phases::Compile) {
1629*67e74705SXin Li llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PCHPL;
1630*67e74705SXin Li types::getCompilationPhases(types::TY_CXXHeader, PCHPL);
1631*67e74705SXin Li Arg *PchInputArg = MakeInputArg(Args, Opts, YcArg->getValue());
1632*67e74705SXin Li
1633*67e74705SXin Li // Build the pipeline for the pch file.
1634*67e74705SXin Li Action *ClangClPch = C.MakeAction<InputAction>(*PchInputArg, InputType);
1635*67e74705SXin Li for (phases::ID Phase : PCHPL)
1636*67e74705SXin Li ClangClPch = ConstructPhaseAction(C, Args, Phase, ClangClPch);
1637*67e74705SXin Li assert(ClangClPch);
1638*67e74705SXin Li Actions.push_back(ClangClPch);
1639*67e74705SXin Li // The driver currently exits after the first failed command. This
1640*67e74705SXin Li // relies on that behavior, to make sure if the pch generation fails,
1641*67e74705SXin Li // the main compilation won't run.
1642*67e74705SXin Li }
1643*67e74705SXin Li }
1644*67e74705SXin Li
1645*67e74705SXin Li phases::ID CudaInjectionPhase =
1646*67e74705SXin Li (phases::Compile < FinalPhase &&
1647*67e74705SXin Li llvm::find(PL, phases::Compile) != PL.end())
1648*67e74705SXin Li ? phases::Compile
1649*67e74705SXin Li : FinalPhase;
1650*67e74705SXin Li
1651*67e74705SXin Li // Build the pipeline for this file.
1652*67e74705SXin Li Action *Current = C.MakeAction<InputAction>(*InputArg, InputType);
1653*67e74705SXin Li for (SmallVectorImpl<phases::ID>::iterator i = PL.begin(), e = PL.end();
1654*67e74705SXin Li i != e; ++i) {
1655*67e74705SXin Li phases::ID Phase = *i;
1656*67e74705SXin Li
1657*67e74705SXin Li // We are done if this step is past what the user requested.
1658*67e74705SXin Li if (Phase > FinalPhase)
1659*67e74705SXin Li break;
1660*67e74705SXin Li
1661*67e74705SXin Li // Queue linker inputs.
1662*67e74705SXin Li if (Phase == phases::Link) {
1663*67e74705SXin Li assert((i + 1) == e && "linking must be final compilation step.");
1664*67e74705SXin Li LinkerInputs.push_back(Current);
1665*67e74705SXin Li Current = nullptr;
1666*67e74705SXin Li break;
1667*67e74705SXin Li }
1668*67e74705SXin Li
1669*67e74705SXin Li // Some types skip the assembler phase (e.g., llvm-bc), but we can't
1670*67e74705SXin Li // encode this in the steps because the intermediate type depends on
1671*67e74705SXin Li // arguments. Just special case here.
1672*67e74705SXin Li if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm)
1673*67e74705SXin Li continue;
1674*67e74705SXin Li
1675*67e74705SXin Li // Otherwise construct the appropriate action.
1676*67e74705SXin Li Current = ConstructPhaseAction(C, Args, Phase, Current);
1677*67e74705SXin Li
1678*67e74705SXin Li if (InputType == types::TY_CUDA && Phase == CudaInjectionPhase) {
1679*67e74705SXin Li Current = buildCudaActions(C, Args, InputArg, Current, Actions);
1680*67e74705SXin Li if (!Current)
1681*67e74705SXin Li break;
1682*67e74705SXin Li }
1683*67e74705SXin Li
1684*67e74705SXin Li if (Current->getType() == types::TY_Nothing)
1685*67e74705SXin Li break;
1686*67e74705SXin Li }
1687*67e74705SXin Li
1688*67e74705SXin Li // If we ended with something, add to the output list.
1689*67e74705SXin Li if (Current)
1690*67e74705SXin Li Actions.push_back(Current);
1691*67e74705SXin Li }
1692*67e74705SXin Li
1693*67e74705SXin Li // Add a link action if necessary.
1694*67e74705SXin Li if (!LinkerInputs.empty())
1695*67e74705SXin Li Actions.push_back(
1696*67e74705SXin Li C.MakeAction<LinkJobAction>(LinkerInputs, types::TY_Image));
1697*67e74705SXin Li
1698*67e74705SXin Li // If we are linking, claim any options which are obviously only used for
1699*67e74705SXin Li // compilation.
1700*67e74705SXin Li if (FinalPhase == phases::Link && PL.size() == 1) {
1701*67e74705SXin Li Args.ClaimAllArgs(options::OPT_CompileOnly_Group);
1702*67e74705SXin Li Args.ClaimAllArgs(options::OPT_cl_compile_Group);
1703*67e74705SXin Li }
1704*67e74705SXin Li
1705*67e74705SXin Li // Claim ignored clang-cl options.
1706*67e74705SXin Li Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
1707*67e74705SXin Li
1708*67e74705SXin Li // Claim --cuda-host-only and --cuda-compile-host-device, which may be passed
1709*67e74705SXin Li // to non-CUDA compilations and should not trigger warnings there.
1710*67e74705SXin Li Args.ClaimAllArgs(options::OPT_cuda_host_only);
1711*67e74705SXin Li Args.ClaimAllArgs(options::OPT_cuda_compile_host_device);
1712*67e74705SXin Li }
1713*67e74705SXin Li
ConstructPhaseAction(Compilation & C,const ArgList & Args,phases::ID Phase,Action * Input) const1714*67e74705SXin Li Action *Driver::ConstructPhaseAction(Compilation &C, const ArgList &Args,
1715*67e74705SXin Li phases::ID Phase, Action *Input) const {
1716*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Constructing phase actions");
1717*67e74705SXin Li // Build the appropriate action.
1718*67e74705SXin Li switch (Phase) {
1719*67e74705SXin Li case phases::Link:
1720*67e74705SXin Li llvm_unreachable("link action invalid here.");
1721*67e74705SXin Li case phases::Preprocess: {
1722*67e74705SXin Li types::ID OutputTy;
1723*67e74705SXin Li // -{M, MM} alter the output type.
1724*67e74705SXin Li if (Args.hasArg(options::OPT_M, options::OPT_MM)) {
1725*67e74705SXin Li OutputTy = types::TY_Dependencies;
1726*67e74705SXin Li } else {
1727*67e74705SXin Li OutputTy = Input->getType();
1728*67e74705SXin Li if (!Args.hasFlag(options::OPT_frewrite_includes,
1729*67e74705SXin Li options::OPT_fno_rewrite_includes, false) &&
1730*67e74705SXin Li !CCGenDiagnostics)
1731*67e74705SXin Li OutputTy = types::getPreprocessedType(OutputTy);
1732*67e74705SXin Li assert(OutputTy != types::TY_INVALID &&
1733*67e74705SXin Li "Cannot preprocess this input type!");
1734*67e74705SXin Li }
1735*67e74705SXin Li return C.MakeAction<PreprocessJobAction>(Input, OutputTy);
1736*67e74705SXin Li }
1737*67e74705SXin Li case phases::Precompile: {
1738*67e74705SXin Li types::ID OutputTy = types::TY_PCH;
1739*67e74705SXin Li if (Args.hasArg(options::OPT_fsyntax_only)) {
1740*67e74705SXin Li // Syntax checks should not emit a PCH file
1741*67e74705SXin Li OutputTy = types::TY_Nothing;
1742*67e74705SXin Li }
1743*67e74705SXin Li return C.MakeAction<PrecompileJobAction>(Input, OutputTy);
1744*67e74705SXin Li }
1745*67e74705SXin Li case phases::Compile: {
1746*67e74705SXin Li if (Args.hasArg(options::OPT_fsyntax_only))
1747*67e74705SXin Li return C.MakeAction<CompileJobAction>(Input, types::TY_Nothing);
1748*67e74705SXin Li if (Args.hasArg(options::OPT_rewrite_objc))
1749*67e74705SXin Li return C.MakeAction<CompileJobAction>(Input, types::TY_RewrittenObjC);
1750*67e74705SXin Li if (Args.hasArg(options::OPT_rewrite_legacy_objc))
1751*67e74705SXin Li return C.MakeAction<CompileJobAction>(Input,
1752*67e74705SXin Li types::TY_RewrittenLegacyObjC);
1753*67e74705SXin Li if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto))
1754*67e74705SXin Li return C.MakeAction<AnalyzeJobAction>(Input, types::TY_Plist);
1755*67e74705SXin Li if (Args.hasArg(options::OPT__migrate))
1756*67e74705SXin Li return C.MakeAction<MigrateJobAction>(Input, types::TY_Remap);
1757*67e74705SXin Li if (Args.hasArg(options::OPT_emit_ast))
1758*67e74705SXin Li return C.MakeAction<CompileJobAction>(Input, types::TY_AST);
1759*67e74705SXin Li if (Args.hasArg(options::OPT_module_file_info))
1760*67e74705SXin Li return C.MakeAction<CompileJobAction>(Input, types::TY_ModuleFile);
1761*67e74705SXin Li if (Args.hasArg(options::OPT_verify_pch))
1762*67e74705SXin Li return C.MakeAction<VerifyPCHJobAction>(Input, types::TY_Nothing);
1763*67e74705SXin Li return C.MakeAction<CompileJobAction>(Input, types::TY_LLVM_BC);
1764*67e74705SXin Li }
1765*67e74705SXin Li case phases::Backend: {
1766*67e74705SXin Li if (isUsingLTO()) {
1767*67e74705SXin Li types::ID Output =
1768*67e74705SXin Li Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
1769*67e74705SXin Li return C.MakeAction<BackendJobAction>(Input, Output);
1770*67e74705SXin Li }
1771*67e74705SXin Li if (Args.hasArg(options::OPT_emit_llvm)) {
1772*67e74705SXin Li types::ID Output =
1773*67e74705SXin Li Args.hasArg(options::OPT_S) ? types::TY_LLVM_IR : types::TY_LLVM_BC;
1774*67e74705SXin Li return C.MakeAction<BackendJobAction>(Input, Output);
1775*67e74705SXin Li }
1776*67e74705SXin Li return C.MakeAction<BackendJobAction>(Input, types::TY_PP_Asm);
1777*67e74705SXin Li }
1778*67e74705SXin Li case phases::Assemble:
1779*67e74705SXin Li return C.MakeAction<AssembleJobAction>(std::move(Input), types::TY_Object);
1780*67e74705SXin Li }
1781*67e74705SXin Li
1782*67e74705SXin Li llvm_unreachable("invalid phase in ConstructPhaseAction");
1783*67e74705SXin Li }
1784*67e74705SXin Li
BuildJobs(Compilation & C) const1785*67e74705SXin Li void Driver::BuildJobs(Compilation &C) const {
1786*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
1787*67e74705SXin Li
1788*67e74705SXin Li Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o);
1789*67e74705SXin Li
1790*67e74705SXin Li // It is an error to provide a -o option if we are making multiple output
1791*67e74705SXin Li // files.
1792*67e74705SXin Li if (FinalOutput) {
1793*67e74705SXin Li unsigned NumOutputs = 0;
1794*67e74705SXin Li for (const Action *A : C.getActions())
1795*67e74705SXin Li if (A->getType() != types::TY_Nothing)
1796*67e74705SXin Li ++NumOutputs;
1797*67e74705SXin Li
1798*67e74705SXin Li if (NumOutputs > 1) {
1799*67e74705SXin Li Diag(clang::diag::err_drv_output_argument_with_multiple_files);
1800*67e74705SXin Li FinalOutput = nullptr;
1801*67e74705SXin Li }
1802*67e74705SXin Li }
1803*67e74705SXin Li
1804*67e74705SXin Li // Collect the list of architectures.
1805*67e74705SXin Li llvm::StringSet<> ArchNames;
1806*67e74705SXin Li if (C.getDefaultToolChain().getTriple().isOSBinFormatMachO())
1807*67e74705SXin Li for (const Arg *A : C.getArgs())
1808*67e74705SXin Li if (A->getOption().matches(options::OPT_arch))
1809*67e74705SXin Li ArchNames.insert(A->getValue());
1810*67e74705SXin Li
1811*67e74705SXin Li // Set of (Action, canonical ToolChain triple) pairs we've built jobs for.
1812*67e74705SXin Li std::map<std::pair<const Action *, std::string>, InputInfo> CachedResults;
1813*67e74705SXin Li for (Action *A : C.getActions()) {
1814*67e74705SXin Li // If we are linking an image for multiple archs then the linker wants
1815*67e74705SXin Li // -arch_multiple and -final_output <final image name>. Unfortunately, this
1816*67e74705SXin Li // doesn't fit in cleanly because we have to pass this information down.
1817*67e74705SXin Li //
1818*67e74705SXin Li // FIXME: This is a hack; find a cleaner way to integrate this into the
1819*67e74705SXin Li // process.
1820*67e74705SXin Li const char *LinkingOutput = nullptr;
1821*67e74705SXin Li if (isa<LipoJobAction>(A)) {
1822*67e74705SXin Li if (FinalOutput)
1823*67e74705SXin Li LinkingOutput = FinalOutput->getValue();
1824*67e74705SXin Li else
1825*67e74705SXin Li LinkingOutput = getDefaultImageName();
1826*67e74705SXin Li }
1827*67e74705SXin Li
1828*67e74705SXin Li BuildJobsForAction(C, A, &C.getDefaultToolChain(),
1829*67e74705SXin Li /*BoundArch*/ nullptr,
1830*67e74705SXin Li /*AtTopLevel*/ true,
1831*67e74705SXin Li /*MultipleArchs*/ ArchNames.size() > 1,
1832*67e74705SXin Li /*LinkingOutput*/ LinkingOutput, CachedResults);
1833*67e74705SXin Li }
1834*67e74705SXin Li
1835*67e74705SXin Li // If the user passed -Qunused-arguments or there were errors, don't warn
1836*67e74705SXin Li // about any unused arguments.
1837*67e74705SXin Li if (Diags.hasErrorOccurred() ||
1838*67e74705SXin Li C.getArgs().hasArg(options::OPT_Qunused_arguments))
1839*67e74705SXin Li return;
1840*67e74705SXin Li
1841*67e74705SXin Li // Claim -### here.
1842*67e74705SXin Li (void)C.getArgs().hasArg(options::OPT__HASH_HASH_HASH);
1843*67e74705SXin Li
1844*67e74705SXin Li // Claim --driver-mode, --rsp-quoting, it was handled earlier.
1845*67e74705SXin Li (void)C.getArgs().hasArg(options::OPT_driver_mode);
1846*67e74705SXin Li (void)C.getArgs().hasArg(options::OPT_rsp_quoting);
1847*67e74705SXin Li
1848*67e74705SXin Li for (Arg *A : C.getArgs()) {
1849*67e74705SXin Li // FIXME: It would be nice to be able to send the argument to the
1850*67e74705SXin Li // DiagnosticsEngine, so that extra values, position, and so on could be
1851*67e74705SXin Li // printed.
1852*67e74705SXin Li if (!A->isClaimed()) {
1853*67e74705SXin Li if (A->getOption().hasFlag(options::NoArgumentUnused))
1854*67e74705SXin Li continue;
1855*67e74705SXin Li
1856*67e74705SXin Li // Suppress the warning automatically if this is just a flag, and it is an
1857*67e74705SXin Li // instance of an argument we already claimed.
1858*67e74705SXin Li const Option &Opt = A->getOption();
1859*67e74705SXin Li if (Opt.getKind() == Option::FlagClass) {
1860*67e74705SXin Li bool DuplicateClaimed = false;
1861*67e74705SXin Li
1862*67e74705SXin Li for (const Arg *AA : C.getArgs().filtered(&Opt)) {
1863*67e74705SXin Li if (AA->isClaimed()) {
1864*67e74705SXin Li DuplicateClaimed = true;
1865*67e74705SXin Li break;
1866*67e74705SXin Li }
1867*67e74705SXin Li }
1868*67e74705SXin Li
1869*67e74705SXin Li if (DuplicateClaimed)
1870*67e74705SXin Li continue;
1871*67e74705SXin Li }
1872*67e74705SXin Li
1873*67e74705SXin Li // In clang-cl, don't mention unknown arguments here since they have
1874*67e74705SXin Li // already been warned about.
1875*67e74705SXin Li if (!IsCLMode() || !A->getOption().matches(options::OPT_UNKNOWN))
1876*67e74705SXin Li Diag(clang::diag::warn_drv_unused_argument)
1877*67e74705SXin Li << A->getAsString(C.getArgs());
1878*67e74705SXin Li }
1879*67e74705SXin Li }
1880*67e74705SXin Li }
1881*67e74705SXin Li
1882*67e74705SXin Li // Returns a Tool for a given JobAction. In case the action and its
1883*67e74705SXin Li // predecessors can be combined, updates Inputs with the inputs of the
1884*67e74705SXin Li // first combined action. If one of the collapsed actions is a
1885*67e74705SXin Li // CudaHostAction, updates CollapsedCHA with the pointer to it so the
1886*67e74705SXin Li // caller can deal with extra handling such action requires.
selectToolForJob(Compilation & C,bool SaveTemps,bool EmbedBitcode,const ToolChain * TC,const JobAction * JA,const ActionList * & Inputs,const CudaHostAction * & CollapsedCHA)1887*67e74705SXin Li static const Tool *selectToolForJob(Compilation &C, bool SaveTemps,
1888*67e74705SXin Li bool EmbedBitcode, const ToolChain *TC,
1889*67e74705SXin Li const JobAction *JA,
1890*67e74705SXin Li const ActionList *&Inputs,
1891*67e74705SXin Li const CudaHostAction *&CollapsedCHA) {
1892*67e74705SXin Li const Tool *ToolForJob = nullptr;
1893*67e74705SXin Li CollapsedCHA = nullptr;
1894*67e74705SXin Li
1895*67e74705SXin Li // See if we should look for a compiler with an integrated assembler. We match
1896*67e74705SXin Li // bottom up, so what we are actually looking for is an assembler job with a
1897*67e74705SXin Li // compiler input.
1898*67e74705SXin Li
1899*67e74705SXin Li if (TC->useIntegratedAs() && !SaveTemps &&
1900*67e74705SXin Li !C.getArgs().hasArg(options::OPT_via_file_asm) &&
1901*67e74705SXin Li !C.getArgs().hasArg(options::OPT__SLASH_FA) &&
1902*67e74705SXin Li !C.getArgs().hasArg(options::OPT__SLASH_Fa) &&
1903*67e74705SXin Li isa<AssembleJobAction>(JA) && Inputs->size() == 1 &&
1904*67e74705SXin Li isa<BackendJobAction>(*Inputs->begin())) {
1905*67e74705SXin Li // A BackendJob is always preceded by a CompileJob, and without -save-temps
1906*67e74705SXin Li // or -fembed-bitcode, they will always get combined together, so instead of
1907*67e74705SXin Li // checking the backend tool, check if the tool for the CompileJob has an
1908*67e74705SXin Li // integrated assembler. For -fembed-bitcode, CompileJob is still used to
1909*67e74705SXin Li // look up tools for BackendJob, but they need to match before we can split
1910*67e74705SXin Li // them.
1911*67e74705SXin Li const ActionList *BackendInputs = &(*Inputs)[0]->getInputs();
1912*67e74705SXin Li // Compile job may be wrapped in CudaHostAction, extract it if
1913*67e74705SXin Li // that's the case and update CollapsedCHA if we combine phases.
1914*67e74705SXin Li CudaHostAction *CHA = dyn_cast<CudaHostAction>(*BackendInputs->begin());
1915*67e74705SXin Li JobAction *CompileJA = cast<CompileJobAction>(
1916*67e74705SXin Li CHA ? *CHA->input_begin() : *BackendInputs->begin());
1917*67e74705SXin Li assert(CompileJA && "Backend job is not preceeded by compile job.");
1918*67e74705SXin Li const Tool *Compiler = TC->SelectTool(*CompileJA);
1919*67e74705SXin Li if (!Compiler)
1920*67e74705SXin Li return nullptr;
1921*67e74705SXin Li // When using -fembed-bitcode, it is required to have the same tool (clang)
1922*67e74705SXin Li // for both CompilerJA and BackendJA. Otherwise, combine two stages.
1923*67e74705SXin Li if (EmbedBitcode) {
1924*67e74705SXin Li JobAction *InputJA = cast<JobAction>(*Inputs->begin());
1925*67e74705SXin Li const Tool *BackendTool = TC->SelectTool(*InputJA);
1926*67e74705SXin Li if (BackendTool == Compiler)
1927*67e74705SXin Li CompileJA = InputJA;
1928*67e74705SXin Li }
1929*67e74705SXin Li if (Compiler->hasIntegratedAssembler()) {
1930*67e74705SXin Li Inputs = &CompileJA->getInputs();
1931*67e74705SXin Li ToolForJob = Compiler;
1932*67e74705SXin Li CollapsedCHA = CHA;
1933*67e74705SXin Li }
1934*67e74705SXin Li }
1935*67e74705SXin Li
1936*67e74705SXin Li // A backend job should always be combined with the preceding compile job
1937*67e74705SXin Li // unless OPT_save_temps or OPT_fembed_bitcode is enabled and the compiler is
1938*67e74705SXin Li // capable of emitting LLVM IR as an intermediate output.
1939*67e74705SXin Li if (isa<BackendJobAction>(JA)) {
1940*67e74705SXin Li // Check if the compiler supports emitting LLVM IR.
1941*67e74705SXin Li assert(Inputs->size() == 1);
1942*67e74705SXin Li // Compile job may be wrapped in CudaHostAction, extract it if
1943*67e74705SXin Li // that's the case and update CollapsedCHA if we combine phases.
1944*67e74705SXin Li CudaHostAction *CHA = dyn_cast<CudaHostAction>(*Inputs->begin());
1945*67e74705SXin Li JobAction *CompileJA =
1946*67e74705SXin Li cast<CompileJobAction>(CHA ? *CHA->input_begin() : *Inputs->begin());
1947*67e74705SXin Li assert(CompileJA && "Backend job is not preceeded by compile job.");
1948*67e74705SXin Li const Tool *Compiler = TC->SelectTool(*CompileJA);
1949*67e74705SXin Li if (!Compiler)
1950*67e74705SXin Li return nullptr;
1951*67e74705SXin Li if (!Compiler->canEmitIR() ||
1952*67e74705SXin Li (!SaveTemps && !EmbedBitcode)) {
1953*67e74705SXin Li Inputs = &CompileJA->getInputs();
1954*67e74705SXin Li ToolForJob = Compiler;
1955*67e74705SXin Li CollapsedCHA = CHA;
1956*67e74705SXin Li }
1957*67e74705SXin Li }
1958*67e74705SXin Li
1959*67e74705SXin Li // Otherwise use the tool for the current job.
1960*67e74705SXin Li if (!ToolForJob)
1961*67e74705SXin Li ToolForJob = TC->SelectTool(*JA);
1962*67e74705SXin Li
1963*67e74705SXin Li // See if we should use an integrated preprocessor. We do so when we have
1964*67e74705SXin Li // exactly one input, since this is the only use case we care about
1965*67e74705SXin Li // (irrelevant since we don't support combine yet).
1966*67e74705SXin Li if (Inputs->size() == 1 && isa<PreprocessJobAction>(*Inputs->begin()) &&
1967*67e74705SXin Li !C.getArgs().hasArg(options::OPT_no_integrated_cpp) &&
1968*67e74705SXin Li !C.getArgs().hasArg(options::OPT_traditional_cpp) && !SaveTemps &&
1969*67e74705SXin Li !C.getArgs().hasArg(options::OPT_rewrite_objc) &&
1970*67e74705SXin Li ToolForJob->hasIntegratedCPP())
1971*67e74705SXin Li Inputs = &(*Inputs)[0]->getInputs();
1972*67e74705SXin Li
1973*67e74705SXin Li return ToolForJob;
1974*67e74705SXin Li }
1975*67e74705SXin Li
BuildJobsForAction(Compilation & C,const Action * A,const ToolChain * TC,const char * BoundArch,bool AtTopLevel,bool MultipleArchs,const char * LinkingOutput,std::map<std::pair<const Action *,std::string>,InputInfo> & CachedResults) const1976*67e74705SXin Li InputInfo Driver::BuildJobsForAction(
1977*67e74705SXin Li Compilation &C, const Action *A, const ToolChain *TC, const char *BoundArch,
1978*67e74705SXin Li bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput,
1979*67e74705SXin Li std::map<std::pair<const Action *, std::string>, InputInfo> &CachedResults)
1980*67e74705SXin Li const {
1981*67e74705SXin Li // The bound arch is not necessarily represented in the toolchain's triple --
1982*67e74705SXin Li // for example, armv7 and armv7s both map to the same triple -- so we need
1983*67e74705SXin Li // both in our map.
1984*67e74705SXin Li std::string TriplePlusArch = TC->getTriple().normalize();
1985*67e74705SXin Li if (BoundArch) {
1986*67e74705SXin Li TriplePlusArch += "-";
1987*67e74705SXin Li TriplePlusArch += BoundArch;
1988*67e74705SXin Li }
1989*67e74705SXin Li std::pair<const Action *, std::string> ActionTC = {A, TriplePlusArch};
1990*67e74705SXin Li auto CachedResult = CachedResults.find(ActionTC);
1991*67e74705SXin Li if (CachedResult != CachedResults.end()) {
1992*67e74705SXin Li return CachedResult->second;
1993*67e74705SXin Li }
1994*67e74705SXin Li InputInfo Result =
1995*67e74705SXin Li BuildJobsForActionNoCache(C, A, TC, BoundArch, AtTopLevel, MultipleArchs,
1996*67e74705SXin Li LinkingOutput, CachedResults);
1997*67e74705SXin Li CachedResults[ActionTC] = Result;
1998*67e74705SXin Li return Result;
1999*67e74705SXin Li }
2000*67e74705SXin Li
BuildJobsForActionNoCache(Compilation & C,const Action * A,const ToolChain * TC,const char * BoundArch,bool AtTopLevel,bool MultipleArchs,const char * LinkingOutput,std::map<std::pair<const Action *,std::string>,InputInfo> & CachedResults) const2001*67e74705SXin Li InputInfo Driver::BuildJobsForActionNoCache(
2002*67e74705SXin Li Compilation &C, const Action *A, const ToolChain *TC, const char *BoundArch,
2003*67e74705SXin Li bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput,
2004*67e74705SXin Li std::map<std::pair<const Action *, std::string>, InputInfo> &CachedResults)
2005*67e74705SXin Li const {
2006*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
2007*67e74705SXin Li
2008*67e74705SXin Li InputInfoList CudaDeviceInputInfos;
2009*67e74705SXin Li if (const CudaHostAction *CHA = dyn_cast<CudaHostAction>(A)) {
2010*67e74705SXin Li // Append outputs of device jobs to the input list.
2011*67e74705SXin Li for (const Action *DA : CHA->getDeviceActions()) {
2012*67e74705SXin Li CudaDeviceInputInfos.push_back(BuildJobsForAction(
2013*67e74705SXin Li C, DA, TC, nullptr, AtTopLevel,
2014*67e74705SXin Li /*MultipleArchs*/ false, LinkingOutput, CachedResults));
2015*67e74705SXin Li }
2016*67e74705SXin Li // Override current action with a real host compile action and continue
2017*67e74705SXin Li // processing it.
2018*67e74705SXin Li A = *CHA->input_begin();
2019*67e74705SXin Li }
2020*67e74705SXin Li
2021*67e74705SXin Li if (const InputAction *IA = dyn_cast<InputAction>(A)) {
2022*67e74705SXin Li // FIXME: It would be nice to not claim this here; maybe the old scheme of
2023*67e74705SXin Li // just using Args was better?
2024*67e74705SXin Li const Arg &Input = IA->getInputArg();
2025*67e74705SXin Li Input.claim();
2026*67e74705SXin Li if (Input.getOption().matches(options::OPT_INPUT)) {
2027*67e74705SXin Li const char *Name = Input.getValue();
2028*67e74705SXin Li return InputInfo(A, Name, /* BaseInput = */ Name);
2029*67e74705SXin Li }
2030*67e74705SXin Li return InputInfo(A, &Input, /* BaseInput = */ "");
2031*67e74705SXin Li }
2032*67e74705SXin Li
2033*67e74705SXin Li if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) {
2034*67e74705SXin Li const ToolChain *TC;
2035*67e74705SXin Li const char *ArchName = BAA->getArchName();
2036*67e74705SXin Li
2037*67e74705SXin Li if (ArchName)
2038*67e74705SXin Li TC = &getToolChain(C.getArgs(),
2039*67e74705SXin Li computeTargetTriple(*this, DefaultTargetTriple,
2040*67e74705SXin Li C.getArgs(), ArchName));
2041*67e74705SXin Li else
2042*67e74705SXin Li TC = &C.getDefaultToolChain();
2043*67e74705SXin Li
2044*67e74705SXin Li return BuildJobsForAction(C, *BAA->input_begin(), TC, ArchName, AtTopLevel,
2045*67e74705SXin Li MultipleArchs, LinkingOutput, CachedResults);
2046*67e74705SXin Li }
2047*67e74705SXin Li
2048*67e74705SXin Li if (const CudaDeviceAction *CDA = dyn_cast<CudaDeviceAction>(A)) {
2049*67e74705SXin Li // Initial processing of CudaDeviceAction carries host params.
2050*67e74705SXin Li // Call BuildJobsForAction() again, now with correct device parameters.
2051*67e74705SXin Li InputInfo II = BuildJobsForAction(
2052*67e74705SXin Li C, *CDA->input_begin(), C.getSingleOffloadToolChain<Action::OFK_Cuda>(),
2053*67e74705SXin Li CudaArchToString(CDA->getGpuArch()), CDA->isAtTopLevel(),
2054*67e74705SXin Li /*MultipleArchs=*/true, LinkingOutput, CachedResults);
2055*67e74705SXin Li // Currently II's Action is *CDA->input_begin(). Set it to CDA instead, so
2056*67e74705SXin Li // that one can retrieve II's GPU arch.
2057*67e74705SXin Li II.setAction(A);
2058*67e74705SXin Li return II;
2059*67e74705SXin Li }
2060*67e74705SXin Li
2061*67e74705SXin Li const ActionList *Inputs = &A->getInputs();
2062*67e74705SXin Li
2063*67e74705SXin Li const JobAction *JA = cast<JobAction>(A);
2064*67e74705SXin Li const CudaHostAction *CollapsedCHA = nullptr;
2065*67e74705SXin Li const Tool *T =
2066*67e74705SXin Li selectToolForJob(C, isSaveTempsEnabled(), embedBitcodeEnabled(), TC, JA,
2067*67e74705SXin Li Inputs, CollapsedCHA);
2068*67e74705SXin Li if (!T)
2069*67e74705SXin Li return InputInfo();
2070*67e74705SXin Li
2071*67e74705SXin Li // If we've collapsed action list that contained CudaHostAction we
2072*67e74705SXin Li // need to build jobs for device-side inputs it may have held.
2073*67e74705SXin Li if (CollapsedCHA) {
2074*67e74705SXin Li for (const Action *DA : CollapsedCHA->getDeviceActions()) {
2075*67e74705SXin Li CudaDeviceInputInfos.push_back(BuildJobsForAction(
2076*67e74705SXin Li C, DA, TC, "", AtTopLevel,
2077*67e74705SXin Li /*MultipleArchs*/ false, LinkingOutput, CachedResults));
2078*67e74705SXin Li }
2079*67e74705SXin Li }
2080*67e74705SXin Li
2081*67e74705SXin Li // Only use pipes when there is exactly one input.
2082*67e74705SXin Li InputInfoList InputInfos;
2083*67e74705SXin Li for (const Action *Input : *Inputs) {
2084*67e74705SXin Li // Treat dsymutil and verify sub-jobs as being at the top-level too, they
2085*67e74705SXin Li // shouldn't get temporary output names.
2086*67e74705SXin Li // FIXME: Clean this up.
2087*67e74705SXin Li bool SubJobAtTopLevel =
2088*67e74705SXin Li AtTopLevel && (isa<DsymutilJobAction>(A) || isa<VerifyJobAction>(A));
2089*67e74705SXin Li InputInfos.push_back(BuildJobsForAction(C, Input, TC, BoundArch,
2090*67e74705SXin Li SubJobAtTopLevel, MultipleArchs,
2091*67e74705SXin Li LinkingOutput, CachedResults));
2092*67e74705SXin Li }
2093*67e74705SXin Li
2094*67e74705SXin Li // Always use the first input as the base input.
2095*67e74705SXin Li const char *BaseInput = InputInfos[0].getBaseInput();
2096*67e74705SXin Li
2097*67e74705SXin Li // ... except dsymutil actions, which use their actual input as the base
2098*67e74705SXin Li // input.
2099*67e74705SXin Li if (JA->getType() == types::TY_dSYM)
2100*67e74705SXin Li BaseInput = InputInfos[0].getFilename();
2101*67e74705SXin Li
2102*67e74705SXin Li // Append outputs of cuda device jobs to the input list
2103*67e74705SXin Li if (CudaDeviceInputInfos.size())
2104*67e74705SXin Li InputInfos.append(CudaDeviceInputInfos.begin(), CudaDeviceInputInfos.end());
2105*67e74705SXin Li
2106*67e74705SXin Li // Determine the place to write output to, if any.
2107*67e74705SXin Li InputInfo Result;
2108*67e74705SXin Li if (JA->getType() == types::TY_Nothing)
2109*67e74705SXin Li Result = InputInfo(A, BaseInput);
2110*67e74705SXin Li else
2111*67e74705SXin Li Result = InputInfo(A, GetNamedOutputPath(C, *JA, BaseInput, BoundArch,
2112*67e74705SXin Li AtTopLevel, MultipleArchs),
2113*67e74705SXin Li BaseInput);
2114*67e74705SXin Li
2115*67e74705SXin Li if (CCCPrintBindings && !CCGenDiagnostics) {
2116*67e74705SXin Li llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"'
2117*67e74705SXin Li << " - \"" << T->getName() << "\", inputs: [";
2118*67e74705SXin Li for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
2119*67e74705SXin Li llvm::errs() << InputInfos[i].getAsString();
2120*67e74705SXin Li if (i + 1 != e)
2121*67e74705SXin Li llvm::errs() << ", ";
2122*67e74705SXin Li }
2123*67e74705SXin Li llvm::errs() << "], output: " << Result.getAsString() << "\n";
2124*67e74705SXin Li } else {
2125*67e74705SXin Li T->ConstructJob(C, *JA, Result, InputInfos,
2126*67e74705SXin Li C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
2127*67e74705SXin Li }
2128*67e74705SXin Li return Result;
2129*67e74705SXin Li }
2130*67e74705SXin Li
getDefaultImageName() const2131*67e74705SXin Li const char *Driver::getDefaultImageName() const {
2132*67e74705SXin Li llvm::Triple Target(llvm::Triple::normalize(DefaultTargetTriple));
2133*67e74705SXin Li return Target.isOSWindows() ? "a.exe" : "a.out";
2134*67e74705SXin Li }
2135*67e74705SXin Li
2136*67e74705SXin Li /// \brief Create output filename based on ArgValue, which could either be a
2137*67e74705SXin Li /// full filename, filename without extension, or a directory. If ArgValue
2138*67e74705SXin Li /// does not provide a filename, then use BaseName, and use the extension
2139*67e74705SXin Li /// suitable for FileType.
MakeCLOutputFilename(const ArgList & Args,StringRef ArgValue,StringRef BaseName,types::ID FileType)2140*67e74705SXin Li static const char *MakeCLOutputFilename(const ArgList &Args, StringRef ArgValue,
2141*67e74705SXin Li StringRef BaseName,
2142*67e74705SXin Li types::ID FileType) {
2143*67e74705SXin Li SmallString<128> Filename = ArgValue;
2144*67e74705SXin Li
2145*67e74705SXin Li if (ArgValue.empty()) {
2146*67e74705SXin Li // If the argument is empty, output to BaseName in the current dir.
2147*67e74705SXin Li Filename = BaseName;
2148*67e74705SXin Li } else if (llvm::sys::path::is_separator(Filename.back())) {
2149*67e74705SXin Li // If the argument is a directory, output to BaseName in that dir.
2150*67e74705SXin Li llvm::sys::path::append(Filename, BaseName);
2151*67e74705SXin Li }
2152*67e74705SXin Li
2153*67e74705SXin Li if (!llvm::sys::path::has_extension(ArgValue)) {
2154*67e74705SXin Li // If the argument didn't provide an extension, then set it.
2155*67e74705SXin Li const char *Extension = types::getTypeTempSuffix(FileType, true);
2156*67e74705SXin Li
2157*67e74705SXin Li if (FileType == types::TY_Image &&
2158*67e74705SXin Li Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd)) {
2159*67e74705SXin Li // The output file is a dll.
2160*67e74705SXin Li Extension = "dll";
2161*67e74705SXin Li }
2162*67e74705SXin Li
2163*67e74705SXin Li llvm::sys::path::replace_extension(Filename, Extension);
2164*67e74705SXin Li }
2165*67e74705SXin Li
2166*67e74705SXin Li return Args.MakeArgString(Filename.c_str());
2167*67e74705SXin Li }
2168*67e74705SXin Li
GetNamedOutputPath(Compilation & C,const JobAction & JA,const char * BaseInput,const char * BoundArch,bool AtTopLevel,bool MultipleArchs) const2169*67e74705SXin Li const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
2170*67e74705SXin Li const char *BaseInput,
2171*67e74705SXin Li const char *BoundArch, bool AtTopLevel,
2172*67e74705SXin Li bool MultipleArchs) const {
2173*67e74705SXin Li llvm::PrettyStackTraceString CrashInfo("Computing output path");
2174*67e74705SXin Li // Output to a user requested destination?
2175*67e74705SXin Li if (AtTopLevel && !isa<DsymutilJobAction>(JA) && !isa<VerifyJobAction>(JA)) {
2176*67e74705SXin Li if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o))
2177*67e74705SXin Li return C.addResultFile(FinalOutput->getValue(), &JA);
2178*67e74705SXin Li }
2179*67e74705SXin Li
2180*67e74705SXin Li // For /P, preprocess to file named after BaseInput.
2181*67e74705SXin Li if (C.getArgs().hasArg(options::OPT__SLASH_P)) {
2182*67e74705SXin Li assert(AtTopLevel && isa<PreprocessJobAction>(JA));
2183*67e74705SXin Li StringRef BaseName = llvm::sys::path::filename(BaseInput);
2184*67e74705SXin Li StringRef NameArg;
2185*67e74705SXin Li if (Arg *A = C.getArgs().getLastArg(options::OPT__SLASH_Fi))
2186*67e74705SXin Li NameArg = A->getValue();
2187*67e74705SXin Li return C.addResultFile(
2188*67e74705SXin Li MakeCLOutputFilename(C.getArgs(), NameArg, BaseName, types::TY_PP_C),
2189*67e74705SXin Li &JA);
2190*67e74705SXin Li }
2191*67e74705SXin Li
2192*67e74705SXin Li // Default to writing to stdout?
2193*67e74705SXin Li if (AtTopLevel && !CCGenDiagnostics &&
2194*67e74705SXin Li (isa<PreprocessJobAction>(JA) || JA.getType() == types::TY_ModuleFile))
2195*67e74705SXin Li return "-";
2196*67e74705SXin Li
2197*67e74705SXin Li // Is this the assembly listing for /FA?
2198*67e74705SXin Li if (JA.getType() == types::TY_PP_Asm &&
2199*67e74705SXin Li (C.getArgs().hasArg(options::OPT__SLASH_FA) ||
2200*67e74705SXin Li C.getArgs().hasArg(options::OPT__SLASH_Fa))) {
2201*67e74705SXin Li // Use /Fa and the input filename to determine the asm file name.
2202*67e74705SXin Li StringRef BaseName = llvm::sys::path::filename(BaseInput);
2203*67e74705SXin Li StringRef FaValue = C.getArgs().getLastArgValue(options::OPT__SLASH_Fa);
2204*67e74705SXin Li return C.addResultFile(
2205*67e74705SXin Li MakeCLOutputFilename(C.getArgs(), FaValue, BaseName, JA.getType()),
2206*67e74705SXin Li &JA);
2207*67e74705SXin Li }
2208*67e74705SXin Li
2209*67e74705SXin Li // Output to a temporary file?
2210*67e74705SXin Li if ((!AtTopLevel && !isSaveTempsEnabled() &&
2211*67e74705SXin Li !C.getArgs().hasArg(options::OPT__SLASH_Fo)) ||
2212*67e74705SXin Li CCGenDiagnostics) {
2213*67e74705SXin Li StringRef Name = llvm::sys::path::filename(BaseInput);
2214*67e74705SXin Li std::pair<StringRef, StringRef> Split = Name.split('.');
2215*67e74705SXin Li std::string TmpName = GetTemporaryPath(
2216*67e74705SXin Li Split.first, types::getTypeTempSuffix(JA.getType(), IsCLMode()));
2217*67e74705SXin Li return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
2218*67e74705SXin Li }
2219*67e74705SXin Li
2220*67e74705SXin Li SmallString<128> BasePath(BaseInput);
2221*67e74705SXin Li StringRef BaseName;
2222*67e74705SXin Li
2223*67e74705SXin Li // Dsymutil actions should use the full path.
2224*67e74705SXin Li if (isa<DsymutilJobAction>(JA) || isa<VerifyJobAction>(JA))
2225*67e74705SXin Li BaseName = BasePath;
2226*67e74705SXin Li else
2227*67e74705SXin Li BaseName = llvm::sys::path::filename(BasePath);
2228*67e74705SXin Li
2229*67e74705SXin Li // Determine what the derived output name should be.
2230*67e74705SXin Li const char *NamedOutput;
2231*67e74705SXin Li
2232*67e74705SXin Li if (JA.getType() == types::TY_Object &&
2233*67e74705SXin Li C.getArgs().hasArg(options::OPT__SLASH_Fo, options::OPT__SLASH_o)) {
2234*67e74705SXin Li // The /Fo or /o flag decides the object filename.
2235*67e74705SXin Li StringRef Val =
2236*67e74705SXin Li C.getArgs()
2237*67e74705SXin Li .getLastArg(options::OPT__SLASH_Fo, options::OPT__SLASH_o)
2238*67e74705SXin Li ->getValue();
2239*67e74705SXin Li NamedOutput =
2240*67e74705SXin Li MakeCLOutputFilename(C.getArgs(), Val, BaseName, types::TY_Object);
2241*67e74705SXin Li } else if (JA.getType() == types::TY_Image &&
2242*67e74705SXin Li C.getArgs().hasArg(options::OPT__SLASH_Fe,
2243*67e74705SXin Li options::OPT__SLASH_o)) {
2244*67e74705SXin Li // The /Fe or /o flag names the linked file.
2245*67e74705SXin Li StringRef Val =
2246*67e74705SXin Li C.getArgs()
2247*67e74705SXin Li .getLastArg(options::OPT__SLASH_Fe, options::OPT__SLASH_o)
2248*67e74705SXin Li ->getValue();
2249*67e74705SXin Li NamedOutput =
2250*67e74705SXin Li MakeCLOutputFilename(C.getArgs(), Val, BaseName, types::TY_Image);
2251*67e74705SXin Li } else if (JA.getType() == types::TY_Image) {
2252*67e74705SXin Li if (IsCLMode()) {
2253*67e74705SXin Li // clang-cl uses BaseName for the executable name.
2254*67e74705SXin Li NamedOutput =
2255*67e74705SXin Li MakeCLOutputFilename(C.getArgs(), "", BaseName, types::TY_Image);
2256*67e74705SXin Li } else if (MultipleArchs && BoundArch) {
2257*67e74705SXin Li SmallString<128> Output(getDefaultImageName());
2258*67e74705SXin Li Output += "-";
2259*67e74705SXin Li Output.append(BoundArch);
2260*67e74705SXin Li NamedOutput = C.getArgs().MakeArgString(Output.c_str());
2261*67e74705SXin Li } else {
2262*67e74705SXin Li NamedOutput = getDefaultImageName();
2263*67e74705SXin Li }
2264*67e74705SXin Li } else if (JA.getType() == types::TY_PCH && IsCLMode()) {
2265*67e74705SXin Li NamedOutput = C.getArgs().MakeArgString(GetClPchPath(C, BaseName).c_str());
2266*67e74705SXin Li } else {
2267*67e74705SXin Li const char *Suffix = types::getTypeTempSuffix(JA.getType(), IsCLMode());
2268*67e74705SXin Li assert(Suffix && "All types used for output should have a suffix.");
2269*67e74705SXin Li
2270*67e74705SXin Li std::string::size_type End = std::string::npos;
2271*67e74705SXin Li if (!types::appendSuffixForType(JA.getType()))
2272*67e74705SXin Li End = BaseName.rfind('.');
2273*67e74705SXin Li SmallString<128> Suffixed(BaseName.substr(0, End));
2274*67e74705SXin Li if (MultipleArchs && BoundArch) {
2275*67e74705SXin Li Suffixed += "-";
2276*67e74705SXin Li Suffixed.append(BoundArch);
2277*67e74705SXin Li }
2278*67e74705SXin Li // When using both -save-temps and -emit-llvm, use a ".tmp.bc" suffix for
2279*67e74705SXin Li // the unoptimized bitcode so that it does not get overwritten by the ".bc"
2280*67e74705SXin Li // optimized bitcode output.
2281*67e74705SXin Li if (!AtTopLevel && C.getArgs().hasArg(options::OPT_emit_llvm) &&
2282*67e74705SXin Li JA.getType() == types::TY_LLVM_BC)
2283*67e74705SXin Li Suffixed += ".tmp";
2284*67e74705SXin Li Suffixed += '.';
2285*67e74705SXin Li Suffixed += Suffix;
2286*67e74705SXin Li NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str());
2287*67e74705SXin Li }
2288*67e74705SXin Li
2289*67e74705SXin Li // Prepend object file path if -save-temps=obj
2290*67e74705SXin Li if (!AtTopLevel && isSaveTempsObj() && C.getArgs().hasArg(options::OPT_o) &&
2291*67e74705SXin Li JA.getType() != types::TY_PCH) {
2292*67e74705SXin Li Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o);
2293*67e74705SXin Li SmallString<128> TempPath(FinalOutput->getValue());
2294*67e74705SXin Li llvm::sys::path::remove_filename(TempPath);
2295*67e74705SXin Li StringRef OutputFileName = llvm::sys::path::filename(NamedOutput);
2296*67e74705SXin Li llvm::sys::path::append(TempPath, OutputFileName);
2297*67e74705SXin Li NamedOutput = C.getArgs().MakeArgString(TempPath.c_str());
2298*67e74705SXin Li }
2299*67e74705SXin Li
2300*67e74705SXin Li // If we're saving temps and the temp file conflicts with the input file,
2301*67e74705SXin Li // then avoid overwriting input file.
2302*67e74705SXin Li if (!AtTopLevel && isSaveTempsEnabled() && NamedOutput == BaseName) {
2303*67e74705SXin Li bool SameFile = false;
2304*67e74705SXin Li SmallString<256> Result;
2305*67e74705SXin Li llvm::sys::fs::current_path(Result);
2306*67e74705SXin Li llvm::sys::path::append(Result, BaseName);
2307*67e74705SXin Li llvm::sys::fs::equivalent(BaseInput, Result.c_str(), SameFile);
2308*67e74705SXin Li // Must share the same path to conflict.
2309*67e74705SXin Li if (SameFile) {
2310*67e74705SXin Li StringRef Name = llvm::sys::path::filename(BaseInput);
2311*67e74705SXin Li std::pair<StringRef, StringRef> Split = Name.split('.');
2312*67e74705SXin Li std::string TmpName = GetTemporaryPath(
2313*67e74705SXin Li Split.first, types::getTypeTempSuffix(JA.getType(), IsCLMode()));
2314*67e74705SXin Li return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
2315*67e74705SXin Li }
2316*67e74705SXin Li }
2317*67e74705SXin Li
2318*67e74705SXin Li // As an annoying special case, PCH generation doesn't strip the pathname.
2319*67e74705SXin Li if (JA.getType() == types::TY_PCH && !IsCLMode()) {
2320*67e74705SXin Li llvm::sys::path::remove_filename(BasePath);
2321*67e74705SXin Li if (BasePath.empty())
2322*67e74705SXin Li BasePath = NamedOutput;
2323*67e74705SXin Li else
2324*67e74705SXin Li llvm::sys::path::append(BasePath, NamedOutput);
2325*67e74705SXin Li return C.addResultFile(C.getArgs().MakeArgString(BasePath.c_str()), &JA);
2326*67e74705SXin Li } else {
2327*67e74705SXin Li return C.addResultFile(NamedOutput, &JA);
2328*67e74705SXin Li }
2329*67e74705SXin Li }
2330*67e74705SXin Li
GetFilePath(const char * Name,const ToolChain & TC) const2331*67e74705SXin Li std::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
2332*67e74705SXin Li // Respect a limited subset of the '-Bprefix' functionality in GCC by
2333*67e74705SXin Li // attempting to use this prefix when looking for file paths.
2334*67e74705SXin Li for (const std::string &Dir : PrefixDirs) {
2335*67e74705SXin Li if (Dir.empty())
2336*67e74705SXin Li continue;
2337*67e74705SXin Li SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir);
2338*67e74705SXin Li llvm::sys::path::append(P, Name);
2339*67e74705SXin Li if (llvm::sys::fs::exists(Twine(P)))
2340*67e74705SXin Li return P.str();
2341*67e74705SXin Li }
2342*67e74705SXin Li
2343*67e74705SXin Li SmallString<128> P(ResourceDir);
2344*67e74705SXin Li llvm::sys::path::append(P, Name);
2345*67e74705SXin Li if (llvm::sys::fs::exists(Twine(P)))
2346*67e74705SXin Li return P.str();
2347*67e74705SXin Li
2348*67e74705SXin Li for (const std::string &Dir : TC.getFilePaths()) {
2349*67e74705SXin Li if (Dir.empty())
2350*67e74705SXin Li continue;
2351*67e74705SXin Li SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir);
2352*67e74705SXin Li llvm::sys::path::append(P, Name);
2353*67e74705SXin Li if (llvm::sys::fs::exists(Twine(P)))
2354*67e74705SXin Li return P.str();
2355*67e74705SXin Li }
2356*67e74705SXin Li
2357*67e74705SXin Li return Name;
2358*67e74705SXin Li }
2359*67e74705SXin Li
generatePrefixedToolNames(const char * Tool,const ToolChain & TC,SmallVectorImpl<std::string> & Names) const2360*67e74705SXin Li void Driver::generatePrefixedToolNames(
2361*67e74705SXin Li const char *Tool, const ToolChain &TC,
2362*67e74705SXin Li SmallVectorImpl<std::string> &Names) const {
2363*67e74705SXin Li // FIXME: Needs a better variable than DefaultTargetTriple
2364*67e74705SXin Li Names.emplace_back(DefaultTargetTriple + "-" + Tool);
2365*67e74705SXin Li Names.emplace_back(Tool);
2366*67e74705SXin Li
2367*67e74705SXin Li // Allow the discovery of tools prefixed with LLVM's default target triple.
2368*67e74705SXin Li std::string LLVMDefaultTargetTriple = llvm::sys::getDefaultTargetTriple();
2369*67e74705SXin Li if (LLVMDefaultTargetTriple != DefaultTargetTriple)
2370*67e74705SXin Li Names.emplace_back(LLVMDefaultTargetTriple + "-" + Tool);
2371*67e74705SXin Li }
2372*67e74705SXin Li
ScanDirForExecutable(SmallString<128> & Dir,ArrayRef<std::string> Names)2373*67e74705SXin Li static bool ScanDirForExecutable(SmallString<128> &Dir,
2374*67e74705SXin Li ArrayRef<std::string> Names) {
2375*67e74705SXin Li for (const auto &Name : Names) {
2376*67e74705SXin Li llvm::sys::path::append(Dir, Name);
2377*67e74705SXin Li if (llvm::sys::fs::can_execute(Twine(Dir)))
2378*67e74705SXin Li return true;
2379*67e74705SXin Li llvm::sys::path::remove_filename(Dir);
2380*67e74705SXin Li }
2381*67e74705SXin Li return false;
2382*67e74705SXin Li }
2383*67e74705SXin Li
GetProgramPath(const char * Name,const ToolChain & TC) const2384*67e74705SXin Li std::string Driver::GetProgramPath(const char *Name,
2385*67e74705SXin Li const ToolChain &TC) const {
2386*67e74705SXin Li SmallVector<std::string, 2> TargetSpecificExecutables;
2387*67e74705SXin Li generatePrefixedToolNames(Name, TC, TargetSpecificExecutables);
2388*67e74705SXin Li
2389*67e74705SXin Li // Respect a limited subset of the '-Bprefix' functionality in GCC by
2390*67e74705SXin Li // attempting to use this prefix when looking for program paths.
2391*67e74705SXin Li for (const auto &PrefixDir : PrefixDirs) {
2392*67e74705SXin Li if (llvm::sys::fs::is_directory(PrefixDir)) {
2393*67e74705SXin Li SmallString<128> P(PrefixDir);
2394*67e74705SXin Li if (ScanDirForExecutable(P, TargetSpecificExecutables))
2395*67e74705SXin Li return P.str();
2396*67e74705SXin Li } else {
2397*67e74705SXin Li SmallString<128> P(PrefixDir + Name);
2398*67e74705SXin Li if (llvm::sys::fs::can_execute(Twine(P)))
2399*67e74705SXin Li return P.str();
2400*67e74705SXin Li }
2401*67e74705SXin Li }
2402*67e74705SXin Li
2403*67e74705SXin Li const ToolChain::path_list &List = TC.getProgramPaths();
2404*67e74705SXin Li for (const auto &Path : List) {
2405*67e74705SXin Li SmallString<128> P(Path);
2406*67e74705SXin Li if (ScanDirForExecutable(P, TargetSpecificExecutables))
2407*67e74705SXin Li return P.str();
2408*67e74705SXin Li }
2409*67e74705SXin Li
2410*67e74705SXin Li // If all else failed, search the path.
2411*67e74705SXin Li for (const auto &TargetSpecificExecutable : TargetSpecificExecutables)
2412*67e74705SXin Li if (llvm::ErrorOr<std::string> P =
2413*67e74705SXin Li llvm::sys::findProgramByName(TargetSpecificExecutable))
2414*67e74705SXin Li return *P;
2415*67e74705SXin Li
2416*67e74705SXin Li return Name;
2417*67e74705SXin Li }
2418*67e74705SXin Li
GetTemporaryPath(StringRef Prefix,const char * Suffix) const2419*67e74705SXin Li std::string Driver::GetTemporaryPath(StringRef Prefix,
2420*67e74705SXin Li const char *Suffix) const {
2421*67e74705SXin Li SmallString<128> Path;
2422*67e74705SXin Li std::error_code EC = llvm::sys::fs::createTemporaryFile(Prefix, Suffix, Path);
2423*67e74705SXin Li if (EC) {
2424*67e74705SXin Li Diag(clang::diag::err_unable_to_make_temp) << EC.message();
2425*67e74705SXin Li return "";
2426*67e74705SXin Li }
2427*67e74705SXin Li
2428*67e74705SXin Li return Path.str();
2429*67e74705SXin Li }
2430*67e74705SXin Li
GetClPchPath(Compilation & C,StringRef BaseName) const2431*67e74705SXin Li std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const {
2432*67e74705SXin Li SmallString<128> Output;
2433*67e74705SXin Li if (Arg *FpArg = C.getArgs().getLastArg(options::OPT__SLASH_Fp)) {
2434*67e74705SXin Li // FIXME: If anybody needs it, implement this obscure rule:
2435*67e74705SXin Li // "If you specify a directory without a file name, the default file name
2436*67e74705SXin Li // is VCx0.pch., where x is the major version of Visual C++ in use."
2437*67e74705SXin Li Output = FpArg->getValue();
2438*67e74705SXin Li
2439*67e74705SXin Li // "If you do not specify an extension as part of the path name, an
2440*67e74705SXin Li // extension of .pch is assumed. "
2441*67e74705SXin Li if (!llvm::sys::path::has_extension(Output))
2442*67e74705SXin Li Output += ".pch";
2443*67e74705SXin Li } else {
2444*67e74705SXin Li Output = BaseName;
2445*67e74705SXin Li llvm::sys::path::replace_extension(Output, ".pch");
2446*67e74705SXin Li }
2447*67e74705SXin Li return Output.str();
2448*67e74705SXin Li }
2449*67e74705SXin Li
getToolChain(const ArgList & Args,const llvm::Triple & Target) const2450*67e74705SXin Li const ToolChain &Driver::getToolChain(const ArgList &Args,
2451*67e74705SXin Li const llvm::Triple &Target) const {
2452*67e74705SXin Li
2453*67e74705SXin Li ToolChain *&TC = ToolChains[Target.str()];
2454*67e74705SXin Li if (!TC) {
2455*67e74705SXin Li switch (Target.getOS()) {
2456*67e74705SXin Li case llvm::Triple::Haiku:
2457*67e74705SXin Li TC = new toolchains::Haiku(*this, Target, Args);
2458*67e74705SXin Li break;
2459*67e74705SXin Li case llvm::Triple::CloudABI:
2460*67e74705SXin Li TC = new toolchains::CloudABI(*this, Target, Args);
2461*67e74705SXin Li break;
2462*67e74705SXin Li case llvm::Triple::Darwin:
2463*67e74705SXin Li case llvm::Triple::MacOSX:
2464*67e74705SXin Li case llvm::Triple::IOS:
2465*67e74705SXin Li case llvm::Triple::TvOS:
2466*67e74705SXin Li case llvm::Triple::WatchOS:
2467*67e74705SXin Li TC = new toolchains::DarwinClang(*this, Target, Args);
2468*67e74705SXin Li break;
2469*67e74705SXin Li case llvm::Triple::DragonFly:
2470*67e74705SXin Li TC = new toolchains::DragonFly(*this, Target, Args);
2471*67e74705SXin Li break;
2472*67e74705SXin Li case llvm::Triple::OpenBSD:
2473*67e74705SXin Li TC = new toolchains::OpenBSD(*this, Target, Args);
2474*67e74705SXin Li break;
2475*67e74705SXin Li case llvm::Triple::Bitrig:
2476*67e74705SXin Li TC = new toolchains::Bitrig(*this, Target, Args);
2477*67e74705SXin Li break;
2478*67e74705SXin Li case llvm::Triple::NetBSD:
2479*67e74705SXin Li TC = new toolchains::NetBSD(*this, Target, Args);
2480*67e74705SXin Li break;
2481*67e74705SXin Li case llvm::Triple::FreeBSD:
2482*67e74705SXin Li TC = new toolchains::FreeBSD(*this, Target, Args);
2483*67e74705SXin Li break;
2484*67e74705SXin Li case llvm::Triple::Minix:
2485*67e74705SXin Li TC = new toolchains::Minix(*this, Target, Args);
2486*67e74705SXin Li break;
2487*67e74705SXin Li case llvm::Triple::Linux:
2488*67e74705SXin Li case llvm::Triple::ELFIAMCU:
2489*67e74705SXin Li if (Target.getArch() == llvm::Triple::hexagon)
2490*67e74705SXin Li TC = new toolchains::HexagonToolChain(*this, Target, Args);
2491*67e74705SXin Li else if ((Target.getVendor() == llvm::Triple::MipsTechnologies) &&
2492*67e74705SXin Li !Target.hasEnvironment())
2493*67e74705SXin Li TC = new toolchains::MipsLLVMToolChain(*this, Target, Args);
2494*67e74705SXin Li else
2495*67e74705SXin Li TC = new toolchains::Linux(*this, Target, Args);
2496*67e74705SXin Li break;
2497*67e74705SXin Li case llvm::Triple::NaCl:
2498*67e74705SXin Li TC = new toolchains::NaClToolChain(*this, Target, Args);
2499*67e74705SXin Li break;
2500*67e74705SXin Li case llvm::Triple::Solaris:
2501*67e74705SXin Li TC = new toolchains::Solaris(*this, Target, Args);
2502*67e74705SXin Li break;
2503*67e74705SXin Li case llvm::Triple::AMDHSA:
2504*67e74705SXin Li TC = new toolchains::AMDGPUToolChain(*this, Target, Args);
2505*67e74705SXin Li break;
2506*67e74705SXin Li case llvm::Triple::Win32:
2507*67e74705SXin Li switch (Target.getEnvironment()) {
2508*67e74705SXin Li default:
2509*67e74705SXin Li if (Target.isOSBinFormatELF())
2510*67e74705SXin Li TC = new toolchains::Generic_ELF(*this, Target, Args);
2511*67e74705SXin Li else if (Target.isOSBinFormatMachO())
2512*67e74705SXin Li TC = new toolchains::MachO(*this, Target, Args);
2513*67e74705SXin Li else
2514*67e74705SXin Li TC = new toolchains::Generic_GCC(*this, Target, Args);
2515*67e74705SXin Li break;
2516*67e74705SXin Li case llvm::Triple::GNU:
2517*67e74705SXin Li TC = new toolchains::MinGW(*this, Target, Args);
2518*67e74705SXin Li break;
2519*67e74705SXin Li case llvm::Triple::Itanium:
2520*67e74705SXin Li TC = new toolchains::CrossWindowsToolChain(*this, Target, Args);
2521*67e74705SXin Li break;
2522*67e74705SXin Li case llvm::Triple::MSVC:
2523*67e74705SXin Li case llvm::Triple::UnknownEnvironment:
2524*67e74705SXin Li TC = new toolchains::MSVCToolChain(*this, Target, Args);
2525*67e74705SXin Li break;
2526*67e74705SXin Li }
2527*67e74705SXin Li break;
2528*67e74705SXin Li case llvm::Triple::CUDA:
2529*67e74705SXin Li TC = new toolchains::CudaToolChain(*this, Target, Args);
2530*67e74705SXin Li break;
2531*67e74705SXin Li case llvm::Triple::PS4:
2532*67e74705SXin Li TC = new toolchains::PS4CPU(*this, Target, Args);
2533*67e74705SXin Li break;
2534*67e74705SXin Li default:
2535*67e74705SXin Li // Of these targets, Hexagon is the only one that might have
2536*67e74705SXin Li // an OS of Linux, in which case it got handled above already.
2537*67e74705SXin Li switch (Target.getArch()) {
2538*67e74705SXin Li case llvm::Triple::tce:
2539*67e74705SXin Li TC = new toolchains::TCEToolChain(*this, Target, Args);
2540*67e74705SXin Li break;
2541*67e74705SXin Li case llvm::Triple::hexagon:
2542*67e74705SXin Li TC = new toolchains::HexagonToolChain(*this, Target, Args);
2543*67e74705SXin Li break;
2544*67e74705SXin Li case llvm::Triple::lanai:
2545*67e74705SXin Li TC = new toolchains::LanaiToolChain(*this, Target, Args);
2546*67e74705SXin Li break;
2547*67e74705SXin Li case llvm::Triple::xcore:
2548*67e74705SXin Li TC = new toolchains::XCoreToolChain(*this, Target, Args);
2549*67e74705SXin Li break;
2550*67e74705SXin Li case llvm::Triple::wasm32:
2551*67e74705SXin Li case llvm::Triple::wasm64:
2552*67e74705SXin Li TC = new toolchains::WebAssembly(*this, Target, Args);
2553*67e74705SXin Li break;
2554*67e74705SXin Li default:
2555*67e74705SXin Li if (Target.getVendor() == llvm::Triple::Myriad)
2556*67e74705SXin Li TC = new toolchains::MyriadToolChain(*this, Target, Args);
2557*67e74705SXin Li else if (Target.isOSBinFormatELF())
2558*67e74705SXin Li TC = new toolchains::Generic_ELF(*this, Target, Args);
2559*67e74705SXin Li else if (Target.isOSBinFormatMachO())
2560*67e74705SXin Li TC = new toolchains::MachO(*this, Target, Args);
2561*67e74705SXin Li else
2562*67e74705SXin Li TC = new toolchains::Generic_GCC(*this, Target, Args);
2563*67e74705SXin Li }
2564*67e74705SXin Li }
2565*67e74705SXin Li }
2566*67e74705SXin Li return *TC;
2567*67e74705SXin Li }
2568*67e74705SXin Li
ShouldUseClangCompiler(const JobAction & JA) const2569*67e74705SXin Li bool Driver::ShouldUseClangCompiler(const JobAction &JA) const {
2570*67e74705SXin Li // Say "no" if there is not exactly one input of a type clang understands.
2571*67e74705SXin Li if (JA.size() != 1 ||
2572*67e74705SXin Li !types::isAcceptedByClang((*JA.input_begin())->getType()))
2573*67e74705SXin Li return false;
2574*67e74705SXin Li
2575*67e74705SXin Li // And say "no" if this is not a kind of action clang understands.
2576*67e74705SXin Li if (!isa<PreprocessJobAction>(JA) && !isa<PrecompileJobAction>(JA) &&
2577*67e74705SXin Li !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
2578*67e74705SXin Li return false;
2579*67e74705SXin Li
2580*67e74705SXin Li return true;
2581*67e74705SXin Li }
2582*67e74705SXin Li
2583*67e74705SXin Li /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the
2584*67e74705SXin Li /// grouped values as integers. Numbers which are not provided are set to 0.
2585*67e74705SXin Li ///
2586*67e74705SXin Li /// \return True if the entire string was parsed (9.2), or all groups were
2587*67e74705SXin Li /// parsed (10.3.5extrastuff).
GetReleaseVersion(const char * Str,unsigned & Major,unsigned & Minor,unsigned & Micro,bool & HadExtra)2588*67e74705SXin Li bool Driver::GetReleaseVersion(const char *Str, unsigned &Major,
2589*67e74705SXin Li unsigned &Minor, unsigned &Micro,
2590*67e74705SXin Li bool &HadExtra) {
2591*67e74705SXin Li HadExtra = false;
2592*67e74705SXin Li
2593*67e74705SXin Li Major = Minor = Micro = 0;
2594*67e74705SXin Li if (*Str == '\0')
2595*67e74705SXin Li return false;
2596*67e74705SXin Li
2597*67e74705SXin Li char *End;
2598*67e74705SXin Li Major = (unsigned)strtol(Str, &End, 10);
2599*67e74705SXin Li if (*Str != '\0' && *End == '\0')
2600*67e74705SXin Li return true;
2601*67e74705SXin Li if (*End != '.')
2602*67e74705SXin Li return false;
2603*67e74705SXin Li
2604*67e74705SXin Li Str = End + 1;
2605*67e74705SXin Li Minor = (unsigned)strtol(Str, &End, 10);
2606*67e74705SXin Li if (*Str != '\0' && *End == '\0')
2607*67e74705SXin Li return true;
2608*67e74705SXin Li if (*End != '.')
2609*67e74705SXin Li return false;
2610*67e74705SXin Li
2611*67e74705SXin Li Str = End + 1;
2612*67e74705SXin Li Micro = (unsigned)strtol(Str, &End, 10);
2613*67e74705SXin Li if (*Str != '\0' && *End == '\0')
2614*67e74705SXin Li return true;
2615*67e74705SXin Li if (Str == End)
2616*67e74705SXin Li return false;
2617*67e74705SXin Li HadExtra = true;
2618*67e74705SXin Li return true;
2619*67e74705SXin Li }
2620*67e74705SXin Li
2621*67e74705SXin Li /// Parse digits from a string \p Str and fulfill \p Digits with
2622*67e74705SXin Li /// the parsed numbers. This method assumes that the max number of
2623*67e74705SXin Li /// digits to look for is equal to Digits.size().
2624*67e74705SXin Li ///
2625*67e74705SXin Li /// \return True if the entire string was parsed and there are
2626*67e74705SXin Li /// no extra characters remaining at the end.
GetReleaseVersion(const char * Str,MutableArrayRef<unsigned> Digits)2627*67e74705SXin Li bool Driver::GetReleaseVersion(const char *Str,
2628*67e74705SXin Li MutableArrayRef<unsigned> Digits) {
2629*67e74705SXin Li if (*Str == '\0')
2630*67e74705SXin Li return false;
2631*67e74705SXin Li
2632*67e74705SXin Li char *End;
2633*67e74705SXin Li unsigned CurDigit = 0;
2634*67e74705SXin Li while (CurDigit < Digits.size()) {
2635*67e74705SXin Li unsigned Digit = (unsigned)strtol(Str, &End, 10);
2636*67e74705SXin Li Digits[CurDigit] = Digit;
2637*67e74705SXin Li if (*Str != '\0' && *End == '\0')
2638*67e74705SXin Li return true;
2639*67e74705SXin Li if (*End != '.' || Str == End)
2640*67e74705SXin Li return false;
2641*67e74705SXin Li Str = End + 1;
2642*67e74705SXin Li CurDigit++;
2643*67e74705SXin Li }
2644*67e74705SXin Li
2645*67e74705SXin Li // More digits than requested, bail out...
2646*67e74705SXin Li return false;
2647*67e74705SXin Li }
2648*67e74705SXin Li
getIncludeExcludeOptionFlagMasks() const2649*67e74705SXin Li std::pair<unsigned, unsigned> Driver::getIncludeExcludeOptionFlagMasks() const {
2650*67e74705SXin Li unsigned IncludedFlagsBitmask = 0;
2651*67e74705SXin Li unsigned ExcludedFlagsBitmask = options::NoDriverOption;
2652*67e74705SXin Li
2653*67e74705SXin Li if (Mode == CLMode) {
2654*67e74705SXin Li // Include CL and Core options.
2655*67e74705SXin Li IncludedFlagsBitmask |= options::CLOption;
2656*67e74705SXin Li IncludedFlagsBitmask |= options::CoreOption;
2657*67e74705SXin Li } else {
2658*67e74705SXin Li ExcludedFlagsBitmask |= options::CLOption;
2659*67e74705SXin Li }
2660*67e74705SXin Li
2661*67e74705SXin Li return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask);
2662*67e74705SXin Li }
2663*67e74705SXin Li
isOptimizationLevelFast(const ArgList & Args)2664*67e74705SXin Li bool clang::driver::isOptimizationLevelFast(const ArgList &Args) {
2665*67e74705SXin Li return Args.hasFlag(options::OPT_Ofast, options::OPT_O_Group, false);
2666*67e74705SXin Li }
2667