• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- Tools.cpp - Tools Implementations --------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "Tools.h"
11 #include "InputInfo.h"
12 #include "ToolChains.h"
13 #include "clang/Basic/LangOptions.h"
14 #include "clang/Basic/ObjCRuntime.h"
15 #include "clang/Basic/Version.h"
16 #include "clang/Driver/Action.h"
17 #include "clang/Driver/Compilation.h"
18 #include "clang/Driver/Driver.h"
19 #include "clang/Driver/DriverDiagnostic.h"
20 #include "clang/Driver/Job.h"
21 #include "clang/Driver/Options.h"
22 #include "clang/Driver/SanitizerArgs.h"
23 #include "clang/Driver/ToolChain.h"
24 #include "clang/Driver/Util.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/StringExtras.h"
27 #include "llvm/ADT/StringSwitch.h"
28 #include "llvm/ADT/Twine.h"
29 #include "llvm/Option/Arg.h"
30 #include "llvm/Option/ArgList.h"
31 #include "llvm/Option/Option.h"
32 #include "llvm/Support/Compression.h"
33 #include "llvm/Support/ErrorHandling.h"
34 #include "llvm/Support/FileSystem.h"
35 #include "llvm/Support/Format.h"
36 #include "llvm/Support/Host.h"
37 #include "llvm/Support/Path.h"
38 #include "llvm/Support/Process.h"
39 #include "llvm/Support/Program.h"
40 #include "llvm/Support/raw_ostream.h"
41 
42 using namespace clang::driver;
43 using namespace clang::driver::tools;
44 using namespace clang;
45 using namespace llvm::opt;
46 
addAssemblerKPIC(const ArgList & Args,ArgStringList & CmdArgs)47 static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
48   Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
49                                     options::OPT_fpic, options::OPT_fno_pic,
50                                     options::OPT_fPIE, options::OPT_fno_PIE,
51                                     options::OPT_fpie, options::OPT_fno_pie);
52   if (!LastPICArg)
53     return;
54   if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
55       LastPICArg->getOption().matches(options::OPT_fpic) ||
56       LastPICArg->getOption().matches(options::OPT_fPIE) ||
57       LastPICArg->getOption().matches(options::OPT_fpie)) {
58     CmdArgs.push_back("-KPIC");
59   }
60 }
61 
62 /// CheckPreprocessingOptions - Perform some validation of preprocessing
63 /// arguments that is shared with gcc.
CheckPreprocessingOptions(const Driver & D,const ArgList & Args)64 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
65   if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
66     if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
67         !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
68       D.Diag(diag::err_drv_argument_only_allowed_with)
69           << A->getBaseArg().getAsString(Args)
70           << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
71     }
72   }
73 }
74 
75 /// CheckCodeGenerationOptions - Perform some validation of code generation
76 /// arguments that is shared with gcc.
CheckCodeGenerationOptions(const Driver & D,const ArgList & Args)77 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
78   // In gcc, only ARM checks this, but it seems reasonable to check universally.
79   if (Args.hasArg(options::OPT_static))
80     if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
81                                        options::OPT_mdynamic_no_pic))
82       D.Diag(diag::err_drv_argument_not_allowed_with)
83         << A->getAsString(Args) << "-static";
84 }
85 
86 // Quote target names for inclusion in GNU Make dependency files.
87 // Only the characters '$', '#', ' ', '\t' are quoted.
QuoteTarget(StringRef Target,SmallVectorImpl<char> & Res)88 static void QuoteTarget(StringRef Target,
89                         SmallVectorImpl<char> &Res) {
90   for (unsigned i = 0, e = Target.size(); i != e; ++i) {
91     switch (Target[i]) {
92     case ' ':
93     case '\t':
94       // Escape the preceding backslashes
95       for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
96         Res.push_back('\\');
97 
98       // Escape the space/tab
99       Res.push_back('\\');
100       break;
101     case '$':
102       Res.push_back('$');
103       break;
104     case '#':
105       Res.push_back('\\');
106       break;
107     default:
108       break;
109     }
110 
111     Res.push_back(Target[i]);
112   }
113 }
114 
addDirectoryList(const ArgList & Args,ArgStringList & CmdArgs,const char * ArgName,const char * EnvVar)115 static void addDirectoryList(const ArgList &Args,
116                              ArgStringList &CmdArgs,
117                              const char *ArgName,
118                              const char *EnvVar) {
119   const char *DirList = ::getenv(EnvVar);
120   bool CombinedArg = false;
121 
122   if (!DirList)
123     return; // Nothing to do.
124 
125   StringRef Name(ArgName);
126   if (Name.equals("-I") || Name.equals("-L"))
127     CombinedArg = true;
128 
129   StringRef Dirs(DirList);
130   if (Dirs.empty()) // Empty string should not add '.'.
131     return;
132 
133   StringRef::size_type Delim;
134   while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
135     if (Delim == 0) { // Leading colon.
136       if (CombinedArg) {
137         CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
138       } else {
139         CmdArgs.push_back(ArgName);
140         CmdArgs.push_back(".");
141       }
142     } else {
143       if (CombinedArg) {
144         CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
145       } else {
146         CmdArgs.push_back(ArgName);
147         CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
148       }
149     }
150     Dirs = Dirs.substr(Delim + 1);
151   }
152 
153   if (Dirs.empty()) { // Trailing colon.
154     if (CombinedArg) {
155       CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
156     } else {
157       CmdArgs.push_back(ArgName);
158       CmdArgs.push_back(".");
159     }
160   } else { // Add the last path.
161     if (CombinedArg) {
162       CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
163     } else {
164       CmdArgs.push_back(ArgName);
165       CmdArgs.push_back(Args.MakeArgString(Dirs));
166     }
167   }
168 }
169 
AddLinkerInputs(const ToolChain & TC,const InputInfoList & Inputs,const ArgList & Args,ArgStringList & CmdArgs)170 static void AddLinkerInputs(const ToolChain &TC,
171                             const InputInfoList &Inputs, const ArgList &Args,
172                             ArgStringList &CmdArgs) {
173   const Driver &D = TC.getDriver();
174 
175   // Add extra linker input arguments which are not treated as inputs
176   // (constructed via -Xarch_).
177   Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
178 
179   for (const auto &II : Inputs) {
180     if (!TC.HasNativeLLVMSupport()) {
181       // Don't try to pass LLVM inputs unless we have native support.
182       if (II.getType() == types::TY_LLVM_IR ||
183           II.getType() == types::TY_LTO_IR ||
184           II.getType() == types::TY_LLVM_BC ||
185           II.getType() == types::TY_LTO_BC)
186         D.Diag(diag::err_drv_no_linker_llvm_support)
187           << TC.getTripleString();
188     }
189 
190     // Add filenames immediately.
191     if (II.isFilename()) {
192       CmdArgs.push_back(II.getFilename());
193       continue;
194     }
195 
196     // Otherwise, this is a linker input argument.
197     const Arg &A = II.getInputArg();
198 
199     // Handle reserved library options.
200     if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
201       TC.AddCXXStdlibLibArgs(Args, CmdArgs);
202     else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
203       TC.AddCCKextLibArgs(Args, CmdArgs);
204     else
205       A.renderAsInput(Args, CmdArgs);
206   }
207 
208   // LIBRARY_PATH - included following the user specified library paths.
209   //                and only supported on native toolchains.
210   if (!TC.isCrossCompiling())
211     addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
212 }
213 
214 /// \brief Determine whether Objective-C automated reference counting is
215 /// enabled.
isObjCAutoRefCount(const ArgList & Args)216 static bool isObjCAutoRefCount(const ArgList &Args) {
217   return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
218 }
219 
220 /// \brief Determine whether we are linking the ObjC runtime.
isObjCRuntimeLinked(const ArgList & Args)221 static bool isObjCRuntimeLinked(const ArgList &Args) {
222   if (isObjCAutoRefCount(Args)) {
223     Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
224     return true;
225   }
226   return Args.hasArg(options::OPT_fobjc_link_runtime);
227 }
228 
forwardToGCC(const Option & O)229 static bool forwardToGCC(const Option &O) {
230   // Don't forward inputs from the original command line.  They are added from
231   // InputInfoList.
232   return O.getKind() != Option::InputClass &&
233          !O.hasFlag(options::DriverOption) &&
234          !O.hasFlag(options::LinkerInput);
235 }
236 
AddPreprocessingOptions(Compilation & C,const JobAction & JA,const Driver & D,const ArgList & Args,ArgStringList & CmdArgs,const InputInfo & Output,const InputInfoList & Inputs) const237 void Clang::AddPreprocessingOptions(Compilation &C,
238                                     const JobAction &JA,
239                                     const Driver &D,
240                                     const ArgList &Args,
241                                     ArgStringList &CmdArgs,
242                                     const InputInfo &Output,
243                                     const InputInfoList &Inputs) const {
244   Arg *A;
245 
246   CheckPreprocessingOptions(D, Args);
247 
248   Args.AddLastArg(CmdArgs, options::OPT_C);
249   Args.AddLastArg(CmdArgs, options::OPT_CC);
250 
251   // Handle dependency file generation.
252   if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
253       (A = Args.getLastArg(options::OPT_MD)) ||
254       (A = Args.getLastArg(options::OPT_MMD))) {
255     // Determine the output location.
256     const char *DepFile;
257     if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
258       DepFile = MF->getValue();
259       C.addFailureResultFile(DepFile, &JA);
260     } else if (Output.getType() == types::TY_Dependencies) {
261       DepFile = Output.getFilename();
262     } else if (A->getOption().matches(options::OPT_M) ||
263                A->getOption().matches(options::OPT_MM)) {
264       DepFile = "-";
265     } else {
266       DepFile = getDependencyFileName(Args, Inputs);
267       C.addFailureResultFile(DepFile, &JA);
268     }
269     CmdArgs.push_back("-dependency-file");
270     CmdArgs.push_back(DepFile);
271 
272     // Add a default target if one wasn't specified.
273     if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274       const char *DepTarget;
275 
276       // If user provided -o, that is the dependency target, except
277       // when we are only generating a dependency file.
278       Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279       if (OutputOpt && Output.getType() != types::TY_Dependencies) {
280         DepTarget = OutputOpt->getValue();
281       } else {
282         // Otherwise derive from the base input.
283         //
284         // FIXME: This should use the computed output file location.
285         SmallString<128> P(Inputs[0].getBaseInput());
286         llvm::sys::path::replace_extension(P, "o");
287         DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
288       }
289 
290       CmdArgs.push_back("-MT");
291       SmallString<128> Quoted;
292       QuoteTarget(DepTarget, Quoted);
293       CmdArgs.push_back(Args.MakeArgString(Quoted));
294     }
295 
296     if (A->getOption().matches(options::OPT_M) ||
297         A->getOption().matches(options::OPT_MD))
298       CmdArgs.push_back("-sys-header-deps");
299 
300     if (isa<PrecompileJobAction>(JA))
301       CmdArgs.push_back("-module-file-deps");
302   }
303 
304   if (Args.hasArg(options::OPT_MG)) {
305     if (!A || A->getOption().matches(options::OPT_MD) ||
306               A->getOption().matches(options::OPT_MMD))
307       D.Diag(diag::err_drv_mg_requires_m_or_mm);
308     CmdArgs.push_back("-MG");
309   }
310 
311   Args.AddLastArg(CmdArgs, options::OPT_MP);
312 
313   // Convert all -MQ <target> args to -MT <quoted target>
314   for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
315                                              options::OPT_MQ),
316          ie = Args.filtered_end(); it != ie; ++it) {
317     const Arg *A = *it;
318     A->claim();
319 
320     if (A->getOption().matches(options::OPT_MQ)) {
321       CmdArgs.push_back("-MT");
322       SmallString<128> Quoted;
323       QuoteTarget(A->getValue(), Quoted);
324       CmdArgs.push_back(Args.MakeArgString(Quoted));
325 
326     // -MT flag - no change
327     } else {
328       A->render(Args, CmdArgs);
329     }
330   }
331 
332   // Add -i* options, and automatically translate to
333   // -include-pch/-include-pth for transparent PCH support. It's
334   // wonky, but we include looking for .gch so we can support seamless
335   // replacement into a build system already set up to be generating
336   // .gch files.
337   bool RenderedImplicitInclude = false;
338   for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
339          ie = Args.filtered_end(); it != ie; ++it) {
340     const Arg *A = it;
341 
342     if (A->getOption().matches(options::OPT_include)) {
343       bool IsFirstImplicitInclude = !RenderedImplicitInclude;
344       RenderedImplicitInclude = true;
345 
346       // Use PCH if the user requested it.
347       bool UsePCH = D.CCCUsePCH;
348 
349       bool FoundPTH = false;
350       bool FoundPCH = false;
351       SmallString<128> P(A->getValue());
352       // We want the files to have a name like foo.h.pch. Add a dummy extension
353       // so that replace_extension does the right thing.
354       P += ".dummy";
355       if (UsePCH) {
356         llvm::sys::path::replace_extension(P, "pch");
357         if (llvm::sys::fs::exists(P.str()))
358           FoundPCH = true;
359       }
360 
361       if (!FoundPCH) {
362         llvm::sys::path::replace_extension(P, "pth");
363         if (llvm::sys::fs::exists(P.str()))
364           FoundPTH = true;
365       }
366 
367       if (!FoundPCH && !FoundPTH) {
368         llvm::sys::path::replace_extension(P, "gch");
369         if (llvm::sys::fs::exists(P.str())) {
370           FoundPCH = UsePCH;
371           FoundPTH = !UsePCH;
372         }
373       }
374 
375       if (FoundPCH || FoundPTH) {
376         if (IsFirstImplicitInclude) {
377           A->claim();
378           if (UsePCH)
379             CmdArgs.push_back("-include-pch");
380           else
381             CmdArgs.push_back("-include-pth");
382           CmdArgs.push_back(Args.MakeArgString(P.str()));
383           continue;
384         } else {
385           // Ignore the PCH if not first on command line and emit warning.
386           D.Diag(diag::warn_drv_pch_not_first_include)
387               << P.str() << A->getAsString(Args);
388         }
389       }
390     }
391 
392     // Not translated, render as usual.
393     A->claim();
394     A->render(Args, CmdArgs);
395   }
396 
397   Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
398   Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
399                   options::OPT_index_header_map);
400 
401   // Add -Wp, and -Xassembler if using the preprocessor.
402 
403   // FIXME: There is a very unfortunate problem here, some troubled
404   // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
405   // really support that we would have to parse and then translate
406   // those options. :(
407   Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
408                        options::OPT_Xpreprocessor);
409 
410   // -I- is a deprecated GCC feature, reject it.
411   if (Arg *A = Args.getLastArg(options::OPT_I_))
412     D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
413 
414   // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
415   // -isysroot to the CC1 invocation.
416   StringRef sysroot = C.getSysRoot();
417   if (sysroot != "") {
418     if (!Args.hasArg(options::OPT_isysroot)) {
419       CmdArgs.push_back("-isysroot");
420       CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
421     }
422   }
423 
424   // Parse additional include paths from environment variables.
425   // FIXME: We should probably sink the logic for handling these from the
426   // frontend into the driver. It will allow deleting 4 otherwise unused flags.
427   // CPATH - included following the user specified includes (but prior to
428   // builtin and standard includes).
429   addDirectoryList(Args, CmdArgs, "-I", "CPATH");
430   // C_INCLUDE_PATH - system includes enabled when compiling C.
431   addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
432   // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
433   addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
434   // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
435   addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
436   // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
437   addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
438 
439   // Add C++ include arguments, if needed.
440   if (types::isCXX(Inputs[0].getType()))
441     getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
442 
443   // Add system include arguments.
444   getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
445 }
446 
447 // FIXME: Move to target hook.
isSignedCharDefault(const llvm::Triple & Triple)448 static bool isSignedCharDefault(const llvm::Triple &Triple) {
449   switch (Triple.getArch()) {
450   default:
451     return true;
452 
453   case llvm::Triple::aarch64:
454   case llvm::Triple::aarch64_be:
455   case llvm::Triple::arm64:
456   case llvm::Triple::arm64_be:
457   case llvm::Triple::arm:
458   case llvm::Triple::armeb:
459     if (Triple.isOSDarwin() || Triple.isOSWindows())
460       return true;
461     return false;
462 
463   case llvm::Triple::ppc:
464   case llvm::Triple::ppc64:
465     if (Triple.isOSDarwin())
466       return true;
467     return false;
468 
469   case llvm::Triple::ppc64le:
470   case llvm::Triple::systemz:
471   case llvm::Triple::xcore:
472     return false;
473   }
474 }
475 
isNoCommonDefault(const llvm::Triple & Triple)476 static bool isNoCommonDefault(const llvm::Triple &Triple) {
477   switch (Triple.getArch()) {
478   default:
479     return false;
480 
481   case llvm::Triple::xcore:
482     return true;
483   }
484 }
485 
486 // Handle -mfpu=.
487 //
488 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
489 // frontend target.
getAArch64FPUFeatures(const Driver & D,const Arg * A,const ArgList & Args,std::vector<const char * > & Features)490 static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
491                                   const ArgList &Args,
492                                   std::vector<const char *> &Features) {
493   StringRef FPU = A->getValue();
494   if (FPU == "fp-armv8") {
495     Features.push_back("+fp-armv8");
496   } else if (FPU == "neon-fp-armv8") {
497     Features.push_back("+fp-armv8");
498     Features.push_back("+neon");
499   } else if (FPU == "crypto-neon-fp-armv8") {
500     Features.push_back("+fp-armv8");
501     Features.push_back("+neon");
502     Features.push_back("+crypto");
503   } else if (FPU == "neon") {
504     Features.push_back("+neon");
505   } else
506     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
507 }
508 
509 // Handle -mhwdiv=.
getARMHWDivFeatures(const Driver & D,const Arg * A,const ArgList & Args,std::vector<const char * > & Features)510 static void getARMHWDivFeatures(const Driver &D, const Arg *A,
511                               const ArgList &Args,
512                               std::vector<const char *> &Features) {
513   StringRef HWDiv = A->getValue();
514   if (HWDiv == "arm") {
515     Features.push_back("+hwdiv-arm");
516     Features.push_back("-hwdiv");
517   } else if (HWDiv == "thumb") {
518     Features.push_back("-hwdiv-arm");
519     Features.push_back("+hwdiv");
520   } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
521     Features.push_back("+hwdiv-arm");
522     Features.push_back("+hwdiv");
523   } else if (HWDiv == "none") {
524     Features.push_back("-hwdiv-arm");
525     Features.push_back("-hwdiv");
526   } else
527     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
528 }
529 
530 // Handle -mfpu=.
531 //
532 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
533 // frontend target.
getARMFPUFeatures(const Driver & D,const Arg * A,const ArgList & Args,std::vector<const char * > & Features)534 static void getARMFPUFeatures(const Driver &D, const Arg *A,
535                               const ArgList &Args,
536                               std::vector<const char *> &Features) {
537   StringRef FPU = A->getValue();
538 
539   // Set the target features based on the FPU.
540   if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
541     // Disable any default FPU support.
542     Features.push_back("-vfp2");
543     Features.push_back("-vfp3");
544     Features.push_back("-neon");
545   } else if (FPU == "vfp") {
546     Features.push_back("+vfp2");
547     Features.push_back("-neon");
548   } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
549     Features.push_back("+vfp3");
550     Features.push_back("+d16");
551     Features.push_back("-neon");
552   } else if (FPU == "vfp3" || FPU == "vfpv3") {
553     Features.push_back("+vfp3");
554     Features.push_back("-neon");
555   } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
556     Features.push_back("+vfp4");
557     Features.push_back("+d16");
558     Features.push_back("-neon");
559   } else if (FPU == "vfp4" || FPU == "vfpv4") {
560     Features.push_back("+vfp4");
561     Features.push_back("-neon");
562   } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
563     Features.push_back("+vfp4");
564     Features.push_back("+d16");
565     Features.push_back("+fp-only-sp");
566     Features.push_back("-neon");
567   } else if (FPU == "fp-armv8") {
568     Features.push_back("+fp-armv8");
569     Features.push_back("-neon");
570     Features.push_back("-crypto");
571   } else if (FPU == "neon-fp-armv8") {
572     Features.push_back("+fp-armv8");
573     Features.push_back("+neon");
574     Features.push_back("-crypto");
575   } else if (FPU == "crypto-neon-fp-armv8") {
576     Features.push_back("+fp-armv8");
577     Features.push_back("+neon");
578     Features.push_back("+crypto");
579   } else if (FPU == "neon") {
580     Features.push_back("+neon");
581   } else if (FPU == "none") {
582     Features.push_back("-vfp2");
583     Features.push_back("-vfp3");
584     Features.push_back("-vfp4");
585     Features.push_back("-fp-armv8");
586     Features.push_back("-crypto");
587     Features.push_back("-neon");
588   } else
589     D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590 }
591 
592 // Select the float ABI as determined by -msoft-float, -mhard-float, and
593 // -mfloat-abi=.
getARMFloatABI(const Driver & D,const ArgList & Args,const llvm::Triple & Triple)594 StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
595                                      const llvm::Triple &Triple) {
596   StringRef FloatABI;
597   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
598                                options::OPT_mhard_float,
599                                options::OPT_mfloat_abi_EQ)) {
600     if (A->getOption().matches(options::OPT_msoft_float))
601       FloatABI = "soft";
602     else if (A->getOption().matches(options::OPT_mhard_float))
603       FloatABI = "hard";
604     else {
605       FloatABI = A->getValue();
606       if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
607         D.Diag(diag::err_drv_invalid_mfloat_abi)
608           << A->getAsString(Args);
609         FloatABI = "soft";
610       }
611     }
612   }
613 
614   // If unspecified, choose the default based on the platform.
615   if (FloatABI.empty()) {
616     switch (Triple.getOS()) {
617     case llvm::Triple::Darwin:
618     case llvm::Triple::MacOSX:
619     case llvm::Triple::IOS: {
620       // Darwin defaults to "softfp" for v6 and v7.
621       //
622       // FIXME: Factor out an ARM class so we can cache the arch somewhere.
623       std::string ArchName =
624         arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
625       if (StringRef(ArchName).startswith("v6") ||
626           StringRef(ArchName).startswith("v7"))
627         FloatABI = "softfp";
628       else
629         FloatABI = "soft";
630       break;
631     }
632 
633     // FIXME: this is invalid for WindowsCE
634     case llvm::Triple::Win32:
635       FloatABI = "hard";
636       break;
637 
638     case llvm::Triple::FreeBSD:
639       switch(Triple.getEnvironment()) {
640       case llvm::Triple::GNUEABIHF:
641         FloatABI = "hard";
642         break;
643       default:
644         // FreeBSD defaults to soft float
645         FloatABI = "soft";
646         break;
647       }
648       break;
649 
650     default:
651       switch(Triple.getEnvironment()) {
652       case llvm::Triple::GNUEABIHF:
653         FloatABI = "hard";
654         break;
655       case llvm::Triple::GNUEABI:
656         FloatABI = "softfp";
657         break;
658       case llvm::Triple::EABIHF:
659         FloatABI = "hard";
660         break;
661       case llvm::Triple::EABI:
662         // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
663         FloatABI = "softfp";
664         break;
665       case llvm::Triple::Android: {
666         std::string ArchName =
667           arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
668         if (StringRef(ArchName).startswith("v7"))
669           FloatABI = "softfp";
670         else
671           FloatABI = "soft";
672         break;
673       }
674       default:
675         // Assume "soft", but warn the user we are guessing.
676         FloatABI = "soft";
677         if (Triple.getOS() != llvm::Triple::UnknownOS ||
678             !Triple.isOSBinFormatMachO())
679           D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
680         break;
681       }
682     }
683   }
684 
685   return FloatABI;
686 }
687 
getARMTargetFeatures(const Driver & D,const llvm::Triple & Triple,const ArgList & Args,std::vector<const char * > & Features,bool ForAS)688 static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
689                                  const ArgList &Args,
690                                  std::vector<const char *> &Features,
691                                  bool ForAS) {
692   StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
693   if (!ForAS) {
694     // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
695     // yet (it uses the -mfloat-abi and -msoft-float options), and it is
696     // stripped out by the ARM target. We should probably pass this a new
697     // -target-option, which is handled by the -cc1/-cc1as invocation.
698     //
699     // FIXME2:  For consistency, it would be ideal if we set up the target
700     // machine state the same when using the frontend or the assembler. We don't
701     // currently do that for the assembler, we pass the options directly to the
702     // backend and never even instantiate the frontend TargetInfo. If we did,
703     // and used its handleTargetFeatures hook, then we could ensure the
704     // assembler and the frontend behave the same.
705 
706     // Use software floating point operations?
707     if (FloatABI == "soft")
708       Features.push_back("+soft-float");
709 
710     // Use software floating point argument passing?
711     if (FloatABI != "hard")
712       Features.push_back("+soft-float-abi");
713   }
714 
715   // Honor -mfpu=.
716   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
717     getARMFPUFeatures(D, A, Args, Features);
718   if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
719     getARMHWDivFeatures(D, A, Args, Features);
720 
721   // Setting -msoft-float effectively disables NEON because of the GCC
722   // implementation, although the same isn't true of VFP or VFP3.
723   if (FloatABI == "soft") {
724     Features.push_back("-neon");
725     // Also need to explicitly disable features which imply NEON.
726     Features.push_back("-crypto");
727   }
728 
729   // En/disable crc
730   if (Arg *A = Args.getLastArg(options::OPT_mcrc,
731                                options::OPT_mnocrc)) {
732     if (A->getOption().matches(options::OPT_mcrc))
733       Features.push_back("+crc");
734     else
735       Features.push_back("-crc");
736   }
737 }
738 
AddARMTargetArgs(const ArgList & Args,ArgStringList & CmdArgs,bool KernelOrKext) const739 void Clang::AddARMTargetArgs(const ArgList &Args,
740                              ArgStringList &CmdArgs,
741                              bool KernelOrKext) const {
742   const Driver &D = getToolChain().getDriver();
743   // Get the effective triple, which takes into account the deployment target.
744   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
745   llvm::Triple Triple(TripleStr);
746   std::string CPUName = arm::getARMTargetCPU(Args, Triple);
747 
748   // Select the ABI to use.
749   //
750   // FIXME: Support -meabi.
751   const char *ABIName = nullptr;
752   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
753     ABIName = A->getValue();
754   } else if (Triple.isOSBinFormatMachO()) {
755     // The backend is hardwired to assume AAPCS for M-class processors, ensure
756     // the frontend matches that.
757     if (Triple.getEnvironment() == llvm::Triple::EABI ||
758         (Triple.getOS() == llvm::Triple::UnknownOS &&
759          Triple.getObjectFormat() == llvm::Triple::MachO) ||
760         StringRef(CPUName).startswith("cortex-m")) {
761       ABIName = "aapcs";
762     } else {
763       ABIName = "apcs-gnu";
764     }
765   } else if (Triple.isOSWindows()) {
766     // FIXME: this is invalid for WindowsCE
767     ABIName = "aapcs";
768   } else {
769     // Select the default based on the platform.
770     switch(Triple.getEnvironment()) {
771     case llvm::Triple::Android:
772     case llvm::Triple::GNUEABI:
773     case llvm::Triple::GNUEABIHF:
774       ABIName = "aapcs-linux";
775       break;
776     case llvm::Triple::EABIHF:
777     case llvm::Triple::EABI:
778       ABIName = "aapcs";
779       break;
780     default:
781       ABIName = "apcs-gnu";
782     }
783   }
784   CmdArgs.push_back("-target-abi");
785   CmdArgs.push_back(ABIName);
786 
787   // Determine floating point ABI from the options & target defaults.
788   StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
789   if (FloatABI == "soft") {
790     // Floating point operations and argument passing are soft.
791     //
792     // FIXME: This changes CPP defines, we need -target-soft-float.
793     CmdArgs.push_back("-msoft-float");
794     CmdArgs.push_back("-mfloat-abi");
795     CmdArgs.push_back("soft");
796   } else if (FloatABI == "softfp") {
797     // Floating point operations are hard, but argument passing is soft.
798     CmdArgs.push_back("-mfloat-abi");
799     CmdArgs.push_back("soft");
800   } else {
801     // Floating point operations and argument passing are hard.
802     assert(FloatABI == "hard" && "Invalid float abi!");
803     CmdArgs.push_back("-mfloat-abi");
804     CmdArgs.push_back("hard");
805   }
806 
807   // Kernel code has more strict alignment requirements.
808   if (KernelOrKext) {
809     if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
810       CmdArgs.push_back("-backend-option");
811       CmdArgs.push_back("-arm-long-calls");
812     }
813 
814     CmdArgs.push_back("-backend-option");
815     CmdArgs.push_back("-arm-strict-align");
816 
817     // The kext linker doesn't know how to deal with movw/movt.
818     CmdArgs.push_back("-backend-option");
819     CmdArgs.push_back("-arm-use-movt=0");
820   }
821 
822   // Setting -mno-global-merge disables the codegen global merge pass. Setting
823   // -mglobal-merge has no effect as the pass is enabled by default.
824   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
825                                options::OPT_mno_global_merge)) {
826     if (A->getOption().matches(options::OPT_mno_global_merge))
827       CmdArgs.push_back("-mno-global-merge");
828   }
829 
830   if (!Args.hasFlag(options::OPT_mimplicit_float,
831                     options::OPT_mno_implicit_float,
832                     true))
833     CmdArgs.push_back("-no-implicit-float");
834 
835   // llvm does not support reserving registers in general. There is support
836   // for reserving r9 on ARM though (defined as a platform-specific register
837   // in ARM EABI).
838   if (Args.hasArg(options::OPT_ffixed_r9)) {
839     CmdArgs.push_back("-backend-option");
840     CmdArgs.push_back("-arm-reserve-r9");
841   }
842 }
843 
844 /// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
845 /// targeting.
getAArch64TargetCPU(const ArgList & Args)846 static std::string getAArch64TargetCPU(const ArgList &Args) {
847   // If we have -mcpu=, use that.
848   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
849     StringRef MCPU = A->getValue();
850     // Handle -mcpu=native.
851     if (MCPU == "native")
852       return llvm::sys::getHostCPUName();
853     else
854       return MCPU;
855   }
856 
857   // At some point, we may need to check -march here, but for now we only
858   // one arm64 architecture.
859 
860   // Make sure we pick "cyclone" if -arch is used.
861   // FIXME: Should this be picked by checking the target triple instead?
862   if (Args.getLastArg(options::OPT_arch))
863     return "cyclone";
864 
865   return "generic";
866 }
867 
AddAArch64TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const868 void Clang::AddAArch64TargetArgs(const ArgList &Args,
869                                  ArgStringList &CmdArgs) const {
870   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
871   llvm::Triple Triple(TripleStr);
872 
873   if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
874       Args.hasArg(options::OPT_mkernel) ||
875       Args.hasArg(options::OPT_fapple_kext))
876     CmdArgs.push_back("-disable-red-zone");
877 
878   if (!Args.hasFlag(options::OPT_mimplicit_float,
879                     options::OPT_mno_implicit_float, true))
880     CmdArgs.push_back("-no-implicit-float");
881 
882   const char *ABIName = nullptr;
883   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
884     ABIName = A->getValue();
885   else if (Triple.isOSDarwin())
886     ABIName = "darwinpcs";
887   else
888     ABIName = "aapcs";
889 
890   CmdArgs.push_back("-target-abi");
891   CmdArgs.push_back(ABIName);
892 
893   CmdArgs.push_back("-target-cpu");
894   CmdArgs.push_back(Args.MakeArgString(getAArch64TargetCPU(Args)));
895 
896   if (Args.hasArg(options::OPT_mstrict_align)) {
897     CmdArgs.push_back("-backend-option");
898     CmdArgs.push_back("-aarch64-strict-align");
899   }
900 
901   // Setting -mno-global-merge disables the codegen global merge pass. Setting
902   // -mglobal-merge has no effect as the pass is enabled by default.
903   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
904                                options::OPT_mno_global_merge)) {
905     if (A->getOption().matches(options::OPT_mno_global_merge))
906       CmdArgs.push_back("-mno-global-merge");
907   }
908 }
909 
910 // Get CPU and ABI names. They are not independent
911 // so we have to calculate them together.
getMipsCPUAndABI(const ArgList & Args,const llvm::Triple & Triple,StringRef & CPUName,StringRef & ABIName)912 static void getMipsCPUAndABI(const ArgList &Args,
913                              const llvm::Triple &Triple,
914                              StringRef &CPUName,
915                              StringRef &ABIName) {
916   const char *DefMips32CPU = "mips32r2";
917   const char *DefMips64CPU = "mips64r2";
918 
919   // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
920   // default for mips64(el)?-img-linux-gnu.
921   if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
922       Triple.getEnvironment() == llvm::Triple::GNU) {
923     DefMips32CPU = "mips32r6";
924     DefMips64CPU = "mips64r6";
925   }
926 
927   if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
928                                options::OPT_mcpu_EQ))
929     CPUName = A->getValue();
930 
931   if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
932     ABIName = A->getValue();
933     // Convert a GNU style Mips ABI name to the name
934     // accepted by LLVM Mips backend.
935     ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
936       .Case("32", "o32")
937       .Case("64", "n64")
938       .Default(ABIName);
939   }
940 
941   // Setup default CPU and ABI names.
942   if (CPUName.empty() && ABIName.empty()) {
943     switch (Triple.getArch()) {
944     default:
945       llvm_unreachable("Unexpected triple arch name");
946     case llvm::Triple::mips:
947     case llvm::Triple::mipsel:
948       CPUName = DefMips32CPU;
949       break;
950     case llvm::Triple::mips64:
951     case llvm::Triple::mips64el:
952       CPUName = DefMips64CPU;
953       break;
954     }
955   }
956 
957   if (ABIName.empty()) {
958     // Deduce ABI name from the target triple.
959     if (Triple.getArch() == llvm::Triple::mips ||
960         Triple.getArch() == llvm::Triple::mipsel)
961       ABIName = "o32";
962     else
963       ABIName = "n64";
964   }
965 
966   if (CPUName.empty()) {
967     // Deduce CPU name from ABI name.
968     CPUName = llvm::StringSwitch<const char *>(ABIName)
969       .Cases("o32", "eabi", DefMips32CPU)
970       .Cases("n32", "n64", DefMips64CPU)
971       .Default("");
972   }
973 }
974 
975 // Convert ABI name to the GNU tools acceptable variant.
getGnuCompatibleMipsABIName(StringRef ABI)976 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
977   return llvm::StringSwitch<llvm::StringRef>(ABI)
978     .Case("o32", "32")
979     .Case("n64", "64")
980     .Default(ABI);
981 }
982 
983 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
984 // and -mfloat-abi=.
getMipsFloatABI(const Driver & D,const ArgList & Args)985 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
986   StringRef FloatABI;
987   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
988                                options::OPT_mhard_float,
989                                options::OPT_mfloat_abi_EQ)) {
990     if (A->getOption().matches(options::OPT_msoft_float))
991       FloatABI = "soft";
992     else if (A->getOption().matches(options::OPT_mhard_float))
993       FloatABI = "hard";
994     else {
995       FloatABI = A->getValue();
996       if (FloatABI != "soft" && FloatABI != "hard") {
997         D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
998         FloatABI = "hard";
999       }
1000     }
1001   }
1002 
1003   // If unspecified, choose the default based on the platform.
1004   if (FloatABI.empty()) {
1005     // Assume "hard", because it's a default value used by gcc.
1006     // When we start to recognize specific target MIPS processors,
1007     // we will be able to select the default more correctly.
1008     FloatABI = "hard";
1009   }
1010 
1011   return FloatABI;
1012 }
1013 
AddTargetFeature(const ArgList & Args,std::vector<const char * > & Features,OptSpecifier OnOpt,OptSpecifier OffOpt,StringRef FeatureName)1014 static void AddTargetFeature(const ArgList &Args,
1015                              std::vector<const char *> &Features,
1016                              OptSpecifier OnOpt, OptSpecifier OffOpt,
1017                              StringRef FeatureName) {
1018   if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
1019     if (A->getOption().matches(OnOpt))
1020       Features.push_back(Args.MakeArgString("+" + FeatureName));
1021     else
1022       Features.push_back(Args.MakeArgString("-" + FeatureName));
1023   }
1024 }
1025 
getMIPSTargetFeatures(const Driver & D,const ArgList & Args,std::vector<const char * > & Features)1026 static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1027                                   std::vector<const char *> &Features) {
1028   StringRef FloatABI = getMipsFloatABI(D, Args);
1029   if (FloatABI == "soft") {
1030     // FIXME: Note, this is a hack. We need to pass the selected float
1031     // mode to the MipsTargetInfoBase to define appropriate macros there.
1032     // Now it is the only method.
1033     Features.push_back("+soft-float");
1034   }
1035 
1036   if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1037     StringRef Val = StringRef(A->getValue());
1038     if (Val == "2008")
1039       Features.push_back("+nan2008");
1040     else if (Val == "legacy")
1041       Features.push_back("-nan2008");
1042     else
1043       D.Diag(diag::err_drv_unsupported_option_argument)
1044           << A->getOption().getName() << Val;
1045   }
1046 
1047   AddTargetFeature(Args, Features, options::OPT_msingle_float,
1048                    options::OPT_mdouble_float, "single-float");
1049   AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1050                    "mips16");
1051   AddTargetFeature(Args, Features, options::OPT_mmicromips,
1052                    options::OPT_mno_micromips, "micromips");
1053   AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1054                    "dsp");
1055   AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1056                    "dspr2");
1057   AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1058                    "msa");
1059   AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1060                    "fp64");
1061   AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1062                    options::OPT_modd_spreg, "nooddspreg");
1063 }
1064 
AddMIPSTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1065 void Clang::AddMIPSTargetArgs(const ArgList &Args,
1066                               ArgStringList &CmdArgs) const {
1067   const Driver &D = getToolChain().getDriver();
1068   StringRef CPUName;
1069   StringRef ABIName;
1070   const llvm::Triple &Triple = getToolChain().getTriple();
1071   getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1072 
1073   CmdArgs.push_back("-target-abi");
1074   CmdArgs.push_back(ABIName.data());
1075 
1076   StringRef FloatABI = getMipsFloatABI(D, Args);
1077 
1078   if (FloatABI == "soft") {
1079     // Floating point operations and argument passing are soft.
1080     CmdArgs.push_back("-msoft-float");
1081     CmdArgs.push_back("-mfloat-abi");
1082     CmdArgs.push_back("soft");
1083   }
1084   else {
1085     // Floating point operations and argument passing are hard.
1086     assert(FloatABI == "hard" && "Invalid float abi!");
1087     CmdArgs.push_back("-mfloat-abi");
1088     CmdArgs.push_back("hard");
1089   }
1090 
1091   if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1092     if (A->getOption().matches(options::OPT_mxgot)) {
1093       CmdArgs.push_back("-mllvm");
1094       CmdArgs.push_back("-mxgot");
1095     }
1096   }
1097 
1098   if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1099                                options::OPT_mno_ldc1_sdc1)) {
1100     if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1101       CmdArgs.push_back("-mllvm");
1102       CmdArgs.push_back("-mno-ldc1-sdc1");
1103     }
1104   }
1105 
1106   if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1107                                options::OPT_mno_check_zero_division)) {
1108     if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1109       CmdArgs.push_back("-mllvm");
1110       CmdArgs.push_back("-mno-check-zero-division");
1111     }
1112   }
1113 
1114   if (Arg *A = Args.getLastArg(options::OPT_G)) {
1115     StringRef v = A->getValue();
1116     CmdArgs.push_back("-mllvm");
1117     CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1118     A->claim();
1119   }
1120 }
1121 
1122 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
getPPCTargetCPU(const ArgList & Args)1123 static std::string getPPCTargetCPU(const ArgList &Args) {
1124   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1125     StringRef CPUName = A->getValue();
1126 
1127     if (CPUName == "native") {
1128       std::string CPU = llvm::sys::getHostCPUName();
1129       if (!CPU.empty() && CPU != "generic")
1130         return CPU;
1131       else
1132         return "";
1133     }
1134 
1135     return llvm::StringSwitch<const char *>(CPUName)
1136       .Case("common", "generic")
1137       .Case("440", "440")
1138       .Case("440fp", "440")
1139       .Case("450", "450")
1140       .Case("601", "601")
1141       .Case("602", "602")
1142       .Case("603", "603")
1143       .Case("603e", "603e")
1144       .Case("603ev", "603ev")
1145       .Case("604", "604")
1146       .Case("604e", "604e")
1147       .Case("620", "620")
1148       .Case("630", "pwr3")
1149       .Case("G3", "g3")
1150       .Case("7400", "7400")
1151       .Case("G4", "g4")
1152       .Case("7450", "7450")
1153       .Case("G4+", "g4+")
1154       .Case("750", "750")
1155       .Case("970", "970")
1156       .Case("G5", "g5")
1157       .Case("a2", "a2")
1158       .Case("a2q", "a2q")
1159       .Case("e500mc", "e500mc")
1160       .Case("e5500", "e5500")
1161       .Case("power3", "pwr3")
1162       .Case("power4", "pwr4")
1163       .Case("power5", "pwr5")
1164       .Case("power5x", "pwr5x")
1165       .Case("power6", "pwr6")
1166       .Case("power6x", "pwr6x")
1167       .Case("power7", "pwr7")
1168       .Case("power8", "pwr8")
1169       .Case("pwr3", "pwr3")
1170       .Case("pwr4", "pwr4")
1171       .Case("pwr5", "pwr5")
1172       .Case("pwr5x", "pwr5x")
1173       .Case("pwr6", "pwr6")
1174       .Case("pwr6x", "pwr6x")
1175       .Case("pwr7", "pwr7")
1176       .Case("pwr8", "pwr8")
1177       .Case("powerpc", "ppc")
1178       .Case("powerpc64", "ppc64")
1179       .Case("powerpc64le", "ppc64le")
1180       .Default("");
1181   }
1182 
1183   return "";
1184 }
1185 
getPPCTargetFeatures(const ArgList & Args,std::vector<const char * > & Features)1186 static void getPPCTargetFeatures(const ArgList &Args,
1187                                  std::vector<const char *> &Features) {
1188   for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1189                     ie = Args.filtered_end();
1190        it != ie; ++it) {
1191     StringRef Name = (*it)->getOption().getName();
1192     (*it)->claim();
1193 
1194     // Skip over "-m".
1195     assert(Name.startswith("m") && "Invalid feature name.");
1196     Name = Name.substr(1);
1197 
1198     bool IsNegative = Name.startswith("no-");
1199     if (IsNegative)
1200       Name = Name.substr(3);
1201 
1202     // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1203     // pass the correct option to the backend while calling the frontend
1204     // option the same.
1205     // TODO: Change the LLVM backend option maybe?
1206     if (Name == "mfcrf")
1207       Name = "mfocrf";
1208 
1209     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1210   }
1211 
1212   // Altivec is a bit weird, allow overriding of the Altivec feature here.
1213   AddTargetFeature(Args, Features, options::OPT_faltivec,
1214                    options::OPT_fno_altivec, "altivec");
1215 }
1216 
1217 /// Get the (LLVM) name of the R600 gpu we are targeting.
getR600TargetGPU(const ArgList & Args)1218 static std::string getR600TargetGPU(const ArgList &Args) {
1219   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1220     const char *GPUName = A->getValue();
1221     return llvm::StringSwitch<const char *>(GPUName)
1222       .Cases("rv630", "rv635", "r600")
1223       .Cases("rv610", "rv620", "rs780", "rs880")
1224       .Case("rv740", "rv770")
1225       .Case("palm", "cedar")
1226       .Cases("sumo", "sumo2", "sumo")
1227       .Case("hemlock", "cypress")
1228       .Case("aruba", "cayman")
1229       .Default(GPUName);
1230   }
1231   return "";
1232 }
1233 
getSparcTargetFeatures(const ArgList & Args,std::vector<const char * > Features)1234 static void getSparcTargetFeatures(const ArgList &Args,
1235                                    std::vector<const char *> Features) {
1236   bool SoftFloatABI = true;
1237   if (Arg *A =
1238           Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1239     if (A->getOption().matches(options::OPT_mhard_float))
1240       SoftFloatABI = false;
1241   }
1242   if (SoftFloatABI)
1243     Features.push_back("+soft-float");
1244 }
1245 
AddSparcTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1246 void Clang::AddSparcTargetArgs(const ArgList &Args,
1247                              ArgStringList &CmdArgs) const {
1248   const Driver &D = getToolChain().getDriver();
1249 
1250   // Select the float ABI as determined by -msoft-float, -mhard-float, and
1251   StringRef FloatABI;
1252   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1253                                options::OPT_mhard_float)) {
1254     if (A->getOption().matches(options::OPT_msoft_float))
1255       FloatABI = "soft";
1256     else if (A->getOption().matches(options::OPT_mhard_float))
1257       FloatABI = "hard";
1258   }
1259 
1260   // If unspecified, choose the default based on the platform.
1261   if (FloatABI.empty()) {
1262     // Assume "soft", but warn the user we are guessing.
1263     FloatABI = "soft";
1264     D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
1265   }
1266 
1267   if (FloatABI == "soft") {
1268     // Floating point operations and argument passing are soft.
1269     //
1270     // FIXME: This changes CPP defines, we need -target-soft-float.
1271     CmdArgs.push_back("-msoft-float");
1272   } else {
1273     assert(FloatABI == "hard" && "Invalid float abi!");
1274     CmdArgs.push_back("-mhard-float");
1275   }
1276 }
1277 
getSystemZTargetCPU(const ArgList & Args)1278 static const char *getSystemZTargetCPU(const ArgList &Args) {
1279   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1280     return A->getValue();
1281   return "z10";
1282 }
1283 
getX86TargetCPU(const ArgList & Args,const llvm::Triple & Triple)1284 static const char *getX86TargetCPU(const ArgList &Args,
1285                                    const llvm::Triple &Triple) {
1286   if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1287     if (StringRef(A->getValue()) != "native") {
1288       if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1289         return "core-avx2";
1290 
1291       return A->getValue();
1292     }
1293 
1294     // FIXME: Reject attempts to use -march=native unless the target matches
1295     // the host.
1296     //
1297     // FIXME: We should also incorporate the detected target features for use
1298     // with -native.
1299     std::string CPU = llvm::sys::getHostCPUName();
1300     if (!CPU.empty() && CPU != "generic")
1301       return Args.MakeArgString(CPU);
1302   }
1303 
1304   // Select the default CPU if none was given (or detection failed).
1305 
1306   if (Triple.getArch() != llvm::Triple::x86_64 &&
1307       Triple.getArch() != llvm::Triple::x86)
1308     return nullptr; // This routine is only handling x86 targets.
1309 
1310   bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1311 
1312   // FIXME: Need target hooks.
1313   if (Triple.isOSDarwin()) {
1314     if (Triple.getArchName() == "x86_64h")
1315       return "core-avx2";
1316     return Is64Bit ? "core2" : "yonah";
1317   }
1318 
1319   // On Android use targets compatible with gcc
1320   if (Triple.getEnvironment() == llvm::Triple::Android)
1321     return Is64Bit ? "x86-64" : "i686";
1322 
1323   // Everything else goes to x86-64 in 64-bit mode.
1324   if (Is64Bit)
1325     return "x86-64";
1326 
1327   switch (Triple.getOS()) {
1328   case llvm::Triple::FreeBSD:
1329   case llvm::Triple::NetBSD:
1330   case llvm::Triple::OpenBSD:
1331     return "i486";
1332   case llvm::Triple::Haiku:
1333     return "i586";
1334   case llvm::Triple::Bitrig:
1335     return "i686";
1336   default:
1337     // Fallback to p4.
1338     return "pentium4";
1339   }
1340 }
1341 
getCPUName(const ArgList & Args,const llvm::Triple & T)1342 static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1343   switch(T.getArch()) {
1344   default:
1345     return "";
1346 
1347   case llvm::Triple::aarch64:
1348   case llvm::Triple::aarch64_be:
1349   case llvm::Triple::arm64:
1350   case llvm::Triple::arm64_be:
1351     return getAArch64TargetCPU(Args);
1352 
1353   case llvm::Triple::arm:
1354   case llvm::Triple::armeb:
1355   case llvm::Triple::thumb:
1356   case llvm::Triple::thumbeb:
1357     return arm::getARMTargetCPU(Args, T);
1358 
1359   case llvm::Triple::mips:
1360   case llvm::Triple::mipsel:
1361   case llvm::Triple::mips64:
1362   case llvm::Triple::mips64el: {
1363     StringRef CPUName;
1364     StringRef ABIName;
1365     getMipsCPUAndABI(Args, T, CPUName, ABIName);
1366     return CPUName;
1367   }
1368 
1369   case llvm::Triple::ppc:
1370   case llvm::Triple::ppc64:
1371   case llvm::Triple::ppc64le: {
1372     std::string TargetCPUName = getPPCTargetCPU(Args);
1373     // LLVM may default to generating code for the native CPU,
1374     // but, like gcc, we default to a more generic option for
1375     // each architecture. (except on Darwin)
1376     if (TargetCPUName.empty() && !T.isOSDarwin()) {
1377       if (T.getArch() == llvm::Triple::ppc64)
1378         TargetCPUName = "ppc64";
1379       else if (T.getArch() == llvm::Triple::ppc64le)
1380         TargetCPUName = "ppc64le";
1381       else
1382         TargetCPUName = "ppc";
1383     }
1384     return TargetCPUName;
1385   }
1386 
1387   case llvm::Triple::sparc:
1388   case llvm::Triple::sparcv9:
1389     if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1390       return A->getValue();
1391     return "";
1392 
1393   case llvm::Triple::x86:
1394   case llvm::Triple::x86_64:
1395     return getX86TargetCPU(Args, T);
1396 
1397   case llvm::Triple::hexagon:
1398     return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1399 
1400   case llvm::Triple::systemz:
1401     return getSystemZTargetCPU(Args);
1402 
1403   case llvm::Triple::r600:
1404     return getR600TargetGPU(Args);
1405   }
1406 }
1407 
AddGoldPlugin(const ToolChain & ToolChain,const ArgList & Args,ArgStringList & CmdArgs)1408 static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1409                           ArgStringList &CmdArgs) {
1410   // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1411   // as gold requires -plugin to come before any -plugin-opt that -Wl might
1412   // forward.
1413   CmdArgs.push_back("-plugin");
1414   std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1415   CmdArgs.push_back(Args.MakeArgString(Plugin));
1416 
1417   // Try to pass driver level flags relevant to LTO code generation down to
1418   // the plugin.
1419 
1420   // Handle flags for selecting CPU variants.
1421   std::string CPU = getCPUName(Args, ToolChain.getTriple());
1422   if (!CPU.empty())
1423     CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1424 }
1425 
getX86TargetFeatures(const llvm::Triple & Triple,const ArgList & Args,std::vector<const char * > & Features)1426 static void getX86TargetFeatures(const llvm::Triple &Triple,
1427                                  const ArgList &Args,
1428                                  std::vector<const char *> &Features) {
1429   if (Triple.getArchName() == "x86_64h") {
1430     // x86_64h implies quite a few of the more modern subtarget features
1431     // for Haswell class CPUs, but not all of them. Opt-out of a few.
1432     Features.push_back("-rdrnd");
1433     Features.push_back("-aes");
1434     Features.push_back("-pclmul");
1435     Features.push_back("-rtm");
1436     Features.push_back("-hle");
1437     Features.push_back("-fsgsbase");
1438   }
1439 
1440   // Add features to comply with gcc on Android
1441   if (Triple.getEnvironment() == llvm::Triple::Android) {
1442     if (Triple.getArch() == llvm::Triple::x86_64) {
1443       Features.push_back("+sse4.2");
1444       Features.push_back("+popcnt");
1445     } else
1446       Features.push_back("+ssse3");
1447   }
1448 
1449   // Now add any that the user explicitly requested on the command line,
1450   // which may override the defaults.
1451   for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1452                     ie = Args.filtered_end();
1453        it != ie; ++it) {
1454     StringRef Name = (*it)->getOption().getName();
1455     (*it)->claim();
1456 
1457     // Skip over "-m".
1458     assert(Name.startswith("m") && "Invalid feature name.");
1459     Name = Name.substr(1);
1460 
1461     bool IsNegative = Name.startswith("no-");
1462     if (IsNegative)
1463       Name = Name.substr(3);
1464 
1465     Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1466   }
1467 }
1468 
AddX86TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1469 void Clang::AddX86TargetArgs(const ArgList &Args,
1470                              ArgStringList &CmdArgs) const {
1471   if (!Args.hasFlag(options::OPT_mred_zone,
1472                     options::OPT_mno_red_zone,
1473                     true) ||
1474       Args.hasArg(options::OPT_mkernel) ||
1475       Args.hasArg(options::OPT_fapple_kext))
1476     CmdArgs.push_back("-disable-red-zone");
1477 
1478   // Default to avoid implicit floating-point for kernel/kext code, but allow
1479   // that to be overridden with -mno-soft-float.
1480   bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1481                           Args.hasArg(options::OPT_fapple_kext));
1482   if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1483                                options::OPT_mno_soft_float,
1484                                options::OPT_mimplicit_float,
1485                                options::OPT_mno_implicit_float)) {
1486     const Option &O = A->getOption();
1487     NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1488                        O.matches(options::OPT_msoft_float));
1489   }
1490   if (NoImplicitFloat)
1491     CmdArgs.push_back("-no-implicit-float");
1492 
1493   if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1494     StringRef Value = A->getValue();
1495     if (Value == "intel" || Value == "att") {
1496       CmdArgs.push_back("-mllvm");
1497       CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1498     } else {
1499       getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1500           << A->getOption().getName() << Value;
1501     }
1502   }
1503 }
1504 
HasPICArg(const ArgList & Args)1505 static inline bool HasPICArg(const ArgList &Args) {
1506   return Args.hasArg(options::OPT_fPIC)
1507     || Args.hasArg(options::OPT_fpic);
1508 }
1509 
GetLastSmallDataThresholdArg(const ArgList & Args)1510 static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1511   return Args.getLastArg(options::OPT_G,
1512                          options::OPT_G_EQ,
1513                          options::OPT_msmall_data_threshold_EQ);
1514 }
1515 
GetHexagonSmallDataThresholdValue(const ArgList & Args)1516 static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1517   std::string value;
1518   if (HasPICArg(Args))
1519     value = "0";
1520   else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1521     value = A->getValue();
1522     A->claim();
1523   }
1524   return value;
1525 }
1526 
AddHexagonTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1527 void Clang::AddHexagonTargetArgs(const ArgList &Args,
1528                                  ArgStringList &CmdArgs) const {
1529   CmdArgs.push_back("-fno-signed-char");
1530   CmdArgs.push_back("-mqdsp6-compat");
1531   CmdArgs.push_back("-Wreturn-type");
1532 
1533   std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1534   if (!SmallDataThreshold.empty()) {
1535     CmdArgs.push_back ("-mllvm");
1536     CmdArgs.push_back(Args.MakeArgString(
1537                         "-hexagon-small-data-threshold=" + SmallDataThreshold));
1538   }
1539 
1540   if (!Args.hasArg(options::OPT_fno_short_enums))
1541     CmdArgs.push_back("-fshort-enums");
1542   if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1543     CmdArgs.push_back ("-mllvm");
1544     CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1545   }
1546   CmdArgs.push_back ("-mllvm");
1547   CmdArgs.push_back ("-machine-sink-split=0");
1548 }
1549 
getAArch64TargetFeatures(const Driver & D,const ArgList & Args,std::vector<const char * > & Features)1550 static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1551                                      std::vector<const char *> &Features) {
1552   // Honor -mfpu=.
1553   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
1554     getAArch64FPUFeatures(D, A, Args, Features);
1555   else
1556     Features.push_back("+neon");
1557 
1558   if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1559     Features.push_back("-fp-armv8");
1560     Features.push_back("-crypto");
1561     Features.push_back("-neon");
1562   }
1563 
1564   // En/disable crc
1565   if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1566                                options::OPT_mnocrc)) {
1567     if (A->getOption().matches(options::OPT_mcrc))
1568       Features.push_back("+crc");
1569     else
1570       Features.push_back("-crc");
1571   }
1572 }
1573 
getTargetFeatures(const Driver & D,const llvm::Triple & Triple,const ArgList & Args,ArgStringList & CmdArgs,bool ForAS)1574 static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1575                               const ArgList &Args, ArgStringList &CmdArgs,
1576                               bool ForAS) {
1577   std::vector<const char *> Features;
1578   switch (Triple.getArch()) {
1579   default:
1580     break;
1581   case llvm::Triple::mips:
1582   case llvm::Triple::mipsel:
1583   case llvm::Triple::mips64:
1584   case llvm::Triple::mips64el:
1585     getMIPSTargetFeatures(D, Args, Features);
1586     break;
1587 
1588   case llvm::Triple::arm:
1589   case llvm::Triple::armeb:
1590   case llvm::Triple::thumb:
1591   case llvm::Triple::thumbeb:
1592     getARMTargetFeatures(D, Triple, Args, Features, ForAS);
1593     break;
1594 
1595   case llvm::Triple::ppc:
1596   case llvm::Triple::ppc64:
1597   case llvm::Triple::ppc64le:
1598     getPPCTargetFeatures(Args, Features);
1599     break;
1600   case llvm::Triple::sparc:
1601     getSparcTargetFeatures(Args, Features);
1602     break;
1603   case llvm::Triple::aarch64:
1604   case llvm::Triple::aarch64_be:
1605   case llvm::Triple::arm64:
1606   case llvm::Triple::arm64_be:
1607     getAArch64TargetFeatures(D, Args, Features);
1608     break;
1609   case llvm::Triple::x86:
1610   case llvm::Triple::x86_64:
1611     getX86TargetFeatures(Triple, Args, Features);
1612     break;
1613   }
1614 
1615   // Find the last of each feature.
1616   llvm::StringMap<unsigned> LastOpt;
1617   for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1618     const char *Name = Features[I];
1619     assert(Name[0] == '-' || Name[0] == '+');
1620     LastOpt[Name + 1] = I;
1621   }
1622 
1623   for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1624     // If this feature was overridden, ignore it.
1625     const char *Name = Features[I];
1626     llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1627     assert(LastI != LastOpt.end());
1628     unsigned Last = LastI->second;
1629     if (Last != I)
1630       continue;
1631 
1632     CmdArgs.push_back("-target-feature");
1633     CmdArgs.push_back(Name);
1634   }
1635 }
1636 
1637 static bool
shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime & runtime,const llvm::Triple & Triple)1638 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1639                                           const llvm::Triple &Triple) {
1640   // We use the zero-cost exception tables for Objective-C if the non-fragile
1641   // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1642   // later.
1643   if (runtime.isNonFragile())
1644     return true;
1645 
1646   if (!Triple.isMacOSX())
1647     return false;
1648 
1649   return (!Triple.isMacOSXVersionLT(10,5) &&
1650           (Triple.getArch() == llvm::Triple::x86_64 ||
1651            Triple.getArch() == llvm::Triple::arm));
1652 }
1653 
1654 namespace {
1655   struct ExceptionSettings {
1656     bool ExceptionsEnabled;
1657     bool ShouldUseExceptionTables;
ExceptionSettings__anonebe874ec0111::ExceptionSettings1658     ExceptionSettings() : ExceptionsEnabled(false),
1659                           ShouldUseExceptionTables(false) {}
1660   };
1661 } // end anonymous namespace.
1662 
1663 // exceptionSettings() exists to share the logic between -cc1 and linker
1664 // invocations.
exceptionSettings(const ArgList & Args,const llvm::Triple & Triple)1665 static ExceptionSettings exceptionSettings(const ArgList &Args,
1666                                            const llvm::Triple &Triple) {
1667   ExceptionSettings ES;
1668 
1669   // Are exceptions enabled by default?
1670   ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1671 
1672   // This keeps track of whether exceptions were explicitly turned on or off.
1673   bool DidHaveExplicitExceptionFlag = false;
1674 
1675   if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1676                                options::OPT_fno_exceptions)) {
1677     if (A->getOption().matches(options::OPT_fexceptions))
1678       ES.ExceptionsEnabled = true;
1679     else
1680       ES.ExceptionsEnabled = false;
1681 
1682     DidHaveExplicitExceptionFlag = true;
1683   }
1684 
1685   // Exception tables and cleanups can be enabled with -fexceptions even if the
1686   // language itself doesn't support exceptions.
1687   if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1688     ES.ShouldUseExceptionTables = true;
1689 
1690   return ES;
1691 }
1692 
1693 /// addExceptionArgs - Adds exception related arguments to the driver command
1694 /// arguments. There's a master flag, -fexceptions and also language specific
1695 /// flags to enable/disable C++ and Objective-C exceptions.
1696 /// This makes it possible to for example disable C++ exceptions but enable
1697 /// Objective-C exceptions.
addExceptionArgs(const ArgList & Args,types::ID InputType,const llvm::Triple & Triple,bool KernelOrKext,const ObjCRuntime & objcRuntime,ArgStringList & CmdArgs)1698 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1699                              const llvm::Triple &Triple,
1700                              bool KernelOrKext,
1701                              const ObjCRuntime &objcRuntime,
1702                              ArgStringList &CmdArgs) {
1703   if (KernelOrKext) {
1704     // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1705     // arguments now to avoid warnings about unused arguments.
1706     Args.ClaimAllArgs(options::OPT_fexceptions);
1707     Args.ClaimAllArgs(options::OPT_fno_exceptions);
1708     Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1709     Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1710     Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1711     Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
1712     return;
1713   }
1714 
1715    // Gather the exception settings from the command line arguments.
1716    ExceptionSettings ES = exceptionSettings(Args, Triple);
1717 
1718   // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1719   // is not necessarily sensible, but follows GCC.
1720   if (types::isObjC(InputType) &&
1721       Args.hasFlag(options::OPT_fobjc_exceptions,
1722                    options::OPT_fno_objc_exceptions,
1723                    true)) {
1724     CmdArgs.push_back("-fobjc-exceptions");
1725 
1726     ES.ShouldUseExceptionTables |=
1727       shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
1728   }
1729 
1730   if (types::isCXX(InputType)) {
1731     bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
1732 
1733     if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1734                                  options::OPT_fno_cxx_exceptions,
1735                                  options::OPT_fexceptions,
1736                                  options::OPT_fno_exceptions)) {
1737       if (A->getOption().matches(options::OPT_fcxx_exceptions))
1738         CXXExceptionsEnabled = true;
1739       else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
1740         CXXExceptionsEnabled = false;
1741     }
1742 
1743     if (CXXExceptionsEnabled) {
1744       CmdArgs.push_back("-fcxx-exceptions");
1745 
1746       ES.ShouldUseExceptionTables = true;
1747     }
1748   }
1749 
1750   if (ES.ShouldUseExceptionTables)
1751     CmdArgs.push_back("-fexceptions");
1752 }
1753 
ShouldDisableAutolink(const ArgList & Args,const ToolChain & TC)1754 static bool ShouldDisableAutolink(const ArgList &Args,
1755                              const ToolChain &TC) {
1756   bool Default = true;
1757   if (TC.getTriple().isOSDarwin()) {
1758     // The native darwin assembler doesn't support the linker_option directives,
1759     // so we disable them if we think the .s file will be passed to it.
1760     Default = TC.useIntegratedAs();
1761   }
1762   return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1763                        Default);
1764 }
1765 
ShouldDisableDwarfDirectory(const ArgList & Args,const ToolChain & TC)1766 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1767                                         const ToolChain &TC) {
1768   bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1769                                         options::OPT_fno_dwarf_directory_asm,
1770                                         TC.useIntegratedAs());
1771   return !UseDwarfDirectory;
1772 }
1773 
1774 /// \brief Check whether the given input tree contains any compilation actions.
ContainsCompileAction(const Action * A)1775 static bool ContainsCompileAction(const Action *A) {
1776   if (isa<CompileJobAction>(A))
1777     return true;
1778 
1779   for (const auto &Act : *A)
1780     if (ContainsCompileAction(Act))
1781       return true;
1782 
1783   return false;
1784 }
1785 
1786 /// \brief Check if -relax-all should be passed to the internal assembler.
1787 /// This is done by default when compiling non-assembler source with -O0.
UseRelaxAll(Compilation & C,const ArgList & Args)1788 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1789   bool RelaxDefault = true;
1790 
1791   if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1792     RelaxDefault = A->getOption().matches(options::OPT_O0);
1793 
1794   if (RelaxDefault) {
1795     RelaxDefault = false;
1796     for (const auto &Act : C.getActions()) {
1797       if (ContainsCompileAction(Act)) {
1798         RelaxDefault = true;
1799         break;
1800       }
1801     }
1802   }
1803 
1804   return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1805     RelaxDefault);
1806 }
1807 
CollectArgsForIntegratedAssembler(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs,const Driver & D)1808 static void CollectArgsForIntegratedAssembler(Compilation &C,
1809                                               const ArgList &Args,
1810                                               ArgStringList &CmdArgs,
1811                                               const Driver &D) {
1812     if (UseRelaxAll(C, Args))
1813       CmdArgs.push_back("-mrelax-all");
1814 
1815     // When passing -I arguments to the assembler we sometimes need to
1816     // unconditionally take the next argument.  For example, when parsing
1817     // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1818     // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1819     // arg after parsing the '-I' arg.
1820     bool TakeNextArg = false;
1821 
1822     // When using an integrated assembler, translate -Wa, and -Xassembler
1823     // options.
1824     bool CompressDebugSections = false;
1825     for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1826                                                options::OPT_Xassembler),
1827            ie = Args.filtered_end(); it != ie; ++it) {
1828       const Arg *A = *it;
1829       A->claim();
1830 
1831       for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1832         StringRef Value = A->getValue(i);
1833         if (TakeNextArg) {
1834           CmdArgs.push_back(Value.data());
1835           TakeNextArg = false;
1836           continue;
1837         }
1838 
1839         if (Value == "-force_cpusubtype_ALL") {
1840           // Do nothing, this is the default and we don't support anything else.
1841         } else if (Value == "-L") {
1842           CmdArgs.push_back("-msave-temp-labels");
1843         } else if (Value == "--fatal-warnings") {
1844           CmdArgs.push_back("-mllvm");
1845           CmdArgs.push_back("-fatal-assembler-warnings");
1846         } else if (Value == "--noexecstack") {
1847           CmdArgs.push_back("-mnoexecstack");
1848         } else if (Value == "-compress-debug-sections" ||
1849                    Value == "--compress-debug-sections") {
1850           CompressDebugSections = true;
1851         } else if (Value == "-nocompress-debug-sections" ||
1852                    Value == "--nocompress-debug-sections") {
1853           CompressDebugSections = false;
1854         } else if (Value.startswith("-I")) {
1855           CmdArgs.push_back(Value.data());
1856           // We need to consume the next argument if the current arg is a plain
1857           // -I. The next arg will be the include directory.
1858           if (Value == "-I")
1859             TakeNextArg = true;
1860         } else if (Value.startswith("-gdwarf-")) {
1861           CmdArgs.push_back(Value.data());
1862         } else {
1863           D.Diag(diag::err_drv_unsupported_option_argument)
1864             << A->getOption().getName() << Value;
1865         }
1866       }
1867     }
1868     if (CompressDebugSections) {
1869       if (llvm::zlib::isAvailable())
1870         CmdArgs.push_back("-compress-debug-sections");
1871       else
1872         D.Diag(diag::warn_debug_compression_unavailable);
1873     }
1874 }
1875 
1876 // Until ARM libraries are build separately, we have them all in one library
getArchNameForCompilerRTLib(const ToolChain & TC)1877 static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
1878   if (TC.getArch() == llvm::Triple::arm ||
1879       TC.getArch() == llvm::Triple::armeb)
1880     return "arm";
1881   else
1882     return TC.getArchName();
1883 }
1884 
getCompilerRTLibDir(const ToolChain & TC)1885 static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1886   // The runtimes are located in the OS-specific resource directory.
1887   SmallString<128> Res(TC.getDriver().ResourceDir);
1888   const llvm::Triple &Triple = TC.getTriple();
1889   // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1890   StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1891     "freebsd" : TC.getOS();
1892   llvm::sys::path::append(Res, "lib", OSLibName);
1893   return Res;
1894 }
1895 
1896 // This adds the static libclang_rt.builtins-arch.a directly to the command line
1897 // FIXME: Make sure we can also emit shared objects if they're requested
1898 // and available, check for possible errors, etc.
addClangRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)1899 static void addClangRTLinux(
1900     const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1901   SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
1902   llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
1903                                           getArchNameForCompilerRTLib(TC) +
1904                                           ".a");
1905 
1906   CmdArgs.push_back(Args.MakeArgString(LibClangRT));
1907   CmdArgs.push_back("-lgcc_s");
1908   if (TC.getDriver().CCCIsCXX())
1909     CmdArgs.push_back("-lgcc_eh");
1910 }
1911 
addProfileRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)1912 static void addProfileRT(
1913     const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1914   if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1915         Args.hasArg(options::OPT_fprofile_generate) ||
1916         Args.hasArg(options::OPT_fprofile_instr_generate) ||
1917         Args.hasArg(options::OPT_fcreate_profile) ||
1918         Args.hasArg(options::OPT_coverage)))
1919     return;
1920 
1921   // -fprofile-instr-generate requires position-independent code to build with
1922   // shared objects.  Link against the right archive.
1923   const char *Lib = "libclang_rt.profile-";
1924   if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
1925       Args.hasArg(options::OPT_shared))
1926     Lib = "libclang_rt.profile-pic-";
1927 
1928   SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1929   llvm::sys::path::append(LibProfile,
1930       Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
1931 
1932   CmdArgs.push_back(Args.MakeArgString(LibProfile));
1933 }
1934 
getSanitizerRTLibName(const ToolChain & TC,const StringRef Sanitizer,bool Shared)1935 static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
1936                                               const StringRef Sanitizer,
1937                                               bool Shared) {
1938   // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
1939   // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
1940   const char *EnvSuffix =
1941     TC.getTriple().getEnvironment() == llvm::Triple::Android ?  "-android" : "";
1942   SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1943   llvm::sys::path::append(LibSanitizer,
1944                           Twine("libclang_rt.") + Sanitizer + "-" +
1945                               getArchNameForCompilerRTLib(TC) + EnvSuffix +
1946                               (Shared ? ".so" : ".a"));
1947   return LibSanitizer;
1948 }
1949 
addSanitizerRTLinkFlags(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,const StringRef Sanitizer,bool BeforeLibStdCXX,bool ExportSymbols=true,bool LinkDeps=true)1950 static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
1951                                     ArgStringList &CmdArgs,
1952                                     const StringRef Sanitizer,
1953                                     bool BeforeLibStdCXX,
1954                                     bool ExportSymbols = true,
1955                                     bool LinkDeps = true) {
1956   SmallString<128> LibSanitizer =
1957       getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
1958 
1959   // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1960   // etc.) so that the linker picks custom versions of the global 'operator
1961   // new' and 'operator delete' symbols. We take the extreme (but simple)
1962   // strategy of inserting it at the front of the link command. It also
1963   // needs to be forced to end up in the executable, so wrap it in
1964   // whole-archive.
1965   SmallVector<const char *, 3> LibSanitizerArgs;
1966   LibSanitizerArgs.push_back("-whole-archive");
1967   LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1968   LibSanitizerArgs.push_back("-no-whole-archive");
1969 
1970   CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1971                  LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1972 
1973   if (LinkDeps) {
1974     // Link sanitizer dependencies explicitly
1975     CmdArgs.push_back("-lpthread");
1976     CmdArgs.push_back("-lrt");
1977     CmdArgs.push_back("-lm");
1978     // There's no libdl on FreeBSD.
1979     if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1980       CmdArgs.push_back("-ldl");
1981   }
1982 
1983   // If possible, use a dynamic symbols file to export the symbols from the
1984   // runtime library. If we can't do so, use -export-dynamic instead to export
1985   // all symbols from the binary.
1986   if (ExportSymbols) {
1987     if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1988       CmdArgs.push_back(
1989           Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1990     else
1991       CmdArgs.push_back("-export-dynamic");
1992   }
1993 }
1994 
1995 /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1996 /// This needs to be called before we add the C run-time (malloc, etc).
addAsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,bool Shared,bool IsCXX)1997 static void addAsanRT(const ToolChain &TC, const ArgList &Args,
1998                       ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
1999   if (Shared) {
2000     // Link dynamic runtime if necessary.
2001     SmallString<128> LibSanitizer =
2002         getSanitizerRTLibName(TC, "asan", Shared);
2003     CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
2004   }
2005 
2006   // Do not link static runtime to DSOs or if compiling for Android.
2007   if (Args.hasArg(options::OPT_shared) ||
2008       (TC.getTriple().getEnvironment() == llvm::Triple::Android))
2009     return;
2010 
2011   if (Shared) {
2012     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2013                             /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2014                             /*LinkDeps*/ false);
2015   } else {
2016     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2017     if (IsCXX)
2018       addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2019   }
2020 }
2021 
2022 /// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2023 /// This needs to be called before we add the C run-time (malloc, etc).
addTsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2024 static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2025                       ArgStringList &CmdArgs) {
2026   if (!Args.hasArg(options::OPT_shared))
2027     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
2028 }
2029 
2030 /// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2031 /// This needs to be called before we add the C run-time (malloc, etc).
addMsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2032 static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2033                       ArgStringList &CmdArgs) {
2034   if (!Args.hasArg(options::OPT_shared))
2035     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
2036 }
2037 
2038 /// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2039 /// This needs to be called before we add the C run-time (malloc, etc).
addLsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2040 static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2041                       ArgStringList &CmdArgs) {
2042   if (!Args.hasArg(options::OPT_shared))
2043     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
2044 }
2045 
2046 /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2047 /// (Linux).
addUbsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,bool IsCXX,bool HasOtherSanitizerRt)2048 static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2049                        ArgStringList &CmdArgs, bool IsCXX,
2050                        bool HasOtherSanitizerRt) {
2051   // Do not link runtime into shared libraries.
2052   if (Args.hasArg(options::OPT_shared))
2053     return;
2054 
2055   // Need a copy of sanitizer_common. This could come from another sanitizer
2056   // runtime; if we're not including one, include our own copy.
2057   if (!HasOtherSanitizerRt)
2058     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
2059 
2060   addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true);
2061 
2062   // Only include the bits of the runtime which need a C++ ABI library if
2063   // we're linking in C++ mode.
2064   if (IsCXX)
2065     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true);
2066 }
2067 
addDfsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2068 static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2069                        ArgStringList &CmdArgs) {
2070   if (!Args.hasArg(options::OPT_shared))
2071     addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2072 }
2073 
2074 // Should be called before we add C++ ABI library.
addSanitizerRuntimes(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2075 static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2076                                  ArgStringList &CmdArgs) {
2077   const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2078   const Driver &D = TC.getDriver();
2079   if (Sanitize.needsUbsanRt())
2080     addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2081                     Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2082                     Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2083   if (Sanitize.needsAsanRt())
2084     addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());
2085   if (Sanitize.needsTsanRt())
2086     addTsanRT(TC, Args, CmdArgs);
2087   if (Sanitize.needsMsanRt())
2088     addMsanRT(TC, Args, CmdArgs);
2089   if (Sanitize.needsLsanRt())
2090     addLsanRT(TC, Args, CmdArgs);
2091   if (Sanitize.needsDfsanRt())
2092     addDfsanRT(TC, Args, CmdArgs);
2093 }
2094 
shouldUseFramePointerForTarget(const ArgList & Args,const llvm::Triple & Triple)2095 static bool shouldUseFramePointerForTarget(const ArgList &Args,
2096                                            const llvm::Triple &Triple) {
2097   switch (Triple.getArch()) {
2098   // Don't use a frame pointer on linux if optimizing for certain targets.
2099   case llvm::Triple::mips64:
2100   case llvm::Triple::mips64el:
2101   case llvm::Triple::mips:
2102   case llvm::Triple::mipsel:
2103   case llvm::Triple::systemz:
2104   case llvm::Triple::x86:
2105   case llvm::Triple::x86_64:
2106     if (Triple.isOSLinux())
2107       if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2108         if (!A->getOption().matches(options::OPT_O0))
2109           return false;
2110     return true;
2111   case llvm::Triple::xcore:
2112     return false;
2113   default:
2114     return true;
2115   }
2116 }
2117 
shouldUseFramePointer(const ArgList & Args,const llvm::Triple & Triple)2118 static bool shouldUseFramePointer(const ArgList &Args,
2119                                   const llvm::Triple &Triple) {
2120   if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2121                                options::OPT_fomit_frame_pointer))
2122     return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2123 
2124   return shouldUseFramePointerForTarget(Args, Triple);
2125 }
2126 
shouldUseLeafFramePointer(const ArgList & Args,const llvm::Triple & Triple)2127 static bool shouldUseLeafFramePointer(const ArgList &Args,
2128                                       const llvm::Triple &Triple) {
2129   if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2130                                options::OPT_momit_leaf_frame_pointer))
2131     return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2132 
2133   return shouldUseFramePointerForTarget(Args, Triple);
2134 }
2135 
2136 /// Add a CC1 option to specify the debug compilation directory.
addDebugCompDirArg(const ArgList & Args,ArgStringList & CmdArgs)2137 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
2138   SmallString<128> cwd;
2139   if (!llvm::sys::fs::current_path(cwd)) {
2140     CmdArgs.push_back("-fdebug-compilation-dir");
2141     CmdArgs.push_back(Args.MakeArgString(cwd));
2142   }
2143 }
2144 
SplitDebugName(const ArgList & Args,const InputInfoList & Inputs)2145 static const char *SplitDebugName(const ArgList &Args,
2146                                   const InputInfoList &Inputs) {
2147   Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2148   if (FinalOutput && Args.hasArg(options::OPT_c)) {
2149     SmallString<128> T(FinalOutput->getValue());
2150     llvm::sys::path::replace_extension(T, "dwo");
2151     return Args.MakeArgString(T);
2152   } else {
2153     // Use the compilation dir.
2154     SmallString<128> T(
2155         Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
2156     SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2157     llvm::sys::path::replace_extension(F, "dwo");
2158     T += F;
2159     return Args.MakeArgString(F);
2160   }
2161 }
2162 
SplitDebugInfo(const ToolChain & TC,Compilation & C,const Tool & T,const JobAction & JA,const ArgList & Args,const InputInfo & Output,const char * OutFile)2163 static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2164                            const Tool &T, const JobAction &JA,
2165                            const ArgList &Args, const InputInfo &Output,
2166                            const char *OutFile) {
2167   ArgStringList ExtractArgs;
2168   ExtractArgs.push_back("--extract-dwo");
2169 
2170   ArgStringList StripArgs;
2171   StripArgs.push_back("--strip-dwo");
2172 
2173   // Grabbing the output of the earlier compile step.
2174   StripArgs.push_back(Output.getFilename());
2175   ExtractArgs.push_back(Output.getFilename());
2176   ExtractArgs.push_back(OutFile);
2177 
2178   const char *Exec =
2179     Args.MakeArgString(TC.GetProgramPath("objcopy"));
2180 
2181   // First extract the dwo sections.
2182   C.addCommand(new Command(JA, T, Exec, ExtractArgs));
2183 
2184   // Then remove them from the original .o file.
2185   C.addCommand(new Command(JA, T, Exec, StripArgs));
2186 }
2187 
2188 /// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2189 /// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
shouldEnableVectorizerAtOLevel(const ArgList & Args,bool isSlpVec)2190 static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
2191   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2192     if (A->getOption().matches(options::OPT_O4) ||
2193         A->getOption().matches(options::OPT_Ofast))
2194       return true;
2195 
2196     if (A->getOption().matches(options::OPT_O0))
2197       return false;
2198 
2199     assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2200 
2201     // Vectorize -Os.
2202     StringRef S(A->getValue());
2203     if (S == "s")
2204       return true;
2205 
2206     // Don't vectorize -Oz, unless it's the slp vectorizer.
2207     if (S == "z")
2208       return isSlpVec;
2209 
2210     unsigned OptLevel = 0;
2211     if (S.getAsInteger(10, OptLevel))
2212       return false;
2213 
2214     return OptLevel > 1;
2215   }
2216 
2217   return false;
2218 }
2219 
2220 /// Add -x lang to \p CmdArgs for \p Input.
addDashXForInput(const ArgList & Args,const InputInfo & Input,ArgStringList & CmdArgs)2221 static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2222                              ArgStringList &CmdArgs) {
2223   // When using -verify-pch, we don't want to provide the type
2224   // 'precompiled-header' if it was inferred from the file extension
2225   if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2226     return;
2227 
2228   CmdArgs.push_back("-x");
2229   if (Args.hasArg(options::OPT_rewrite_objc))
2230     CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2231   else
2232     CmdArgs.push_back(types::getTypeName(Input.getType()));
2233 }
2234 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const2235 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
2236                          const InputInfo &Output,
2237                          const InputInfoList &Inputs,
2238                          const ArgList &Args,
2239                          const char *LinkingOutput) const {
2240   bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2241                                   options::OPT_fapple_kext);
2242   const Driver &D = getToolChain().getDriver();
2243   ArgStringList CmdArgs;
2244 
2245   bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
2246   bool IsWindowsCygnus =
2247       getToolChain().getTriple().isWindowsCygwinEnvironment();
2248   bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2249 
2250   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2251 
2252   // Invoke ourselves in -cc1 mode.
2253   //
2254   // FIXME: Implement custom jobs for internal actions.
2255   CmdArgs.push_back("-cc1");
2256 
2257   // Add the "effective" target triple.
2258   CmdArgs.push_back("-triple");
2259   std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2260   CmdArgs.push_back(Args.MakeArgString(TripleStr));
2261 
2262   const llvm::Triple TT(TripleStr);
2263   if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2264                            TT.getArch() == llvm::Triple::thumb)) {
2265     unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2266     unsigned Version;
2267     TT.getArchName().substr(Offset).getAsInteger(10, Version);
2268     if (Version < 7)
2269       D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2270                                                 << TripleStr;
2271   }
2272 
2273   // Push all default warning arguments that are specific to
2274   // the given target.  These come before user provided warning options
2275   // are provided.
2276   getToolChain().addClangWarningOptions(CmdArgs);
2277 
2278   // Select the appropriate action.
2279   RewriteKind rewriteKind = RK_None;
2280 
2281   if (isa<AnalyzeJobAction>(JA)) {
2282     assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2283     CmdArgs.push_back("-analyze");
2284   } else if (isa<MigrateJobAction>(JA)) {
2285     CmdArgs.push_back("-migrate");
2286   } else if (isa<PreprocessJobAction>(JA)) {
2287     if (Output.getType() == types::TY_Dependencies)
2288       CmdArgs.push_back("-Eonly");
2289     else {
2290       CmdArgs.push_back("-E");
2291       if (Args.hasArg(options::OPT_rewrite_objc) &&
2292           !Args.hasArg(options::OPT_g_Group))
2293         CmdArgs.push_back("-P");
2294     }
2295   } else if (isa<AssembleJobAction>(JA)) {
2296     CmdArgs.push_back("-emit-obj");
2297 
2298     CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
2299 
2300     // Also ignore explicit -force_cpusubtype_ALL option.
2301     (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
2302   } else if (isa<PrecompileJobAction>(JA)) {
2303     // Use PCH if the user requested it.
2304     bool UsePCH = D.CCCUsePCH;
2305 
2306     if (JA.getType() == types::TY_Nothing)
2307       CmdArgs.push_back("-fsyntax-only");
2308     else if (UsePCH)
2309       CmdArgs.push_back("-emit-pch");
2310     else
2311       CmdArgs.push_back("-emit-pth");
2312   } else if (isa<VerifyPCHJobAction>(JA)) {
2313     CmdArgs.push_back("-verify-pch");
2314   } else {
2315     assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
2316 
2317     if (JA.getType() == types::TY_Nothing) {
2318       CmdArgs.push_back("-fsyntax-only");
2319     } else if (JA.getType() == types::TY_LLVM_IR ||
2320                JA.getType() == types::TY_LTO_IR) {
2321       CmdArgs.push_back("-emit-llvm");
2322     } else if (JA.getType() == types::TY_LLVM_BC ||
2323                JA.getType() == types::TY_LTO_BC) {
2324       CmdArgs.push_back("-emit-llvm-bc");
2325     } else if (JA.getType() == types::TY_PP_Asm) {
2326       CmdArgs.push_back("-S");
2327     } else if (JA.getType() == types::TY_AST) {
2328       CmdArgs.push_back("-emit-pch");
2329     } else if (JA.getType() == types::TY_ModuleFile) {
2330       CmdArgs.push_back("-module-file-info");
2331     } else if (JA.getType() == types::TY_RewrittenObjC) {
2332       CmdArgs.push_back("-rewrite-objc");
2333       rewriteKind = RK_NonFragile;
2334     } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2335       CmdArgs.push_back("-rewrite-objc");
2336       rewriteKind = RK_Fragile;
2337     } else {
2338       assert(JA.getType() == types::TY_PP_Asm &&
2339              "Unexpected output type!");
2340     }
2341   }
2342 
2343   // We normally speed up the clang process a bit by skipping destructors at
2344   // exit, but when we're generating diagnostics we can rely on some of the
2345   // cleanup.
2346   if (!C.isForDiagnostics())
2347     CmdArgs.push_back("-disable-free");
2348 
2349   // Disable the verification pass in -asserts builds.
2350 #ifdef NDEBUG
2351   CmdArgs.push_back("-disable-llvm-verifier");
2352 #endif
2353 
2354   // Set the main file name, so that debug info works even with
2355   // -save-temps.
2356   CmdArgs.push_back("-main-file-name");
2357   CmdArgs.push_back(getBaseInputName(Args, Inputs));
2358 
2359   // Some flags which affect the language (via preprocessor
2360   // defines).
2361   if (Args.hasArg(options::OPT_static))
2362     CmdArgs.push_back("-static-define");
2363 
2364   if (isa<AnalyzeJobAction>(JA)) {
2365     // Enable region store model by default.
2366     CmdArgs.push_back("-analyzer-store=region");
2367 
2368     // Treat blocks as analysis entry points.
2369     CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2370 
2371     CmdArgs.push_back("-analyzer-eagerly-assume");
2372 
2373     // Add default argument set.
2374     if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
2375       CmdArgs.push_back("-analyzer-checker=core");
2376 
2377       if (!IsWindowsMSVC)
2378         CmdArgs.push_back("-analyzer-checker=unix");
2379 
2380       if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
2381         CmdArgs.push_back("-analyzer-checker=osx");
2382 
2383       CmdArgs.push_back("-analyzer-checker=deadcode");
2384 
2385       if (types::isCXX(Inputs[0].getType()))
2386         CmdArgs.push_back("-analyzer-checker=cplusplus");
2387 
2388       // Enable the following experimental checkers for testing.
2389       CmdArgs.push_back(
2390           "-analyzer-checker=security.insecureAPI.UncheckedReturn");
2391       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2392       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2393       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2394       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2395       CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
2396     }
2397 
2398     // Set the output format. The default is plist, for (lame) historical
2399     // reasons.
2400     CmdArgs.push_back("-analyzer-output");
2401     if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
2402       CmdArgs.push_back(A->getValue());
2403     else
2404       CmdArgs.push_back("plist");
2405 
2406     // Disable the presentation of standard compiler warnings when
2407     // using --analyze.  We only want to show static analyzer diagnostics
2408     // or frontend errors.
2409     CmdArgs.push_back("-w");
2410 
2411     // Add -Xanalyzer arguments when running as analyzer.
2412     Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
2413   }
2414 
2415   CheckCodeGenerationOptions(D, Args);
2416 
2417   bool PIE = getToolChain().isPIEDefault();
2418   bool PIC = PIE || getToolChain().isPICDefault();
2419   bool IsPICLevelTwo = PIC;
2420 
2421   // Android-specific defaults for PIC/PIE
2422   if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2423     switch (getToolChain().getTriple().getArch()) {
2424     case llvm::Triple::arm:
2425     case llvm::Triple::armeb:
2426     case llvm::Triple::thumb:
2427     case llvm::Triple::thumbeb:
2428     case llvm::Triple::aarch64:
2429     case llvm::Triple::arm64:
2430     case llvm::Triple::mips:
2431     case llvm::Triple::mipsel:
2432     case llvm::Triple::mips64:
2433     case llvm::Triple::mips64el:
2434       PIC = true; // "-fpic"
2435       break;
2436 
2437     case llvm::Triple::x86:
2438     case llvm::Triple::x86_64:
2439       PIC = true; // "-fPIC"
2440       IsPICLevelTwo = true;
2441       break;
2442 
2443     default:
2444       break;
2445     }
2446   }
2447 
2448   // OpenBSD-specific defaults for PIE
2449   if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2450     switch (getToolChain().getTriple().getArch()) {
2451     case llvm::Triple::mips64:
2452     case llvm::Triple::mips64el:
2453     case llvm::Triple::sparc:
2454     case llvm::Triple::x86:
2455     case llvm::Triple::x86_64:
2456       IsPICLevelTwo = false; // "-fpie"
2457       break;
2458 
2459     case llvm::Triple::ppc:
2460     case llvm::Triple::sparcv9:
2461       IsPICLevelTwo = true; // "-fPIE"
2462       break;
2463 
2464     default:
2465       break;
2466     }
2467   }
2468 
2469   // For the PIC and PIE flag options, this logic is different from the
2470   // legacy logic in very old versions of GCC, as that logic was just
2471   // a bug no one had ever fixed. This logic is both more rational and
2472   // consistent with GCC's new logic now that the bugs are fixed. The last
2473   // argument relating to either PIC or PIE wins, and no other argument is
2474   // used. If the last argument is any flavor of the '-fno-...' arguments,
2475   // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2476   // at the same level.
2477   Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2478                                  options::OPT_fpic, options::OPT_fno_pic,
2479                                  options::OPT_fPIE, options::OPT_fno_PIE,
2480                                  options::OPT_fpie, options::OPT_fno_pie);
2481   // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2482   // is forced, then neither PIC nor PIE flags will have no effect.
2483   if (!getToolChain().isPICDefaultForced()) {
2484     if (LastPICArg) {
2485       Option O = LastPICArg->getOption();
2486       if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2487           O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2488         PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2489         PIC = PIE || O.matches(options::OPT_fPIC) ||
2490               O.matches(options::OPT_fpic);
2491         IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2492                         O.matches(options::OPT_fPIC);
2493       } else {
2494         PIE = PIC = false;
2495       }
2496     }
2497   }
2498 
2499   // Introduce a Darwin-specific hack. If the default is PIC but the flags
2500   // specified while enabling PIC enabled level 1 PIC, just force it back to
2501   // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2502   // informal testing).
2503   if (PIC && getToolChain().getTriple().isOSDarwin())
2504     IsPICLevelTwo |= getToolChain().isPICDefault();
2505 
2506   // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2507   // PIC or PIE options above, if these show up, PIC is disabled.
2508   llvm::Triple Triple(TripleStr);
2509   if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
2510                        Triple.getArch() == llvm::Triple::arm64 ||
2511                        Triple.getArch() == llvm::Triple::aarch64))
2512     PIC = PIE = false;
2513   if (Args.hasArg(options::OPT_static))
2514     PIC = PIE = false;
2515 
2516   if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2517     // This is a very special mode. It trumps the other modes, almost no one
2518     // uses it, and it isn't even valid on any OS but Darwin.
2519     if (!getToolChain().getTriple().isOSDarwin())
2520       D.Diag(diag::err_drv_unsupported_opt_for_target)
2521         << A->getSpelling() << getToolChain().getTriple().str();
2522 
2523     // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2524 
2525     CmdArgs.push_back("-mrelocation-model");
2526     CmdArgs.push_back("dynamic-no-pic");
2527 
2528     // Only a forced PIC mode can cause the actual compile to have PIC defines
2529     // etc., no flags are sufficient. This behavior was selected to closely
2530     // match that of llvm-gcc and Apple GCC before that.
2531     if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2532       CmdArgs.push_back("-pic-level");
2533       CmdArgs.push_back("2");
2534     }
2535   } else {
2536     // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2537     // handled in Clang's IRGen by the -pie-level flag.
2538     CmdArgs.push_back("-mrelocation-model");
2539     CmdArgs.push_back(PIC ? "pic" : "static");
2540 
2541     if (PIC) {
2542       CmdArgs.push_back("-pic-level");
2543       CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2544       if (PIE) {
2545         CmdArgs.push_back("-pie-level");
2546         CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2547       }
2548     }
2549   }
2550 
2551   if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2552                     options::OPT_fno_merge_all_constants))
2553     CmdArgs.push_back("-fno-merge-all-constants");
2554 
2555   // LLVM Code Generator Options.
2556 
2557   if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2558     StringRef v = A->getValue();
2559     CmdArgs.push_back("-mllvm");
2560     CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2561     A->claim();
2562   }
2563 
2564   if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2565     CmdArgs.push_back("-mregparm");
2566     CmdArgs.push_back(A->getValue());
2567   }
2568 
2569   if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2570                                options::OPT_freg_struct_return)) {
2571     if (getToolChain().getArch() != llvm::Triple::x86) {
2572       D.Diag(diag::err_drv_unsupported_opt_for_target)
2573         << A->getSpelling() << getToolChain().getTriple().str();
2574     } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2575       CmdArgs.push_back("-fpcc-struct-return");
2576     } else {
2577       assert(A->getOption().matches(options::OPT_freg_struct_return));
2578       CmdArgs.push_back("-freg-struct-return");
2579     }
2580   }
2581 
2582   if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2583     CmdArgs.push_back("-mrtd");
2584 
2585   if (shouldUseFramePointer(Args, getToolChain().getTriple()))
2586     CmdArgs.push_back("-mdisable-fp-elim");
2587   if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2588                     options::OPT_fno_zero_initialized_in_bss))
2589     CmdArgs.push_back("-mno-zero-initialized-in-bss");
2590 
2591   bool OFastEnabled = isOptimizationLevelFast(Args);
2592   // If -Ofast is the optimization level, then -fstrict-aliasing should be
2593   // enabled.  This alias option is being used to simplify the hasFlag logic.
2594   OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2595     options::OPT_fstrict_aliasing;
2596   // We turn strict aliasing off by default if we're in CL mode, since MSVC
2597   // doesn't do any TBAA.
2598   bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
2599   if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
2600                     options::OPT_fno_strict_aliasing, TBAAOnByDefault))
2601     CmdArgs.push_back("-relaxed-aliasing");
2602   if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2603                     options::OPT_fno_struct_path_tbaa))
2604     CmdArgs.push_back("-no-struct-path-tbaa");
2605   if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2606                    false))
2607     CmdArgs.push_back("-fstrict-enums");
2608   if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2609                     options::OPT_fno_optimize_sibling_calls))
2610     CmdArgs.push_back("-mdisable-tail-calls");
2611 
2612   // Handle segmented stacks.
2613   if (Args.hasArg(options::OPT_fsplit_stack))
2614     CmdArgs.push_back("-split-stacks");
2615 
2616   // If -Ofast is the optimization level, then -ffast-math should be enabled.
2617   // This alias option is being used to simplify the getLastArg logic.
2618   OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2619     options::OPT_ffast_math;
2620 
2621   // Handle various floating point optimization flags, mapping them to the
2622   // appropriate LLVM code generation flags. The pattern for all of these is to
2623   // default off the codegen optimizations, and if any flag enables them and no
2624   // flag disables them after the flag enabling them, enable the codegen
2625   // optimization. This is complicated by several "umbrella" flags.
2626   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2627                                options::OPT_fno_fast_math,
2628                                options::OPT_ffinite_math_only,
2629                                options::OPT_fno_finite_math_only,
2630                                options::OPT_fhonor_infinities,
2631                                options::OPT_fno_honor_infinities))
2632     if (A->getOption().getID() != options::OPT_fno_fast_math &&
2633         A->getOption().getID() != options::OPT_fno_finite_math_only &&
2634         A->getOption().getID() != options::OPT_fhonor_infinities)
2635       CmdArgs.push_back("-menable-no-infs");
2636   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2637                                options::OPT_fno_fast_math,
2638                                options::OPT_ffinite_math_only,
2639                                options::OPT_fno_finite_math_only,
2640                                options::OPT_fhonor_nans,
2641                                options::OPT_fno_honor_nans))
2642     if (A->getOption().getID() != options::OPT_fno_fast_math &&
2643         A->getOption().getID() != options::OPT_fno_finite_math_only &&
2644         A->getOption().getID() != options::OPT_fhonor_nans)
2645       CmdArgs.push_back("-menable-no-nans");
2646 
2647   // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2648   bool MathErrno = getToolChain().IsMathErrnoDefault();
2649   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2650                                options::OPT_fno_fast_math,
2651                                options::OPT_fmath_errno,
2652                                options::OPT_fno_math_errno)) {
2653     // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2654     // However, turning *off* -ffast_math merely restores the toolchain default
2655     // (which may be false).
2656     if (A->getOption().getID() == options::OPT_fno_math_errno ||
2657         A->getOption().getID() == options::OPT_ffast_math ||
2658         A->getOption().getID() == options::OPT_Ofast)
2659       MathErrno = false;
2660     else if (A->getOption().getID() == options::OPT_fmath_errno)
2661       MathErrno = true;
2662   }
2663   if (MathErrno)
2664     CmdArgs.push_back("-fmath-errno");
2665 
2666   // There are several flags which require disabling very specific
2667   // optimizations. Any of these being disabled forces us to turn off the
2668   // entire set of LLVM optimizations, so collect them through all the flag
2669   // madness.
2670   bool AssociativeMath = false;
2671   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2672                                options::OPT_fno_fast_math,
2673                                options::OPT_funsafe_math_optimizations,
2674                                options::OPT_fno_unsafe_math_optimizations,
2675                                options::OPT_fassociative_math,
2676                                options::OPT_fno_associative_math))
2677     if (A->getOption().getID() != options::OPT_fno_fast_math &&
2678         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2679         A->getOption().getID() != options::OPT_fno_associative_math)
2680       AssociativeMath = true;
2681   bool ReciprocalMath = false;
2682   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2683                                options::OPT_fno_fast_math,
2684                                options::OPT_funsafe_math_optimizations,
2685                                options::OPT_fno_unsafe_math_optimizations,
2686                                options::OPT_freciprocal_math,
2687                                options::OPT_fno_reciprocal_math))
2688     if (A->getOption().getID() != options::OPT_fno_fast_math &&
2689         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2690         A->getOption().getID() != options::OPT_fno_reciprocal_math)
2691       ReciprocalMath = true;
2692   bool SignedZeros = true;
2693   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2694                                options::OPT_fno_fast_math,
2695                                options::OPT_funsafe_math_optimizations,
2696                                options::OPT_fno_unsafe_math_optimizations,
2697                                options::OPT_fsigned_zeros,
2698                                options::OPT_fno_signed_zeros))
2699     if (A->getOption().getID() != options::OPT_fno_fast_math &&
2700         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2701         A->getOption().getID() != options::OPT_fsigned_zeros)
2702       SignedZeros = false;
2703   bool TrappingMath = true;
2704   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2705                                options::OPT_fno_fast_math,
2706                                options::OPT_funsafe_math_optimizations,
2707                                options::OPT_fno_unsafe_math_optimizations,
2708                                options::OPT_ftrapping_math,
2709                                options::OPT_fno_trapping_math))
2710     if (A->getOption().getID() != options::OPT_fno_fast_math &&
2711         A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2712         A->getOption().getID() != options::OPT_ftrapping_math)
2713       TrappingMath = false;
2714   if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2715       !TrappingMath)
2716     CmdArgs.push_back("-menable-unsafe-fp-math");
2717 
2718 
2719   // Validate and pass through -fp-contract option.
2720   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2721                                options::OPT_fno_fast_math,
2722                                options::OPT_ffp_contract)) {
2723     if (A->getOption().getID() == options::OPT_ffp_contract) {
2724       StringRef Val = A->getValue();
2725       if (Val == "fast" || Val == "on" || Val == "off") {
2726         CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2727       } else {
2728         D.Diag(diag::err_drv_unsupported_option_argument)
2729           << A->getOption().getName() << Val;
2730       }
2731     } else if (A->getOption().matches(options::OPT_ffast_math) ||
2732                (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
2733       // If fast-math is set then set the fp-contract mode to fast.
2734       CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2735     }
2736   }
2737 
2738   // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2739   // and if we find them, tell the frontend to provide the appropriate
2740   // preprocessor macros. This is distinct from enabling any optimizations as
2741   // these options induce language changes which must survive serialization
2742   // and deserialization, etc.
2743   if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2744                                options::OPT_fno_fast_math))
2745       if (!A->getOption().matches(options::OPT_fno_fast_math))
2746         CmdArgs.push_back("-ffast-math");
2747   if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2748                                options::OPT_fno_fast_math))
2749     if (A->getOption().matches(options::OPT_ffinite_math_only))
2750       CmdArgs.push_back("-ffinite-math-only");
2751 
2752   // Decide whether to use verbose asm. Verbose assembly is the default on
2753   // toolchains which have the integrated assembler on by default.
2754   bool IsIntegratedAssemblerDefault =
2755       getToolChain().IsIntegratedAssemblerDefault();
2756   if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
2757                    IsIntegratedAssemblerDefault) ||
2758       Args.hasArg(options::OPT_dA))
2759     CmdArgs.push_back("-masm-verbose");
2760 
2761   if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
2762                     IsIntegratedAssemblerDefault))
2763     CmdArgs.push_back("-no-integrated-as");
2764 
2765   if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2766     CmdArgs.push_back("-mdebug-pass");
2767     CmdArgs.push_back("Structure");
2768   }
2769   if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2770     CmdArgs.push_back("-mdebug-pass");
2771     CmdArgs.push_back("Arguments");
2772   }
2773 
2774   // Enable -mconstructor-aliases except on darwin, where we have to
2775   // work around a linker bug;  see <rdar://problem/7651567>.
2776   if (!getToolChain().getTriple().isOSDarwin())
2777     CmdArgs.push_back("-mconstructor-aliases");
2778 
2779   // Darwin's kernel doesn't support guard variables; just die if we
2780   // try to use them.
2781   if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
2782     CmdArgs.push_back("-fforbid-guard-variables");
2783 
2784   if (Args.hasArg(options::OPT_mms_bitfields)) {
2785     CmdArgs.push_back("-mms-bitfields");
2786   }
2787 
2788   // This is a coarse approximation of what llvm-gcc actually does, both
2789   // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2790   // complicated ways.
2791   bool AsynchronousUnwindTables =
2792       Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2793                    options::OPT_fno_asynchronous_unwind_tables,
2794                    (getToolChain().IsUnwindTablesDefault() ||
2795                     getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2796                        !KernelOrKext);
2797   if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2798                    AsynchronousUnwindTables))
2799     CmdArgs.push_back("-munwind-tables");
2800 
2801   getToolChain().addClangTargetOptions(Args, CmdArgs);
2802 
2803   if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2804     CmdArgs.push_back("-mlimit-float-precision");
2805     CmdArgs.push_back(A->getValue());
2806   }
2807 
2808   // FIXME: Handle -mtune=.
2809   (void) Args.hasArg(options::OPT_mtune_EQ);
2810 
2811   if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2812     CmdArgs.push_back("-mcode-model");
2813     CmdArgs.push_back(A->getValue());
2814   }
2815 
2816   // Add the target cpu
2817   std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2818   llvm::Triple ETriple(ETripleStr);
2819   std::string CPU = getCPUName(Args, ETriple);
2820   if (!CPU.empty()) {
2821     CmdArgs.push_back("-target-cpu");
2822     CmdArgs.push_back(Args.MakeArgString(CPU));
2823   }
2824 
2825   if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2826     CmdArgs.push_back("-mfpmath");
2827     CmdArgs.push_back(A->getValue());
2828   }
2829 
2830   // Add the target features
2831   getTargetFeatures(D, ETriple, Args, CmdArgs, false);
2832 
2833   // Add target specific flags.
2834   switch(getToolChain().getArch()) {
2835   default:
2836     break;
2837 
2838   case llvm::Triple::arm:
2839   case llvm::Triple::armeb:
2840   case llvm::Triple::thumb:
2841   case llvm::Triple::thumbeb:
2842     AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2843     break;
2844 
2845   case llvm::Triple::aarch64:
2846   case llvm::Triple::aarch64_be:
2847   case llvm::Triple::arm64:
2848   case llvm::Triple::arm64_be:
2849     AddAArch64TargetArgs(Args, CmdArgs);
2850     break;
2851 
2852   case llvm::Triple::mips:
2853   case llvm::Triple::mipsel:
2854   case llvm::Triple::mips64:
2855   case llvm::Triple::mips64el:
2856     AddMIPSTargetArgs(Args, CmdArgs);
2857     break;
2858 
2859   case llvm::Triple::sparc:
2860     AddSparcTargetArgs(Args, CmdArgs);
2861     break;
2862 
2863   case llvm::Triple::x86:
2864   case llvm::Triple::x86_64:
2865     AddX86TargetArgs(Args, CmdArgs);
2866     break;
2867 
2868   case llvm::Triple::hexagon:
2869     AddHexagonTargetArgs(Args, CmdArgs);
2870     break;
2871   }
2872 
2873   // Add clang-cl arguments.
2874   if (getToolChain().getDriver().IsCLMode())
2875     AddClangCLArgs(Args, CmdArgs);
2876 
2877   // Pass the linker version in use.
2878   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2879     CmdArgs.push_back("-target-linker-version");
2880     CmdArgs.push_back(A->getValue());
2881   }
2882 
2883   if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
2884     CmdArgs.push_back("-momit-leaf-frame-pointer");
2885 
2886   // Explicitly error on some things we know we don't support and can't just
2887   // ignore.
2888   types::ID InputType = Inputs[0].getType();
2889   if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2890     Arg *Unsupported;
2891     if (types::isCXX(InputType) &&
2892         getToolChain().getTriple().isOSDarwin() &&
2893         getToolChain().getArch() == llvm::Triple::x86) {
2894       if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2895           (Unsupported = Args.getLastArg(options::OPT_mkernel)))
2896         D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
2897           << Unsupported->getOption().getName();
2898     }
2899   }
2900 
2901   Args.AddAllArgs(CmdArgs, options::OPT_v);
2902   Args.AddLastArg(CmdArgs, options::OPT_H);
2903   if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
2904     CmdArgs.push_back("-header-include-file");
2905     CmdArgs.push_back(D.CCPrintHeadersFilename ?
2906                       D.CCPrintHeadersFilename : "-");
2907   }
2908   Args.AddLastArg(CmdArgs, options::OPT_P);
2909   Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
2910 
2911   if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2912     CmdArgs.push_back("-diagnostic-log-file");
2913     CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2914                       D.CCLogDiagnosticsFilename : "-");
2915   }
2916 
2917   // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2918   // are preserved, all other debug options are substituted with "-g".
2919   Args.ClaimAllArgs(options::OPT_g_Group);
2920   if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2921     if (A->getOption().matches(options::OPT_gline_tables_only)) {
2922       // FIXME: we should support specifying dwarf version with
2923       // -gline-tables-only.
2924       CmdArgs.push_back("-gline-tables-only");
2925       // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2926       const llvm::Triple &Triple = getToolChain().getTriple();
2927       if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2928           Triple.getOS() == llvm::Triple::FreeBSD)
2929         CmdArgs.push_back("-gdwarf-2");
2930     } else if (A->getOption().matches(options::OPT_gdwarf_2))
2931       CmdArgs.push_back("-gdwarf-2");
2932     else if (A->getOption().matches(options::OPT_gdwarf_3))
2933       CmdArgs.push_back("-gdwarf-3");
2934     else if (A->getOption().matches(options::OPT_gdwarf_4))
2935       CmdArgs.push_back("-gdwarf-4");
2936     else if (!A->getOption().matches(options::OPT_g0) &&
2937              !A->getOption().matches(options::OPT_ggdb0)) {
2938       // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2939       const llvm::Triple &Triple = getToolChain().getTriple();
2940       if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2941           Triple.getOS() == llvm::Triple::FreeBSD)
2942         CmdArgs.push_back("-gdwarf-2");
2943       else
2944         CmdArgs.push_back("-g");
2945     }
2946   }
2947 
2948   // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2949   Args.ClaimAllArgs(options::OPT_g_flags_Group);
2950   if (Args.hasArg(options::OPT_gcolumn_info))
2951     CmdArgs.push_back("-dwarf-column-info");
2952 
2953   // FIXME: Move backend command line options to the module.
2954   // -gsplit-dwarf should turn on -g and enable the backend dwarf
2955   // splitting and extraction.
2956   // FIXME: Currently only works on Linux.
2957   if (getToolChain().getTriple().isOSLinux() &&
2958       Args.hasArg(options::OPT_gsplit_dwarf)) {
2959     CmdArgs.push_back("-g");
2960     CmdArgs.push_back("-backend-option");
2961     CmdArgs.push_back("-split-dwarf=Enable");
2962   }
2963 
2964   // -ggnu-pubnames turns on gnu style pubnames in the backend.
2965   if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2966     CmdArgs.push_back("-backend-option");
2967     CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2968   }
2969 
2970   // -gdwarf-aranges turns on the emission of the aranges section in the
2971   // backend.
2972   if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2973     CmdArgs.push_back("-backend-option");
2974     CmdArgs.push_back("-generate-arange-section");
2975   }
2976 
2977   if (Args.hasFlag(options::OPT_fdebug_types_section,
2978                    options::OPT_fno_debug_types_section, false)) {
2979     CmdArgs.push_back("-backend-option");
2980     CmdArgs.push_back("-generate-type-units");
2981   }
2982 
2983   if (Args.hasFlag(options::OPT_ffunction_sections,
2984                    options::OPT_fno_function_sections, false)) {
2985     CmdArgs.push_back("-ffunction-sections");
2986   }
2987 
2988   if (Args.hasFlag(options::OPT_fdata_sections,
2989                    options::OPT_fno_data_sections, false)) {
2990     CmdArgs.push_back("-fdata-sections");
2991   }
2992 
2993   Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2994 
2995   if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2996       (Args.hasArg(options::OPT_fprofile_instr_use) ||
2997        Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2998     D.Diag(diag::err_drv_argument_not_allowed_with)
2999       << "-fprofile-instr-generate" << "-fprofile-instr-use";
3000 
3001   Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3002 
3003   if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3004     A->render(Args, CmdArgs);
3005   else if (Args.hasArg(options::OPT_fprofile_instr_use))
3006     CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3007 
3008   if (Args.hasArg(options::OPT_ftest_coverage) ||
3009       Args.hasArg(options::OPT_coverage))
3010     CmdArgs.push_back("-femit-coverage-notes");
3011   if (Args.hasArg(options::OPT_fprofile_arcs) ||
3012       Args.hasArg(options::OPT_coverage))
3013     CmdArgs.push_back("-femit-coverage-data");
3014 
3015   if (C.getArgs().hasArg(options::OPT_c) ||
3016       C.getArgs().hasArg(options::OPT_S)) {
3017     if (Output.isFilename()) {
3018       CmdArgs.push_back("-coverage-file");
3019       SmallString<128> CoverageFilename(Output.getFilename());
3020       if (llvm::sys::path::is_relative(CoverageFilename.str())) {
3021         SmallString<128> Pwd;
3022         if (!llvm::sys::fs::current_path(Pwd)) {
3023           llvm::sys::path::append(Pwd, CoverageFilename.str());
3024           CoverageFilename.swap(Pwd);
3025         }
3026       }
3027       CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3028     }
3029   }
3030 
3031   // Pass options for controlling the default header search paths.
3032   if (Args.hasArg(options::OPT_nostdinc)) {
3033     CmdArgs.push_back("-nostdsysteminc");
3034     CmdArgs.push_back("-nobuiltininc");
3035   } else {
3036     if (Args.hasArg(options::OPT_nostdlibinc))
3037         CmdArgs.push_back("-nostdsysteminc");
3038     Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3039     Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3040   }
3041 
3042   // Pass the path to compiler resource files.
3043   CmdArgs.push_back("-resource-dir");
3044   CmdArgs.push_back(D.ResourceDir.c_str());
3045 
3046   Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3047 
3048   bool ARCMTEnabled = false;
3049   if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
3050     if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
3051                                        options::OPT_ccc_arcmt_modify,
3052                                        options::OPT_ccc_arcmt_migrate)) {
3053       ARCMTEnabled = true;
3054       switch (A->getOption().getID()) {
3055       default:
3056         llvm_unreachable("missed a case");
3057       case options::OPT_ccc_arcmt_check:
3058         CmdArgs.push_back("-arcmt-check");
3059         break;
3060       case options::OPT_ccc_arcmt_modify:
3061         CmdArgs.push_back("-arcmt-modify");
3062         break;
3063       case options::OPT_ccc_arcmt_migrate:
3064         CmdArgs.push_back("-arcmt-migrate");
3065         CmdArgs.push_back("-mt-migrate-directory");
3066         CmdArgs.push_back(A->getValue());
3067 
3068         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3069         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
3070         break;
3071       }
3072     }
3073   } else {
3074     Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3075     Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3076     Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
3077   }
3078 
3079   if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3080     if (ARCMTEnabled) {
3081       D.Diag(diag::err_drv_argument_not_allowed_with)
3082         << A->getAsString(Args) << "-ccc-arcmt-migrate";
3083     }
3084     CmdArgs.push_back("-mt-migrate-directory");
3085     CmdArgs.push_back(A->getValue());
3086 
3087     if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
3088                      options::OPT_objcmt_migrate_subscripting,
3089                      options::OPT_objcmt_migrate_property)) {
3090       // None specified, means enable them all.
3091       CmdArgs.push_back("-objcmt-migrate-literals");
3092       CmdArgs.push_back("-objcmt-migrate-subscripting");
3093       CmdArgs.push_back("-objcmt-migrate-property");
3094     } else {
3095       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3096       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3097       Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3098     }
3099   } else {
3100     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3101     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3102     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3103     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3104     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3105     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3106     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3107     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3108     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3109     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3110     Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3111     Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3112     Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
3113     Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
3114     Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
3115   }
3116 
3117   // Add preprocessing options like -I, -D, etc. if we are using the
3118   // preprocessor.
3119   //
3120   // FIXME: Support -fpreprocessed
3121   if (types::getPreprocessedType(InputType) != types::TY_INVALID)
3122     AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
3123 
3124   // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3125   // that "The compiler can only warn and ignore the option if not recognized".
3126   // When building with ccache, it will pass -D options to clang even on
3127   // preprocessed inputs and configure concludes that -fPIC is not supported.
3128   Args.ClaimAllArgs(options::OPT_D);
3129 
3130   // Manually translate -O4 to -O3; let clang reject others.
3131   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3132     if (A->getOption().matches(options::OPT_O4)) {
3133       CmdArgs.push_back("-O3");
3134       D.Diag(diag::warn_O4_is_O3);
3135     } else {
3136       A->render(Args, CmdArgs);
3137     }
3138   }
3139 
3140   // Don't warn about unused -flto.  This can happen when we're preprocessing or
3141   // precompiling.
3142   Args.ClaimAllArgs(options::OPT_flto);
3143 
3144   Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
3145   if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3146     CmdArgs.push_back("-pedantic");
3147   Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
3148   Args.AddLastArg(CmdArgs, options::OPT_w);
3149 
3150   // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
3151   // (-ansi is equivalent to -std=c89 or -std=c++98).
3152   //
3153   // If a std is supplied, only add -trigraphs if it follows the
3154   // option.
3155   if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3156     if (Std->getOption().matches(options::OPT_ansi))
3157       if (types::isCXX(InputType))
3158         CmdArgs.push_back("-std=c++98");
3159       else
3160         CmdArgs.push_back("-std=c89");
3161     else
3162       Std->render(Args, CmdArgs);
3163 
3164     if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3165                                  options::OPT_trigraphs))
3166       if (A != Std)
3167         A->render(Args, CmdArgs);
3168   } else {
3169     // Honor -std-default.
3170     //
3171     // FIXME: Clang doesn't correctly handle -std= when the input language
3172     // doesn't match. For the time being just ignore this for C++ inputs;
3173     // eventually we want to do all the standard defaulting here instead of
3174     // splitting it between the driver and clang -cc1.
3175     if (!types::isCXX(InputType))
3176       Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3177                                 "-std=", /*Joined=*/true);
3178     else if (IsWindowsMSVC)
3179       CmdArgs.push_back("-std=c++11");
3180 
3181     Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
3182   }
3183 
3184   // GCC's behavior for -Wwrite-strings is a bit strange:
3185   //  * In C, this "warning flag" changes the types of string literals from
3186   //    'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3187   //    for the discarded qualifier.
3188   //  * In C++, this is just a normal warning flag.
3189   //
3190   // Implementing this warning correctly in C is hard, so we follow GCC's
3191   // behavior for now. FIXME: Directly diagnose uses of a string literal as
3192   // a non-const char* in C, rather than using this crude hack.
3193   if (!types::isCXX(InputType)) {
3194     // FIXME: This should behave just like a warning flag, and thus should also
3195     // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3196     Arg *WriteStrings =
3197         Args.getLastArg(options::OPT_Wwrite_strings,
3198                         options::OPT_Wno_write_strings, options::OPT_w);
3199     if (WriteStrings &&
3200         WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
3201       CmdArgs.push_back("-fconst-strings");
3202   }
3203 
3204   // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
3205   // during C++ compilation, which it is by default. GCC keeps this define even
3206   // in the presence of '-w', match this behavior bug-for-bug.
3207   if (types::isCXX(InputType) &&
3208       Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3209                    true)) {
3210     CmdArgs.push_back("-fdeprecated-macro");
3211   }
3212 
3213   // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3214   if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3215     if (Asm->getOption().matches(options::OPT_fasm))
3216       CmdArgs.push_back("-fgnu-keywords");
3217     else
3218       CmdArgs.push_back("-fno-gnu-keywords");
3219   }
3220 
3221   if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3222     CmdArgs.push_back("-fno-dwarf-directory-asm");
3223 
3224   if (ShouldDisableAutolink(Args, getToolChain()))
3225     CmdArgs.push_back("-fno-autolink");
3226 
3227   // Add in -fdebug-compilation-dir if necessary.
3228   addDebugCompDirArg(Args, CmdArgs);
3229 
3230   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3231                                options::OPT_ftemplate_depth_EQ)) {
3232     CmdArgs.push_back("-ftemplate-depth");
3233     CmdArgs.push_back(A->getValue());
3234   }
3235 
3236   if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3237     CmdArgs.push_back("-foperator-arrow-depth");
3238     CmdArgs.push_back(A->getValue());
3239   }
3240 
3241   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3242     CmdArgs.push_back("-fconstexpr-depth");
3243     CmdArgs.push_back(A->getValue());
3244   }
3245 
3246   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3247     CmdArgs.push_back("-fconstexpr-steps");
3248     CmdArgs.push_back(A->getValue());
3249   }
3250 
3251   if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3252     CmdArgs.push_back("-fbracket-depth");
3253     CmdArgs.push_back(A->getValue());
3254   }
3255 
3256   if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3257                                options::OPT_Wlarge_by_value_copy_def)) {
3258     if (A->getNumValues()) {
3259       StringRef bytes = A->getValue();
3260       CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3261     } else
3262       CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
3263   }
3264 
3265 
3266   if (Args.hasArg(options::OPT_relocatable_pch))
3267     CmdArgs.push_back("-relocatable-pch");
3268 
3269   if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3270     CmdArgs.push_back("-fconstant-string-class");
3271     CmdArgs.push_back(A->getValue());
3272   }
3273 
3274   if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3275     CmdArgs.push_back("-ftabstop");
3276     CmdArgs.push_back(A->getValue());
3277   }
3278 
3279   CmdArgs.push_back("-ferror-limit");
3280   if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
3281     CmdArgs.push_back(A->getValue());
3282   else
3283     CmdArgs.push_back("19");
3284 
3285   if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3286     CmdArgs.push_back("-fmacro-backtrace-limit");
3287     CmdArgs.push_back(A->getValue());
3288   }
3289 
3290   if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3291     CmdArgs.push_back("-ftemplate-backtrace-limit");
3292     CmdArgs.push_back(A->getValue());
3293   }
3294 
3295   if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3296     CmdArgs.push_back("-fconstexpr-backtrace-limit");
3297     CmdArgs.push_back(A->getValue());
3298   }
3299 
3300   // Pass -fmessage-length=.
3301   CmdArgs.push_back("-fmessage-length");
3302   if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
3303     CmdArgs.push_back(A->getValue());
3304   } else {
3305     // If -fmessage-length=N was not specified, determine whether this is a
3306     // terminal and, if so, implicitly define -fmessage-length appropriately.
3307     unsigned N = llvm::sys::Process::StandardErrColumns();
3308     CmdArgs.push_back(Args.MakeArgString(Twine(N)));
3309   }
3310 
3311   // -fvisibility= and -fvisibility-ms-compat are of a piece.
3312   if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3313                                      options::OPT_fvisibility_ms_compat)) {
3314     if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3315       CmdArgs.push_back("-fvisibility");
3316       CmdArgs.push_back(A->getValue());
3317     } else {
3318       assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3319       CmdArgs.push_back("-fvisibility");
3320       CmdArgs.push_back("hidden");
3321       CmdArgs.push_back("-ftype-visibility");
3322       CmdArgs.push_back("default");
3323     }
3324   }
3325 
3326   Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
3327 
3328   Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3329 
3330   // -fhosted is default.
3331   if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3332       KernelOrKext)
3333     CmdArgs.push_back("-ffreestanding");
3334 
3335   // Forward -f (flag) options which we can pass directly.
3336   Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
3337   Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
3338   Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3339   Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
3340   Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
3341   // AltiVec language extensions aren't relevant for assembling.
3342   if (!isa<PreprocessJobAction>(JA) ||
3343       Output.getType() != types::TY_PP_Asm)
3344     Args.AddLastArg(CmdArgs, options::OPT_faltivec);
3345   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3346   Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
3347 
3348   const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3349   Sanitize.addArgs(Args, CmdArgs);
3350 
3351   if (!Args.hasFlag(options::OPT_fsanitize_recover,
3352                     options::OPT_fno_sanitize_recover,
3353                     true))
3354     CmdArgs.push_back("-fno-sanitize-recover");
3355 
3356   if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3357                    options::OPT_fno_sanitize_undefined_trap_on_error, false))
3358     CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3359 
3360   // Report an error for -faltivec on anything other than PowerPC.
3361   if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
3362     if (!(getToolChain().getArch() == llvm::Triple::ppc ||
3363           getToolChain().getArch() == llvm::Triple::ppc64 ||
3364           getToolChain().getArch() == llvm::Triple::ppc64le))
3365       D.Diag(diag::err_drv_argument_only_allowed_with)
3366         << A->getAsString(Args) << "ppc/ppc64/ppc64le";
3367 
3368   if (getToolChain().SupportsProfiling())
3369     Args.AddLastArg(CmdArgs, options::OPT_pg);
3370 
3371   // -flax-vector-conversions is default.
3372   if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3373                     options::OPT_fno_lax_vector_conversions))
3374     CmdArgs.push_back("-fno-lax-vector-conversions");
3375 
3376   if (Args.getLastArg(options::OPT_fapple_kext))
3377     CmdArgs.push_back("-fapple-kext");
3378 
3379   Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
3380   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
3381   Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
3382   Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3383   Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
3384 
3385   if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3386     CmdArgs.push_back("-ftrapv-handler");
3387     CmdArgs.push_back(A->getValue());
3388   }
3389 
3390   Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
3391 
3392   // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3393   // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3394   if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3395                                options::OPT_fno_wrapv)) {
3396     if (A->getOption().matches(options::OPT_fwrapv))
3397       CmdArgs.push_back("-fwrapv");
3398   } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3399                                       options::OPT_fno_strict_overflow)) {
3400     if (A->getOption().matches(options::OPT_fno_strict_overflow))
3401       CmdArgs.push_back("-fwrapv");
3402   }
3403 
3404   if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3405                                options::OPT_fno_reroll_loops))
3406     if (A->getOption().matches(options::OPT_freroll_loops))
3407       CmdArgs.push_back("-freroll-loops");
3408 
3409   Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
3410   Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3411                   options::OPT_fno_unroll_loops);
3412 
3413   Args.AddLastArg(CmdArgs, options::OPT_pthread);
3414 
3415 
3416   // -stack-protector=0 is default.
3417   unsigned StackProtectorLevel = 0;
3418   if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3419                                options::OPT_fstack_protector_all,
3420                                options::OPT_fstack_protector_strong,
3421                                options::OPT_fstack_protector)) {
3422     if (A->getOption().matches(options::OPT_fstack_protector)) {
3423       StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3424         getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3425     } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3426       StackProtectorLevel = LangOptions::SSPStrong;
3427     else if (A->getOption().matches(options::OPT_fstack_protector_all))
3428       StackProtectorLevel = LangOptions::SSPReq;
3429   } else {
3430     StackProtectorLevel =
3431       getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3432   }
3433   if (StackProtectorLevel) {
3434     CmdArgs.push_back("-stack-protector");
3435     CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
3436   }
3437 
3438   // --param ssp-buffer-size=
3439   for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3440        ie = Args.filtered_end(); it != ie; ++it) {
3441     StringRef Str((*it)->getValue());
3442     if (Str.startswith("ssp-buffer-size=")) {
3443       if (StackProtectorLevel) {
3444         CmdArgs.push_back("-stack-protector-buffer-size");
3445         // FIXME: Verify the argument is a valid integer.
3446         CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
3447       }
3448       (*it)->claim();
3449     }
3450   }
3451 
3452   // Translate -mstackrealign
3453   if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3454                    false)) {
3455     CmdArgs.push_back("-backend-option");
3456     CmdArgs.push_back("-force-align-stack");
3457   }
3458   if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3459                    false)) {
3460     CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3461   }
3462 
3463   if (Args.hasArg(options::OPT_mstack_alignment)) {
3464     StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3465     CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
3466   }
3467   // -mkernel implies -mstrict-align; don't add the redundant option.
3468   if (!KernelOrKext) {
3469     if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3470                                  options::OPT_munaligned_access)) {
3471       if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3472         CmdArgs.push_back("-backend-option");
3473         if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3474             getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3475             getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
3476             getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
3477           CmdArgs.push_back("-aarch64-strict-align");
3478         else
3479           CmdArgs.push_back("-arm-strict-align");
3480       } else {
3481         CmdArgs.push_back("-backend-option");
3482         if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3483             getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3484             getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
3485             getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
3486           CmdArgs.push_back("-aarch64-no-strict-align");
3487         else
3488           CmdArgs.push_back("-arm-no-strict-align");
3489       }
3490     }
3491   }
3492 
3493   if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3494                                options::OPT_mno_restrict_it)) {
3495     if (A->getOption().matches(options::OPT_mrestrict_it)) {
3496       CmdArgs.push_back("-backend-option");
3497       CmdArgs.push_back("-arm-restrict-it");
3498     } else {
3499       CmdArgs.push_back("-backend-option");
3500       CmdArgs.push_back("-arm-no-restrict-it");
3501     }
3502   } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3503                                   TT.getArch() == llvm::Triple::thumb)) {
3504     // Windows on ARM expects restricted IT blocks
3505     CmdArgs.push_back("-backend-option");
3506     CmdArgs.push_back("-arm-restrict-it");
3507   }
3508 
3509   if (TT.getArch() == llvm::Triple::arm ||
3510       TT.getArch() == llvm::Triple::thumb) {
3511     if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3512                                  options::OPT_mno_long_calls)) {
3513       if (A->getOption().matches(options::OPT_mlong_calls)) {
3514         CmdArgs.push_back("-backend-option");
3515         CmdArgs.push_back("-arm-long-calls");
3516       }
3517     }
3518   }
3519 
3520   // Forward -f options with positive and negative forms; we translate
3521   // these by hand.
3522   if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3523     StringRef fname = A->getValue();
3524     if (!llvm::sys::fs::exists(fname))
3525       D.Diag(diag::err_drv_no_such_file) << fname;
3526     else
3527       A->render(Args, CmdArgs);
3528   }
3529 
3530   if (Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
3531     A->render(Args, CmdArgs);
3532 
3533   if (Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
3534     A->render(Args, CmdArgs);
3535 
3536   if (Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
3537     A->render(Args, CmdArgs);
3538 
3539   if (Args.hasArg(options::OPT_mkernel)) {
3540     if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
3541       CmdArgs.push_back("-fapple-kext");
3542     if (!Args.hasArg(options::OPT_fbuiltin))
3543       CmdArgs.push_back("-fno-builtin");
3544     Args.ClaimAllArgs(options::OPT_fno_builtin);
3545   }
3546   // -fbuiltin is default.
3547   else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
3548     CmdArgs.push_back("-fno-builtin");
3549 
3550   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3551                     options::OPT_fno_assume_sane_operator_new))
3552     CmdArgs.push_back("-fno-assume-sane-operator-new");
3553 
3554   // -fblocks=0 is default.
3555   if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
3556                    getToolChain().IsBlocksDefault()) ||
3557         (Args.hasArg(options::OPT_fgnu_runtime) &&
3558          Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3559          !Args.hasArg(options::OPT_fno_blocks))) {
3560     CmdArgs.push_back("-fblocks");
3561 
3562     if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3563         !getToolChain().hasBlocksRuntime())
3564       CmdArgs.push_back("-fblocks-runtime-optional");
3565   }
3566 
3567   // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3568   // users must also pass -fcxx-modules. The latter flag will disappear once the
3569   // modules implementation is solid for C++/Objective-C++ programs as well.
3570   bool HaveModules = false;
3571   if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3572     bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3573                                      options::OPT_fno_cxx_modules,
3574                                      false);
3575     if (AllowedInCXX || !types::isCXX(InputType)) {
3576       CmdArgs.push_back("-fmodules");
3577       HaveModules = true;
3578     }
3579   }
3580 
3581   // -fmodule-maps enables module map processing (off by default) for header
3582   // checking.  It is implied by -fmodules.
3583   if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3584                    false)) {
3585     CmdArgs.push_back("-fmodule-maps");
3586   }
3587 
3588   // -fmodules-decluse checks that modules used are declared so (off by
3589   // default).
3590   if (Args.hasFlag(options::OPT_fmodules_decluse,
3591                    options::OPT_fno_modules_decluse,
3592                    false)) {
3593     CmdArgs.push_back("-fmodules-decluse");
3594   }
3595 
3596   // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3597   // all #included headers are part of modules.
3598   if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3599                    options::OPT_fno_modules_strict_decluse,
3600                    false)) {
3601     CmdArgs.push_back("-fmodules-strict-decluse");
3602   }
3603 
3604   // -fmodule-name specifies the module that is currently being built (or
3605   // used for header checking by -fmodule-maps).
3606   if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
3607     A->render(Args, CmdArgs);
3608 
3609   // -fmodule-map-file can be used to specify a file containing module
3610   // definitions.
3611   if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
3612     A->render(Args, CmdArgs);
3613 
3614   // -fmodule-cache-path specifies where our module files should be written.
3615   SmallString<128> ModuleCachePath;
3616   if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3617     ModuleCachePath = A->getValue();
3618   if (HaveModules) {
3619     if (C.isForDiagnostics()) {
3620       // When generating crash reports, we want to emit the modules along with
3621       // the reproduction sources, so we ignore any provided module path.
3622       ModuleCachePath = Output.getFilename();
3623       llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3624       llvm::sys::path::append(ModuleCachePath, "modules");
3625     } else if (ModuleCachePath.empty()) {
3626       // No module path was provided: use the default.
3627       llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3628                                              ModuleCachePath);
3629       llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3630       llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3631     }
3632     const char Arg[] = "-fmodules-cache-path=";
3633     ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3634     CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3635   }
3636 
3637   // When building modules and generating crashdumps, we need to dump a module
3638   // dependency VFS alongside the output.
3639   if (HaveModules && C.isForDiagnostics()) {
3640     SmallString<128> VFSDir(Output.getFilename());
3641     llvm::sys::path::replace_extension(VFSDir, ".cache");
3642     llvm::sys::path::append(VFSDir, "vfs");
3643     CmdArgs.push_back("-module-dependency-dir");
3644     CmdArgs.push_back(Args.MakeArgString(VFSDir));
3645   }
3646 
3647   if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3648     if (HaveModules)
3649       A->render(Args, CmdArgs);
3650 
3651   // Pass through all -fmodules-ignore-macro arguments.
3652   Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
3653   Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3654   Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
3655 
3656   Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3657 
3658   if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3659     if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3660       D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3661 
3662     Args.AddLastArg(CmdArgs,
3663                     options::OPT_fmodules_validate_once_per_build_session);
3664   }
3665 
3666   Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3667 
3668   // -faccess-control is default.
3669   if (Args.hasFlag(options::OPT_fno_access_control,
3670                    options::OPT_faccess_control,
3671                    false))
3672     CmdArgs.push_back("-fno-access-control");
3673 
3674   // -felide-constructors is the default.
3675   if (Args.hasFlag(options::OPT_fno_elide_constructors,
3676                    options::OPT_felide_constructors,
3677                    false))
3678     CmdArgs.push_back("-fno-elide-constructors");
3679 
3680   // -frtti is default.
3681   if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
3682       KernelOrKext) {
3683     CmdArgs.push_back("-fno-rtti");
3684 
3685     // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
3686     if (Sanitize.sanitizesVptr()) {
3687       std::string NoRttiArg =
3688         Args.getLastArg(options::OPT_mkernel,
3689                         options::OPT_fapple_kext,
3690                         options::OPT_fno_rtti)->getAsString(Args);
3691       D.Diag(diag::err_drv_argument_not_allowed_with)
3692         << "-fsanitize=vptr" << NoRttiArg;
3693     }
3694   }
3695 
3696   // -fshort-enums=0 is default for all architectures except Hexagon.
3697   if (Args.hasFlag(options::OPT_fshort_enums,
3698                    options::OPT_fno_short_enums,
3699                    getToolChain().getArch() ==
3700                    llvm::Triple::hexagon))
3701     CmdArgs.push_back("-fshort-enums");
3702 
3703   // -fsigned-char is default.
3704   if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
3705                     isSignedCharDefault(getToolChain().getTriple())))
3706     CmdArgs.push_back("-fno-signed-char");
3707 
3708   // -fthreadsafe-static is default.
3709   if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
3710                     options::OPT_fno_threadsafe_statics))
3711     CmdArgs.push_back("-fno-threadsafe-statics");
3712 
3713   // -fuse-cxa-atexit is default.
3714   if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3715                     options::OPT_fno_use_cxa_atexit,
3716                     !IsWindowsCygnus && !IsWindowsGNU &&
3717                     getToolChain().getArch() != llvm::Triple::hexagon &&
3718                     getToolChain().getArch() != llvm::Triple::xcore) ||
3719       KernelOrKext)
3720     CmdArgs.push_back("-fno-use-cxa-atexit");
3721 
3722   // -fms-extensions=0 is default.
3723   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3724                    IsWindowsMSVC))
3725     CmdArgs.push_back("-fms-extensions");
3726 
3727   // -fms-compatibility=0 is default.
3728   if (Args.hasFlag(options::OPT_fms_compatibility,
3729                    options::OPT_fno_ms_compatibility,
3730                    (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3731                                                   options::OPT_fno_ms_extensions,
3732                                                   true))))
3733     CmdArgs.push_back("-fms-compatibility");
3734 
3735   // -fmsc-version=1700 is default.
3736   if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3737                    IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
3738     StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
3739     if (msc_ver.empty())
3740       CmdArgs.push_back("-fmsc-version=1700");
3741     else
3742       CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3743   }
3744 
3745 
3746   // -fno-borland-extensions is default.
3747   if (Args.hasFlag(options::OPT_fborland_extensions,
3748                    options::OPT_fno_borland_extensions, false))
3749     CmdArgs.push_back("-fborland-extensions");
3750 
3751   // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3752   // needs it.
3753   if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3754                    options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
3755     CmdArgs.push_back("-fdelayed-template-parsing");
3756 
3757   // -fgnu-keywords default varies depending on language; only pass if
3758   // specified.
3759   if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
3760                                options::OPT_fno_gnu_keywords))
3761     A->render(Args, CmdArgs);
3762 
3763   if (Args.hasFlag(options::OPT_fgnu89_inline,
3764                    options::OPT_fno_gnu89_inline,
3765                    false))
3766     CmdArgs.push_back("-fgnu89-inline");
3767 
3768   if (Args.hasArg(options::OPT_fno_inline))
3769     CmdArgs.push_back("-fno-inline");
3770 
3771   if (Args.hasArg(options::OPT_fno_inline_functions))
3772     CmdArgs.push_back("-fno-inline-functions");
3773 
3774   ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
3775 
3776   // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3777   // legacy is the default. Except for deployment taget of 10.5,
3778   // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3779   // gets ignored silently.
3780   if (objcRuntime.isNonFragile()) {
3781     if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3782                       options::OPT_fno_objc_legacy_dispatch,
3783                       objcRuntime.isLegacyDispatchDefaultForArch(
3784                         getToolChain().getArch()))) {
3785       if (getToolChain().UseObjCMixedDispatch())
3786         CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3787       else
3788         CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3789     }
3790   }
3791 
3792   // When ObjectiveC legacy runtime is in effect on MacOSX,
3793   // turn on the option to do Array/Dictionary subscripting
3794   // by default.
3795   if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3796       getToolChain().getTriple().isMacOSX() &&
3797       !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3798       objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
3799       objcRuntime.isNeXTFamily())
3800     CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3801 
3802   // -fencode-extended-block-signature=1 is default.
3803   if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3804     CmdArgs.push_back("-fencode-extended-block-signature");
3805   }
3806 
3807   // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3808   // NOTE: This logic is duplicated in ToolChains.cpp.
3809   bool ARC = isObjCAutoRefCount(Args);
3810   if (ARC) {
3811     getToolChain().CheckObjCARC();
3812 
3813     CmdArgs.push_back("-fobjc-arc");
3814 
3815     // FIXME: It seems like this entire block, and several around it should be
3816     // wrapped in isObjC, but for now we just use it here as this is where it
3817     // was being used previously.
3818     if (types::isCXX(InputType) && types::isObjC(InputType)) {
3819       if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3820         CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3821       else
3822         CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3823     }
3824 
3825     // Allow the user to enable full exceptions code emission.
3826     // We define off for Objective-CC, on for Objective-C++.
3827     if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3828                      options::OPT_fno_objc_arc_exceptions,
3829                      /*default*/ types::isCXX(InputType)))
3830       CmdArgs.push_back("-fobjc-arc-exceptions");
3831   }
3832 
3833   // -fobjc-infer-related-result-type is the default, except in the Objective-C
3834   // rewriter.
3835   if (rewriteKind != RK_None)
3836     CmdArgs.push_back("-fno-objc-infer-related-result-type");
3837 
3838   // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3839   // takes precedence.
3840   const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3841   if (!GCArg)
3842     GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3843   if (GCArg) {
3844     if (ARC) {
3845       D.Diag(diag::err_drv_objc_gc_arr)
3846         << GCArg->getAsString(Args);
3847     } else if (getToolChain().SupportsObjCGC()) {
3848       GCArg->render(Args, CmdArgs);
3849     } else {
3850       // FIXME: We should move this to a hard error.
3851       D.Diag(diag::warn_drv_objc_gc_unsupported)
3852         << GCArg->getAsString(Args);
3853     }
3854   }
3855 
3856   // Handle GCC-style exception args.
3857   if (!C.getDriver().IsCLMode())
3858     addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
3859                      objcRuntime, CmdArgs);
3860 
3861   if (getToolChain().UseSjLjExceptions())
3862     CmdArgs.push_back("-fsjlj-exceptions");
3863 
3864   // C++ "sane" operator new.
3865   if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3866                     options::OPT_fno_assume_sane_operator_new))
3867     CmdArgs.push_back("-fno-assume-sane-operator-new");
3868 
3869   // -fconstant-cfstrings is default, and may be subject to argument translation
3870   // on Darwin.
3871   if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3872                     options::OPT_fno_constant_cfstrings) ||
3873       !Args.hasFlag(options::OPT_mconstant_cfstrings,
3874                     options::OPT_mno_constant_cfstrings))
3875     CmdArgs.push_back("-fno-constant-cfstrings");
3876 
3877   // -fshort-wchar default varies depending on platform; only
3878   // pass if specified.
3879   if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3880                                options::OPT_fno_short_wchar))
3881     A->render(Args, CmdArgs);
3882 
3883   // -fno-pascal-strings is default, only pass non-default.
3884   if (Args.hasFlag(options::OPT_fpascal_strings,
3885                    options::OPT_fno_pascal_strings,
3886                    false))
3887     CmdArgs.push_back("-fpascal-strings");
3888 
3889   // Honor -fpack-struct= and -fpack-struct, if given. Note that
3890   // -fno-pack-struct doesn't apply to -fpack-struct=.
3891   if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
3892     std::string PackStructStr = "-fpack-struct=";
3893     PackStructStr += A->getValue();
3894     CmdArgs.push_back(Args.MakeArgString(PackStructStr));
3895   } else if (Args.hasFlag(options::OPT_fpack_struct,
3896                           options::OPT_fno_pack_struct, false)) {
3897     CmdArgs.push_back("-fpack-struct=1");
3898   }
3899 
3900   if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
3901     if (!Args.hasArg(options::OPT_fcommon))
3902       CmdArgs.push_back("-fno-common");
3903     Args.ClaimAllArgs(options::OPT_fno_common);
3904   }
3905 
3906   // -fcommon is default, only pass non-default.
3907   else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
3908     CmdArgs.push_back("-fno-common");
3909 
3910   // -fsigned-bitfields is default, and clang doesn't yet support
3911   // -funsigned-bitfields.
3912   if (!Args.hasFlag(options::OPT_fsigned_bitfields,
3913                     options::OPT_funsigned_bitfields))
3914     D.Diag(diag::warn_drv_clang_unsupported)
3915       << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3916 
3917   // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3918   if (!Args.hasFlag(options::OPT_ffor_scope,
3919                     options::OPT_fno_for_scope))
3920     D.Diag(diag::err_drv_clang_unsupported)
3921       << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3922 
3923   // -finput_charset=UTF-8 is default. Reject others
3924   if (Arg *inputCharset = Args.getLastArg(
3925           options::OPT_finput_charset_EQ)) {
3926       StringRef value = inputCharset->getValue();
3927       if (value != "UTF-8")
3928           D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
3929   }
3930 
3931   // -fcaret-diagnostics is default.
3932   if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3933                     options::OPT_fno_caret_diagnostics, true))
3934     CmdArgs.push_back("-fno-caret-diagnostics");
3935 
3936   // -fdiagnostics-fixit-info is default, only pass non-default.
3937   if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
3938                     options::OPT_fno_diagnostics_fixit_info))
3939     CmdArgs.push_back("-fno-diagnostics-fixit-info");
3940 
3941   // Enable -fdiagnostics-show-option by default.
3942   if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
3943                    options::OPT_fno_diagnostics_show_option))
3944     CmdArgs.push_back("-fdiagnostics-show-option");
3945 
3946   if (const Arg *A =
3947         Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3948     CmdArgs.push_back("-fdiagnostics-show-category");
3949     CmdArgs.push_back(A->getValue());
3950   }
3951 
3952   if (const Arg *A =
3953         Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3954     CmdArgs.push_back("-fdiagnostics-format");
3955     CmdArgs.push_back(A->getValue());
3956   }
3957 
3958   if (Arg *A = Args.getLastArg(
3959       options::OPT_fdiagnostics_show_note_include_stack,
3960       options::OPT_fno_diagnostics_show_note_include_stack)) {
3961     if (A->getOption().matches(
3962         options::OPT_fdiagnostics_show_note_include_stack))
3963       CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3964     else
3965       CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3966   }
3967 
3968   // Color diagnostics are the default, unless the terminal doesn't support
3969   // them.
3970   // Support both clang's -f[no-]color-diagnostics and gcc's
3971   // -f[no-]diagnostics-colors[=never|always|auto].
3972   enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3973   for (const auto &Arg : Args) {
3974     const Option &O = Arg->getOption();
3975     if (!O.matches(options::OPT_fcolor_diagnostics) &&
3976         !O.matches(options::OPT_fdiagnostics_color) &&
3977         !O.matches(options::OPT_fno_color_diagnostics) &&
3978         !O.matches(options::OPT_fno_diagnostics_color) &&
3979         !O.matches(options::OPT_fdiagnostics_color_EQ))
3980       continue;
3981 
3982     Arg->claim();
3983     if (O.matches(options::OPT_fcolor_diagnostics) ||
3984         O.matches(options::OPT_fdiagnostics_color)) {
3985       ShowColors = Colors_On;
3986     } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3987                O.matches(options::OPT_fno_diagnostics_color)) {
3988       ShowColors = Colors_Off;
3989     } else {
3990       assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3991       StringRef value(Arg->getValue());
3992       if (value == "always")
3993         ShowColors = Colors_On;
3994       else if (value == "never")
3995         ShowColors = Colors_Off;
3996       else if (value == "auto")
3997         ShowColors = Colors_Auto;
3998       else
3999         getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4000           << ("-fdiagnostics-color=" + value).str();
4001     }
4002   }
4003   if (ShowColors == Colors_On ||
4004       (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
4005     CmdArgs.push_back("-fcolor-diagnostics");
4006 
4007   if (Args.hasArg(options::OPT_fansi_escape_codes))
4008     CmdArgs.push_back("-fansi-escape-codes");
4009 
4010   if (!Args.hasFlag(options::OPT_fshow_source_location,
4011                     options::OPT_fno_show_source_location))
4012     CmdArgs.push_back("-fno-show-source-location");
4013 
4014   if (!Args.hasFlag(options::OPT_fshow_column,
4015                     options::OPT_fno_show_column,
4016                     true))
4017     CmdArgs.push_back("-fno-show-column");
4018 
4019   if (!Args.hasFlag(options::OPT_fspell_checking,
4020                     options::OPT_fno_spell_checking))
4021     CmdArgs.push_back("-fno-spell-checking");
4022 
4023 
4024   // -fno-asm-blocks is default.
4025   if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4026                    false))
4027     CmdArgs.push_back("-fasm-blocks");
4028 
4029   // Enable vectorization per default according to the optimization level
4030   // selected. For optimization levels that want vectorization we use the alias
4031   // option to simplify the hasFlag logic.
4032   bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
4033   OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
4034     options::OPT_fvectorize;
4035   if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
4036                    options::OPT_fno_vectorize, EnableVec))
4037     CmdArgs.push_back("-vectorize-loops");
4038 
4039   // -fslp-vectorize is enabled based on the optimization level selected.
4040   bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4041   OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
4042     options::OPT_fslp_vectorize;
4043   if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
4044                    options::OPT_fno_slp_vectorize, EnableSLPVec))
4045     CmdArgs.push_back("-vectorize-slp");
4046 
4047   // -fno-slp-vectorize-aggressive is default.
4048   if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
4049                    options::OPT_fno_slp_vectorize_aggressive, false))
4050     CmdArgs.push_back("-vectorize-slp-aggressive");
4051 
4052   if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4053     A->render(Args, CmdArgs);
4054 
4055   // -fdollars-in-identifiers default varies depending on platform and
4056   // language; only pass if specified.
4057   if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
4058                                options::OPT_fno_dollars_in_identifiers)) {
4059     if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
4060       CmdArgs.push_back("-fdollars-in-identifiers");
4061     else
4062       CmdArgs.push_back("-fno-dollars-in-identifiers");
4063   }
4064 
4065   // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4066   // practical purposes.
4067   if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
4068                                options::OPT_fno_unit_at_a_time)) {
4069     if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
4070       D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
4071   }
4072 
4073   if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4074                    options::OPT_fno_apple_pragma_pack, false))
4075     CmdArgs.push_back("-fapple-pragma-pack");
4076 
4077   // le32-specific flags:
4078   //  -fno-math-builtin: clang should not convert math builtins to intrinsics
4079   //                     by default.
4080   if (getToolChain().getArch() == llvm::Triple::le32) {
4081     CmdArgs.push_back("-fno-math-builtin");
4082   }
4083 
4084   // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4085   //
4086   // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
4087 #if 0
4088   if (getToolChain().getTriple().isOSDarwin() &&
4089       (getToolChain().getArch() == llvm::Triple::arm ||
4090        getToolChain().getArch() == llvm::Triple::thumb)) {
4091     if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4092       CmdArgs.push_back("-fno-builtin-strcat");
4093     if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4094       CmdArgs.push_back("-fno-builtin-strcpy");
4095   }
4096 #endif
4097 
4098   // Enable rewrite includes if the user's asked for it or if we're generating
4099   // diagnostics.
4100   // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4101   // nice to enable this when doing a crashdump for modules as well.
4102   if (Args.hasFlag(options::OPT_frewrite_includes,
4103                    options::OPT_fno_rewrite_includes, false) ||
4104       (C.isForDiagnostics() && !HaveModules))
4105     CmdArgs.push_back("-frewrite-includes");
4106 
4107   // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
4108   if (Arg *A = Args.getLastArg(options::OPT_traditional,
4109                                options::OPT_traditional_cpp)) {
4110     if (isa<PreprocessJobAction>(JA))
4111       CmdArgs.push_back("-traditional-cpp");
4112     else
4113       D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
4114   }
4115 
4116   Args.AddLastArg(CmdArgs, options::OPT_dM);
4117   Args.AddLastArg(CmdArgs, options::OPT_dD);
4118 
4119   // Handle serialized diagnostics.
4120   if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4121     CmdArgs.push_back("-serialize-diagnostic-file");
4122     CmdArgs.push_back(Args.MakeArgString(A->getValue()));
4123   }
4124 
4125   if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4126     CmdArgs.push_back("-fretain-comments-from-system-headers");
4127 
4128   // Forward -fcomment-block-commands to -cc1.
4129   Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
4130   // Forward -fparse-all-comments to -cc1.
4131   Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
4132 
4133   // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4134   // parser.
4135   Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
4136   for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4137          ie = Args.filtered_end(); it != ie; ++it) {
4138     (*it)->claim();
4139 
4140     // We translate this by hand to the -cc1 argument, since nightly test uses
4141     // it and developers have been trained to spell it with -mllvm.
4142     if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
4143       CmdArgs.push_back("-disable-llvm-optzns");
4144     else
4145       (*it)->render(Args, CmdArgs);
4146   }
4147 
4148   if (Output.getType() == types::TY_Dependencies) {
4149     // Handled with other dependency code.
4150   } else if (Output.isFilename()) {
4151     CmdArgs.push_back("-o");
4152     CmdArgs.push_back(Output.getFilename());
4153   } else {
4154     assert(Output.isNothing() && "Invalid output.");
4155   }
4156 
4157   for (const auto &II : Inputs) {
4158     addDashXForInput(Args, II, CmdArgs);
4159 
4160     if (II.isFilename())
4161       CmdArgs.push_back(II.getFilename());
4162     else
4163       II.getInputArg().renderAsInput(Args, CmdArgs);
4164   }
4165 
4166   Args.AddAllArgs(CmdArgs, options::OPT_undef);
4167 
4168   const char *Exec = getToolChain().getDriver().getClangProgramPath();
4169 
4170   // Optionally embed the -cc1 level arguments into the debug info, for build
4171   // analysis.
4172   if (getToolChain().UseDwarfDebugFlags()) {
4173     ArgStringList OriginalArgs;
4174     for (const auto &Arg : Args)
4175       Arg->render(Args, OriginalArgs);
4176 
4177     SmallString<256> Flags;
4178     Flags += Exec;
4179     for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4180       Flags += " ";
4181       Flags += OriginalArgs[i];
4182     }
4183     CmdArgs.push_back("-dwarf-debug-flags");
4184     CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4185   }
4186 
4187   // Add the split debug info name to the command lines here so we
4188   // can propagate it to the backend.
4189   bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
4190     getToolChain().getTriple().isOSLinux() &&
4191     (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
4192   const char *SplitDwarfOut;
4193   if (SplitDwarf) {
4194     CmdArgs.push_back("-split-dwarf-file");
4195     SplitDwarfOut = SplitDebugName(Args, Inputs);
4196     CmdArgs.push_back(SplitDwarfOut);
4197   }
4198 
4199   // Finally add the compile command to the compilation.
4200   if (Args.hasArg(options::OPT__SLASH_fallback) &&
4201       Output.getType() == types::TY_Object &&
4202       (InputType == types::TY_C || InputType == types::TY_CXX)) {
4203     Command *CLCommand = getCLFallback()->GetCommand(C, JA, Output, Inputs,
4204                                                      Args, LinkingOutput);
4205     C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
4206   } else {
4207     C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4208   }
4209 
4210 
4211   // Handle the debug info splitting at object creation time if we're
4212   // creating an object.
4213   // TODO: Currently only works on linux with newer objcopy.
4214   if (SplitDwarf && !isa<CompileJobAction>(JA))
4215     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
4216 
4217   if (Arg *A = Args.getLastArg(options::OPT_pg))
4218     if (Args.hasArg(options::OPT_fomit_frame_pointer))
4219       D.Diag(diag::err_drv_argument_not_allowed_with)
4220         << "-fomit-frame-pointer" << A->getAsString(Args);
4221 
4222   // Claim some arguments which clang supports automatically.
4223 
4224   // -fpch-preprocess is used with gcc to add a special marker in the output to
4225   // include the PCH file. Clang's PTH solution is completely transparent, so we
4226   // do not need to deal with it at all.
4227   Args.ClaimAllArgs(options::OPT_fpch_preprocess);
4228 
4229   // Claim some arguments which clang doesn't support, but we don't
4230   // care to warn the user about.
4231   Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4232   Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
4233 
4234   // Disable warnings for clang -E -emit-llvm foo.c
4235   Args.ClaimAllArgs(options::OPT_emit_llvm);
4236 }
4237 
4238 /// Add options related to the Objective-C runtime/ABI.
4239 ///
4240 /// Returns true if the runtime is non-fragile.
AddObjCRuntimeArgs(const ArgList & args,ArgStringList & cmdArgs,RewriteKind rewriteKind) const4241 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4242                                       ArgStringList &cmdArgs,
4243                                       RewriteKind rewriteKind) const {
4244   // Look for the controlling runtime option.
4245   Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4246                                     options::OPT_fgnu_runtime,
4247                                     options::OPT_fobjc_runtime_EQ);
4248 
4249   // Just forward -fobjc-runtime= to the frontend.  This supercedes
4250   // options about fragility.
4251   if (runtimeArg &&
4252       runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4253     ObjCRuntime runtime;
4254     StringRef value = runtimeArg->getValue();
4255     if (runtime.tryParse(value)) {
4256       getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4257         << value;
4258     }
4259 
4260     runtimeArg->render(args, cmdArgs);
4261     return runtime;
4262   }
4263 
4264   // Otherwise, we'll need the ABI "version".  Version numbers are
4265   // slightly confusing for historical reasons:
4266   //   1 - Traditional "fragile" ABI
4267   //   2 - Non-fragile ABI, version 1
4268   //   3 - Non-fragile ABI, version 2
4269   unsigned objcABIVersion = 1;
4270   // If -fobjc-abi-version= is present, use that to set the version.
4271   if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
4272     StringRef value = abiArg->getValue();
4273     if (value == "1")
4274       objcABIVersion = 1;
4275     else if (value == "2")
4276       objcABIVersion = 2;
4277     else if (value == "3")
4278       objcABIVersion = 3;
4279     else
4280       getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4281         << value;
4282   } else {
4283     // Otherwise, determine if we are using the non-fragile ABI.
4284     bool nonFragileABIIsDefault =
4285       (rewriteKind == RK_NonFragile ||
4286        (rewriteKind == RK_None &&
4287         getToolChain().IsObjCNonFragileABIDefault()));
4288     if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4289                      options::OPT_fno_objc_nonfragile_abi,
4290                      nonFragileABIIsDefault)) {
4291       // Determine the non-fragile ABI version to use.
4292 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4293       unsigned nonFragileABIVersion = 1;
4294 #else
4295       unsigned nonFragileABIVersion = 2;
4296 #endif
4297 
4298       if (Arg *abiArg = args.getLastArg(
4299             options::OPT_fobjc_nonfragile_abi_version_EQ)) {
4300         StringRef value = abiArg->getValue();
4301         if (value == "1")
4302           nonFragileABIVersion = 1;
4303         else if (value == "2")
4304           nonFragileABIVersion = 2;
4305         else
4306           getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4307             << value;
4308       }
4309 
4310       objcABIVersion = 1 + nonFragileABIVersion;
4311     } else {
4312       objcABIVersion = 1;
4313     }
4314   }
4315 
4316   // We don't actually care about the ABI version other than whether
4317   // it's non-fragile.
4318   bool isNonFragile = objcABIVersion != 1;
4319 
4320   // If we have no runtime argument, ask the toolchain for its default runtime.
4321   // However, the rewriter only really supports the Mac runtime, so assume that.
4322   ObjCRuntime runtime;
4323   if (!runtimeArg) {
4324     switch (rewriteKind) {
4325     case RK_None:
4326       runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4327       break;
4328     case RK_Fragile:
4329       runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4330       break;
4331     case RK_NonFragile:
4332       runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4333       break;
4334     }
4335 
4336   // -fnext-runtime
4337   } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4338     // On Darwin, make this use the default behavior for the toolchain.
4339     if (getToolChain().getTriple().isOSDarwin()) {
4340       runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4341 
4342     // Otherwise, build for a generic macosx port.
4343     } else {
4344       runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4345     }
4346 
4347   // -fgnu-runtime
4348   } else {
4349     assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
4350     // Legacy behaviour is to target the gnustep runtime if we are i
4351     // non-fragile mode or the GCC runtime in fragile mode.
4352     if (isNonFragile)
4353       runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
4354     else
4355       runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
4356   }
4357 
4358   cmdArgs.push_back(args.MakeArgString(
4359                                  "-fobjc-runtime=" + runtime.getAsString()));
4360   return runtime;
4361 }
4362 
maybeConsumeDash(const std::string & EH,size_t & I)4363 static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4364   bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4365   I += HaveDash;
4366   return !HaveDash;
4367 }
4368 
4369 struct EHFlags {
EHFlagsEHFlags4370   EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4371   bool Synch;
4372   bool Asynch;
4373   bool NoExceptC;
4374 };
4375 
4376 /// /EH controls whether to run destructor cleanups when exceptions are
4377 /// thrown.  There are three modifiers:
4378 /// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4379 /// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4380 ///      The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4381 /// - c: Assume that extern "C" functions are implicitly noexcept.  This
4382 ///      modifier is an optimization, so we ignore it for now.
4383 /// The default is /EHs-c-, meaning cleanups are disabled.
parseClangCLEHFlags(const Driver & D,const ArgList & Args)4384 static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4385   EHFlags EH;
4386   std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4387   for (auto EHVal : EHArgs) {
4388     for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4389       switch (EHVal[I]) {
4390       case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4391       case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4392       case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4393       default: break;
4394       }
4395       D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4396       break;
4397     }
4398   }
4399   return EH;
4400 }
4401 
AddClangCLArgs(const ArgList & Args,ArgStringList & CmdArgs) const4402 void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4403   unsigned RTOptionID = options::OPT__SLASH_MT;
4404 
4405   if (Args.hasArg(options::OPT__SLASH_LDd))
4406     // The /LDd option implies /MTd. The dependent lib part can be overridden,
4407     // but defining _DEBUG is sticky.
4408     RTOptionID = options::OPT__SLASH_MTd;
4409 
4410   if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
4411     RTOptionID = A->getOption().getID();
4412 
4413   switch(RTOptionID) {
4414     case options::OPT__SLASH_MD:
4415       if (Args.hasArg(options::OPT__SLASH_LDd))
4416         CmdArgs.push_back("-D_DEBUG");
4417       CmdArgs.push_back("-D_MT");
4418       CmdArgs.push_back("-D_DLL");
4419       CmdArgs.push_back("--dependent-lib=msvcrt");
4420       break;
4421     case options::OPT__SLASH_MDd:
4422       CmdArgs.push_back("-D_DEBUG");
4423       CmdArgs.push_back("-D_MT");
4424       CmdArgs.push_back("-D_DLL");
4425       CmdArgs.push_back("--dependent-lib=msvcrtd");
4426       break;
4427     case options::OPT__SLASH_MT:
4428       if (Args.hasArg(options::OPT__SLASH_LDd))
4429         CmdArgs.push_back("-D_DEBUG");
4430       CmdArgs.push_back("-D_MT");
4431       CmdArgs.push_back("--dependent-lib=libcmt");
4432       break;
4433     case options::OPT__SLASH_MTd:
4434       CmdArgs.push_back("-D_DEBUG");
4435       CmdArgs.push_back("-D_MT");
4436       CmdArgs.push_back("--dependent-lib=libcmtd");
4437       break;
4438     default:
4439       llvm_unreachable("Unexpected option ID.");
4440   }
4441 
4442   // This provides POSIX compatibility (maps 'open' to '_open'), which most
4443   // users want.  The /Za flag to cl.exe turns this off, but it's not
4444   // implemented in clang.
4445   CmdArgs.push_back("--dependent-lib=oldnames");
4446 
4447   if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4448     A->render(Args, CmdArgs);
4449 
4450   // This controls whether or not we emit RTTI data for polymorphic types.
4451   if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4452                    /*default=*/false))
4453     CmdArgs.push_back("-fno-rtti-data");
4454 
4455   const Driver &D = getToolChain().getDriver();
4456   EHFlags EH = parseClangCLEHFlags(D, Args);
4457   // FIXME: Do something with NoExceptC.
4458   if (EH.Synch || EH.Asynch) {
4459     CmdArgs.push_back("-fexceptions");
4460     CmdArgs.push_back("-fcxx-exceptions");
4461   }
4462 
4463   // /EP should expand to -E -P.
4464   if (Args.hasArg(options::OPT__SLASH_EP)) {
4465     CmdArgs.push_back("-E");
4466     CmdArgs.push_back("-P");
4467   }
4468 
4469   Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4470   Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4471   if (MostGeneralArg && BestCaseArg)
4472     D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4473         << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4474 
4475   if (MostGeneralArg) {
4476     Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4477     Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4478     Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4479 
4480     Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4481     Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4482     if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4483       D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4484           << FirstConflict->getAsString(Args)
4485           << SecondConflict->getAsString(Args);
4486 
4487     if (SingleArg)
4488       CmdArgs.push_back("-fms-memptr-rep=single");
4489     else if (MultipleArg)
4490       CmdArgs.push_back("-fms-memptr-rep=multiple");
4491     else
4492       CmdArgs.push_back("-fms-memptr-rep=virtual");
4493   }
4494 
4495   if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4496     A->render(Args, CmdArgs);
4497 
4498   if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4499     CmdArgs.push_back("-fdiagnostics-format");
4500     if (Args.hasArg(options::OPT__SLASH_fallback))
4501       CmdArgs.push_back("msvc-fallback");
4502     else
4503       CmdArgs.push_back("msvc");
4504   }
4505 }
4506 
getCLFallback() const4507 visualstudio::Compile *Clang::getCLFallback() const {
4508   if (!CLFallback)
4509     CLFallback.reset(new visualstudio::Compile(getToolChain()));
4510   return CLFallback.get();
4511 }
4512 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4513 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
4514                            const InputInfo &Output,
4515                            const InputInfoList &Inputs,
4516                            const ArgList &Args,
4517                            const char *LinkingOutput) const {
4518   ArgStringList CmdArgs;
4519 
4520   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4521   const InputInfo &Input = Inputs[0];
4522 
4523   // Don't warn about "clang -w -c foo.s"
4524   Args.ClaimAllArgs(options::OPT_w);
4525   // and "clang -emit-llvm -c foo.s"
4526   Args.ClaimAllArgs(options::OPT_emit_llvm);
4527 
4528   // Invoke ourselves in -cc1as mode.
4529   //
4530   // FIXME: Implement custom jobs for internal actions.
4531   CmdArgs.push_back("-cc1as");
4532 
4533   // Add the "effective" target triple.
4534   CmdArgs.push_back("-triple");
4535   std::string TripleStr =
4536     getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
4537   CmdArgs.push_back(Args.MakeArgString(TripleStr));
4538 
4539   // Set the output mode, we currently only expect to be used as a real
4540   // assembler.
4541   CmdArgs.push_back("-filetype");
4542   CmdArgs.push_back("obj");
4543 
4544   // Set the main file name, so that debug info works even with
4545   // -save-temps or preprocessed assembly.
4546   CmdArgs.push_back("-main-file-name");
4547   CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4548 
4549   // Add the target cpu
4550   const llvm::Triple &Triple = getToolChain().getTriple();
4551   std::string CPU = getCPUName(Args, Triple);
4552   if (!CPU.empty()) {
4553     CmdArgs.push_back("-target-cpu");
4554     CmdArgs.push_back(Args.MakeArgString(CPU));
4555   }
4556 
4557   // Add the target features
4558   const Driver &D = getToolChain().getDriver();
4559   getTargetFeatures(D, Triple, Args, CmdArgs, true);
4560 
4561   // Ignore explicit -force_cpusubtype_ALL option.
4562   (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
4563 
4564   // Determine the original source input.
4565   const Action *SourceAction = &JA;
4566   while (SourceAction->getKind() != Action::InputClass) {
4567     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4568     SourceAction = SourceAction->getInputs()[0];
4569   }
4570 
4571   // Forward -g and handle debug info related flags, assuming we are dealing
4572   // with an actual assembly file.
4573   if (SourceAction->getType() == types::TY_Asm ||
4574       SourceAction->getType() == types::TY_PP_Asm) {
4575     Args.ClaimAllArgs(options::OPT_g_Group);
4576     if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4577       if (!A->getOption().matches(options::OPT_g0))
4578         CmdArgs.push_back("-g");
4579 
4580     if (Args.hasArg(options::OPT_gdwarf_2))
4581       CmdArgs.push_back("-gdwarf-2");
4582     if (Args.hasArg(options::OPT_gdwarf_3))
4583       CmdArgs.push_back("-gdwarf-3");
4584     if (Args.hasArg(options::OPT_gdwarf_4))
4585       CmdArgs.push_back("-gdwarf-4");
4586 
4587     // Add the -fdebug-compilation-dir flag if needed.
4588     addDebugCompDirArg(Args, CmdArgs);
4589 
4590     // Set the AT_producer to the clang version when using the integrated
4591     // assembler on assembly source files.
4592     CmdArgs.push_back("-dwarf-debug-producer");
4593     CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
4594   }
4595 
4596   // Optionally embed the -cc1as level arguments into the debug info, for build
4597   // analysis.
4598   if (getToolChain().UseDwarfDebugFlags()) {
4599     ArgStringList OriginalArgs;
4600     for (const auto &Arg : Args)
4601       Arg->render(Args, OriginalArgs);
4602 
4603     SmallString<256> Flags;
4604     const char *Exec = getToolChain().getDriver().getClangProgramPath();
4605     Flags += Exec;
4606     for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4607       Flags += " ";
4608       Flags += OriginalArgs[i];
4609     }
4610     CmdArgs.push_back("-dwarf-debug-flags");
4611     CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4612   }
4613 
4614   // FIXME: Add -static support, once we have it.
4615 
4616   // Consume all the warning flags. Usually this would be handled more
4617   // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4618   // doesn't handle that so rather than warning about unused flags that are
4619   // actually used, we'll lie by omission instead.
4620   // FIXME: Stop lying and consume only the appropriate driver flags
4621   for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4622                     ie = Args.filtered_end();
4623        it != ie; ++it)
4624     (*it)->claim();
4625 
4626   CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4627                                     getToolChain().getDriver());
4628 
4629   Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
4630 
4631   assert(Output.isFilename() && "Unexpected lipo output.");
4632   CmdArgs.push_back("-o");
4633   CmdArgs.push_back(Output.getFilename());
4634 
4635   assert(Input.isFilename() && "Invalid input.");
4636   CmdArgs.push_back(Input.getFilename());
4637 
4638   const char *Exec = getToolChain().getDriver().getClangProgramPath();
4639   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4640 
4641   // Handle the debug info splitting at object creation time if we're
4642   // creating an object.
4643   // TODO: Currently only works on linux with newer objcopy.
4644   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
4645       getToolChain().getTriple().isOSLinux())
4646     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4647                    SplitDebugName(Args, Inputs));
4648 }
4649 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4650 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
4651                                const InputInfo &Output,
4652                                const InputInfoList &Inputs,
4653                                const ArgList &Args,
4654                                const char *LinkingOutput) const {
4655   const Driver &D = getToolChain().getDriver();
4656   ArgStringList CmdArgs;
4657 
4658   for (const auto &A : Args) {
4659     if (forwardToGCC(A->getOption())) {
4660       // Don't forward any -g arguments to assembly steps.
4661       if (isa<AssembleJobAction>(JA) &&
4662           A->getOption().matches(options::OPT_g_Group))
4663         continue;
4664 
4665       // Don't forward any -W arguments to assembly and link steps.
4666       if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4667           A->getOption().matches(options::OPT_W_Group))
4668         continue;
4669 
4670       // It is unfortunate that we have to claim here, as this means
4671       // we will basically never report anything interesting for
4672       // platforms using a generic gcc, even if we are just using gcc
4673       // to get to the assembler.
4674       A->claim();
4675       A->render(Args, CmdArgs);
4676     }
4677   }
4678 
4679   RenderExtraToolArgs(JA, CmdArgs);
4680 
4681   // If using a driver driver, force the arch.
4682   llvm::Triple::ArchType Arch = getToolChain().getArch();
4683   if (getToolChain().getTriple().isOSDarwin()) {
4684     CmdArgs.push_back("-arch");
4685 
4686     // FIXME: Remove these special cases.
4687     if (Arch == llvm::Triple::ppc)
4688       CmdArgs.push_back("ppc");
4689     else if (Arch == llvm::Triple::ppc64)
4690       CmdArgs.push_back("ppc64");
4691     else if (Arch == llvm::Triple::ppc64le)
4692       CmdArgs.push_back("ppc64le");
4693     else
4694       CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
4695   }
4696 
4697   // Try to force gcc to match the tool chain we want, if we recognize
4698   // the arch.
4699   //
4700   // FIXME: The triple class should directly provide the information we want
4701   // here.
4702   if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
4703     CmdArgs.push_back("-m32");
4704   else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4705            Arch == llvm::Triple::ppc64le)
4706     CmdArgs.push_back("-m64");
4707 
4708   if (Output.isFilename()) {
4709     CmdArgs.push_back("-o");
4710     CmdArgs.push_back(Output.getFilename());
4711   } else {
4712     assert(Output.isNothing() && "Unexpected output");
4713     CmdArgs.push_back("-fsyntax-only");
4714   }
4715 
4716   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4717                        options::OPT_Xassembler);
4718 
4719   // Only pass -x if gcc will understand it; otherwise hope gcc
4720   // understands the suffix correctly. The main use case this would go
4721   // wrong in is for linker inputs if they happened to have an odd
4722   // suffix; really the only way to get this to happen is a command
4723   // like '-x foobar a.c' which will treat a.c like a linker input.
4724   //
4725   // FIXME: For the linker case specifically, can we safely convert
4726   // inputs into '-Wl,' options?
4727   for (const auto &II : Inputs) {
4728     // Don't try to pass LLVM or AST inputs to a generic gcc.
4729     if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4730         II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4731       D.Diag(diag::err_drv_no_linker_llvm_support)
4732         << getToolChain().getTripleString();
4733     else if (II.getType() == types::TY_AST)
4734       D.Diag(diag::err_drv_no_ast_support)
4735         << getToolChain().getTripleString();
4736     else if (II.getType() == types::TY_ModuleFile)
4737       D.Diag(diag::err_drv_no_module_support)
4738         << getToolChain().getTripleString();
4739 
4740     if (types::canTypeBeUserSpecified(II.getType())) {
4741       CmdArgs.push_back("-x");
4742       CmdArgs.push_back(types::getTypeName(II.getType()));
4743     }
4744 
4745     if (II.isFilename())
4746       CmdArgs.push_back(II.getFilename());
4747     else {
4748       const Arg &A = II.getInputArg();
4749 
4750       // Reverse translate some rewritten options.
4751       if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4752         CmdArgs.push_back("-lstdc++");
4753         continue;
4754       }
4755 
4756       // Don't render as input, we need gcc to do the translations.
4757       A.render(Args, CmdArgs);
4758     }
4759   }
4760 
4761   const std::string customGCCName = D.getCCCGenericGCCName();
4762   const char *GCCName;
4763   if (!customGCCName.empty())
4764     GCCName = customGCCName.c_str();
4765   else if (D.CCCIsCXX()) {
4766     GCCName = "g++";
4767   } else
4768     GCCName = "gcc";
4769 
4770   const char *Exec =
4771     Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4772   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4773 }
4774 
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4775 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4776                                           ArgStringList &CmdArgs) const {
4777   CmdArgs.push_back("-E");
4778 }
4779 
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4780 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4781                                        ArgStringList &CmdArgs) const {
4782   const Driver &D = getToolChain().getDriver();
4783 
4784   // If -flto, etc. are present then make sure not to force assembly output.
4785   if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4786       JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
4787     CmdArgs.push_back("-c");
4788   else {
4789     if (JA.getType() != types::TY_PP_Asm)
4790       D.Diag(diag::err_drv_invalid_gcc_output_type)
4791         << getTypeName(JA.getType());
4792 
4793     CmdArgs.push_back("-S");
4794   }
4795 }
4796 
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4797 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4798                                     ArgStringList &CmdArgs) const {
4799   // The types are (hopefully) good enough.
4800 }
4801 
4802 // Hexagon tools start.
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4803 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4804                                         ArgStringList &CmdArgs) const {
4805 
4806 }
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4807 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4808                                const InputInfo &Output,
4809                                const InputInfoList &Inputs,
4810                                const ArgList &Args,
4811                                const char *LinkingOutput) const {
4812 
4813   const Driver &D = getToolChain().getDriver();
4814   ArgStringList CmdArgs;
4815 
4816   std::string MarchString = "-march=";
4817   MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
4818   CmdArgs.push_back(Args.MakeArgString(MarchString));
4819 
4820   RenderExtraToolArgs(JA, CmdArgs);
4821 
4822   if (Output.isFilename()) {
4823     CmdArgs.push_back("-o");
4824     CmdArgs.push_back(Output.getFilename());
4825   } else {
4826     assert(Output.isNothing() && "Unexpected output");
4827     CmdArgs.push_back("-fsyntax-only");
4828   }
4829 
4830   std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4831   if (!SmallDataThreshold.empty())
4832     CmdArgs.push_back(
4833       Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4834 
4835   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4836                        options::OPT_Xassembler);
4837 
4838   // Only pass -x if gcc will understand it; otherwise hope gcc
4839   // understands the suffix correctly. The main use case this would go
4840   // wrong in is for linker inputs if they happened to have an odd
4841   // suffix; really the only way to get this to happen is a command
4842   // like '-x foobar a.c' which will treat a.c like a linker input.
4843   //
4844   // FIXME: For the linker case specifically, can we safely convert
4845   // inputs into '-Wl,' options?
4846   for (const auto &II : Inputs) {
4847     // Don't try to pass LLVM or AST inputs to a generic gcc.
4848     if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4849         II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4850       D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4851         << getToolChain().getTripleString();
4852     else if (II.getType() == types::TY_AST)
4853       D.Diag(clang::diag::err_drv_no_ast_support)
4854         << getToolChain().getTripleString();
4855     else if (II.getType() == types::TY_ModuleFile)
4856       D.Diag(diag::err_drv_no_module_support)
4857       << getToolChain().getTripleString();
4858 
4859     if (II.isFilename())
4860       CmdArgs.push_back(II.getFilename());
4861     else
4862       // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4863       II.getInputArg().render(Args, CmdArgs);
4864   }
4865 
4866   const char *GCCName = "hexagon-as";
4867   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4868   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4869 }
4870 
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4871 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4872                                     ArgStringList &CmdArgs) const {
4873   // The types are (hopefully) good enough.
4874 }
4875 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4876 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4877                                const InputInfo &Output,
4878                                const InputInfoList &Inputs,
4879                                const ArgList &Args,
4880                                const char *LinkingOutput) const {
4881 
4882   const toolchains::Hexagon_TC& ToolChain =
4883     static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4884   const Driver &D = ToolChain.getDriver();
4885 
4886   ArgStringList CmdArgs;
4887 
4888   //----------------------------------------------------------------------------
4889   //
4890   //----------------------------------------------------------------------------
4891   bool hasStaticArg = Args.hasArg(options::OPT_static);
4892   bool buildingLib = Args.hasArg(options::OPT_shared);
4893   bool buildPIE = Args.hasArg(options::OPT_pie);
4894   bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4895   bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4896   bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4897   bool useShared = buildingLib && !hasStaticArg;
4898 
4899   //----------------------------------------------------------------------------
4900   // Silence warnings for various options
4901   //----------------------------------------------------------------------------
4902 
4903   Args.ClaimAllArgs(options::OPT_g_Group);
4904   Args.ClaimAllArgs(options::OPT_emit_llvm);
4905   Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4906                                      // handled somewhere else.
4907   Args.ClaimAllArgs(options::OPT_static_libgcc);
4908 
4909   //----------------------------------------------------------------------------
4910   //
4911   //----------------------------------------------------------------------------
4912   for (const auto &Opt : ToolChain.ExtraOpts)
4913     CmdArgs.push_back(Opt.c_str());
4914 
4915   std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4916   CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
4917 
4918   if (buildingLib) {
4919     CmdArgs.push_back("-shared");
4920     CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4921                                        // hexagon-gcc does
4922   }
4923 
4924   if (hasStaticArg)
4925     CmdArgs.push_back("-static");
4926 
4927   if (buildPIE && !buildingLib)
4928     CmdArgs.push_back("-pie");
4929 
4930   std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4931   if (!SmallDataThreshold.empty()) {
4932     CmdArgs.push_back(
4933       Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4934   }
4935 
4936   //----------------------------------------------------------------------------
4937   //
4938   //----------------------------------------------------------------------------
4939   CmdArgs.push_back("-o");
4940   CmdArgs.push_back(Output.getFilename());
4941 
4942   const std::string MarchSuffix = "/" + MarchString;
4943   const std::string G0Suffix = "/G0";
4944   const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4945   const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4946                               + "/";
4947   const std::string StartFilesDir = RootDir
4948                                     + "hexagon/lib"
4949                                     + (buildingLib
4950                                        ? MarchG0Suffix : MarchSuffix);
4951 
4952   //----------------------------------------------------------------------------
4953   // moslib
4954   //----------------------------------------------------------------------------
4955   std::vector<std::string> oslibs;
4956   bool hasStandalone= false;
4957 
4958   for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4959          ie = Args.filtered_end(); it != ie; ++it) {
4960     (*it)->claim();
4961     oslibs.push_back((*it)->getValue());
4962     hasStandalone = hasStandalone || (oslibs.back() == "standalone");
4963   }
4964   if (oslibs.empty()) {
4965     oslibs.push_back("standalone");
4966     hasStandalone = true;
4967   }
4968 
4969   //----------------------------------------------------------------------------
4970   // Start Files
4971   //----------------------------------------------------------------------------
4972   if (incStdLib && incStartFiles) {
4973 
4974     if (!buildingLib) {
4975       if (hasStandalone) {
4976         CmdArgs.push_back(
4977           Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4978       }
4979       CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4980     }
4981     std::string initObj = useShared ? "/initS.o" : "/init.o";
4982     CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4983   }
4984 
4985   //----------------------------------------------------------------------------
4986   // Library Search Paths
4987   //----------------------------------------------------------------------------
4988   const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4989   for (const auto &LibPath : LibPaths)
4990     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
4991 
4992   //----------------------------------------------------------------------------
4993   //
4994   //----------------------------------------------------------------------------
4995   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4996   Args.AddAllArgs(CmdArgs, options::OPT_e);
4997   Args.AddAllArgs(CmdArgs, options::OPT_s);
4998   Args.AddAllArgs(CmdArgs, options::OPT_t);
4999   Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5000 
5001   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5002 
5003   //----------------------------------------------------------------------------
5004   // Libraries
5005   //----------------------------------------------------------------------------
5006   if (incStdLib && incDefLibs) {
5007     if (D.CCCIsCXX()) {
5008       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5009       CmdArgs.push_back("-lm");
5010     }
5011 
5012     CmdArgs.push_back("--start-group");
5013 
5014     if (!buildingLib) {
5015       for(std::vector<std::string>::iterator i = oslibs.begin(),
5016             e = oslibs.end(); i != e; ++i)
5017         CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5018       CmdArgs.push_back("-lc");
5019     }
5020     CmdArgs.push_back("-lgcc");
5021 
5022     CmdArgs.push_back("--end-group");
5023   }
5024 
5025   //----------------------------------------------------------------------------
5026   // End files
5027   //----------------------------------------------------------------------------
5028   if (incStdLib && incStartFiles) {
5029     std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5030     CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5031   }
5032 
5033   std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
5034   C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
5035 }
5036 // Hexagon tools end.
5037 
getARMCPUForMArch(const ArgList & Args,const llvm::Triple & Triple)5038 const char *arm::getARMCPUForMArch(const ArgList &Args,
5039                                    const llvm::Triple &Triple) {
5040   StringRef MArch;
5041   if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5042     // Otherwise, if we have -march= choose the base CPU for that arch.
5043     MArch = A->getValue();
5044   } else {
5045     // Otherwise, use the Arch from the triple.
5046     MArch = Triple.getArchName();
5047   }
5048 
5049   // Handle -march=native.
5050   if (MArch == "native") {
5051     std::string CPU = llvm::sys::getHostCPUName();
5052     if (CPU != "generic") {
5053       // Translate the native cpu into the architecture. The switch below will
5054       // then chose the minimum cpu for that arch.
5055       MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
5056     }
5057   }
5058 
5059   return driver::getARMCPUForMArch(MArch, Triple);
5060 }
5061 
5062 /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5063 //
5064 // FIXME: tblgen this.
getARMCPUForMArch(StringRef MArch,const llvm::Triple & Triple)5065 const char *driver::getARMCPUForMArch(StringRef MArch,
5066                                       const llvm::Triple &Triple) {
5067   switch (Triple.getOS()) {
5068   case llvm::Triple::NetBSD:
5069     if (MArch == "armv6")
5070       return "arm1176jzf-s";
5071     break;
5072   case llvm::Triple::Win32:
5073     // FIXME: this is invalid for WindowsCE
5074     return "cortex-a9";
5075   default:
5076     break;
5077   }
5078 
5079   const char *result = nullptr;
5080   size_t offset = StringRef::npos;
5081   if (MArch.startswith("arm"))
5082     offset = 3;
5083   if (MArch.startswith("thumb"))
5084     offset = 5;
5085   if (offset != StringRef::npos && MArch.substr(offset, 2) == "eb")
5086     offset += 2;
5087   if (offset != StringRef::npos)
5088     result = llvm::StringSwitch<const char *>(MArch.substr(offset))
5089       .Cases("v2", "v2a", "arm2")
5090       .Case("v3", "arm6")
5091       .Case("v3m", "arm7m")
5092       .Case("v4", "strongarm")
5093       .Case("v4t", "arm7tdmi")
5094       .Cases("v5", "v5t", "arm10tdmi")
5095       .Cases("v5e", "v5te", "arm1022e")
5096       .Case("v5tej", "arm926ej-s")
5097       .Cases("v6", "v6k", "arm1136jf-s")
5098       .Case("v6j", "arm1136j-s")
5099       .Cases("v6z", "v6zk", "arm1176jzf-s")
5100       .Case("v6t2", "arm1156t2-s")
5101       .Cases("v6m", "v6-m", "cortex-m0")
5102       .Cases("v7", "v7a", "v7-a", "v7l", "v7-l", "cortex-a8")
5103       .Cases("v7s", "v7-s", "swift")
5104       .Cases("v7r", "v7-r", "cortex-r4")
5105       .Cases("v7m", "v7-m", "cortex-m3")
5106       .Cases("v7em", "v7e-m", "cortex-m4")
5107       .Cases("v8", "v8a", "v8-a", "cortex-a53")
5108       .Default(nullptr);
5109   else
5110     result = llvm::StringSwitch<const char *>(MArch)
5111       .Case("ep9312", "ep9312")
5112       .Case("iwmmxt", "iwmmxt")
5113       .Case("xscale", "xscale")
5114       .Default(nullptr);
5115 
5116   if (result)
5117     return result;
5118 
5119   // If all else failed, return the most base CPU with thumb interworking
5120   // supported by LLVM.
5121   // FIXME: Should warn once that we're falling back.
5122   switch (Triple.getOS()) {
5123   case llvm::Triple::NetBSD:
5124     switch (Triple.getEnvironment()) {
5125     case llvm::Triple::GNUEABIHF:
5126     case llvm::Triple::GNUEABI:
5127     case llvm::Triple::EABIHF:
5128     case llvm::Triple::EABI:
5129       return "arm926ej-s";
5130     default:
5131       return "strongarm";
5132     }
5133   default:
5134     switch (Triple.getEnvironment()) {
5135     case llvm::Triple::EABIHF:
5136     case llvm::Triple::GNUEABIHF:
5137       return "arm1176jzf-s";
5138     default:
5139       return "arm7tdmi";
5140     }
5141   }
5142 }
5143 
5144 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
getARMTargetCPU(const ArgList & Args,const llvm::Triple & Triple)5145 StringRef arm::getARMTargetCPU(const ArgList &Args,
5146                                const llvm::Triple &Triple) {
5147   // FIXME: Warn on inconsistent use of -mcpu and -march.
5148   // If we have -mcpu=, use that.
5149   if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5150     StringRef MCPU = A->getValue();
5151     // Handle -mcpu=native.
5152     if (MCPU == "native")
5153       return llvm::sys::getHostCPUName();
5154     else
5155       return MCPU;
5156   }
5157 
5158   return getARMCPUForMArch(Args, Triple);
5159 }
5160 
5161 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5162 /// CPU.
5163 //
5164 // FIXME: This is redundant with -mcpu, why does LLVM use this.
5165 // FIXME: tblgen this, or kill it!
getLLVMArchSuffixForARM(StringRef CPU)5166 const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5167   return llvm::StringSwitch<const char *>(CPU)
5168     .Case("strongarm", "v4")
5169     .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5170     .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5171     .Cases("arm920", "arm920t", "arm922t", "v4t")
5172     .Cases("arm940t", "ep9312","v4t")
5173     .Cases("arm10tdmi",  "arm1020t", "v5")
5174     .Cases("arm9e",  "arm926ej-s",  "arm946e-s", "v5e")
5175     .Cases("arm966e-s",  "arm968e-s",  "arm10e", "v5e")
5176     .Cases("arm1020e",  "arm1022e",  "xscale", "iwmmxt", "v5e")
5177     .Cases("arm1136j-s",  "arm1136jf-s",  "arm1176jz-s", "v6")
5178     .Cases("arm1176jzf-s",  "mpcorenovfp",  "mpcore", "v6")
5179     .Cases("arm1156t2-s",  "arm1156t2f-s", "v6t2")
5180     .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
5181     .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5182     .Cases("cortex-r4", "cortex-r5", "v7r")
5183     .Case("cortex-m0", "v6m")
5184     .Case("cortex-m3", "v7m")
5185     .Case("cortex-m4", "v7em")
5186     .Case("swift", "v7s")
5187     .Case("cyclone", "v8")
5188     .Cases("cortex-a53", "cortex-a57", "v8")
5189     .Default("");
5190 }
5191 
hasMipsAbiArg(const ArgList & Args,const char * Value)5192 bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5193   Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5194   return A && (A->getValue() == StringRef(Value));
5195 }
5196 
isNaN2008(const ArgList & Args,const llvm::Triple & Triple)5197 bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
5198   if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5199     return llvm::StringSwitch<bool>(NaNArg->getValue())
5200                .Case("2008", true)
5201                .Case("legacy", false)
5202                .Default(false);
5203 
5204   // NaN2008 is the default for MIPS32r6/MIPS64r6.
5205   return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5206              .Cases("mips32r6", "mips64r6", true)
5207              .Default(false);
5208 
5209   return false;
5210 }
5211 
getArchTypeForMachOArchName(StringRef Str)5212 llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
5213   // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5214   // archs which Darwin doesn't use.
5215 
5216   // The matching this routine does is fairly pointless, since it is neither the
5217   // complete architecture list, nor a reasonable subset. The problem is that
5218   // historically the driver driver accepts this and also ties its -march=
5219   // handling to the architecture name, so we need to be careful before removing
5220   // support for it.
5221 
5222   // This code must be kept in sync with Clang's Darwin specific argument
5223   // translation.
5224 
5225   return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5226     .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5227     .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5228     .Case("ppc64", llvm::Triple::ppc64)
5229     .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5230     .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5231            llvm::Triple::x86)
5232     .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
5233     // This is derived from the driver driver.
5234     .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5235     .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
5236     .Cases("armv7s", "xscale", llvm::Triple::arm)
5237     .Case("arm64", llvm::Triple::arm64)
5238     .Case("r600", llvm::Triple::r600)
5239     .Case("nvptx", llvm::Triple::nvptx)
5240     .Case("nvptx64", llvm::Triple::nvptx64)
5241     .Case("amdil", llvm::Triple::amdil)
5242     .Case("spir", llvm::Triple::spir)
5243     .Default(llvm::Triple::UnknownArch);
5244 }
5245 
setTripleTypeForMachOArchName(llvm::Triple & T,StringRef Str)5246 void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5247   llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5248   T.setArch(Arch);
5249 
5250   if (Str == "x86_64h")
5251     T.setArchName(Str);
5252   else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5253     T.setOS(llvm::Triple::UnknownOS);
5254     T.setObjectFormat(llvm::Triple::MachO);
5255   }
5256 }
5257 
getBaseInputName(const ArgList & Args,const InputInfoList & Inputs)5258 const char *Clang::getBaseInputName(const ArgList &Args,
5259                                     const InputInfoList &Inputs) {
5260   return Args.MakeArgString(
5261     llvm::sys::path::filename(Inputs[0].getBaseInput()));
5262 }
5263 
getBaseInputStem(const ArgList & Args,const InputInfoList & Inputs)5264 const char *Clang::getBaseInputStem(const ArgList &Args,
5265                                     const InputInfoList &Inputs) {
5266   const char *Str = getBaseInputName(Args, Inputs);
5267 
5268   if (const char *End = strrchr(Str, '.'))
5269     return Args.MakeArgString(std::string(Str, End));
5270 
5271   return Str;
5272 }
5273 
getDependencyFileName(const ArgList & Args,const InputInfoList & Inputs)5274 const char *Clang::getDependencyFileName(const ArgList &Args,
5275                                          const InputInfoList &Inputs) {
5276   // FIXME: Think about this more.
5277   std::string Res;
5278 
5279   if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
5280     std::string Str(OutputOpt->getValue());
5281     Res = Str.substr(0, Str.rfind('.'));
5282   } else {
5283     Res = getBaseInputStem(Args, Inputs);
5284   }
5285   return Args.MakeArgString(Res + ".d");
5286 }
5287 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5288 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5289                                     const InputInfo &Output,
5290                                     const InputInfoList &Inputs,
5291                                     const ArgList &Args,
5292                                     const char *LinkingOutput) const {
5293   ArgStringList CmdArgs;
5294 
5295   assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5296   const InputInfo &Input = Inputs[0];
5297 
5298   // Determine the original source input.
5299   const Action *SourceAction = &JA;
5300   while (SourceAction->getKind() != Action::InputClass) {
5301     assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5302     SourceAction = SourceAction->getInputs()[0];
5303   }
5304 
5305   // If -fno_integrated_as is used add -Q to the darwin assember driver to make
5306   // sure it runs its system assembler not clang's integrated assembler.
5307   // Applicable to darwin11+ and Xcode 4+.  darwin<10 lacked integrated-as.
5308   // FIXME: at run-time detect assembler capabilities or rely on version
5309   // information forwarded by -target-assembler-version (future)
5310   if (Args.hasArg(options::OPT_fno_integrated_as)) {
5311     const llvm::Triple &T(getToolChain().getTriple());
5312     if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
5313       CmdArgs.push_back("-Q");
5314   }
5315 
5316   // Forward -g, assuming we are dealing with an actual assembly file.
5317   if (SourceAction->getType() == types::TY_Asm ||
5318       SourceAction->getType() == types::TY_PP_Asm) {
5319     if (Args.hasArg(options::OPT_gstabs))
5320       CmdArgs.push_back("--gstabs");
5321     else if (Args.hasArg(options::OPT_g_Group))
5322       CmdArgs.push_back("-g");
5323   }
5324 
5325   // Derived from asm spec.
5326   AddMachOArch(Args, CmdArgs);
5327 
5328   // Use -force_cpusubtype_ALL on x86 by default.
5329   if (getToolChain().getArch() == llvm::Triple::x86 ||
5330       getToolChain().getArch() == llvm::Triple::x86_64 ||
5331       Args.hasArg(options::OPT_force__cpusubtype__ALL))
5332     CmdArgs.push_back("-force_cpusubtype_ALL");
5333 
5334   if (getToolChain().getArch() != llvm::Triple::x86_64 &&
5335       (((Args.hasArg(options::OPT_mkernel) ||
5336          Args.hasArg(options::OPT_fapple_kext)) &&
5337         getMachOToolChain().isKernelStatic()) ||
5338        Args.hasArg(options::OPT_static)))
5339     CmdArgs.push_back("-static");
5340 
5341   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5342                        options::OPT_Xassembler);
5343 
5344   assert(Output.isFilename() && "Unexpected lipo output.");
5345   CmdArgs.push_back("-o");
5346   CmdArgs.push_back(Output.getFilename());
5347 
5348   assert(Input.isFilename() && "Invalid input.");
5349   CmdArgs.push_back(Input.getFilename());
5350 
5351   // asm_final spec is empty.
5352 
5353   const char *Exec =
5354     Args.MakeArgString(getToolChain().GetProgramPath("as"));
5355   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5356 }
5357 
anchor()5358 void darwin::MachOTool::anchor() {}
5359 
AddMachOArch(const ArgList & Args,ArgStringList & CmdArgs) const5360 void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5361                                      ArgStringList &CmdArgs) const {
5362   StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
5363 
5364   // Derived from darwin_arch spec.
5365   CmdArgs.push_back("-arch");
5366   CmdArgs.push_back(Args.MakeArgString(ArchName));
5367 
5368   // FIXME: Is this needed anymore?
5369   if (ArchName == "arm")
5370     CmdArgs.push_back("-force_cpusubtype_ALL");
5371 }
5372 
NeedsTempPath(const InputInfoList & Inputs) const5373 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5374   // We only need to generate a temp path for LTO if we aren't compiling object
5375   // files. When compiling source files, we run 'dsymutil' after linking. We
5376   // don't run 'dsymutil' when compiling object files.
5377   for (const auto &Input : Inputs)
5378     if (Input.getType() != types::TY_Object)
5379       return true;
5380 
5381   return false;
5382 }
5383 
AddLinkArgs(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs,const InputInfoList & Inputs) const5384 void darwin::Link::AddLinkArgs(Compilation &C,
5385                                const ArgList &Args,
5386                                ArgStringList &CmdArgs,
5387                                const InputInfoList &Inputs) const {
5388   const Driver &D = getToolChain().getDriver();
5389   const toolchains::MachO &MachOTC = getMachOToolChain();
5390 
5391   unsigned Version[3] = { 0, 0, 0 };
5392   if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5393     bool HadExtra;
5394     if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
5395                                    Version[1], Version[2], HadExtra) ||
5396         HadExtra)
5397       D.Diag(diag::err_drv_invalid_version_number)
5398         << A->getAsString(Args);
5399   }
5400 
5401   // Newer linkers support -demangle. Pass it if supported and not disabled by
5402   // the user.
5403   if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5404     CmdArgs.push_back("-demangle");
5405 
5406   if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5407     CmdArgs.push_back("-export_dynamic");
5408 
5409   // If we are using LTO, then automatically create a temporary file path for
5410   // the linker to use, so that it's lifetime will extend past a possible
5411   // dsymutil step.
5412   if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5413     const char *TmpPath = C.getArgs().MakeArgString(
5414       D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5415     C.addTempFile(TmpPath);
5416     CmdArgs.push_back("-object_path_lto");
5417     CmdArgs.push_back(TmpPath);
5418   }
5419 
5420   // Derived from the "link" spec.
5421   Args.AddAllArgs(CmdArgs, options::OPT_static);
5422   if (!Args.hasArg(options::OPT_static))
5423     CmdArgs.push_back("-dynamic");
5424   if (Args.hasArg(options::OPT_fgnu_runtime)) {
5425     // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5426     // here. How do we wish to handle such things?
5427   }
5428 
5429   if (!Args.hasArg(options::OPT_dynamiclib)) {
5430     AddMachOArch(Args, CmdArgs);
5431     // FIXME: Why do this only on this path?
5432     Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
5433 
5434     Args.AddLastArg(CmdArgs, options::OPT_bundle);
5435     Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5436     Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5437 
5438     Arg *A;
5439     if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5440         (A = Args.getLastArg(options::OPT_current__version)) ||
5441         (A = Args.getLastArg(options::OPT_install__name)))
5442       D.Diag(diag::err_drv_argument_only_allowed_with)
5443         << A->getAsString(Args) << "-dynamiclib";
5444 
5445     Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5446     Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5447     Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5448   } else {
5449     CmdArgs.push_back("-dylib");
5450 
5451     Arg *A;
5452     if ((A = Args.getLastArg(options::OPT_bundle)) ||
5453         (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5454         (A = Args.getLastArg(options::OPT_client__name)) ||
5455         (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5456         (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5457         (A = Args.getLastArg(options::OPT_private__bundle)))
5458       D.Diag(diag::err_drv_argument_not_allowed_with)
5459         << A->getAsString(Args) << "-dynamiclib";
5460 
5461     Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5462                               "-dylib_compatibility_version");
5463     Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5464                               "-dylib_current_version");
5465 
5466     AddMachOArch(Args, CmdArgs);
5467 
5468     Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5469                               "-dylib_install_name");
5470   }
5471 
5472   Args.AddLastArg(CmdArgs, options::OPT_all__load);
5473   Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5474   Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
5475   if (MachOTC.isTargetIOSBased())
5476     Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
5477   Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5478   Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5479   Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5480   Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5481   Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5482   Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
5483   Args.AddAllArgs(CmdArgs, options::OPT_force__load);
5484   Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5485   Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5486   Args.AddAllArgs(CmdArgs, options::OPT_init);
5487 
5488   // Add the deployment target.
5489   MachOTC.addMinVersionArgs(Args, CmdArgs);
5490 
5491   Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5492   Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5493   Args.AddLastArg(CmdArgs, options::OPT_single__module);
5494   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5495   Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
5496 
5497   if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5498                                      options::OPT_fno_pie,
5499                                      options::OPT_fno_PIE)) {
5500     if (A->getOption().matches(options::OPT_fpie) ||
5501         A->getOption().matches(options::OPT_fPIE))
5502       CmdArgs.push_back("-pie");
5503     else
5504       CmdArgs.push_back("-no_pie");
5505   }
5506 
5507   Args.AddLastArg(CmdArgs, options::OPT_prebind);
5508   Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5509   Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5510   Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5511   Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5512   Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5513   Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5514   Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5515   Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5516   Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5517   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5518   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5519   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5520   Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5521   Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5522   Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
5523 
5524   // Give --sysroot= preference, over the Apple specific behavior to also use
5525   // --isysroot as the syslibroot.
5526   StringRef sysroot = C.getSysRoot();
5527   if (sysroot != "") {
5528     CmdArgs.push_back("-syslibroot");
5529     CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
5530   } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5531     CmdArgs.push_back("-syslibroot");
5532     CmdArgs.push_back(A->getValue());
5533   }
5534 
5535   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5536   Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5537   Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5538   Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5539   Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
5540   Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
5541   Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5542   Args.AddAllArgs(CmdArgs, options::OPT_y);
5543   Args.AddLastArg(CmdArgs, options::OPT_w);
5544   Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5545   Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5546   Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5547   Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5548   Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5549   Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5550   Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5551   Args.AddLastArg(CmdArgs, options::OPT_whyload);
5552   Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5553   Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5554   Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5555   Args.AddLastArg(CmdArgs, options::OPT_Mach);
5556 }
5557 
5558 enum LibOpenMP {
5559   LibUnknown,
5560   LibGOMP,
5561   LibIOMP5
5562 };
5563 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5564 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
5565                                 const InputInfo &Output,
5566                                 const InputInfoList &Inputs,
5567                                 const ArgList &Args,
5568                                 const char *LinkingOutput) const {
5569   assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
5570 
5571   // The logic here is derived from gcc's behavior; most of which
5572   // comes from specs (starting with link_command). Consult gcc for
5573   // more information.
5574   ArgStringList CmdArgs;
5575 
5576   /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5577   if (Args.hasArg(options::OPT_ccc_arcmt_check,
5578                   options::OPT_ccc_arcmt_migrate)) {
5579     for (const auto &Arg : Args)
5580       Arg->claim();
5581     const char *Exec =
5582       Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5583     CmdArgs.push_back(Output.getFilename());
5584     C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5585     return;
5586   }
5587 
5588   // I'm not sure why this particular decomposition exists in gcc, but
5589   // we follow suite for ease of comparison.
5590   AddLinkArgs(C, Args, CmdArgs, Inputs);
5591 
5592   Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5593   Args.AddAllArgs(CmdArgs, options::OPT_s);
5594   Args.AddAllArgs(CmdArgs, options::OPT_t);
5595   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5596   Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5597   Args.AddLastArg(CmdArgs, options::OPT_e);
5598   Args.AddAllArgs(CmdArgs, options::OPT_r);
5599 
5600   // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5601   // members of static archive libraries which implement Objective-C classes or
5602   // categories.
5603   if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5604     CmdArgs.push_back("-ObjC");
5605 
5606   CmdArgs.push_back("-o");
5607   CmdArgs.push_back(Output.getFilename());
5608 
5609   if (!Args.hasArg(options::OPT_nostdlib) &&
5610       !Args.hasArg(options::OPT_nostartfiles))
5611     getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
5612 
5613   Args.AddAllArgs(CmdArgs, options::OPT_L);
5614 
5615   LibOpenMP UsedOpenMPLib = LibUnknown;
5616   if (Args.hasArg(options::OPT_fopenmp)) {
5617     UsedOpenMPLib = LibGOMP;
5618   } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5619     UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5620         .Case("libgomp",  LibGOMP)
5621         .Case("libiomp5", LibIOMP5)
5622         .Default(LibUnknown);
5623     if (UsedOpenMPLib == LibUnknown)
5624       getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5625         << A->getOption().getName() << A->getValue();
5626   }
5627   switch (UsedOpenMPLib) {
5628   case LibGOMP:
5629     CmdArgs.push_back("-lgomp");
5630     break;
5631   case LibIOMP5:
5632     CmdArgs.push_back("-liomp5");
5633     break;
5634   case LibUnknown:
5635     break;
5636   }
5637 
5638   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5639 
5640   if (isObjCRuntimeLinked(Args) &&
5641       !Args.hasArg(options::OPT_nostdlib) &&
5642       !Args.hasArg(options::OPT_nodefaultlibs)) {
5643     // We use arclite library for both ARC and subscripting support.
5644     getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5645 
5646     CmdArgs.push_back("-framework");
5647     CmdArgs.push_back("Foundation");
5648     // Link libobj.
5649     CmdArgs.push_back("-lobjc");
5650   }
5651 
5652   if (LinkingOutput) {
5653     CmdArgs.push_back("-arch_multiple");
5654     CmdArgs.push_back("-final_output");
5655     CmdArgs.push_back(LinkingOutput);
5656   }
5657 
5658   if (Args.hasArg(options::OPT_fnested_functions))
5659     CmdArgs.push_back("-allow_stack_execute");
5660 
5661   if (!Args.hasArg(options::OPT_nostdlib) &&
5662       !Args.hasArg(options::OPT_nodefaultlibs)) {
5663     if (getToolChain().getDriver().CCCIsCXX())
5664       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5665 
5666     // link_ssp spec is empty.
5667 
5668     // Let the tool chain choose which runtime library to link.
5669     getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
5670   }
5671 
5672   if (!Args.hasArg(options::OPT_nostdlib) &&
5673       !Args.hasArg(options::OPT_nostartfiles)) {
5674     // endfile_spec is empty.
5675   }
5676 
5677   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5678   Args.AddAllArgs(CmdArgs, options::OPT_F);
5679 
5680   const char *Exec =
5681     Args.MakeArgString(getToolChain().GetLinkerPath());
5682   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5683 }
5684 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5685 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
5686                                 const InputInfo &Output,
5687                                 const InputInfoList &Inputs,
5688                                 const ArgList &Args,
5689                                 const char *LinkingOutput) const {
5690   ArgStringList CmdArgs;
5691 
5692   CmdArgs.push_back("-create");
5693   assert(Output.isFilename() && "Unexpected lipo output.");
5694 
5695   CmdArgs.push_back("-output");
5696   CmdArgs.push_back(Output.getFilename());
5697 
5698   for (const auto &II : Inputs) {
5699     assert(II.isFilename() && "Unexpected lipo input.");
5700     CmdArgs.push_back(II.getFilename());
5701   }
5702 
5703   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
5704   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5705 }
5706 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5707 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
5708                                     const InputInfo &Output,
5709                                     const InputInfoList &Inputs,
5710                                     const ArgList &Args,
5711                                     const char *LinkingOutput) const {
5712   ArgStringList CmdArgs;
5713 
5714   CmdArgs.push_back("-o");
5715   CmdArgs.push_back(Output.getFilename());
5716 
5717   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5718   const InputInfo &Input = Inputs[0];
5719   assert(Input.isFilename() && "Unexpected dsymutil input.");
5720   CmdArgs.push_back(Input.getFilename());
5721 
5722   const char *Exec =
5723     Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
5724   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5725 }
5726 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5727 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
5728                                        const InputInfo &Output,
5729                                        const InputInfoList &Inputs,
5730                                        const ArgList &Args,
5731                                        const char *LinkingOutput) const {
5732   ArgStringList CmdArgs;
5733   CmdArgs.push_back("--verify");
5734   CmdArgs.push_back("--debug-info");
5735   CmdArgs.push_back("--eh-frame");
5736   CmdArgs.push_back("--quiet");
5737 
5738   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5739   const InputInfo &Input = Inputs[0];
5740   assert(Input.isFilename() && "Unexpected verify input");
5741 
5742   // Grabbing the output of the earlier dsymutil run.
5743   CmdArgs.push_back(Input.getFilename());
5744 
5745   const char *Exec =
5746     Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5747   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5748 }
5749 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5750 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5751                                       const InputInfo &Output,
5752                                       const InputInfoList &Inputs,
5753                                       const ArgList &Args,
5754                                       const char *LinkingOutput) const {
5755   ArgStringList CmdArgs;
5756 
5757   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5758                        options::OPT_Xassembler);
5759 
5760   CmdArgs.push_back("-o");
5761   CmdArgs.push_back(Output.getFilename());
5762 
5763   for (const auto &II : Inputs)
5764     CmdArgs.push_back(II.getFilename());
5765 
5766   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
5767   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5768 }
5769 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5770 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5771                                   const InputInfo &Output,
5772                                   const InputInfoList &Inputs,
5773                                   const ArgList &Args,
5774                                   const char *LinkingOutput) const {
5775   // FIXME: Find a real GCC, don't hard-code versions here
5776   std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5777   const llvm::Triple &T = getToolChain().getTriple();
5778   std::string LibPath = "/usr/lib/";
5779   llvm::Triple::ArchType Arch = T.getArch();
5780   switch (Arch) {
5781   case llvm::Triple::x86:
5782     GCCLibPath +=
5783         ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5784     break;
5785   case llvm::Triple::x86_64:
5786     GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5787     GCCLibPath += "/4.5.2/amd64/";
5788     LibPath += "amd64/";
5789     break;
5790   default:
5791     llvm_unreachable("Unsupported architecture");
5792   }
5793 
5794   ArgStringList CmdArgs;
5795 
5796   // Demangle C++ names in errors
5797   CmdArgs.push_back("-C");
5798 
5799   if ((!Args.hasArg(options::OPT_nostdlib)) &&
5800       (!Args.hasArg(options::OPT_shared))) {
5801     CmdArgs.push_back("-e");
5802     CmdArgs.push_back("_start");
5803   }
5804 
5805   if (Args.hasArg(options::OPT_static)) {
5806     CmdArgs.push_back("-Bstatic");
5807     CmdArgs.push_back("-dn");
5808   } else {
5809     CmdArgs.push_back("-Bdynamic");
5810     if (Args.hasArg(options::OPT_shared)) {
5811       CmdArgs.push_back("-shared");
5812     } else {
5813       CmdArgs.push_back("--dynamic-linker");
5814       CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5815     }
5816   }
5817 
5818   if (Output.isFilename()) {
5819     CmdArgs.push_back("-o");
5820     CmdArgs.push_back(Output.getFilename());
5821   } else {
5822     assert(Output.isNothing() && "Invalid output.");
5823   }
5824 
5825   if (!Args.hasArg(options::OPT_nostdlib) &&
5826       !Args.hasArg(options::OPT_nostartfiles)) {
5827     if (!Args.hasArg(options::OPT_shared)) {
5828       CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5829       CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5830       CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5831       CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5832     } else {
5833       CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5834       CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5835       CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5836     }
5837     if (getToolChain().getDriver().CCCIsCXX())
5838       CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
5839   }
5840 
5841   CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5842 
5843   Args.AddAllArgs(CmdArgs, options::OPT_L);
5844   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5845   Args.AddAllArgs(CmdArgs, options::OPT_e);
5846   Args.AddAllArgs(CmdArgs, options::OPT_r);
5847 
5848   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5849 
5850   if (!Args.hasArg(options::OPT_nostdlib) &&
5851       !Args.hasArg(options::OPT_nodefaultlibs)) {
5852     if (getToolChain().getDriver().CCCIsCXX())
5853       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5854     CmdArgs.push_back("-lgcc_s");
5855     if (!Args.hasArg(options::OPT_shared)) {
5856       CmdArgs.push_back("-lgcc");
5857       CmdArgs.push_back("-lc");
5858       CmdArgs.push_back("-lm");
5859     }
5860   }
5861 
5862   if (!Args.hasArg(options::OPT_nostdlib) &&
5863       !Args.hasArg(options::OPT_nostartfiles)) {
5864     CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
5865   }
5866   CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
5867 
5868   addProfileRT(getToolChain(), Args, CmdArgs);
5869 
5870   const char *Exec =
5871     Args.MakeArgString(getToolChain().GetLinkerPath());
5872   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5873 }
5874 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5875 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5876                                       const InputInfo &Output,
5877                                       const InputInfoList &Inputs,
5878                                       const ArgList &Args,
5879                                       const char *LinkingOutput) const {
5880   ArgStringList CmdArgs;
5881 
5882   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5883                        options::OPT_Xassembler);
5884 
5885   CmdArgs.push_back("-o");
5886   CmdArgs.push_back(Output.getFilename());
5887 
5888   for (const auto &II : Inputs)
5889     CmdArgs.push_back(II.getFilename());
5890 
5891   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
5892   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5893 }
5894 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5895 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
5896                                   const InputInfo &Output,
5897                                   const InputInfoList &Inputs,
5898                                   const ArgList &Args,
5899                                   const char *LinkingOutput) const {
5900   ArgStringList CmdArgs;
5901 
5902   if ((!Args.hasArg(options::OPT_nostdlib)) &&
5903       (!Args.hasArg(options::OPT_shared))) {
5904     CmdArgs.push_back("-e");
5905     CmdArgs.push_back("_start");
5906   }
5907 
5908   if (Args.hasArg(options::OPT_static)) {
5909     CmdArgs.push_back("-Bstatic");
5910     CmdArgs.push_back("-dn");
5911   } else {
5912 //    CmdArgs.push_back("--eh-frame-hdr");
5913     CmdArgs.push_back("-Bdynamic");
5914     if (Args.hasArg(options::OPT_shared)) {
5915       CmdArgs.push_back("-shared");
5916     } else {
5917       CmdArgs.push_back("--dynamic-linker");
5918       CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5919     }
5920   }
5921 
5922   if (Output.isFilename()) {
5923     CmdArgs.push_back("-o");
5924     CmdArgs.push_back(Output.getFilename());
5925   } else {
5926     assert(Output.isNothing() && "Invalid output.");
5927   }
5928 
5929   if (!Args.hasArg(options::OPT_nostdlib) &&
5930       !Args.hasArg(options::OPT_nostartfiles)) {
5931     if (!Args.hasArg(options::OPT_shared)) {
5932       CmdArgs.push_back(Args.MakeArgString(
5933                                 getToolChain().GetFilePath("crt1.o")));
5934       CmdArgs.push_back(Args.MakeArgString(
5935                                 getToolChain().GetFilePath("crti.o")));
5936       CmdArgs.push_back(Args.MakeArgString(
5937                                 getToolChain().GetFilePath("crtbegin.o")));
5938     } else {
5939       CmdArgs.push_back(Args.MakeArgString(
5940                                 getToolChain().GetFilePath("crti.o")));
5941     }
5942     CmdArgs.push_back(Args.MakeArgString(
5943                                 getToolChain().GetFilePath("crtn.o")));
5944   }
5945 
5946   CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5947                                        + getToolChain().getTripleString()
5948                                        + "/4.2.4"));
5949 
5950   Args.AddAllArgs(CmdArgs, options::OPT_L);
5951   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5952   Args.AddAllArgs(CmdArgs, options::OPT_e);
5953 
5954   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5955 
5956   if (!Args.hasArg(options::OPT_nostdlib) &&
5957       !Args.hasArg(options::OPT_nodefaultlibs)) {
5958     // FIXME: For some reason GCC passes -lgcc before adding
5959     // the default system libraries. Just mimic this for now.
5960     CmdArgs.push_back("-lgcc");
5961 
5962     if (Args.hasArg(options::OPT_pthread))
5963       CmdArgs.push_back("-pthread");
5964     if (!Args.hasArg(options::OPT_shared))
5965       CmdArgs.push_back("-lc");
5966     CmdArgs.push_back("-lgcc");
5967   }
5968 
5969   if (!Args.hasArg(options::OPT_nostdlib) &&
5970       !Args.hasArg(options::OPT_nostartfiles)) {
5971     if (!Args.hasArg(options::OPT_shared))
5972       CmdArgs.push_back(Args.MakeArgString(
5973                                 getToolChain().GetFilePath("crtend.o")));
5974   }
5975 
5976   addProfileRT(getToolChain(), Args, CmdArgs);
5977 
5978   const char *Exec =
5979     Args.MakeArgString(getToolChain().GetLinkerPath());
5980   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5981 }
5982 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5983 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5984                                      const InputInfo &Output,
5985                                      const InputInfoList &Inputs,
5986                                      const ArgList &Args,
5987                                      const char *LinkingOutput) const {
5988   ArgStringList CmdArgs;
5989   bool NeedsKPIC = false;
5990 
5991   switch (getToolChain().getArch()) {
5992   case llvm::Triple::x86:
5993     // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5994     // instruct as in the base system to assemble 32-bit code.
5995     CmdArgs.push_back("--32");
5996     break;
5997 
5998   case llvm::Triple::ppc:
5999     CmdArgs.push_back("-mppc");
6000     CmdArgs.push_back("-many");
6001     break;
6002 
6003   case llvm::Triple::sparc:
6004     CmdArgs.push_back("-32");
6005     NeedsKPIC = true;
6006     break;
6007 
6008   case llvm::Triple::sparcv9:
6009     CmdArgs.push_back("-64");
6010     CmdArgs.push_back("-Av9a");
6011     NeedsKPIC = true;
6012     break;
6013 
6014   case llvm::Triple::mips64:
6015   case llvm::Triple::mips64el: {
6016     StringRef CPUName;
6017     StringRef ABIName;
6018     getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6019 
6020     CmdArgs.push_back("-mabi");
6021     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6022 
6023     if (getToolChain().getArch() == llvm::Triple::mips64)
6024       CmdArgs.push_back("-EB");
6025     else
6026       CmdArgs.push_back("-EL");
6027 
6028     NeedsKPIC = true;
6029     break;
6030   }
6031 
6032   default:
6033     break;
6034   }
6035 
6036   if (NeedsKPIC)
6037     addAssemblerKPIC(Args, CmdArgs);
6038 
6039   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6040                        options::OPT_Xassembler);
6041 
6042   CmdArgs.push_back("-o");
6043   CmdArgs.push_back(Output.getFilename());
6044 
6045   for (const auto &II : Inputs)
6046     CmdArgs.push_back(II.getFilename());
6047 
6048   const char *Exec =
6049     Args.MakeArgString(getToolChain().GetProgramPath("as"));
6050   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6051 }
6052 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6053 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6054                                  const InputInfo &Output,
6055                                  const InputInfoList &Inputs,
6056                                  const ArgList &Args,
6057                                  const char *LinkingOutput) const {
6058   const Driver &D = getToolChain().getDriver();
6059   ArgStringList CmdArgs;
6060 
6061   // Silence warning for "clang -g foo.o -o foo"
6062   Args.ClaimAllArgs(options::OPT_g_Group);
6063   // and "clang -emit-llvm foo.o -o foo"
6064   Args.ClaimAllArgs(options::OPT_emit_llvm);
6065   // and for "clang -w foo.o -o foo". Other warning options are already
6066   // handled somewhere else.
6067   Args.ClaimAllArgs(options::OPT_w);
6068 
6069   if (getToolChain().getArch() == llvm::Triple::mips64)
6070     CmdArgs.push_back("-EB");
6071   else if (getToolChain().getArch() == llvm::Triple::mips64el)
6072     CmdArgs.push_back("-EL");
6073 
6074   if ((!Args.hasArg(options::OPT_nostdlib)) &&
6075       (!Args.hasArg(options::OPT_shared))) {
6076     CmdArgs.push_back("-e");
6077     CmdArgs.push_back("__start");
6078   }
6079 
6080   if (Args.hasArg(options::OPT_static)) {
6081     CmdArgs.push_back("-Bstatic");
6082   } else {
6083     if (Args.hasArg(options::OPT_rdynamic))
6084       CmdArgs.push_back("-export-dynamic");
6085     CmdArgs.push_back("--eh-frame-hdr");
6086     CmdArgs.push_back("-Bdynamic");
6087     if (Args.hasArg(options::OPT_shared)) {
6088       CmdArgs.push_back("-shared");
6089     } else {
6090       CmdArgs.push_back("-dynamic-linker");
6091       CmdArgs.push_back("/usr/libexec/ld.so");
6092     }
6093   }
6094 
6095   if (Args.hasArg(options::OPT_nopie))
6096     CmdArgs.push_back("-nopie");
6097 
6098   if (Output.isFilename()) {
6099     CmdArgs.push_back("-o");
6100     CmdArgs.push_back(Output.getFilename());
6101   } else {
6102     assert(Output.isNothing() && "Invalid output.");
6103   }
6104 
6105   if (!Args.hasArg(options::OPT_nostdlib) &&
6106       !Args.hasArg(options::OPT_nostartfiles)) {
6107     if (!Args.hasArg(options::OPT_shared)) {
6108       if (Args.hasArg(options::OPT_pg))
6109         CmdArgs.push_back(Args.MakeArgString(
6110                                 getToolChain().GetFilePath("gcrt0.o")));
6111       else
6112         CmdArgs.push_back(Args.MakeArgString(
6113                                 getToolChain().GetFilePath("crt0.o")));
6114       CmdArgs.push_back(Args.MakeArgString(
6115                               getToolChain().GetFilePath("crtbegin.o")));
6116     } else {
6117       CmdArgs.push_back(Args.MakeArgString(
6118                               getToolChain().GetFilePath("crtbeginS.o")));
6119     }
6120   }
6121 
6122   std::string Triple = getToolChain().getTripleString();
6123   if (Triple.substr(0, 6) == "x86_64")
6124     Triple.replace(0, 6, "amd64");
6125   CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
6126                                        "/4.2.1"));
6127 
6128   Args.AddAllArgs(CmdArgs, options::OPT_L);
6129   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6130   Args.AddAllArgs(CmdArgs, options::OPT_e);
6131   Args.AddAllArgs(CmdArgs, options::OPT_s);
6132   Args.AddAllArgs(CmdArgs, options::OPT_t);
6133   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6134   Args.AddAllArgs(CmdArgs, options::OPT_r);
6135 
6136   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6137 
6138   if (!Args.hasArg(options::OPT_nostdlib) &&
6139       !Args.hasArg(options::OPT_nodefaultlibs)) {
6140     if (D.CCCIsCXX()) {
6141       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6142       if (Args.hasArg(options::OPT_pg))
6143         CmdArgs.push_back("-lm_p");
6144       else
6145         CmdArgs.push_back("-lm");
6146     }
6147 
6148     // FIXME: For some reason GCC passes -lgcc before adding
6149     // the default system libraries. Just mimic this for now.
6150     CmdArgs.push_back("-lgcc");
6151 
6152     if (Args.hasArg(options::OPT_pthread)) {
6153       if (!Args.hasArg(options::OPT_shared) &&
6154           Args.hasArg(options::OPT_pg))
6155          CmdArgs.push_back("-lpthread_p");
6156       else
6157          CmdArgs.push_back("-lpthread");
6158     }
6159 
6160     if (!Args.hasArg(options::OPT_shared)) {
6161       if (Args.hasArg(options::OPT_pg))
6162          CmdArgs.push_back("-lc_p");
6163       else
6164          CmdArgs.push_back("-lc");
6165     }
6166 
6167     CmdArgs.push_back("-lgcc");
6168   }
6169 
6170   if (!Args.hasArg(options::OPT_nostdlib) &&
6171       !Args.hasArg(options::OPT_nostartfiles)) {
6172     if (!Args.hasArg(options::OPT_shared))
6173       CmdArgs.push_back(Args.MakeArgString(
6174                               getToolChain().GetFilePath("crtend.o")));
6175     else
6176       CmdArgs.push_back(Args.MakeArgString(
6177                               getToolChain().GetFilePath("crtendS.o")));
6178   }
6179 
6180   const char *Exec =
6181     Args.MakeArgString(getToolChain().GetLinkerPath());
6182   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6183 }
6184 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6185 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6186                                     const InputInfo &Output,
6187                                     const InputInfoList &Inputs,
6188                                     const ArgList &Args,
6189                                     const char *LinkingOutput) const {
6190   ArgStringList CmdArgs;
6191 
6192   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6193                        options::OPT_Xassembler);
6194 
6195   CmdArgs.push_back("-o");
6196   CmdArgs.push_back(Output.getFilename());
6197 
6198   for (const auto &II : Inputs)
6199     CmdArgs.push_back(II.getFilename());
6200 
6201   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6202   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6203 }
6204 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6205 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6206                                 const InputInfo &Output,
6207                                 const InputInfoList &Inputs,
6208                                 const ArgList &Args,
6209                                 const char *LinkingOutput) const {
6210   const Driver &D = getToolChain().getDriver();
6211   ArgStringList CmdArgs;
6212 
6213   if ((!Args.hasArg(options::OPT_nostdlib)) &&
6214       (!Args.hasArg(options::OPT_shared))) {
6215     CmdArgs.push_back("-e");
6216     CmdArgs.push_back("__start");
6217   }
6218 
6219   if (Args.hasArg(options::OPT_static)) {
6220     CmdArgs.push_back("-Bstatic");
6221   } else {
6222     if (Args.hasArg(options::OPT_rdynamic))
6223       CmdArgs.push_back("-export-dynamic");
6224     CmdArgs.push_back("--eh-frame-hdr");
6225     CmdArgs.push_back("-Bdynamic");
6226     if (Args.hasArg(options::OPT_shared)) {
6227       CmdArgs.push_back("-shared");
6228     } else {
6229       CmdArgs.push_back("-dynamic-linker");
6230       CmdArgs.push_back("/usr/libexec/ld.so");
6231     }
6232   }
6233 
6234   if (Output.isFilename()) {
6235     CmdArgs.push_back("-o");
6236     CmdArgs.push_back(Output.getFilename());
6237   } else {
6238     assert(Output.isNothing() && "Invalid output.");
6239   }
6240 
6241   if (!Args.hasArg(options::OPT_nostdlib) &&
6242       !Args.hasArg(options::OPT_nostartfiles)) {
6243     if (!Args.hasArg(options::OPT_shared)) {
6244       if (Args.hasArg(options::OPT_pg))
6245         CmdArgs.push_back(Args.MakeArgString(
6246                                 getToolChain().GetFilePath("gcrt0.o")));
6247       else
6248         CmdArgs.push_back(Args.MakeArgString(
6249                                 getToolChain().GetFilePath("crt0.o")));
6250       CmdArgs.push_back(Args.MakeArgString(
6251                               getToolChain().GetFilePath("crtbegin.o")));
6252     } else {
6253       CmdArgs.push_back(Args.MakeArgString(
6254                               getToolChain().GetFilePath("crtbeginS.o")));
6255     }
6256   }
6257 
6258   Args.AddAllArgs(CmdArgs, options::OPT_L);
6259   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6260   Args.AddAllArgs(CmdArgs, options::OPT_e);
6261 
6262   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6263 
6264   if (!Args.hasArg(options::OPT_nostdlib) &&
6265       !Args.hasArg(options::OPT_nodefaultlibs)) {
6266     if (D.CCCIsCXX()) {
6267       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6268       if (Args.hasArg(options::OPT_pg))
6269         CmdArgs.push_back("-lm_p");
6270       else
6271         CmdArgs.push_back("-lm");
6272     }
6273 
6274     if (Args.hasArg(options::OPT_pthread)) {
6275       if (!Args.hasArg(options::OPT_shared) &&
6276           Args.hasArg(options::OPT_pg))
6277         CmdArgs.push_back("-lpthread_p");
6278       else
6279         CmdArgs.push_back("-lpthread");
6280     }
6281 
6282     if (!Args.hasArg(options::OPT_shared)) {
6283       if (Args.hasArg(options::OPT_pg))
6284         CmdArgs.push_back("-lc_p");
6285       else
6286         CmdArgs.push_back("-lc");
6287     }
6288 
6289     StringRef MyArch;
6290     switch (getToolChain().getTriple().getArch()) {
6291     case llvm::Triple::arm:
6292       MyArch = "arm";
6293       break;
6294     case llvm::Triple::x86:
6295       MyArch = "i386";
6296       break;
6297     case llvm::Triple::x86_64:
6298       MyArch = "amd64";
6299       break;
6300     default:
6301       llvm_unreachable("Unsupported architecture");
6302     }
6303     CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
6304   }
6305 
6306   if (!Args.hasArg(options::OPT_nostdlib) &&
6307       !Args.hasArg(options::OPT_nostartfiles)) {
6308     if (!Args.hasArg(options::OPT_shared))
6309       CmdArgs.push_back(Args.MakeArgString(
6310                               getToolChain().GetFilePath("crtend.o")));
6311     else
6312       CmdArgs.push_back(Args.MakeArgString(
6313                               getToolChain().GetFilePath("crtendS.o")));
6314   }
6315 
6316   const char *Exec =
6317     Args.MakeArgString(getToolChain().GetLinkerPath());
6318   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6319 }
6320 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6321 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6322                                      const InputInfo &Output,
6323                                      const InputInfoList &Inputs,
6324                                      const ArgList &Args,
6325                                      const char *LinkingOutput) const {
6326   ArgStringList CmdArgs;
6327 
6328   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6329   // instruct as in the base system to assemble 32-bit code.
6330   if (getToolChain().getArch() == llvm::Triple::x86)
6331     CmdArgs.push_back("--32");
6332   else if (getToolChain().getArch() == llvm::Triple::ppc)
6333     CmdArgs.push_back("-a32");
6334   else if (getToolChain().getArch() == llvm::Triple::mips ||
6335            getToolChain().getArch() == llvm::Triple::mipsel ||
6336            getToolChain().getArch() == llvm::Triple::mips64 ||
6337            getToolChain().getArch() == llvm::Triple::mips64el) {
6338     StringRef CPUName;
6339     StringRef ABIName;
6340     getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6341 
6342     CmdArgs.push_back("-march");
6343     CmdArgs.push_back(CPUName.data());
6344 
6345     CmdArgs.push_back("-mabi");
6346     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6347 
6348     if (getToolChain().getArch() == llvm::Triple::mips ||
6349         getToolChain().getArch() == llvm::Triple::mips64)
6350       CmdArgs.push_back("-EB");
6351     else
6352       CmdArgs.push_back("-EL");
6353 
6354     addAssemblerKPIC(Args, CmdArgs);
6355   } else if (getToolChain().getArch() == llvm::Triple::arm ||
6356              getToolChain().getArch() == llvm::Triple::armeb ||
6357              getToolChain().getArch() == llvm::Triple::thumb ||
6358              getToolChain().getArch() == llvm::Triple::thumbeb) {
6359     const Driver &D = getToolChain().getDriver();
6360     const llvm::Triple &Triple = getToolChain().getTriple();
6361     StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6362 
6363     if (FloatABI == "hard") {
6364       CmdArgs.push_back("-mfpu=vfp");
6365     } else {
6366       CmdArgs.push_back("-mfpu=softvfp");
6367     }
6368 
6369     switch(getToolChain().getTriple().getEnvironment()) {
6370     case llvm::Triple::GNUEABIHF:
6371     case llvm::Triple::GNUEABI:
6372     case llvm::Triple::EABI:
6373       CmdArgs.push_back("-meabi=5");
6374       break;
6375 
6376     default:
6377       CmdArgs.push_back("-matpcs");
6378     }
6379   } else if (getToolChain().getArch() == llvm::Triple::sparc ||
6380              getToolChain().getArch() == llvm::Triple::sparcv9) {
6381     if (getToolChain().getArch() == llvm::Triple::sparc)
6382       CmdArgs.push_back("-Av8plusa");
6383     else
6384       CmdArgs.push_back("-Av9a");
6385 
6386     addAssemblerKPIC(Args, CmdArgs);
6387   }
6388 
6389   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6390                        options::OPT_Xassembler);
6391 
6392   CmdArgs.push_back("-o");
6393   CmdArgs.push_back(Output.getFilename());
6394 
6395   for (const auto &II : Inputs)
6396     CmdArgs.push_back(II.getFilename());
6397 
6398   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6399   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6400 }
6401 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6402 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6403                                  const InputInfo &Output,
6404                                  const InputInfoList &Inputs,
6405                                  const ArgList &Args,
6406                                  const char *LinkingOutput) const {
6407   const toolchains::FreeBSD& ToolChain =
6408     static_cast<const toolchains::FreeBSD&>(getToolChain());
6409   const Driver &D = ToolChain.getDriver();
6410   const bool IsPIE =
6411     !Args.hasArg(options::OPT_shared) &&
6412     (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
6413   ArgStringList CmdArgs;
6414 
6415   // Silence warning for "clang -g foo.o -o foo"
6416   Args.ClaimAllArgs(options::OPT_g_Group);
6417   // and "clang -emit-llvm foo.o -o foo"
6418   Args.ClaimAllArgs(options::OPT_emit_llvm);
6419   // and for "clang -w foo.o -o foo". Other warning options are already
6420   // handled somewhere else.
6421   Args.ClaimAllArgs(options::OPT_w);
6422 
6423   if (!D.SysRoot.empty())
6424     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6425 
6426   if (IsPIE)
6427     CmdArgs.push_back("-pie");
6428 
6429   if (Args.hasArg(options::OPT_static)) {
6430     CmdArgs.push_back("-Bstatic");
6431   } else {
6432     if (Args.hasArg(options::OPT_rdynamic))
6433       CmdArgs.push_back("-export-dynamic");
6434     CmdArgs.push_back("--eh-frame-hdr");
6435     if (Args.hasArg(options::OPT_shared)) {
6436       CmdArgs.push_back("-Bshareable");
6437     } else {
6438       CmdArgs.push_back("-dynamic-linker");
6439       CmdArgs.push_back("/libexec/ld-elf.so.1");
6440     }
6441     if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6442       llvm::Triple::ArchType Arch = ToolChain.getArch();
6443       if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6444           Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6445         CmdArgs.push_back("--hash-style=both");
6446       }
6447     }
6448     CmdArgs.push_back("--enable-new-dtags");
6449   }
6450 
6451   // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6452   // instruct ld in the base system to link 32-bit code.
6453   if (ToolChain.getArch() == llvm::Triple::x86) {
6454     CmdArgs.push_back("-m");
6455     CmdArgs.push_back("elf_i386_fbsd");
6456   }
6457 
6458   if (ToolChain.getArch() == llvm::Triple::ppc) {
6459     CmdArgs.push_back("-m");
6460     CmdArgs.push_back("elf32ppc_fbsd");
6461   }
6462 
6463   if (Output.isFilename()) {
6464     CmdArgs.push_back("-o");
6465     CmdArgs.push_back(Output.getFilename());
6466   } else {
6467     assert(Output.isNothing() && "Invalid output.");
6468   }
6469 
6470   if (!Args.hasArg(options::OPT_nostdlib) &&
6471       !Args.hasArg(options::OPT_nostartfiles)) {
6472     const char *crt1 = nullptr;
6473     if (!Args.hasArg(options::OPT_shared)) {
6474       if (Args.hasArg(options::OPT_pg))
6475         crt1 = "gcrt1.o";
6476       else if (IsPIE)
6477         crt1 = "Scrt1.o";
6478       else
6479         crt1 = "crt1.o";
6480     }
6481     if (crt1)
6482       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6483 
6484     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6485 
6486     const char *crtbegin = nullptr;
6487     if (Args.hasArg(options::OPT_static))
6488       crtbegin = "crtbeginT.o";
6489     else if (Args.hasArg(options::OPT_shared) || IsPIE)
6490       crtbegin = "crtbeginS.o";
6491     else
6492       crtbegin = "crtbegin.o";
6493 
6494     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
6495   }
6496 
6497   Args.AddAllArgs(CmdArgs, options::OPT_L);
6498   const ToolChain::path_list Paths = ToolChain.getFilePaths();
6499   for (const auto &Path : Paths)
6500     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
6501   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6502   Args.AddAllArgs(CmdArgs, options::OPT_e);
6503   Args.AddAllArgs(CmdArgs, options::OPT_s);
6504   Args.AddAllArgs(CmdArgs, options::OPT_t);
6505   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6506   Args.AddAllArgs(CmdArgs, options::OPT_r);
6507 
6508   if (D.IsUsingLTO(Args))
6509     AddGoldPlugin(ToolChain, Args, CmdArgs);
6510 
6511   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6512 
6513   if (!Args.hasArg(options::OPT_nostdlib) &&
6514       !Args.hasArg(options::OPT_nodefaultlibs)) {
6515     if (D.CCCIsCXX()) {
6516       ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6517       if (Args.hasArg(options::OPT_pg))
6518         CmdArgs.push_back("-lm_p");
6519       else
6520         CmdArgs.push_back("-lm");
6521     }
6522     // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6523     // the default system libraries. Just mimic this for now.
6524     if (Args.hasArg(options::OPT_pg))
6525       CmdArgs.push_back("-lgcc_p");
6526     else
6527       CmdArgs.push_back("-lgcc");
6528     if (Args.hasArg(options::OPT_static)) {
6529       CmdArgs.push_back("-lgcc_eh");
6530     } else if (Args.hasArg(options::OPT_pg)) {
6531       CmdArgs.push_back("-lgcc_eh_p");
6532     } else {
6533       CmdArgs.push_back("--as-needed");
6534       CmdArgs.push_back("-lgcc_s");
6535       CmdArgs.push_back("--no-as-needed");
6536     }
6537 
6538     if (Args.hasArg(options::OPT_pthread)) {
6539       if (Args.hasArg(options::OPT_pg))
6540         CmdArgs.push_back("-lpthread_p");
6541       else
6542         CmdArgs.push_back("-lpthread");
6543     }
6544 
6545     if (Args.hasArg(options::OPT_pg)) {
6546       if (Args.hasArg(options::OPT_shared))
6547         CmdArgs.push_back("-lc");
6548       else
6549         CmdArgs.push_back("-lc_p");
6550       CmdArgs.push_back("-lgcc_p");
6551     } else {
6552       CmdArgs.push_back("-lc");
6553       CmdArgs.push_back("-lgcc");
6554     }
6555 
6556     if (Args.hasArg(options::OPT_static)) {
6557       CmdArgs.push_back("-lgcc_eh");
6558     } else if (Args.hasArg(options::OPT_pg)) {
6559       CmdArgs.push_back("-lgcc_eh_p");
6560     } else {
6561       CmdArgs.push_back("--as-needed");
6562       CmdArgs.push_back("-lgcc_s");
6563       CmdArgs.push_back("--no-as-needed");
6564     }
6565   }
6566 
6567   if (!Args.hasArg(options::OPT_nostdlib) &&
6568       !Args.hasArg(options::OPT_nostartfiles)) {
6569     if (Args.hasArg(options::OPT_shared) || IsPIE)
6570       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
6571     else
6572       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6573     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6574   }
6575 
6576   addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6577 
6578   addProfileRT(ToolChain, Args, CmdArgs);
6579 
6580   const char *Exec =
6581     Args.MakeArgString(getToolChain().GetLinkerPath());
6582   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6583 }
6584 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6585 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6586                                      const InputInfo &Output,
6587                                      const InputInfoList &Inputs,
6588                                      const ArgList &Args,
6589                                      const char *LinkingOutput) const {
6590   ArgStringList CmdArgs;
6591 
6592   // GNU as needs different flags for creating the correct output format
6593   // on architectures with different ABIs or optional feature sets.
6594   switch (getToolChain().getArch()) {
6595   case llvm::Triple::x86:
6596     CmdArgs.push_back("--32");
6597     break;
6598   case llvm::Triple::arm:
6599   case llvm::Triple::armeb:
6600   case llvm::Triple::thumb:
6601   case llvm::Triple::thumbeb: {
6602     std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
6603     CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6604     break;
6605   }
6606 
6607   case llvm::Triple::mips:
6608   case llvm::Triple::mipsel:
6609   case llvm::Triple::mips64:
6610   case llvm::Triple::mips64el: {
6611     StringRef CPUName;
6612     StringRef ABIName;
6613     getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6614 
6615     CmdArgs.push_back("-march");
6616     CmdArgs.push_back(CPUName.data());
6617 
6618     CmdArgs.push_back("-mabi");
6619     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6620 
6621     if (getToolChain().getArch() == llvm::Triple::mips ||
6622         getToolChain().getArch() == llvm::Triple::mips64)
6623       CmdArgs.push_back("-EB");
6624     else
6625       CmdArgs.push_back("-EL");
6626 
6627     addAssemblerKPIC(Args, CmdArgs);
6628     break;
6629   }
6630 
6631   case llvm::Triple::sparc:
6632     CmdArgs.push_back("-32");
6633     addAssemblerKPIC(Args, CmdArgs);
6634     break;
6635 
6636   case llvm::Triple::sparcv9:
6637     CmdArgs.push_back("-64");
6638     CmdArgs.push_back("-Av9");
6639     addAssemblerKPIC(Args, CmdArgs);
6640     break;
6641 
6642   default:
6643     break;
6644   }
6645 
6646   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6647                        options::OPT_Xassembler);
6648 
6649   CmdArgs.push_back("-o");
6650   CmdArgs.push_back(Output.getFilename());
6651 
6652   for (const auto &II : Inputs)
6653     CmdArgs.push_back(II.getFilename());
6654 
6655   const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
6656   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6657 }
6658 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6659 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6660                                  const InputInfo &Output,
6661                                  const InputInfoList &Inputs,
6662                                  const ArgList &Args,
6663                                  const char *LinkingOutput) const {
6664   const Driver &D = getToolChain().getDriver();
6665   ArgStringList CmdArgs;
6666 
6667   if (!D.SysRoot.empty())
6668     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6669 
6670   CmdArgs.push_back("--eh-frame-hdr");
6671   if (Args.hasArg(options::OPT_static)) {
6672     CmdArgs.push_back("-Bstatic");
6673   } else {
6674     if (Args.hasArg(options::OPT_rdynamic))
6675       CmdArgs.push_back("-export-dynamic");
6676     if (Args.hasArg(options::OPT_shared)) {
6677       CmdArgs.push_back("-Bshareable");
6678     } else {
6679       CmdArgs.push_back("-dynamic-linker");
6680       CmdArgs.push_back("/libexec/ld.elf_so");
6681     }
6682   }
6683 
6684   // Many NetBSD architectures support more than one ABI.
6685   // Determine the correct emulation for ld.
6686   switch (getToolChain().getArch()) {
6687   case llvm::Triple::x86:
6688     CmdArgs.push_back("-m");
6689     CmdArgs.push_back("elf_i386");
6690     break;
6691   case llvm::Triple::arm:
6692   case llvm::Triple::armeb:
6693   case llvm::Triple::thumb:
6694   case llvm::Triple::thumbeb:
6695     CmdArgs.push_back("-m");
6696     switch (getToolChain().getTriple().getEnvironment()) {
6697     case llvm::Triple::EABI:
6698     case llvm::Triple::GNUEABI:
6699       CmdArgs.push_back("armelf_nbsd_eabi");
6700       break;
6701     case llvm::Triple::EABIHF:
6702     case llvm::Triple::GNUEABIHF:
6703       CmdArgs.push_back("armelf_nbsd_eabihf");
6704       break;
6705     default:
6706       CmdArgs.push_back("armelf_nbsd");
6707       break;
6708     }
6709     break;
6710   case llvm::Triple::mips64:
6711   case llvm::Triple::mips64el:
6712     if (mips::hasMipsAbiArg(Args, "32")) {
6713       CmdArgs.push_back("-m");
6714       if (getToolChain().getArch() == llvm::Triple::mips64)
6715         CmdArgs.push_back("elf32btsmip");
6716       else
6717         CmdArgs.push_back("elf32ltsmip");
6718    } else if (mips::hasMipsAbiArg(Args, "64")) {
6719      CmdArgs.push_back("-m");
6720      if (getToolChain().getArch() == llvm::Triple::mips64)
6721        CmdArgs.push_back("elf64btsmip");
6722      else
6723        CmdArgs.push_back("elf64ltsmip");
6724    }
6725    break;
6726 
6727   case llvm::Triple::sparc:
6728     CmdArgs.push_back("-m");
6729     CmdArgs.push_back("elf32_sparc");
6730     break;
6731 
6732   case llvm::Triple::sparcv9:
6733     CmdArgs.push_back("-m");
6734     CmdArgs.push_back("elf64_sparc");
6735     break;
6736 
6737   default:
6738     break;
6739   }
6740 
6741   if (Output.isFilename()) {
6742     CmdArgs.push_back("-o");
6743     CmdArgs.push_back(Output.getFilename());
6744   } else {
6745     assert(Output.isNothing() && "Invalid output.");
6746   }
6747 
6748   if (!Args.hasArg(options::OPT_nostdlib) &&
6749       !Args.hasArg(options::OPT_nostartfiles)) {
6750     if (!Args.hasArg(options::OPT_shared)) {
6751       CmdArgs.push_back(Args.MakeArgString(
6752                               getToolChain().GetFilePath("crt0.o")));
6753       CmdArgs.push_back(Args.MakeArgString(
6754                               getToolChain().GetFilePath("crti.o")));
6755       CmdArgs.push_back(Args.MakeArgString(
6756                               getToolChain().GetFilePath("crtbegin.o")));
6757     } else {
6758       CmdArgs.push_back(Args.MakeArgString(
6759                               getToolChain().GetFilePath("crti.o")));
6760       CmdArgs.push_back(Args.MakeArgString(
6761                               getToolChain().GetFilePath("crtbeginS.o")));
6762     }
6763   }
6764 
6765   Args.AddAllArgs(CmdArgs, options::OPT_L);
6766   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6767   Args.AddAllArgs(CmdArgs, options::OPT_e);
6768   Args.AddAllArgs(CmdArgs, options::OPT_s);
6769   Args.AddAllArgs(CmdArgs, options::OPT_t);
6770   Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6771   Args.AddAllArgs(CmdArgs, options::OPT_r);
6772 
6773   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6774 
6775   unsigned Major, Minor, Micro;
6776   getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6777   bool useLibgcc = true;
6778   if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 40) || Major == 0) {
6779     switch(getToolChain().getArch()) {
6780     case llvm::Triple::arm:
6781     case llvm::Triple::armeb:
6782     case llvm::Triple::thumb:
6783     case llvm::Triple::thumbeb:
6784     case llvm::Triple::x86:
6785     case llvm::Triple::x86_64:
6786       useLibgcc = false;
6787       break;
6788     default:
6789       break;
6790     }
6791   }
6792 
6793   if (!Args.hasArg(options::OPT_nostdlib) &&
6794       !Args.hasArg(options::OPT_nodefaultlibs)) {
6795     if (D.CCCIsCXX()) {
6796       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6797       CmdArgs.push_back("-lm");
6798     }
6799     if (Args.hasArg(options::OPT_pthread))
6800       CmdArgs.push_back("-lpthread");
6801     CmdArgs.push_back("-lc");
6802 
6803     if (useLibgcc) {
6804       if (Args.hasArg(options::OPT_static)) {
6805         // libgcc_eh depends on libc, so resolve as much as possible,
6806         // pull in any new requirements from libc and then get the rest
6807         // of libgcc.
6808         CmdArgs.push_back("-lgcc_eh");
6809         CmdArgs.push_back("-lc");
6810         CmdArgs.push_back("-lgcc");
6811       } else {
6812         CmdArgs.push_back("-lgcc");
6813         CmdArgs.push_back("--as-needed");
6814         CmdArgs.push_back("-lgcc_s");
6815         CmdArgs.push_back("--no-as-needed");
6816       }
6817     }
6818   }
6819 
6820   if (!Args.hasArg(options::OPT_nostdlib) &&
6821       !Args.hasArg(options::OPT_nostartfiles)) {
6822     if (!Args.hasArg(options::OPT_shared))
6823       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6824                                                                   "crtend.o")));
6825     else
6826       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6827                                                                  "crtendS.o")));
6828     CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6829                                                                     "crtn.o")));
6830   }
6831 
6832   addProfileRT(getToolChain(), Args, CmdArgs);
6833 
6834   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
6835   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6836 }
6837 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6838 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6839                                       const InputInfo &Output,
6840                                       const InputInfoList &Inputs,
6841                                       const ArgList &Args,
6842                                       const char *LinkingOutput) const {
6843   ArgStringList CmdArgs;
6844   bool NeedsKPIC = false;
6845 
6846   // Add --32/--64 to make sure we get the format we want.
6847   // This is incomplete
6848   if (getToolChain().getArch() == llvm::Triple::x86) {
6849     CmdArgs.push_back("--32");
6850   } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6851     if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
6852       CmdArgs.push_back("--x32");
6853     else
6854       CmdArgs.push_back("--64");
6855   } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6856     CmdArgs.push_back("-a32");
6857     CmdArgs.push_back("-mppc");
6858     CmdArgs.push_back("-many");
6859   } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6860     CmdArgs.push_back("-a64");
6861     CmdArgs.push_back("-mppc64");
6862     CmdArgs.push_back("-many");
6863   } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6864     CmdArgs.push_back("-a64");
6865     CmdArgs.push_back("-mppc64");
6866     CmdArgs.push_back("-many");
6867     CmdArgs.push_back("-mlittle-endian");
6868   } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6869     CmdArgs.push_back("-32");
6870     CmdArgs.push_back("-Av8plusa");
6871     NeedsKPIC = true;
6872   } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6873     CmdArgs.push_back("-64");
6874     CmdArgs.push_back("-Av9a");
6875     NeedsKPIC = true;
6876   } else if (getToolChain().getArch() == llvm::Triple::arm ||
6877              getToolChain().getArch() == llvm::Triple::armeb) {
6878     StringRef MArch = getToolChain().getArchName();
6879     if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6880       CmdArgs.push_back("-mfpu=neon");
6881     if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6882         MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
6883       CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
6884 
6885     StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6886         getToolChain().getDriver(), Args, getToolChain().getTriple());
6887     CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
6888 
6889     Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6890 
6891     // FIXME: remove krait check when GNU tools support krait cpu
6892     // for now replace it with -march=armv7-a  to avoid a lower
6893     // march from being picked in the absence of a cpu flag.
6894     Arg *A;
6895     if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6896       StringRef(A->getValue()) == "krait")
6897         CmdArgs.push_back("-march=armv7-a");
6898     else
6899       Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6900     Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
6901   } else if (getToolChain().getArch() == llvm::Triple::mips ||
6902              getToolChain().getArch() == llvm::Triple::mipsel ||
6903              getToolChain().getArch() == llvm::Triple::mips64 ||
6904              getToolChain().getArch() == llvm::Triple::mips64el) {
6905     StringRef CPUName;
6906     StringRef ABIName;
6907     getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6908 
6909     CmdArgs.push_back("-march");
6910     CmdArgs.push_back(CPUName.data());
6911 
6912     CmdArgs.push_back("-mabi");
6913     CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6914 
6915     if (getToolChain().getArch() == llvm::Triple::mips ||
6916         getToolChain().getArch() == llvm::Triple::mips64)
6917       CmdArgs.push_back("-EB");
6918     else
6919       CmdArgs.push_back("-EL");
6920 
6921     if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6922       if (StringRef(A->getValue()) == "2008")
6923         CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6924     }
6925 
6926     Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
6927     Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6928     Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6929                     options::OPT_mno_micromips);
6930     Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6931     Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6932 
6933     if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6934       // Do not use AddLastArg because not all versions of MIPS assembler
6935       // support -mmsa / -mno-msa options.
6936       if (A->getOption().matches(options::OPT_mmsa))
6937         CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6938     }
6939 
6940     NeedsKPIC = true;
6941   } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6942     // Always pass an -march option, since our default of z10 is later
6943     // than the GNU assembler's default.
6944     StringRef CPUName = getSystemZTargetCPU(Args);
6945     CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6946   }
6947 
6948   if (NeedsKPIC)
6949     addAssemblerKPIC(Args, CmdArgs);
6950 
6951   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6952                        options::OPT_Xassembler);
6953 
6954   CmdArgs.push_back("-o");
6955   CmdArgs.push_back(Output.getFilename());
6956 
6957   for (const auto &II : Inputs)
6958     CmdArgs.push_back(II.getFilename());
6959 
6960   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6961   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6962 
6963   // Handle the debug info splitting at object creation time if we're
6964   // creating an object.
6965   // TODO: Currently only works on linux with newer objcopy.
6966   if (Args.hasArg(options::OPT_gsplit_dwarf) &&
6967       getToolChain().getTriple().isOSLinux())
6968     SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6969                    SplitDebugName(Args, Inputs));
6970 }
6971 
AddLibgcc(const llvm::Triple & Triple,const Driver & D,ArgStringList & CmdArgs,const ArgList & Args)6972 static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
6973                       ArgStringList &CmdArgs, const ArgList &Args) {
6974   bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
6975   bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6976                       Args.hasArg(options::OPT_static);
6977   if (!D.CCCIsCXX())
6978     CmdArgs.push_back("-lgcc");
6979 
6980   if (StaticLibgcc || isAndroid) {
6981     if (D.CCCIsCXX())
6982       CmdArgs.push_back("-lgcc");
6983   } else {
6984     if (!D.CCCIsCXX())
6985       CmdArgs.push_back("--as-needed");
6986     CmdArgs.push_back("-lgcc_s");
6987     if (!D.CCCIsCXX())
6988       CmdArgs.push_back("--no-as-needed");
6989   }
6990 
6991   if (StaticLibgcc && !isAndroid)
6992     CmdArgs.push_back("-lgcc_eh");
6993   else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
6994     CmdArgs.push_back("-lgcc");
6995 
6996   // According to Android ABI, we have to link with libdl if we are
6997   // linking with non-static libgcc.
6998   //
6999   // NOTE: This fixes a link error on Android MIPS as well.  The non-static
7000   // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7001   if (isAndroid && !StaticLibgcc)
7002     CmdArgs.push_back("-ldl");
7003 }
7004 
getLinuxDynamicLinker(const ArgList & Args,const toolchains::Linux & ToolChain)7005 static StringRef getLinuxDynamicLinker(const ArgList &Args,
7006                                        const toolchains::Linux &ToolChain) {
7007   if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7008     if (ToolChain.getTriple().isArch64Bit())
7009       return "/system/bin/linker64";
7010     else
7011       return "/system/bin/linker";
7012   } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7013              ToolChain.getArch() == llvm::Triple::sparc)
7014     return "/lib/ld-linux.so.2";
7015   else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7016            ToolChain.getArch() == llvm::Triple::arm64)
7017     return "/lib/ld-linux-aarch64.so.1";
7018   else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7019            ToolChain.getArch() == llvm::Triple::arm64_be)
7020     return "/lib/ld-linux-aarch64_be.so.1";
7021   else if (ToolChain.getArch() == llvm::Triple::arm ||
7022            ToolChain.getArch() == llvm::Triple::thumb) {
7023     if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7024       return "/lib/ld-linux-armhf.so.3";
7025     else
7026       return "/lib/ld-linux.so.3";
7027   } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7028              ToolChain.getArch() == llvm::Triple::thumbeb) {
7029     if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7030       return "/lib/ld-linux-armhf.so.3";        /* TODO: check which dynamic linker name.  */
7031     else
7032       return "/lib/ld-linux.so.3";              /* TODO: check which dynamic linker name.  */
7033   } else if (ToolChain.getArch() == llvm::Triple::mips ||
7034              ToolChain.getArch() == llvm::Triple::mipsel) {
7035     if (mips::isNaN2008(Args, ToolChain.getTriple()))
7036       return "/lib/ld-linux-mipsn8.so.1";
7037     return "/lib/ld.so.1";
7038   } else if (ToolChain.getArch() == llvm::Triple::mips64 ||
7039              ToolChain.getArch() == llvm::Triple::mips64el) {
7040     if (mips::hasMipsAbiArg(Args, "n32"))
7041       return mips::isNaN2008(Args, ToolChain.getTriple())
7042                  ? "/lib32/ld-linux-mipsn8.so.1" : "/lib32/ld.so.1";
7043     return mips::isNaN2008(Args, ToolChain.getTriple())
7044                ? "/lib64/ld-linux-mipsn8.so.1" : "/lib64/ld.so.1";
7045   } else if (ToolChain.getArch() == llvm::Triple::ppc)
7046     return "/lib/ld.so.1";
7047   else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7048            ToolChain.getArch() == llvm::Triple::systemz)
7049     return "/lib64/ld64.so.1";
7050   else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7051     return "/lib64/ld64.so.2";
7052   else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7053     return "/lib64/ld-linux.so.2";
7054   else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7055            ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7056     return "/libx32/ld-linux-x32.so.2";
7057   else
7058     return "/lib64/ld-linux-x86-64.so.2";
7059 }
7060 
AddRunTimeLibs(const ToolChain & TC,const Driver & D,ArgStringList & CmdArgs,const ArgList & Args)7061 static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7062                       ArgStringList &CmdArgs, const ArgList &Args) {
7063   // Make use of compiler-rt if --rtlib option is used
7064   ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7065 
7066   switch(RLT) {
7067   case ToolChain::RLT_CompilerRT:
7068     addClangRTLinux(TC, Args, CmdArgs);
7069     break;
7070   case ToolChain::RLT_Libgcc:
7071     AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7072     break;
7073   }
7074 }
7075 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7076 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7077                                   const InputInfo &Output,
7078                                   const InputInfoList &Inputs,
7079                                   const ArgList &Args,
7080                                   const char *LinkingOutput) const {
7081   const toolchains::Linux& ToolChain =
7082     static_cast<const toolchains::Linux&>(getToolChain());
7083   const Driver &D = ToolChain.getDriver();
7084   const bool isAndroid =
7085     ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
7086   const bool IsPIE =
7087     !Args.hasArg(options::OPT_shared) &&
7088     !Args.hasArg(options::OPT_static) &&
7089     (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7090      // On Android every code is PIC so every executable is PIE
7091      // Cannot use isPIEDefault here since otherwise
7092      // PIE only logic will be enabled during compilation
7093      isAndroid);
7094 
7095   ArgStringList CmdArgs;
7096 
7097   // Silence warning for "clang -g foo.o -o foo"
7098   Args.ClaimAllArgs(options::OPT_g_Group);
7099   // and "clang -emit-llvm foo.o -o foo"
7100   Args.ClaimAllArgs(options::OPT_emit_llvm);
7101   // and for "clang -w foo.o -o foo". Other warning options are already
7102   // handled somewhere else.
7103   Args.ClaimAllArgs(options::OPT_w);
7104 
7105   if (!D.SysRoot.empty())
7106     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7107 
7108   if (IsPIE)
7109     CmdArgs.push_back("-pie");
7110 
7111   if (Args.hasArg(options::OPT_rdynamic))
7112     CmdArgs.push_back("-export-dynamic");
7113 
7114   if (Args.hasArg(options::OPT_s))
7115     CmdArgs.push_back("-s");
7116 
7117   for (const auto &Opt : ToolChain.ExtraOpts)
7118     CmdArgs.push_back(Opt.c_str());
7119 
7120   if (!Args.hasArg(options::OPT_static)) {
7121     CmdArgs.push_back("--eh-frame-hdr");
7122   }
7123 
7124   CmdArgs.push_back("-m");
7125   if (ToolChain.getArch() == llvm::Triple::x86)
7126     CmdArgs.push_back("elf_i386");
7127   else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7128            ToolChain.getArch() == llvm::Triple::arm64)
7129     CmdArgs.push_back("aarch64linux");
7130   else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7131            ToolChain.getArch() == llvm::Triple::arm64_be)
7132     CmdArgs.push_back("aarch64_be_linux");
7133   else if (ToolChain.getArch() == llvm::Triple::arm
7134            ||  ToolChain.getArch() == llvm::Triple::thumb)
7135     CmdArgs.push_back("armelf_linux_eabi");
7136   else if (ToolChain.getArch() == llvm::Triple::armeb
7137            ||  ToolChain.getArch() == llvm::Triple::thumbeb)
7138     CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME.  */
7139   else if (ToolChain.getArch() == llvm::Triple::ppc)
7140     CmdArgs.push_back("elf32ppclinux");
7141   else if (ToolChain.getArch() == llvm::Triple::ppc64)
7142     CmdArgs.push_back("elf64ppc");
7143   else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7144     CmdArgs.push_back("elf64lppc");
7145   else if (ToolChain.getArch() == llvm::Triple::sparc)
7146     CmdArgs.push_back("elf32_sparc");
7147   else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7148     CmdArgs.push_back("elf64_sparc");
7149   else if (ToolChain.getArch() == llvm::Triple::mips)
7150     CmdArgs.push_back("elf32btsmip");
7151   else if (ToolChain.getArch() == llvm::Triple::mipsel)
7152     CmdArgs.push_back("elf32ltsmip");
7153   else if (ToolChain.getArch() == llvm::Triple::mips64) {
7154     if (mips::hasMipsAbiArg(Args, "n32"))
7155       CmdArgs.push_back("elf32btsmipn32");
7156     else
7157       CmdArgs.push_back("elf64btsmip");
7158   }
7159   else if (ToolChain.getArch() == llvm::Triple::mips64el) {
7160     if (mips::hasMipsAbiArg(Args, "n32"))
7161       CmdArgs.push_back("elf32ltsmipn32");
7162     else
7163       CmdArgs.push_back("elf64ltsmip");
7164   }
7165   else if (ToolChain.getArch() == llvm::Triple::systemz)
7166     CmdArgs.push_back("elf64_s390");
7167   else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7168            ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7169     CmdArgs.push_back("elf32_x86_64");
7170   else
7171     CmdArgs.push_back("elf_x86_64");
7172 
7173   if (Args.hasArg(options::OPT_static)) {
7174     if (ToolChain.getArch() == llvm::Triple::arm ||
7175         ToolChain.getArch() == llvm::Triple::armeb ||
7176         ToolChain.getArch() == llvm::Triple::thumb ||
7177         ToolChain.getArch() == llvm::Triple::thumbeb)
7178       CmdArgs.push_back("-Bstatic");
7179     else
7180       CmdArgs.push_back("-static");
7181   } else if (Args.hasArg(options::OPT_shared)) {
7182     CmdArgs.push_back("-shared");
7183   }
7184 
7185   if (ToolChain.getArch() == llvm::Triple::arm ||
7186       ToolChain.getArch() == llvm::Triple::armeb ||
7187       ToolChain.getArch() == llvm::Triple::thumb ||
7188       ToolChain.getArch() == llvm::Triple::thumbeb ||
7189       (!Args.hasArg(options::OPT_static) &&
7190        !Args.hasArg(options::OPT_shared))) {
7191     CmdArgs.push_back("-dynamic-linker");
7192     CmdArgs.push_back(Args.MakeArgString(
7193         D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7194   }
7195 
7196   CmdArgs.push_back("-o");
7197   CmdArgs.push_back(Output.getFilename());
7198 
7199   if (!Args.hasArg(options::OPT_nostdlib) &&
7200       !Args.hasArg(options::OPT_nostartfiles)) {
7201     if (!isAndroid) {
7202       const char *crt1 = nullptr;
7203       if (!Args.hasArg(options::OPT_shared)){
7204         if (Args.hasArg(options::OPT_pg))
7205           crt1 = "gcrt1.o";
7206         else if (IsPIE)
7207           crt1 = "Scrt1.o";
7208         else
7209           crt1 = "crt1.o";
7210       }
7211       if (crt1)
7212         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7213 
7214       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7215     }
7216 
7217     const char *crtbegin;
7218     if (Args.hasArg(options::OPT_static))
7219       crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
7220     else if (Args.hasArg(options::OPT_shared))
7221       crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
7222     else if (IsPIE)
7223       crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
7224     else
7225       crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
7226     CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
7227 
7228     // Add crtfastmath.o if available and fast math is enabled.
7229     ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
7230   }
7231 
7232   Args.AddAllArgs(CmdArgs, options::OPT_L);
7233   Args.AddAllArgs(CmdArgs, options::OPT_u);
7234 
7235   const ToolChain::path_list Paths = ToolChain.getFilePaths();
7236 
7237   for (const auto &Path : Paths)
7238     CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
7239 
7240   if (D.IsUsingLTO(Args))
7241     AddGoldPlugin(ToolChain, Args, CmdArgs);
7242 
7243   if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7244     CmdArgs.push_back("--no-demangle");
7245 
7246   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7247 
7248   addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
7249   // The profile runtime also needs access to system libraries.
7250   addProfileRT(getToolChain(), Args, CmdArgs);
7251 
7252   if (D.CCCIsCXX() &&
7253       !Args.hasArg(options::OPT_nostdlib) &&
7254       !Args.hasArg(options::OPT_nodefaultlibs)) {
7255     bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7256       !Args.hasArg(options::OPT_static);
7257     if (OnlyLibstdcxxStatic)
7258       CmdArgs.push_back("-Bstatic");
7259     ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7260     if (OnlyLibstdcxxStatic)
7261       CmdArgs.push_back("-Bdynamic");
7262     CmdArgs.push_back("-lm");
7263   }
7264 
7265   if (!Args.hasArg(options::OPT_nostdlib)) {
7266     if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7267       if (Args.hasArg(options::OPT_static))
7268         CmdArgs.push_back("--start-group");
7269 
7270       LibOpenMP UsedOpenMPLib = LibUnknown;
7271       if (Args.hasArg(options::OPT_fopenmp)) {
7272         UsedOpenMPLib = LibGOMP;
7273       } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7274         UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7275             .Case("libgomp",  LibGOMP)
7276             .Case("libiomp5", LibIOMP5)
7277             .Default(LibUnknown);
7278         if (UsedOpenMPLib == LibUnknown)
7279           D.Diag(diag::err_drv_unsupported_option_argument)
7280             << A->getOption().getName() << A->getValue();
7281       }
7282       switch (UsedOpenMPLib) {
7283       case LibGOMP:
7284         CmdArgs.push_back("-lgomp");
7285 
7286         // FIXME: Exclude this for platforms with libgomp that don't require
7287         // librt. Most modern Linux platforms require it, but some may not.
7288         CmdArgs.push_back("-lrt");
7289         break;
7290       case LibIOMP5:
7291         CmdArgs.push_back("-liomp5");
7292         break;
7293       case LibUnknown:
7294         break;
7295       }
7296       AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
7297 
7298       if ((Args.hasArg(options::OPT_pthread) ||
7299            Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7300           !isAndroid)
7301         CmdArgs.push_back("-lpthread");
7302 
7303       CmdArgs.push_back("-lc");
7304 
7305       if (Args.hasArg(options::OPT_static))
7306         CmdArgs.push_back("--end-group");
7307       else
7308         AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
7309     }
7310 
7311     if (!Args.hasArg(options::OPT_nostartfiles)) {
7312       const char *crtend;
7313       if (Args.hasArg(options::OPT_shared))
7314         crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
7315       else if (IsPIE)
7316         crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
7317       else
7318         crtend = isAndroid ? "crtend_android.o" : "crtend.o";
7319 
7320       CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
7321       if (!isAndroid)
7322         CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
7323     }
7324   }
7325 
7326   C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7327 }
7328 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7329 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7330                                    const InputInfo &Output,
7331                                    const InputInfoList &Inputs,
7332                                    const ArgList &Args,
7333                                    const char *LinkingOutput) const {
7334   ArgStringList CmdArgs;
7335 
7336   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
7337 
7338   CmdArgs.push_back("-o");
7339   CmdArgs.push_back(Output.getFilename());
7340 
7341   for (const auto &II : Inputs)
7342     CmdArgs.push_back(II.getFilename());
7343 
7344   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
7345   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7346 }
7347 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7348 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
7349                                const InputInfo &Output,
7350                                const InputInfoList &Inputs,
7351                                const ArgList &Args,
7352                                const char *LinkingOutput) const {
7353   const Driver &D = getToolChain().getDriver();
7354   ArgStringList CmdArgs;
7355 
7356   if (Output.isFilename()) {
7357     CmdArgs.push_back("-o");
7358     CmdArgs.push_back(Output.getFilename());
7359   } else {
7360     assert(Output.isNothing() && "Invalid output.");
7361   }
7362 
7363   if (!Args.hasArg(options::OPT_nostdlib) &&
7364       !Args.hasArg(options::OPT_nostartfiles)) {
7365       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7366       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7367       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7368       CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7369   }
7370 
7371   Args.AddAllArgs(CmdArgs, options::OPT_L);
7372   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7373   Args.AddAllArgs(CmdArgs, options::OPT_e);
7374 
7375   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7376 
7377   addProfileRT(getToolChain(), Args, CmdArgs);
7378 
7379   if (!Args.hasArg(options::OPT_nostdlib) &&
7380       !Args.hasArg(options::OPT_nodefaultlibs)) {
7381     if (D.CCCIsCXX()) {
7382       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7383       CmdArgs.push_back("-lm");
7384     }
7385   }
7386 
7387   if (!Args.hasArg(options::OPT_nostdlib) &&
7388       !Args.hasArg(options::OPT_nostartfiles)) {
7389     if (Args.hasArg(options::OPT_pthread))
7390       CmdArgs.push_back("-lpthread");
7391     CmdArgs.push_back("-lc");
7392     CmdArgs.push_back("-lCompilerRT-Generic");
7393     CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7394     CmdArgs.push_back(
7395          Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
7396   }
7397 
7398   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7399   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7400 }
7401 
7402 /// DragonFly Tools
7403 
7404 // For now, DragonFly Assemble does just about the same as for
7405 // FreeBSD, but this may change soon.
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7406 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7407                                        const InputInfo &Output,
7408                                        const InputInfoList &Inputs,
7409                                        const ArgList &Args,
7410                                        const char *LinkingOutput) const {
7411   ArgStringList CmdArgs;
7412 
7413   // When building 32-bit code on DragonFly/pc64, we have to explicitly
7414   // instruct as in the base system to assemble 32-bit code.
7415   if (getToolChain().getArch() == llvm::Triple::x86)
7416     CmdArgs.push_back("--32");
7417 
7418   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
7419 
7420   CmdArgs.push_back("-o");
7421   CmdArgs.push_back(Output.getFilename());
7422 
7423   for (const auto &II : Inputs)
7424     CmdArgs.push_back(II.getFilename());
7425 
7426   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
7427   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7428 }
7429 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7430 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
7431                                    const InputInfo &Output,
7432                                    const InputInfoList &Inputs,
7433                                    const ArgList &Args,
7434                                    const char *LinkingOutput) const {
7435   bool UseGCC47 = false;
7436   const Driver &D = getToolChain().getDriver();
7437   ArgStringList CmdArgs;
7438 
7439   if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7440     UseGCC47 = false;
7441 
7442   if (!D.SysRoot.empty())
7443     CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7444 
7445   CmdArgs.push_back("--eh-frame-hdr");
7446   if (Args.hasArg(options::OPT_static)) {
7447     CmdArgs.push_back("-Bstatic");
7448   } else {
7449     if (Args.hasArg(options::OPT_rdynamic))
7450       CmdArgs.push_back("-export-dynamic");
7451     if (Args.hasArg(options::OPT_shared))
7452       CmdArgs.push_back("-Bshareable");
7453     else {
7454       CmdArgs.push_back("-dynamic-linker");
7455       CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7456     }
7457     CmdArgs.push_back("--hash-style=both");
7458   }
7459 
7460   // When building 32-bit code on DragonFly/pc64, we have to explicitly
7461   // instruct ld in the base system to link 32-bit code.
7462   if (getToolChain().getArch() == llvm::Triple::x86) {
7463     CmdArgs.push_back("-m");
7464     CmdArgs.push_back("elf_i386");
7465   }
7466 
7467   if (Output.isFilename()) {
7468     CmdArgs.push_back("-o");
7469     CmdArgs.push_back(Output.getFilename());
7470   } else {
7471     assert(Output.isNothing() && "Invalid output.");
7472   }
7473 
7474   if (!Args.hasArg(options::OPT_nostdlib) &&
7475       !Args.hasArg(options::OPT_nostartfiles)) {
7476     if (!Args.hasArg(options::OPT_shared)) {
7477       if (Args.hasArg(options::OPT_pg))
7478         CmdArgs.push_back(Args.MakeArgString(
7479                                 getToolChain().GetFilePath("gcrt1.o")));
7480       else {
7481         if (Args.hasArg(options::OPT_pie))
7482           CmdArgs.push_back(Args.MakeArgString(
7483                                   getToolChain().GetFilePath("Scrt1.o")));
7484         else
7485           CmdArgs.push_back(Args.MakeArgString(
7486                                   getToolChain().GetFilePath("crt1.o")));
7487       }
7488     }
7489     CmdArgs.push_back(Args.MakeArgString(
7490                             getToolChain().GetFilePath("crti.o")));
7491     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7492       CmdArgs.push_back(Args.MakeArgString(
7493                               getToolChain().GetFilePath("crtbeginS.o")));
7494     else
7495       CmdArgs.push_back(Args.MakeArgString(
7496                               getToolChain().GetFilePath("crtbegin.o")));
7497   }
7498 
7499   Args.AddAllArgs(CmdArgs, options::OPT_L);
7500   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7501   Args.AddAllArgs(CmdArgs, options::OPT_e);
7502 
7503   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7504 
7505   if (!Args.hasArg(options::OPT_nostdlib) &&
7506       !Args.hasArg(options::OPT_nodefaultlibs)) {
7507     // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7508     //         rpaths
7509     if (UseGCC47)
7510       CmdArgs.push_back("-L/usr/lib/gcc47");
7511     else
7512       CmdArgs.push_back("-L/usr/lib/gcc44");
7513 
7514     if (!Args.hasArg(options::OPT_static)) {
7515       if (UseGCC47) {
7516         CmdArgs.push_back("-rpath");
7517         CmdArgs.push_back("/usr/lib/gcc47");
7518       } else {
7519         CmdArgs.push_back("-rpath");
7520         CmdArgs.push_back("/usr/lib/gcc44");
7521       }
7522     }
7523 
7524     if (D.CCCIsCXX()) {
7525       getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7526       CmdArgs.push_back("-lm");
7527     }
7528 
7529     if (Args.hasArg(options::OPT_pthread))
7530       CmdArgs.push_back("-lpthread");
7531 
7532     if (!Args.hasArg(options::OPT_nolibc)) {
7533       CmdArgs.push_back("-lc");
7534     }
7535 
7536     if (UseGCC47) {
7537       if (Args.hasArg(options::OPT_static) ||
7538           Args.hasArg(options::OPT_static_libgcc)) {
7539         CmdArgs.push_back("-lgcc");
7540         CmdArgs.push_back("-lgcc_eh");
7541       } else {
7542         if (Args.hasArg(options::OPT_shared_libgcc)) {
7543           CmdArgs.push_back("-lgcc_pic");
7544           if (!Args.hasArg(options::OPT_shared))
7545             CmdArgs.push_back("-lgcc");
7546         } else {
7547           CmdArgs.push_back("-lgcc");
7548           CmdArgs.push_back("--as-needed");
7549           CmdArgs.push_back("-lgcc_pic");
7550           CmdArgs.push_back("--no-as-needed");
7551         }
7552       }
7553     } else {
7554       if (Args.hasArg(options::OPT_shared)) {
7555         CmdArgs.push_back("-lgcc_pic");
7556       } else {
7557         CmdArgs.push_back("-lgcc");
7558       }
7559     }
7560   }
7561 
7562   if (!Args.hasArg(options::OPT_nostdlib) &&
7563       !Args.hasArg(options::OPT_nostartfiles)) {
7564     if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7565       CmdArgs.push_back(Args.MakeArgString(
7566                               getToolChain().GetFilePath("crtendS.o")));
7567     else
7568       CmdArgs.push_back(Args.MakeArgString(
7569                               getToolChain().GetFilePath("crtend.o")));
7570     CmdArgs.push_back(Args.MakeArgString(
7571                             getToolChain().GetFilePath("crtn.o")));
7572   }
7573 
7574   addProfileRT(getToolChain(), Args, CmdArgs);
7575 
7576   const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7577   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7578 }
7579 
addSanitizerRTWindows(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,const StringRef RTName)7580 static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7581                                   ArgStringList &CmdArgs,
7582                                   const StringRef RTName) {
7583   SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7584   llvm::sys::path::append(LibSanitizer,
7585                           Twine("clang_rt.") + RTName + ".lib");
7586   CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7587 }
7588 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7589 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7590                                       const InputInfo &Output,
7591                                       const InputInfoList &Inputs,
7592                                       const ArgList &Args,
7593                                       const char *LinkingOutput) const {
7594   ArgStringList CmdArgs;
7595 
7596   if (Output.isFilename()) {
7597     CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7598                                          Output.getFilename()));
7599   } else {
7600     assert(Output.isNothing() && "Invalid output.");
7601   }
7602 
7603   if (!Args.hasArg(options::OPT_nostdlib) &&
7604       !Args.hasArg(options::OPT_nostartfiles) &&
7605       !C.getDriver().IsCLMode()) {
7606     CmdArgs.push_back("-defaultlib:libcmt");
7607   }
7608 
7609   CmdArgs.push_back("-nologo");
7610 
7611   if (Args.hasArg(options::OPT_g_Group)) {
7612     CmdArgs.push_back("-debug");
7613   }
7614 
7615   bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7616 
7617   if (DLL) {
7618     CmdArgs.push_back(Args.MakeArgString("-dll"));
7619 
7620     SmallString<128> ImplibName(Output.getFilename());
7621     llvm::sys::path::replace_extension(ImplibName, "lib");
7622     CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7623                                          ImplibName.str()));
7624   }
7625 
7626   if (getToolChain().getSanitizerArgs().needsAsanRt()) {
7627     CmdArgs.push_back(Args.MakeArgString("-debug"));
7628     CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
7629     // FIXME: Handle 64-bit.
7630     if (DLL) {
7631       addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7632                             "asan_dll_thunk-i386");
7633     } else {
7634       addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7635       addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7636     }
7637   }
7638 
7639   Args.AddAllArgValues(CmdArgs, options::OPT_l);
7640   Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
7641 
7642   // Add filenames immediately.
7643   for (const auto &Input : Inputs)
7644     if (Input.isFilename())
7645       CmdArgs.push_back(Input.getFilename());
7646     else
7647       Input.getInputArg().renderAsInput(Args, CmdArgs);
7648 
7649   const char *Exec =
7650     Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
7651   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7652 }
7653 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7654 void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7655                                          const InputInfo &Output,
7656                                          const InputInfoList &Inputs,
7657                                          const ArgList &Args,
7658                                          const char *LinkingOutput) const {
7659   C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7660 }
7661 
7662 // Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7663 // If one cannot be found, return FallbackName.
7664 // We do this special search to prevent clang-cl from falling back onto itself
7665 // if it's available as cl.exe on the path.
FindFallback(const char * FallbackName,const char * ClangProgramPath)7666 static std::string FindFallback(const char *FallbackName,
7667                                 const char *ClangProgramPath) {
7668   llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7669   if (!OptPath.hasValue())
7670     return FallbackName;
7671 
7672   const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
7673   SmallVector<StringRef, 8> PathSegments;
7674   llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
7675 
7676   for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7677     const StringRef &PathSegment = PathSegments[i];
7678     if (PathSegment.empty())
7679       continue;
7680 
7681     SmallString<128> FilePath(PathSegment);
7682     llvm::sys::path::append(FilePath, FallbackName);
7683     if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7684         !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7685       return FilePath.str();
7686   }
7687 
7688   return FallbackName;
7689 }
7690 
GetCommand(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7691 Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7692                                            const InputInfo &Output,
7693                                            const InputInfoList &Inputs,
7694                                            const ArgList &Args,
7695                                            const char *LinkingOutput) const {
7696   ArgStringList CmdArgs;
7697   CmdArgs.push_back("/nologo");
7698   CmdArgs.push_back("/c"); // Compile only.
7699   CmdArgs.push_back("/W0"); // No warnings.
7700 
7701   // The goal is to be able to invoke this tool correctly based on
7702   // any flag accepted by clang-cl.
7703 
7704   // These are spelled the same way in clang and cl.exe,.
7705   Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7706   Args.AddAllArgs(CmdArgs, options::OPT_I);
7707 
7708   // Optimization level.
7709   if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7710     if (A->getOption().getID() == options::OPT_O0) {
7711       CmdArgs.push_back("/Od");
7712     } else {
7713       StringRef OptLevel = A->getValue();
7714       if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7715         A->render(Args, CmdArgs);
7716       else if (OptLevel == "3")
7717         CmdArgs.push_back("/Ox");
7718     }
7719   }
7720 
7721   // Flags for which clang-cl have an alias.
7722   // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7723 
7724   if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7725                    /*default=*/false))
7726     CmdArgs.push_back("/GR-");
7727   if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7728                                options::OPT_fno_function_sections))
7729     CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7730                           ? "/Gy"
7731                           : "/Gy-");
7732   if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7733                                options::OPT_fno_data_sections))
7734     CmdArgs.push_back(
7735         A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
7736   if (Args.hasArg(options::OPT_fsyntax_only))
7737     CmdArgs.push_back("/Zs");
7738   if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7739     CmdArgs.push_back("/Z7");
7740 
7741   std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7742   for (const auto &Include : Includes)
7743     CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
7744 
7745   // Flags that can simply be passed through.
7746   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7747   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7748   Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
7749 
7750   // The order of these flags is relevant, so pick the last one.
7751   if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7752                                options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7753     A->render(Args, CmdArgs);
7754 
7755 
7756   // Input filename.
7757   assert(Inputs.size() == 1);
7758   const InputInfo &II = Inputs[0];
7759   assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7760   CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7761   if (II.isFilename())
7762     CmdArgs.push_back(II.getFilename());
7763   else
7764     II.getInputArg().renderAsInput(Args, CmdArgs);
7765 
7766   // Output filename.
7767   assert(Output.getType() == types::TY_Object);
7768   const char *Fo = Args.MakeArgString(std::string("/Fo") +
7769                                       Output.getFilename());
7770   CmdArgs.push_back(Fo);
7771 
7772   const Driver &D = getToolChain().getDriver();
7773   std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
7774   return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
7775 }
7776 
7777 
7778 /// XCore Tools
7779 // We pass assemble and link construction to the xcc tool.
7780 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7781 void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7782                                        const InputInfo &Output,
7783                                        const InputInfoList &Inputs,
7784                                        const ArgList &Args,
7785                                        const char *LinkingOutput) const {
7786   ArgStringList CmdArgs;
7787 
7788   CmdArgs.push_back("-o");
7789   CmdArgs.push_back(Output.getFilename());
7790 
7791   CmdArgs.push_back("-c");
7792 
7793   if (Args.hasArg(options::OPT_v))
7794     CmdArgs.push_back("-v");
7795 
7796   if (Arg *A = Args.getLastArg(options::OPT_g_Group))
7797     if (!A->getOption().matches(options::OPT_g0))
7798       CmdArgs.push_back("-g");
7799 
7800   if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7801                    false))
7802     CmdArgs.push_back("-fverbose-asm");
7803 
7804   Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7805                        options::OPT_Xassembler);
7806 
7807   for (const auto &II : Inputs)
7808     CmdArgs.push_back(II.getFilename());
7809 
7810   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7811   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7812 }
7813 
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7814 void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7815                                    const InputInfo &Output,
7816                                    const InputInfoList &Inputs,
7817                                    const ArgList &Args,
7818                                    const char *LinkingOutput) const {
7819   ArgStringList CmdArgs;
7820 
7821   if (Output.isFilename()) {
7822     CmdArgs.push_back("-o");
7823     CmdArgs.push_back(Output.getFilename());
7824   } else {
7825     assert(Output.isNothing() && "Invalid output.");
7826   }
7827 
7828   if (Args.hasArg(options::OPT_v))
7829     CmdArgs.push_back("-v");
7830 
7831   ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7832   if (EH.ShouldUseExceptionTables)
7833     CmdArgs.push_back("-fexceptions");
7834 
7835   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7836 
7837   const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7838   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7839 }
7840