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