1 //===--- Tools.cpp - Tools Implementations --------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #include "InputInfo.h"
12 #include "ToolChains.h"
13 #include "clang/Basic/ObjCRuntime.h"
14 #include "clang/Basic/Version.h"
15 #include "clang/Driver/Action.h"
16 #include "clang/Driver/Compilation.h"
17 #include "clang/Driver/Driver.h"
18 #include "clang/Driver/DriverDiagnostic.h"
19 #include "clang/Driver/Job.h"
20 #include "clang/Driver/Options.h"
21 #include "clang/Driver/SanitizerArgs.h"
22 #include "clang/Driver/ToolChain.h"
23 #include "clang/Driver/Util.h"
24 #include "clang/Sema/SemaDiagnostic.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/StringExtras.h"
27 #include "llvm/ADT/StringSwitch.h"
28 #include "llvm/ADT/Twine.h"
29 #include "llvm/Option/Arg.h"
30 #include "llvm/Option/ArgList.h"
31 #include "llvm/Option/Option.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/FileSystem.h"
34 #include "llvm/Support/Format.h"
35 #include "llvm/Support/Host.h"
36 #include "llvm/Support/Path.h"
37 #include "llvm/Support/Program.h"
38 #include "llvm/Support/Process.h"
39 #include "llvm/Support/raw_ostream.h"
42 using namespace clang::driver;
43 using namespace clang::driver::tools;
44 using namespace clang;
45 using namespace llvm::opt;
47 /// CheckPreprocessingOptions - Perform some validation of preprocessing
48 /// arguments that is shared with gcc.
49 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
50 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
51 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
52 D.Diag(diag::err_drv_argument_only_allowed_with)
53 << A->getAsString(Args) << "-E";
56 /// CheckCodeGenerationOptions - Perform some validation of code generation
57 /// arguments that is shared with gcc.
58 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
59 // In gcc, only ARM checks this, but it seems reasonable to check universally.
60 if (Args.hasArg(options::OPT_static))
61 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
62 options::OPT_mdynamic_no_pic))
63 D.Diag(diag::err_drv_argument_not_allowed_with)
64 << A->getAsString(Args) << "-static";
67 // Quote target names for inclusion in GNU Make dependency files.
68 // Only the characters '$', '#', ' ', '\t' are quoted.
69 static void QuoteTarget(StringRef Target,
70 SmallVectorImpl<char> &Res) {
71 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
75 // Escape the preceding backslashes
76 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
79 // Escape the space/tab
92 Res.push_back(Target[i]);
96 static void addDirectoryList(const ArgList &Args,
97 ArgStringList &CmdArgs,
100 const char *DirList = ::getenv(EnvVar);
101 bool CombinedArg = false;
104 return; // Nothing to do.
106 StringRef Name(ArgName);
107 if (Name.equals("-I") || Name.equals("-L"))
110 StringRef Dirs(DirList);
111 if (Dirs.empty()) // Empty string should not add '.'.
114 StringRef::size_type Delim;
115 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
116 if (Delim == 0) { // Leading colon.
118 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
120 CmdArgs.push_back(ArgName);
121 CmdArgs.push_back(".");
125 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
127 CmdArgs.push_back(ArgName);
128 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
131 Dirs = Dirs.substr(Delim + 1);
134 if (Dirs.empty()) { // Trailing colon.
136 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
138 CmdArgs.push_back(ArgName);
139 CmdArgs.push_back(".");
141 } else { // Add the last path.
143 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
145 CmdArgs.push_back(ArgName);
146 CmdArgs.push_back(Args.MakeArgString(Dirs));
151 static void AddLinkerInputs(const ToolChain &TC,
152 const InputInfoList &Inputs, const ArgList &Args,
153 ArgStringList &CmdArgs) {
154 const Driver &D = TC.getDriver();
156 // Add extra linker input arguments which are not treated as inputs
157 // (constructed via -Xarch_).
158 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
160 for (InputInfoList::const_iterator
161 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
162 const InputInfo &II = *it;
164 if (!TC.HasNativeLLVMSupport()) {
165 // Don't try to pass LLVM inputs unless we have native support.
166 if (II.getType() == types::TY_LLVM_IR ||
167 II.getType() == types::TY_LTO_IR ||
168 II.getType() == types::TY_LLVM_BC ||
169 II.getType() == types::TY_LTO_BC)
170 D.Diag(diag::err_drv_no_linker_llvm_support)
171 << TC.getTripleString();
174 // Add filenames immediately.
175 if (II.isFilename()) {
176 CmdArgs.push_back(II.getFilename());
180 // Otherwise, this is a linker input argument.
181 const Arg &A = II.getInputArg();
183 // Handle reserved library options.
184 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
185 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
186 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
187 TC.AddCCKextLibArgs(Args, CmdArgs);
189 A.renderAsInput(Args, CmdArgs);
192 // LIBRARY_PATH - included following the user specified library paths.
193 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
196 /// \brief Determine whether Objective-C automated reference counting is
198 static bool isObjCAutoRefCount(const ArgList &Args) {
199 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
202 /// \brief Determine whether we are linking the ObjC runtime.
203 static bool isObjCRuntimeLinked(const ArgList &Args) {
204 if (isObjCAutoRefCount(Args)) {
205 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
208 return Args.hasArg(options::OPT_fobjc_link_runtime);
211 static void addProfileRT(const ToolChain &TC, const ArgList &Args,
212 ArgStringList &CmdArgs,
213 llvm::Triple Triple) {
214 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
215 Args.hasArg(options::OPT_fprofile_generate) ||
216 Args.hasArg(options::OPT_fcreate_profile) ||
217 Args.hasArg(options::OPT_coverage)))
220 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
221 // the link line. We cannot do the same thing because unlike gcov there is a
222 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
223 // not supported by old linkers.
224 std::string ProfileRT =
225 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
227 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
230 static bool forwardToGCC(const Option &O) {
231 // Don't forward inputs from the original command line. They are added from
233 return O.getKind() != Option::InputClass &&
234 !O.hasFlag(options::DriverOption) &&
235 !O.hasFlag(options::LinkerInput);
238 void Clang::AddPreprocessingOptions(Compilation &C,
242 ArgStringList &CmdArgs,
243 const InputInfo &Output,
244 const InputInfoList &Inputs) const {
247 CheckPreprocessingOptions(D, Args);
249 Args.AddLastArg(CmdArgs, options::OPT_C);
250 Args.AddLastArg(CmdArgs, options::OPT_CC);
252 // Handle dependency file generation.
253 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
254 (A = Args.getLastArg(options::OPT_MD)) ||
255 (A = Args.getLastArg(options::OPT_MMD))) {
256 // Determine the output location.
258 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
259 DepFile = MF->getValue();
260 C.addFailureResultFile(DepFile, &JA);
261 } else if (Output.getType() == types::TY_Dependencies) {
262 DepFile = Output.getFilename();
263 } else if (A->getOption().matches(options::OPT_M) ||
264 A->getOption().matches(options::OPT_MM)) {
267 DepFile = getDependencyFileName(Args, Inputs);
268 C.addFailureResultFile(DepFile, &JA);
270 CmdArgs.push_back("-dependency-file");
271 CmdArgs.push_back(DepFile);
273 // Add a default target if one wasn't specified.
274 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
275 const char *DepTarget;
277 // If user provided -o, that is the dependency target, except
278 // when we are only generating a dependency file.
279 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
280 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
281 DepTarget = OutputOpt->getValue();
283 // Otherwise derive from the base input.
285 // FIXME: This should use the computed output file location.
286 SmallString<128> P(Inputs[0].getBaseInput());
287 llvm::sys::path::replace_extension(P, "o");
288 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
291 CmdArgs.push_back("-MT");
292 SmallString<128> Quoted;
293 QuoteTarget(DepTarget, Quoted);
294 CmdArgs.push_back(Args.MakeArgString(Quoted));
297 if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MD))
299 CmdArgs.push_back("-sys-header-deps");
302 if (Args.hasArg(options::OPT_MG)) {
303 if (!A || A->getOption().matches(options::OPT_MD) ||
304 A->getOption().matches(options::OPT_MMD))
305 D.Diag(diag::err_drv_mg_requires_m_or_mm);
306 CmdArgs.push_back("-MG");
309 Args.AddLastArg(CmdArgs, options::OPT_MP);
311 // Convert all -MQ <target> args to -MT <quoted target>
312 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
314 ie = Args.filtered_end(); it != ie; ++it) {
318 if (A->getOption().matches(options::OPT_MQ)) {
319 CmdArgs.push_back("-MT");
320 SmallString<128> Quoted;
321 QuoteTarget(A->getValue(), Quoted);
322 CmdArgs.push_back(Args.MakeArgString(Quoted));
324 // -MT flag - no change
326 A->render(Args, CmdArgs);
330 // Add -i* options, and automatically translate to
331 // -include-pch/-include-pth for transparent PCH support. It's
332 // wonky, but we include looking for .gch so we can support seamless
333 // replacement into a build system already set up to be generating
335 bool RenderedImplicitInclude = false;
336 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
337 ie = Args.filtered_end(); it != ie; ++it) {
340 if (A->getOption().matches(options::OPT_include)) {
341 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
342 RenderedImplicitInclude = true;
344 // Use PCH if the user requested it.
345 bool UsePCH = D.CCCUsePCH;
347 bool FoundPTH = false;
348 bool FoundPCH = false;
349 SmallString<128> P(A->getValue());
350 // We want the files to have a name like foo.h.pch. Add a dummy extension
351 // so that replace_extension does the right thing.
354 llvm::sys::path::replace_extension(P, "pch");
355 if (llvm::sys::fs::exists(P.str()))
360 llvm::sys::path::replace_extension(P, "pth");
361 if (llvm::sys::fs::exists(P.str()))
365 if (!FoundPCH && !FoundPTH) {
366 llvm::sys::path::replace_extension(P, "gch");
367 if (llvm::sys::fs::exists(P.str())) {
373 if (FoundPCH || FoundPTH) {
374 if (IsFirstImplicitInclude) {
377 CmdArgs.push_back("-include-pch");
379 CmdArgs.push_back("-include-pth");
380 CmdArgs.push_back(Args.MakeArgString(P.str()));
383 // Ignore the PCH if not first on command line and emit warning.
384 D.Diag(diag::warn_drv_pch_not_first_include)
385 << P.str() << A->getAsString(Args);
390 // Not translated, render as usual.
392 A->render(Args, CmdArgs);
395 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
396 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
397 options::OPT_index_header_map);
399 // Add -Wp, and -Xassembler if using the preprocessor.
401 // FIXME: There is a very unfortunate problem here, some troubled
402 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
403 // really support that we would have to parse and then translate
405 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
406 options::OPT_Xpreprocessor);
408 // -I- is a deprecated GCC feature, reject it.
409 if (Arg *A = Args.getLastArg(options::OPT_I_))
410 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
412 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
413 // -isysroot to the CC1 invocation.
414 StringRef sysroot = C.getSysRoot();
416 if (!Args.hasArg(options::OPT_isysroot)) {
417 CmdArgs.push_back("-isysroot");
418 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
422 // Parse additional include paths from environment variables.
423 // FIXME: We should probably sink the logic for handling these from the
424 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
425 // CPATH - included following the user specified includes (but prior to
426 // builtin and standard includes).
427 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
428 // C_INCLUDE_PATH - system includes enabled when compiling C.
429 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
430 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
431 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
432 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
433 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
434 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
435 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
437 // Add C++ include arguments, if needed.
438 if (types::isCXX(Inputs[0].getType()))
439 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
441 // Add system include arguments.
442 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
445 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
448 // FIXME: This is redundant with -mcpu, why does LLVM use this.
449 // FIXME: tblgen this, or kill it!
450 static const char *getLLVMArchSuffixForARM(StringRef CPU) {
451 return llvm::StringSwitch<const char *>(CPU)
452 .Case("strongarm", "v4")
453 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
454 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
455 .Cases("arm920", "arm920t", "arm922t", "v4t")
456 .Cases("arm940t", "ep9312","v4t")
457 .Cases("arm10tdmi", "arm1020t", "v5")
458 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
459 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
460 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
461 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
462 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
463 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
464 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
465 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "v7")
466 .Cases("cortex-r4", "cortex-r5", "v7r")
467 .Case("cortex-m0", "v6m")
468 .Case("cortex-m3", "v7m")
469 .Case("cortex-m4", "v7em")
470 .Case("cortex-a9-mp", "v7f")
471 .Case("swift", "v7s")
472 .Cases("cortex-a53", "cortex-a57", "v8")
476 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
478 // FIXME: tblgen this.
479 static std::string getARMTargetCPU(const ArgList &Args,
480 const llvm::Triple &Triple) {
481 // FIXME: Warn on inconsistent use of -mcpu and -march.
483 // If we have -mcpu=, use that.
484 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
485 StringRef MCPU = A->getValue();
486 // Handle -mcpu=native.
487 if (MCPU == "native")
488 return llvm::sys::getHostCPUName();
494 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
495 // Otherwise, if we have -march= choose the base CPU for that arch.
496 MArch = A->getValue();
498 // Otherwise, use the Arch from the triple.
499 MArch = Triple.getArchName();
502 if (Triple.getOS() == llvm::Triple::NetBSD) {
503 if (MArch == "armv6")
504 return "arm1176jzf-s";
507 // Handle -march=native.
508 std::string NativeMArch;
509 if (MArch == "native") {
510 std::string CPU = llvm::sys::getHostCPUName();
511 if (CPU != "generic") {
512 // Translate the native cpu into the architecture. The switch below will
513 // then chose the minimum cpu for that arch.
514 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
519 return llvm::StringSwitch<const char *>(MArch)
520 .Cases("armv2", "armv2a","arm2")
521 .Case("armv3", "arm6")
522 .Case("armv3m", "arm7m")
523 .Case("armv4", "strongarm")
524 .Case("armv4t", "arm7tdmi")
525 .Cases("armv5", "armv5t", "arm10tdmi")
526 .Cases("armv5e", "armv5te", "arm1022e")
527 .Case("armv5tej", "arm926ej-s")
528 .Cases("armv6", "armv6k", "arm1136jf-s")
529 .Case("armv6j", "arm1136j-s")
530 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
531 .Case("armv6t2", "arm1156t2-s")
532 .Cases("armv6m", "armv6-m", "cortex-m0")
533 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
534 .Cases("armv7em", "armv7e-m", "cortex-m4")
535 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
536 .Cases("armv7s", "armv7-s", "swift")
537 .Cases("armv7r", "armv7-r", "cortex-r4")
538 .Cases("armv7m", "armv7-m", "cortex-m3")
539 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
540 .Case("ep9312", "ep9312")
541 .Case("iwmmxt", "iwmmxt")
542 .Case("xscale", "xscale")
543 // If all else failed, return the most base CPU with thumb interworking
544 // supported by LLVM.
545 .Default("arm7tdmi");
548 /// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
550 // FIXME: tblgen this.
551 static std::string getAArch64TargetCPU(const ArgList &Args,
552 const llvm::Triple &Triple) {
553 // FIXME: Warn on inconsistent use of -mcpu and -march.
555 // If we have -mcpu=, use that.
556 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
557 StringRef MCPU = A->getValue();
558 // Handle -mcpu=native.
559 if (MCPU == "native")
560 return llvm::sys::getHostCPUName();
568 // FIXME: Move to target hook.
569 static bool isSignedCharDefault(const llvm::Triple &Triple) {
570 switch (Triple.getArch()) {
574 case llvm::Triple::aarch64:
575 case llvm::Triple::arm:
576 case llvm::Triple::ppc:
577 case llvm::Triple::ppc64:
578 if (Triple.isOSDarwin())
582 case llvm::Triple::ppc64le:
583 case llvm::Triple::systemz:
584 case llvm::Triple::xcore:
589 static bool isNoCommonDefault(const llvm::Triple &Triple) {
590 switch (Triple.getArch()) {
594 case llvm::Triple::xcore:
601 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
603 static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
605 std::vector<const char *> &Features) {
606 StringRef FPU = A->getValue();
607 if (FPU == "fp-armv8") {
608 Features.push_back("+fp-armv8");
609 } else if (FPU == "neon-fp-armv8") {
610 Features.push_back("+fp-armv8");
611 Features.push_back("+neon");
612 } else if (FPU == "crypto-neon-fp-armv8") {
613 Features.push_back("+fp-armv8");
614 Features.push_back("+neon");
615 Features.push_back("+crypto");
616 } else if (FPU == "neon") {
617 Features.push_back("+neon");
618 } else if (FPU == "none") {
619 Features.push_back("-fp-armv8");
620 Features.push_back("-crypto");
621 Features.push_back("-neon");
623 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
627 static void getARMHWDivFeatures(const Driver &D, const Arg *A,
629 std::vector<const char *> &Features) {
630 StringRef HWDiv = A->getValue();
631 if (HWDiv == "arm") {
632 Features.push_back("+hwdiv-arm");
633 Features.push_back("-hwdiv");
634 } else if (HWDiv == "thumb") {
635 Features.push_back("-hwdiv-arm");
636 Features.push_back("+hwdiv");
637 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
638 Features.push_back("+hwdiv-arm");
639 Features.push_back("+hwdiv");
640 } else if (HWDiv == "none") {
641 Features.push_back("-hwdiv-arm");
642 Features.push_back("-hwdiv");
644 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
649 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
651 static void getARMFPUFeatures(const Driver &D, const Arg *A,
653 std::vector<const char *> &Features) {
654 StringRef FPU = A->getValue();
656 // Set the target features based on the FPU.
657 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
658 // Disable any default FPU support.
659 Features.push_back("-vfp2");
660 Features.push_back("-vfp3");
661 Features.push_back("-neon");
662 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
663 Features.push_back("+vfp3");
664 Features.push_back("+d16");
665 Features.push_back("-neon");
666 } else if (FPU == "vfp") {
667 Features.push_back("+vfp2");
668 Features.push_back("-neon");
669 } else if (FPU == "vfp3" || FPU == "vfpv3") {
670 Features.push_back("+vfp3");
671 Features.push_back("-neon");
672 } else if (FPU == "fp-armv8") {
673 Features.push_back("+fp-armv8");
674 Features.push_back("-neon");
675 Features.push_back("-crypto");
676 } else if (FPU == "neon-fp-armv8") {
677 Features.push_back("+fp-armv8");
678 Features.push_back("+neon");
679 Features.push_back("-crypto");
680 } else if (FPU == "crypto-neon-fp-armv8") {
681 Features.push_back("+fp-armv8");
682 Features.push_back("+neon");
683 Features.push_back("+crypto");
684 } else if (FPU == "neon") {
685 Features.push_back("+neon");
686 } else if (FPU == "none") {
687 Features.push_back("-vfp2");
688 Features.push_back("-vfp3");
689 Features.push_back("-vfp4");
690 Features.push_back("-fp-armv8");
691 Features.push_back("-crypto");
692 Features.push_back("-neon");
694 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
697 // Select the float ABI as determined by -msoft-float, -mhard-float, and
699 static StringRef getARMFloatABI(const Driver &D,
701 const llvm::Triple &Triple) {
703 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
704 options::OPT_mhard_float,
705 options::OPT_mfloat_abi_EQ)) {
706 if (A->getOption().matches(options::OPT_msoft_float))
708 else if (A->getOption().matches(options::OPT_mhard_float))
711 FloatABI = A->getValue();
712 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
713 D.Diag(diag::err_drv_invalid_mfloat_abi)
714 << A->getAsString(Args);
720 // If unspecified, choose the default based on the platform.
721 if (FloatABI.empty()) {
722 switch (Triple.getOS()) {
723 case llvm::Triple::Darwin:
724 case llvm::Triple::MacOSX:
725 case llvm::Triple::IOS: {
726 // Darwin defaults to "softfp" for v6 and v7.
728 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
729 std::string ArchName =
730 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
731 if (StringRef(ArchName).startswith("v6") ||
732 StringRef(ArchName).startswith("v7"))
739 case llvm::Triple::FreeBSD:
740 // FreeBSD defaults to soft float
745 switch(Triple.getEnvironment()) {
746 case llvm::Triple::GNUEABIHF:
749 case llvm::Triple::GNUEABI:
752 case llvm::Triple::EABI:
753 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
756 case llvm::Triple::Android: {
757 std::string ArchName =
758 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
759 if (StringRef(ArchName).startswith("v7"))
766 // Assume "soft", but warn the user we are guessing.
768 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
777 static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
779 std::vector<const char *> &Features) {
780 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
781 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
782 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
783 // stripped out by the ARM target.
784 // Use software floating point operations?
785 if (FloatABI == "soft")
786 Features.push_back("+soft-float");
788 // Use software floating point argument passing?
789 if (FloatABI != "hard")
790 Features.push_back("+soft-float-abi");
793 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
794 getARMFPUFeatures(D, A, Args, Features);
795 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
796 getARMHWDivFeatures(D, A, Args, Features);
798 // Setting -msoft-float effectively disables NEON because of the GCC
799 // implementation, although the same isn't true of VFP or VFP3.
800 if (FloatABI == "soft")
801 Features.push_back("-neon");
804 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
805 options::OPT_mnocrc)) {
806 if (A->getOption().matches(options::OPT_mcrc))
807 Features.push_back("+crc");
809 Features.push_back("-crc");
813 void Clang::AddARMTargetArgs(const ArgList &Args,
814 ArgStringList &CmdArgs,
815 bool KernelOrKext) const {
816 const Driver &D = getToolChain().getDriver();
817 // Get the effective triple, which takes into account the deployment target.
818 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
819 llvm::Triple Triple(TripleStr);
820 std::string CPUName = getARMTargetCPU(Args, Triple);
822 // Select the ABI to use.
824 // FIXME: Support -meabi.
825 const char *ABIName = 0;
826 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
827 ABIName = A->getValue();
828 } else if (Triple.isOSDarwin()) {
829 // The backend is hardwired to assume AAPCS for M-class processors, ensure
830 // the frontend matches that.
831 if (Triple.getEnvironment() == llvm::Triple::EABI ||
832 StringRef(CPUName).startswith("cortex-m")) {
835 ABIName = "apcs-gnu";
838 // Select the default based on the platform.
839 switch(Triple.getEnvironment()) {
840 case llvm::Triple::Android:
841 case llvm::Triple::GNUEABI:
842 case llvm::Triple::GNUEABIHF:
843 ABIName = "aapcs-linux";
845 case llvm::Triple::EABI:
849 ABIName = "apcs-gnu";
852 CmdArgs.push_back("-target-abi");
853 CmdArgs.push_back(ABIName);
855 // Determine floating point ABI from the options & target defaults.
856 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
857 if (FloatABI == "soft") {
858 // Floating point operations and argument passing are soft.
860 // FIXME: This changes CPP defines, we need -target-soft-float.
861 CmdArgs.push_back("-msoft-float");
862 CmdArgs.push_back("-mfloat-abi");
863 CmdArgs.push_back("soft");
864 } else if (FloatABI == "softfp") {
865 // Floating point operations are hard, but argument passing is soft.
866 CmdArgs.push_back("-mfloat-abi");
867 CmdArgs.push_back("soft");
869 // Floating point operations and argument passing are hard.
870 assert(FloatABI == "hard" && "Invalid float abi!");
871 CmdArgs.push_back("-mfloat-abi");
872 CmdArgs.push_back("hard");
875 // Kernel code has more strict alignment requirements.
877 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
878 CmdArgs.push_back("-backend-option");
879 CmdArgs.push_back("-arm-long-calls");
882 CmdArgs.push_back("-backend-option");
883 CmdArgs.push_back("-arm-strict-align");
885 // The kext linker doesn't know how to deal with movw/movt.
886 CmdArgs.push_back("-backend-option");
887 CmdArgs.push_back("-arm-use-movt=0");
890 // Setting -mno-global-merge disables the codegen global merge pass. Setting
891 // -mglobal-merge has no effect as the pass is enabled by default.
892 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
893 options::OPT_mno_global_merge)) {
894 if (A->getOption().matches(options::OPT_mno_global_merge))
895 CmdArgs.push_back("-mno-global-merge");
898 if (!Args.hasFlag(options::OPT_mimplicit_float,
899 options::OPT_mno_implicit_float,
901 CmdArgs.push_back("-no-implicit-float");
903 // llvm does not support reserving registers in general. There is support
904 // for reserving r9 on ARM though (defined as a platform-specific register
906 if (Args.hasArg(options::OPT_ffixed_r9)) {
907 CmdArgs.push_back("-backend-option");
908 CmdArgs.push_back("-arm-reserve-r9");
912 // Get CPU and ABI names. They are not independent
913 // so we have to calculate them together.
914 static void getMipsCPUAndABI(const ArgList &Args,
915 const llvm::Triple &Triple,
917 StringRef &ABIName) {
918 const char *DefMips32CPU = "mips32";
919 const char *DefMips64CPU = "mips64";
921 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
922 options::OPT_mcpu_EQ))
923 CPUName = A->getValue();
925 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
926 ABIName = A->getValue();
927 // Convert a GNU style Mips ABI name to the name
928 // accepted by LLVM Mips backend.
929 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
935 // Setup default CPU and ABI names.
936 if (CPUName.empty() && ABIName.empty()) {
937 switch (Triple.getArch()) {
939 llvm_unreachable("Unexpected triple arch name");
940 case llvm::Triple::mips:
941 case llvm::Triple::mipsel:
942 CPUName = DefMips32CPU;
944 case llvm::Triple::mips64:
945 case llvm::Triple::mips64el:
946 CPUName = DefMips64CPU;
951 if (!ABIName.empty()) {
952 // Deduce CPU name from ABI name.
953 CPUName = llvm::StringSwitch<const char *>(ABIName)
954 .Cases("32", "o32", "eabi", DefMips32CPU)
955 .Cases("n32", "n64", "64", DefMips64CPU)
958 else if (!CPUName.empty()) {
959 // Deduce ABI name from CPU name.
960 ABIName = llvm::StringSwitch<const char *>(CPUName)
961 .Cases("mips32", "mips32r2", "o32")
962 .Cases("mips64", "mips64r2", "n64")
966 // FIXME: Warn on inconsistent cpu and abi usage.
969 // Convert ABI name to the GNU tools acceptable variant.
970 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
971 return llvm::StringSwitch<llvm::StringRef>(ABI)
977 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
979 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
981 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
982 options::OPT_mhard_float,
983 options::OPT_mfloat_abi_EQ)) {
984 if (A->getOption().matches(options::OPT_msoft_float))
986 else if (A->getOption().matches(options::OPT_mhard_float))
989 FloatABI = A->getValue();
990 if (FloatABI != "soft" && FloatABI != "hard") {
991 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
997 // If unspecified, choose the default based on the platform.
998 if (FloatABI.empty()) {
999 // Assume "hard", because it's a default value used by gcc.
1000 // When we start to recognize specific target MIPS processors,
1001 // we will be able to select the default more correctly.
1008 static void AddTargetFeature(const ArgList &Args,
1009 std::vector<const char *> &Features,
1010 OptSpecifier OnOpt, OptSpecifier OffOpt,
1011 StringRef FeatureName) {
1012 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
1013 if (A->getOption().matches(OnOpt))
1014 Features.push_back(Args.MakeArgString("+" + FeatureName));
1016 Features.push_back(Args.MakeArgString("-" + FeatureName));
1020 static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1021 std::vector<const char *> &Features) {
1022 StringRef FloatABI = getMipsFloatABI(D, Args);
1023 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1024 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
1025 // FIXME: Note, this is a hack. We need to pass the selected float
1026 // mode to the MipsTargetInfoBase to define appropriate macros there.
1027 // Now it is the only method.
1028 Features.push_back("+soft-float");
1031 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1032 if (StringRef(A->getValue()) == "2008")
1033 Features.push_back("+nan2008");
1036 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1037 options::OPT_mdouble_float, "single-float");
1038 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1040 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1041 options::OPT_mno_micromips, "micromips");
1042 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1044 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1046 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1048 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1052 void Clang::AddMIPSTargetArgs(const ArgList &Args,
1053 ArgStringList &CmdArgs) const {
1054 const Driver &D = getToolChain().getDriver();
1057 const llvm::Triple &Triple = getToolChain().getTriple();
1058 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1060 CmdArgs.push_back("-target-abi");
1061 CmdArgs.push_back(ABIName.data());
1063 StringRef FloatABI = getMipsFloatABI(D, Args);
1065 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
1067 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
1068 // Floating point operations and argument passing are soft.
1069 CmdArgs.push_back("-msoft-float");
1070 CmdArgs.push_back("-mfloat-abi");
1071 CmdArgs.push_back("soft");
1073 if (FloatABI == "hard" && IsMips16) {
1074 CmdArgs.push_back("-mllvm");
1075 CmdArgs.push_back("-mips16-hard-float");
1079 // Floating point operations and argument passing are hard.
1080 assert(FloatABI == "hard" && "Invalid float abi!");
1081 CmdArgs.push_back("-mfloat-abi");
1082 CmdArgs.push_back("hard");
1085 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1086 if (A->getOption().matches(options::OPT_mxgot)) {
1087 CmdArgs.push_back("-mllvm");
1088 CmdArgs.push_back("-mxgot");
1092 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1093 options::OPT_mno_ldc1_sdc1)) {
1094 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1095 CmdArgs.push_back("-mllvm");
1096 CmdArgs.push_back("-mno-ldc1-sdc1");
1100 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1101 options::OPT_mno_check_zero_division)) {
1102 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1103 CmdArgs.push_back("-mllvm");
1104 CmdArgs.push_back("-mno-check-zero-division");
1108 if (Arg *A = Args.getLastArg(options::OPT_G)) {
1109 StringRef v = A->getValue();
1110 CmdArgs.push_back("-mllvm");
1111 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1116 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1117 static std::string getPPCTargetCPU(const ArgList &Args) {
1118 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1119 StringRef CPUName = A->getValue();
1121 if (CPUName == "native") {
1122 std::string CPU = llvm::sys::getHostCPUName();
1123 if (!CPU.empty() && CPU != "generic")
1129 return llvm::StringSwitch<const char *>(CPUName)
1130 .Case("common", "generic")
1132 .Case("440fp", "440")
1137 .Case("603e", "603e")
1138 .Case("603ev", "603ev")
1140 .Case("604e", "604e")
1142 .Case("630", "pwr3")
1144 .Case("7400", "7400")
1146 .Case("7450", "7450")
1153 .Case("e500mc", "e500mc")
1154 .Case("e5500", "e5500")
1155 .Case("power3", "pwr3")
1156 .Case("power4", "pwr4")
1157 .Case("power5", "pwr5")
1158 .Case("power5x", "pwr5x")
1159 .Case("power6", "pwr6")
1160 .Case("power6x", "pwr6x")
1161 .Case("power7", "pwr7")
1162 .Case("pwr3", "pwr3")
1163 .Case("pwr4", "pwr4")
1164 .Case("pwr5", "pwr5")
1165 .Case("pwr5x", "pwr5x")
1166 .Case("pwr6", "pwr6")
1167 .Case("pwr6x", "pwr6x")
1168 .Case("pwr7", "pwr7")
1169 .Case("powerpc", "ppc")
1170 .Case("powerpc64", "ppc64")
1171 .Case("powerpc64le", "ppc64le")
1178 static void getPPCTargetFeatures(const ArgList &Args,
1179 std::vector<const char *> &Features) {
1180 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1181 ie = Args.filtered_end();
1183 StringRef Name = (*it)->getOption().getName();
1187 assert(Name.startswith("m") && "Invalid feature name.");
1188 Name = Name.substr(1);
1190 bool IsNegative = Name.startswith("no-");
1192 Name = Name.substr(3);
1194 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1195 // pass the correct option to the backend while calling the frontend
1197 // TODO: Change the LLVM backend option maybe?
1198 if (Name == "mfcrf")
1201 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1204 // Altivec is a bit weird, allow overriding of the Altivec feature here.
1205 AddTargetFeature(Args, Features, options::OPT_faltivec,
1206 options::OPT_fno_altivec, "altivec");
1209 /// Get the (LLVM) name of the R600 gpu we are targeting.
1210 static std::string getR600TargetGPU(const ArgList &Args) {
1211 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1212 const char *GPUName = A->getValue();
1213 return llvm::StringSwitch<const char *>(GPUName)
1214 .Cases("rv630", "rv635", "r600")
1215 .Cases("rv610", "rv620", "rs780", "rs880")
1216 .Case("rv740", "rv770")
1217 .Case("palm", "cedar")
1218 .Cases("sumo", "sumo2", "sumo")
1219 .Case("hemlock", "cypress")
1220 .Case("aruba", "cayman")
1226 static void getSparcTargetFeatures(const ArgList &Args,
1227 std::vector<const char *> Features) {
1228 bool SoftFloatABI = true;
1230 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1231 if (A->getOption().matches(options::OPT_mhard_float))
1232 SoftFloatABI = false;
1235 Features.push_back("+soft-float");
1238 void Clang::AddSparcTargetArgs(const ArgList &Args,
1239 ArgStringList &CmdArgs) const {
1240 const Driver &D = getToolChain().getDriver();
1242 // Select the float ABI as determined by -msoft-float, -mhard-float, and
1244 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1245 options::OPT_mhard_float)) {
1246 if (A->getOption().matches(options::OPT_msoft_float))
1248 else if (A->getOption().matches(options::OPT_mhard_float))
1252 // If unspecified, choose the default based on the platform.
1253 if (FloatABI.empty()) {
1254 // Assume "soft", but warn the user we are guessing.
1256 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
1259 if (FloatABI == "soft") {
1260 // Floating point operations and argument passing are soft.
1262 // FIXME: This changes CPP defines, we need -target-soft-float.
1263 CmdArgs.push_back("-msoft-float");
1265 assert(FloatABI == "hard" && "Invalid float abi!");
1266 CmdArgs.push_back("-mhard-float");
1270 static const char *getSystemZTargetCPU(const ArgList &Args) {
1271 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1272 return A->getValue();
1276 static const char *getX86TargetCPU(const ArgList &Args,
1277 const llvm::Triple &Triple) {
1278 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1279 if (StringRef(A->getValue()) != "native") {
1280 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1283 return A->getValue();
1286 // FIXME: Reject attempts to use -march=native unless the target matches
1289 // FIXME: We should also incorporate the detected target features for use
1291 std::string CPU = llvm::sys::getHostCPUName();
1292 if (!CPU.empty() && CPU != "generic")
1293 return Args.MakeArgString(CPU);
1296 // Select the default CPU if none was given (or detection failed).
1298 if (Triple.getArch() != llvm::Triple::x86_64 &&
1299 Triple.getArch() != llvm::Triple::x86)
1300 return 0; // This routine is only handling x86 targets.
1302 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1304 // FIXME: Need target hooks.
1305 if (Triple.isOSDarwin()) {
1306 if (Triple.getArchName() == "x86_64h")
1308 return Is64Bit ? "core2" : "yonah";
1311 // All x86 devices running Android have core2 as their common
1312 // denominator. This makes a better choice than pentium4.
1313 if (Triple.getEnvironment() == llvm::Triple::Android)
1316 // Everything else goes to x86-64 in 64-bit mode.
1320 switch (Triple.getOS()) {
1321 case llvm::Triple::FreeBSD:
1322 case llvm::Triple::NetBSD:
1323 case llvm::Triple::OpenBSD:
1325 case llvm::Triple::Haiku:
1327 case llvm::Triple::Bitrig:
1335 static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1336 switch(T.getArch()) {
1340 case llvm::Triple::aarch64:
1341 return getAArch64TargetCPU(Args, T);
1343 case llvm::Triple::arm:
1344 case llvm::Triple::thumb:
1345 return getARMTargetCPU(Args, T);
1347 case llvm::Triple::mips:
1348 case llvm::Triple::mipsel:
1349 case llvm::Triple::mips64:
1350 case llvm::Triple::mips64el: {
1353 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1357 case llvm::Triple::ppc:
1358 case llvm::Triple::ppc64:
1359 case llvm::Triple::ppc64le: {
1360 std::string TargetCPUName = getPPCTargetCPU(Args);
1361 // LLVM may default to generating code for the native CPU,
1362 // but, like gcc, we default to a more generic option for
1363 // each architecture. (except on Darwin)
1364 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1365 if (T.getArch() == llvm::Triple::ppc64)
1366 TargetCPUName = "ppc64";
1367 else if (T.getArch() == llvm::Triple::ppc64le)
1368 TargetCPUName = "ppc64le";
1370 TargetCPUName = "ppc";
1372 return TargetCPUName;
1375 case llvm::Triple::sparc:
1376 case llvm::Triple::sparcv9:
1377 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1378 return A->getValue();
1381 case llvm::Triple::x86:
1382 case llvm::Triple::x86_64:
1383 return getX86TargetCPU(Args, T);
1385 case llvm::Triple::hexagon:
1386 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1388 case llvm::Triple::systemz:
1389 return getSystemZTargetCPU(Args);
1391 case llvm::Triple::r600:
1392 return getR600TargetGPU(Args);
1396 static void getX86TargetFeatures(const llvm::Triple &Triple,
1397 const ArgList &Args,
1398 std::vector<const char *> &Features) {
1399 if (Triple.getArchName() == "x86_64h") {
1400 // x86_64h implies quite a few of the more modern subtarget features
1401 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1402 Features.push_back("-rdrnd");
1403 Features.push_back("-aes");
1404 Features.push_back("-pclmul");
1405 Features.push_back("-rtm");
1406 Features.push_back("-hle");
1407 Features.push_back("-fsgsbase");
1410 // Now add any that the user explicitly requested on the command line,
1411 // which may override the defaults.
1412 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1413 ie = Args.filtered_end();
1415 StringRef Name = (*it)->getOption().getName();
1419 assert(Name.startswith("m") && "Invalid feature name.");
1420 Name = Name.substr(1);
1422 bool IsNegative = Name.startswith("no-");
1424 Name = Name.substr(3);
1426 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1430 void Clang::AddX86TargetArgs(const ArgList &Args,
1431 ArgStringList &CmdArgs) const {
1432 if (!Args.hasFlag(options::OPT_mred_zone,
1433 options::OPT_mno_red_zone,
1435 Args.hasArg(options::OPT_mkernel) ||
1436 Args.hasArg(options::OPT_fapple_kext))
1437 CmdArgs.push_back("-disable-red-zone");
1439 // Default to avoid implicit floating-point for kernel/kext code, but allow
1440 // that to be overridden with -mno-soft-float.
1441 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1442 Args.hasArg(options::OPT_fapple_kext));
1443 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1444 options::OPT_mno_soft_float,
1445 options::OPT_mimplicit_float,
1446 options::OPT_mno_implicit_float)) {
1447 const Option &O = A->getOption();
1448 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1449 O.matches(options::OPT_msoft_float));
1451 if (NoImplicitFloat)
1452 CmdArgs.push_back("-no-implicit-float");
1455 static inline bool HasPICArg(const ArgList &Args) {
1456 return Args.hasArg(options::OPT_fPIC)
1457 || Args.hasArg(options::OPT_fpic);
1460 static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1461 return Args.getLastArg(options::OPT_G,
1463 options::OPT_msmall_data_threshold_EQ);
1466 static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1468 if (HasPICArg(Args))
1470 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1471 value = A->getValue();
1477 void Clang::AddHexagonTargetArgs(const ArgList &Args,
1478 ArgStringList &CmdArgs) const {
1479 CmdArgs.push_back("-fno-signed-char");
1480 CmdArgs.push_back("-mqdsp6-compat");
1481 CmdArgs.push_back("-Wreturn-type");
1483 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1484 if (!SmallDataThreshold.empty()) {
1485 CmdArgs.push_back ("-mllvm");
1486 CmdArgs.push_back(Args.MakeArgString(
1487 "-hexagon-small-data-threshold=" + SmallDataThreshold));
1490 if (!Args.hasArg(options::OPT_fno_short_enums))
1491 CmdArgs.push_back("-fshort-enums");
1492 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1493 CmdArgs.push_back ("-mllvm");
1494 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1496 CmdArgs.push_back ("-mllvm");
1497 CmdArgs.push_back ("-machine-sink-split=0");
1500 static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1501 std::vector<const char *> &Features) {
1503 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
1504 getAArch64FPUFeatures(D, A, Args, Features);
1507 static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1508 const ArgList &Args, ArgStringList &CmdArgs) {
1509 std::vector<const char *> Features;
1510 switch (Triple.getArch()) {
1513 case llvm::Triple::mips:
1514 case llvm::Triple::mipsel:
1515 case llvm::Triple::mips64:
1516 case llvm::Triple::mips64el:
1517 getMIPSTargetFeatures(D, Args, Features);
1520 case llvm::Triple::arm:
1521 case llvm::Triple::thumb:
1522 getARMTargetFeatures(D, Triple, Args, Features);
1525 case llvm::Triple::ppc:
1526 case llvm::Triple::ppc64:
1527 case llvm::Triple::ppc64le:
1528 getPPCTargetFeatures(Args, Features);
1530 case llvm::Triple::sparc:
1531 getSparcTargetFeatures(Args, Features);
1533 case llvm::Triple::aarch64:
1534 getAArch64TargetFeatures(D, Args, Features);
1536 case llvm::Triple::x86:
1537 case llvm::Triple::x86_64:
1538 getX86TargetFeatures(Triple, Args, Features);
1542 // Find the last of each feature.
1543 llvm::StringMap<unsigned> LastOpt;
1544 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1545 const char *Name = Features[I];
1546 assert(Name[0] == '-' || Name[0] == '+');
1547 LastOpt[Name + 1] = I;
1550 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1551 // If this feature was overridden, ignore it.
1552 const char *Name = Features[I];
1553 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1554 assert(LastI != LastOpt.end());
1555 unsigned Last = LastI->second;
1559 CmdArgs.push_back("-target-feature");
1560 CmdArgs.push_back(Name);
1565 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1566 const llvm::Triple &Triple) {
1567 // We use the zero-cost exception tables for Objective-C if the non-fragile
1568 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1570 if (runtime.isNonFragile())
1573 if (!Triple.isOSDarwin())
1576 return (!Triple.isMacOSXVersionLT(10,5) &&
1577 (Triple.getArch() == llvm::Triple::x86_64 ||
1578 Triple.getArch() == llvm::Triple::arm));
1581 /// addExceptionArgs - Adds exception related arguments to the driver command
1582 /// arguments. There's a master flag, -fexceptions and also language specific
1583 /// flags to enable/disable C++ and Objective-C exceptions.
1584 /// This makes it possible to for example disable C++ exceptions but enable
1585 /// Objective-C exceptions.
1586 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1587 const llvm::Triple &Triple,
1589 const ObjCRuntime &objcRuntime,
1590 ArgStringList &CmdArgs) {
1592 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1593 // arguments now to avoid warnings about unused arguments.
1594 Args.ClaimAllArgs(options::OPT_fexceptions);
1595 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1596 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1597 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1598 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1599 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
1603 // Exceptions are enabled by default.
1604 bool ExceptionsEnabled = true;
1606 // This keeps track of whether exceptions were explicitly turned on or off.
1607 bool DidHaveExplicitExceptionFlag = false;
1609 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1610 options::OPT_fno_exceptions)) {
1611 if (A->getOption().matches(options::OPT_fexceptions))
1612 ExceptionsEnabled = true;
1614 ExceptionsEnabled = false;
1616 DidHaveExplicitExceptionFlag = true;
1619 bool ShouldUseExceptionTables = false;
1621 // Exception tables and cleanups can be enabled with -fexceptions even if the
1622 // language itself doesn't support exceptions.
1623 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1624 ShouldUseExceptionTables = true;
1626 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1627 // is not necessarily sensible, but follows GCC.
1628 if (types::isObjC(InputType) &&
1629 Args.hasFlag(options::OPT_fobjc_exceptions,
1630 options::OPT_fno_objc_exceptions,
1632 CmdArgs.push_back("-fobjc-exceptions");
1634 ShouldUseExceptionTables |=
1635 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
1638 if (types::isCXX(InputType)) {
1639 bool CXXExceptionsEnabled = ExceptionsEnabled;
1641 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1642 options::OPT_fno_cxx_exceptions,
1643 options::OPT_fexceptions,
1644 options::OPT_fno_exceptions)) {
1645 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1646 CXXExceptionsEnabled = true;
1647 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
1648 CXXExceptionsEnabled = false;
1651 if (CXXExceptionsEnabled) {
1652 CmdArgs.push_back("-fcxx-exceptions");
1654 ShouldUseExceptionTables = true;
1658 if (ShouldUseExceptionTables)
1659 CmdArgs.push_back("-fexceptions");
1662 static bool ShouldDisableAutolink(const ArgList &Args,
1663 const ToolChain &TC) {
1664 bool Default = true;
1665 if (TC.getTriple().isOSDarwin()) {
1666 // The native darwin assembler doesn't support the linker_option directives,
1667 // so we disable them if we think the .s file will be passed to it.
1668 Default = TC.useIntegratedAs();
1670 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1674 static bool ShouldDisableCFI(const ArgList &Args,
1675 const ToolChain &TC) {
1676 bool Default = true;
1677 if (TC.getTriple().isOSDarwin()) {
1678 // The native darwin assembler doesn't support cfi directives, so
1679 // we disable them if we think the .s file will be passed to it.
1680 Default = TC.useIntegratedAs();
1682 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1683 options::OPT_fno_dwarf2_cfi_asm,
1687 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1688 const ToolChain &TC) {
1689 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1690 options::OPT_fno_dwarf_directory_asm,
1691 TC.useIntegratedAs());
1692 return !UseDwarfDirectory;
1695 /// \brief Check whether the given input tree contains any compilation actions.
1696 static bool ContainsCompileAction(const Action *A) {
1697 if (isa<CompileJobAction>(A))
1700 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1701 if (ContainsCompileAction(*it))
1707 /// \brief Check if -relax-all should be passed to the internal assembler.
1708 /// This is done by default when compiling non-assembler source with -O0.
1709 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1710 bool RelaxDefault = true;
1712 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1713 RelaxDefault = A->getOption().matches(options::OPT_O0);
1716 RelaxDefault = false;
1717 for (ActionList::const_iterator it = C.getActions().begin(),
1718 ie = C.getActions().end(); it != ie; ++it) {
1719 if (ContainsCompileAction(*it)) {
1720 RelaxDefault = true;
1726 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1730 static void CollectArgsForIntegratedAssembler(Compilation &C,
1731 const ArgList &Args,
1732 ArgStringList &CmdArgs,
1734 if (UseRelaxAll(C, Args))
1735 CmdArgs.push_back("-mrelax-all");
1737 // When passing -I arguments to the assembler we sometimes need to
1738 // unconditionally take the next argument. For example, when parsing
1739 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1740 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1741 // arg after parsing the '-I' arg.
1742 bool TakeNextArg = false;
1744 // When using an integrated assembler, translate -Wa, and -Xassembler
1746 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1747 options::OPT_Xassembler),
1748 ie = Args.filtered_end(); it != ie; ++it) {
1752 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1753 StringRef Value = A->getValue(i);
1755 CmdArgs.push_back(Value.data());
1756 TakeNextArg = false;
1760 if (Value == "-force_cpusubtype_ALL") {
1761 // Do nothing, this is the default and we don't support anything else.
1762 } else if (Value == "-L") {
1763 CmdArgs.push_back("-msave-temp-labels");
1764 } else if (Value == "--fatal-warnings") {
1765 CmdArgs.push_back("-mllvm");
1766 CmdArgs.push_back("-fatal-assembler-warnings");
1767 } else if (Value == "--noexecstack") {
1768 CmdArgs.push_back("-mnoexecstack");
1769 } else if (Value.startswith("-I")) {
1770 CmdArgs.push_back(Value.data());
1771 // We need to consume the next argument if the current arg is a plain
1772 // -I. The next arg will be the include directory.
1776 D.Diag(diag::err_drv_unsupported_option_argument)
1777 << A->getOption().getName() << Value;
1783 static void addProfileRTLinux(
1784 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1785 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1786 Args.hasArg(options::OPT_fprofile_generate) ||
1787 Args.hasArg(options::OPT_fcreate_profile) ||
1788 Args.hasArg(options::OPT_coverage)))
1791 // The profile runtime is located in the Linux library directory and has name
1792 // "libclang_rt.profile-<ArchName>.a".
1793 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1794 llvm::sys::path::append(
1795 LibProfile, "lib", "linux",
1796 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1798 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1801 static void addSanitizerRTLinkFlagsLinux(
1802 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
1803 const StringRef Sanitizer, bool BeforeLibStdCXX,
1804 bool ExportSymbols = true) {
1805 // Sanitizer runtime is located in the Linux library directory and
1806 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1807 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1808 llvm::sys::path::append(
1809 LibSanitizer, "lib", "linux",
1810 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
1812 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1813 // etc.) so that the linker picks custom versions of the global 'operator
1814 // new' and 'operator delete' symbols. We take the extreme (but simple)
1815 // strategy of inserting it at the front of the link command. It also
1816 // needs to be forced to end up in the executable, so wrap it in
1818 SmallVector<const char *, 3> LibSanitizerArgs;
1819 LibSanitizerArgs.push_back("-whole-archive");
1820 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1821 LibSanitizerArgs.push_back("-no-whole-archive");
1823 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1824 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1826 CmdArgs.push_back("-lpthread");
1827 CmdArgs.push_back("-lrt");
1828 CmdArgs.push_back("-ldl");
1829 CmdArgs.push_back("-lm");
1831 // If possible, use a dynamic symbols file to export the symbols from the
1832 // runtime library. If we can't do so, use -export-dynamic instead to export
1833 // all symbols from the binary.
1834 if (ExportSymbols) {
1835 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1837 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1839 CmdArgs.push_back("-export-dynamic");
1843 /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1844 /// This needs to be called before we add the C run-time (malloc, etc).
1845 static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
1846 ArgStringList &CmdArgs) {
1847 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
1848 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1849 llvm::sys::path::append(LibAsan, "lib", "linux",
1850 (Twine("libclang_rt.asan-") +
1851 TC.getArchName() + "-android.so"));
1852 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
1854 if (!Args.hasArg(options::OPT_shared))
1855 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
1859 /// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1860 /// This needs to be called before we add the C run-time (malloc, etc).
1861 static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1862 ArgStringList &CmdArgs) {
1863 if (!Args.hasArg(options::OPT_shared))
1864 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
1867 /// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1868 /// This needs to be called before we add the C run-time (malloc, etc).
1869 static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1870 ArgStringList &CmdArgs) {
1871 if (!Args.hasArg(options::OPT_shared))
1872 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
1875 /// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1876 /// This needs to be called before we add the C run-time (malloc, etc).
1877 static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1878 ArgStringList &CmdArgs) {
1879 if (!Args.hasArg(options::OPT_shared))
1880 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
1883 /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1885 static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1886 ArgStringList &CmdArgs, bool IsCXX,
1887 bool HasOtherSanitizerRt) {
1888 // Need a copy of sanitizer_common. This could come from another sanitizer
1889 // runtime; if we're not including one, include our own copy.
1890 if (!HasOtherSanitizerRt)
1891 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1893 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1895 // Only include the bits of the runtime which need a C++ ABI library if
1896 // we're linking in C++ mode.
1898 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
1901 static void addDfsanRTLinux(const ToolChain &TC, const ArgList &Args,
1902 ArgStringList &CmdArgs) {
1903 if (!Args.hasArg(options::OPT_shared))
1904 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "dfsan", true);
1907 static bool shouldUseFramePointerForTarget(const ArgList &Args,
1908 const llvm::Triple &Triple) {
1909 switch (Triple.getArch()) {
1910 // Don't use a frame pointer on linux if optimizing for certain targets.
1911 case llvm::Triple::mips64:
1912 case llvm::Triple::mips64el:
1913 case llvm::Triple::mips:
1914 case llvm::Triple::mipsel:
1915 case llvm::Triple::systemz:
1916 case llvm::Triple::x86:
1917 case llvm::Triple::x86_64:
1918 if (Triple.isOSLinux())
1919 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1920 if (!A->getOption().matches(options::OPT_O0))
1923 case llvm::Triple::xcore:
1930 static bool shouldUseFramePointer(const ArgList &Args,
1931 const llvm::Triple &Triple) {
1932 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1933 options::OPT_fomit_frame_pointer))
1934 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1936 return shouldUseFramePointerForTarget(Args, Triple);
1939 static bool shouldUseLeafFramePointer(const ArgList &Args,
1940 const llvm::Triple &Triple) {
1941 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1942 options::OPT_momit_leaf_frame_pointer))
1943 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1945 return shouldUseFramePointerForTarget(Args, Triple);
1948 /// Add a CC1 option to specify the debug compilation directory.
1949 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1950 SmallString<128> cwd;
1951 if (!llvm::sys::fs::current_path(cwd)) {
1952 CmdArgs.push_back("-fdebug-compilation-dir");
1953 CmdArgs.push_back(Args.MakeArgString(cwd));
1957 static const char *SplitDebugName(const ArgList &Args,
1958 const InputInfoList &Inputs) {
1959 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1960 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1961 SmallString<128> T(FinalOutput->getValue());
1962 llvm::sys::path::replace_extension(T, "dwo");
1963 return Args.MakeArgString(T);
1965 // Use the compilation dir.
1966 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1967 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1968 llvm::sys::path::replace_extension(F, "dwo");
1970 return Args.MakeArgString(F);
1974 static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1975 const Tool &T, const JobAction &JA,
1976 const ArgList &Args, const InputInfo &Output,
1977 const char *OutFile) {
1978 ArgStringList ExtractArgs;
1979 ExtractArgs.push_back("--extract-dwo");
1981 ArgStringList StripArgs;
1982 StripArgs.push_back("--strip-dwo");
1984 // Grabbing the output of the earlier compile step.
1985 StripArgs.push_back(Output.getFilename());
1986 ExtractArgs.push_back(Output.getFilename());
1987 ExtractArgs.push_back(OutFile);
1990 Args.MakeArgString(TC.GetProgramPath("objcopy"));
1992 // First extract the dwo sections.
1993 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
1995 // Then remove them from the original .o file.
1996 C.addCommand(new Command(JA, T, Exec, StripArgs));
1999 static bool isOptimizationLevelFast(const ArgList &Args) {
2000 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2001 if (A->getOption().matches(options::OPT_Ofast))
2006 /// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2007 static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2008 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2009 if (A->getOption().matches(options::OPT_O4) ||
2010 A->getOption().matches(options::OPT_Ofast))
2013 if (A->getOption().matches(options::OPT_O0))
2016 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2019 StringRef S(A->getValue());
2023 // Don't vectorize -Oz.
2027 unsigned OptLevel = 0;
2028 if (S.getAsInteger(10, OptLevel))
2031 return OptLevel > 1;
2037 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
2038 const InputInfo &Output,
2039 const InputInfoList &Inputs,
2040 const ArgList &Args,
2041 const char *LinkingOutput) const {
2042 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2043 options::OPT_fapple_kext);
2044 const Driver &D = getToolChain().getDriver();
2045 ArgStringList CmdArgs;
2047 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2049 // Invoke ourselves in -cc1 mode.
2051 // FIXME: Implement custom jobs for internal actions.
2052 CmdArgs.push_back("-cc1");
2054 // Add the "effective" target triple.
2055 CmdArgs.push_back("-triple");
2056 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2057 CmdArgs.push_back(Args.MakeArgString(TripleStr));
2059 // Select the appropriate action.
2060 RewriteKind rewriteKind = RK_None;
2062 if (isa<AnalyzeJobAction>(JA)) {
2063 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2064 CmdArgs.push_back("-analyze");
2065 } else if (isa<MigrateJobAction>(JA)) {
2066 CmdArgs.push_back("-migrate");
2067 } else if (isa<PreprocessJobAction>(JA)) {
2068 if (Output.getType() == types::TY_Dependencies)
2069 CmdArgs.push_back("-Eonly");
2071 CmdArgs.push_back("-E");
2072 if (Args.hasArg(options::OPT_rewrite_objc) &&
2073 !Args.hasArg(options::OPT_g_Group))
2074 CmdArgs.push_back("-P");
2076 } else if (isa<AssembleJobAction>(JA)) {
2077 CmdArgs.push_back("-emit-obj");
2079 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
2081 // Also ignore explicit -force_cpusubtype_ALL option.
2082 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
2083 } else if (isa<PrecompileJobAction>(JA)) {
2084 // Use PCH if the user requested it.
2085 bool UsePCH = D.CCCUsePCH;
2087 if (JA.getType() == types::TY_Nothing)
2088 CmdArgs.push_back("-fsyntax-only");
2090 CmdArgs.push_back("-emit-pch");
2092 CmdArgs.push_back("-emit-pth");
2094 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
2096 if (JA.getType() == types::TY_Nothing) {
2097 CmdArgs.push_back("-fsyntax-only");
2098 } else if (JA.getType() == types::TY_LLVM_IR ||
2099 JA.getType() == types::TY_LTO_IR) {
2100 CmdArgs.push_back("-emit-llvm");
2101 } else if (JA.getType() == types::TY_LLVM_BC ||
2102 JA.getType() == types::TY_LTO_BC) {
2103 CmdArgs.push_back("-emit-llvm-bc");
2104 } else if (JA.getType() == types::TY_PP_Asm) {
2105 CmdArgs.push_back("-S");
2106 } else if (JA.getType() == types::TY_AST) {
2107 CmdArgs.push_back("-emit-pch");
2108 } else if (JA.getType() == types::TY_ModuleFile) {
2109 CmdArgs.push_back("-module-file-info");
2110 } else if (JA.getType() == types::TY_RewrittenObjC) {
2111 CmdArgs.push_back("-rewrite-objc");
2112 rewriteKind = RK_NonFragile;
2113 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2114 CmdArgs.push_back("-rewrite-objc");
2115 rewriteKind = RK_Fragile;
2117 assert(JA.getType() == types::TY_PP_Asm &&
2118 "Unexpected output type!");
2122 // The make clang go fast button.
2123 CmdArgs.push_back("-disable-free");
2125 // Disable the verification pass in -asserts builds.
2127 CmdArgs.push_back("-disable-llvm-verifier");
2130 // Set the main file name, so that debug info works even with
2132 CmdArgs.push_back("-main-file-name");
2133 CmdArgs.push_back(getBaseInputName(Args, Inputs));
2135 // Some flags which affect the language (via preprocessor
2137 if (Args.hasArg(options::OPT_static))
2138 CmdArgs.push_back("-static-define");
2140 if (isa<AnalyzeJobAction>(JA)) {
2141 // Enable region store model by default.
2142 CmdArgs.push_back("-analyzer-store=region");
2144 // Treat blocks as analysis entry points.
2145 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2147 CmdArgs.push_back("-analyzer-eagerly-assume");
2149 // Add default argument set.
2150 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
2151 CmdArgs.push_back("-analyzer-checker=core");
2153 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2154 CmdArgs.push_back("-analyzer-checker=unix");
2156 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
2157 CmdArgs.push_back("-analyzer-checker=osx");
2159 CmdArgs.push_back("-analyzer-checker=deadcode");
2161 if (types::isCXX(Inputs[0].getType()))
2162 CmdArgs.push_back("-analyzer-checker=cplusplus");
2164 // Enable the following experimental checkers for testing.
2165 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2166 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2167 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2168 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2169 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2170 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
2173 // Set the output format. The default is plist, for (lame) historical
2175 CmdArgs.push_back("-analyzer-output");
2176 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
2177 CmdArgs.push_back(A->getValue());
2179 CmdArgs.push_back("plist");
2181 // Disable the presentation of standard compiler warnings when
2182 // using --analyze. We only want to show static analyzer diagnostics
2183 // or frontend errors.
2184 CmdArgs.push_back("-w");
2186 // Add -Xanalyzer arguments when running as analyzer.
2187 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
2190 CheckCodeGenerationOptions(D, Args);
2192 bool PIE = getToolChain().isPIEDefault();
2193 bool PIC = PIE || getToolChain().isPICDefault();
2194 bool IsPICLevelTwo = PIC;
2196 // For the PIC and PIE flag options, this logic is different from the
2197 // legacy logic in very old versions of GCC, as that logic was just
2198 // a bug no one had ever fixed. This logic is both more rational and
2199 // consistent with GCC's new logic now that the bugs are fixed. The last
2200 // argument relating to either PIC or PIE wins, and no other argument is
2201 // used. If the last argument is any flavor of the '-fno-...' arguments,
2202 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2203 // at the same level.
2204 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2205 options::OPT_fpic, options::OPT_fno_pic,
2206 options::OPT_fPIE, options::OPT_fno_PIE,
2207 options::OPT_fpie, options::OPT_fno_pie);
2208 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2209 // is forced, then neither PIC nor PIE flags will have no effect.
2210 if (!getToolChain().isPICDefaultForced()) {
2212 Option O = LastPICArg->getOption();
2213 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2214 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2215 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2216 PIC = PIE || O.matches(options::OPT_fPIC) ||
2217 O.matches(options::OPT_fpic);
2218 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2219 O.matches(options::OPT_fPIC);
2226 // Introduce a Darwin-specific hack. If the default is PIC but the flags
2227 // specified while enabling PIC enabled level 1 PIC, just force it back to
2228 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2229 // informal testing).
2230 if (PIC && getToolChain().getTriple().isOSDarwin())
2231 IsPICLevelTwo |= getToolChain().isPICDefault();
2233 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2234 // PIC or PIE options above, if these show up, PIC is disabled.
2235 llvm::Triple Triple(TripleStr);
2237 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
2239 if (Args.hasArg(options::OPT_static))
2242 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2243 // This is a very special mode. It trumps the other modes, almost no one
2244 // uses it, and it isn't even valid on any OS but Darwin.
2245 if (!getToolChain().getTriple().isOSDarwin())
2246 D.Diag(diag::err_drv_unsupported_opt_for_target)
2247 << A->getSpelling() << getToolChain().getTriple().str();
2249 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2251 CmdArgs.push_back("-mrelocation-model");
2252 CmdArgs.push_back("dynamic-no-pic");
2254 // Only a forced PIC mode can cause the actual compile to have PIC defines
2255 // etc., no flags are sufficient. This behavior was selected to closely
2256 // match that of llvm-gcc and Apple GCC before that.
2257 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2258 CmdArgs.push_back("-pic-level");
2259 CmdArgs.push_back("2");
2262 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2263 // handled in Clang's IRGen by the -pie-level flag.
2264 CmdArgs.push_back("-mrelocation-model");
2265 CmdArgs.push_back(PIC ? "pic" : "static");
2268 CmdArgs.push_back("-pic-level");
2269 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2271 CmdArgs.push_back("-pie-level");
2272 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2277 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2278 options::OPT_fno_merge_all_constants))
2279 CmdArgs.push_back("-fno-merge-all-constants");
2281 // LLVM Code Generator Options.
2283 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2284 CmdArgs.push_back("-mregparm");
2285 CmdArgs.push_back(A->getValue());
2288 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2289 options::OPT_freg_struct_return)) {
2290 if (getToolChain().getArch() != llvm::Triple::x86) {
2291 D.Diag(diag::err_drv_unsupported_opt_for_target)
2292 << A->getSpelling() << getToolChain().getTriple().str();
2293 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2294 CmdArgs.push_back("-fpcc-struct-return");
2296 assert(A->getOption().matches(options::OPT_freg_struct_return));
2297 CmdArgs.push_back("-freg-struct-return");
2301 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2302 CmdArgs.push_back("-mrtd");
2304 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
2305 CmdArgs.push_back("-mdisable-fp-elim");
2306 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2307 options::OPT_fno_zero_initialized_in_bss))
2308 CmdArgs.push_back("-mno-zero-initialized-in-bss");
2310 bool OFastEnabled = isOptimizationLevelFast(Args);
2311 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2312 // enabled. This alias option is being used to simplify the hasFlag logic.
2313 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2314 options::OPT_fstrict_aliasing;
2315 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
2316 options::OPT_fno_strict_aliasing, true))
2317 CmdArgs.push_back("-relaxed-aliasing");
2318 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2319 options::OPT_fno_struct_path_tbaa))
2320 CmdArgs.push_back("-no-struct-path-tbaa");
2321 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2323 CmdArgs.push_back("-fstrict-enums");
2324 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2325 options::OPT_fno_optimize_sibling_calls))
2326 CmdArgs.push_back("-mdisable-tail-calls");
2328 // Handle segmented stacks.
2329 if (Args.hasArg(options::OPT_fsplit_stack))
2330 CmdArgs.push_back("-split-stacks");
2332 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2333 // This alias option is being used to simplify the getLastArg logic.
2334 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2335 options::OPT_ffast_math;
2337 // Handle various floating point optimization flags, mapping them to the
2338 // appropriate LLVM code generation flags. The pattern for all of these is to
2339 // default off the codegen optimizations, and if any flag enables them and no
2340 // flag disables them after the flag enabling them, enable the codegen
2341 // optimization. This is complicated by several "umbrella" flags.
2342 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2343 options::OPT_fno_fast_math,
2344 options::OPT_ffinite_math_only,
2345 options::OPT_fno_finite_math_only,
2346 options::OPT_fhonor_infinities,
2347 options::OPT_fno_honor_infinities))
2348 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2349 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2350 A->getOption().getID() != options::OPT_fhonor_infinities)
2351 CmdArgs.push_back("-menable-no-infs");
2352 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2353 options::OPT_fno_fast_math,
2354 options::OPT_ffinite_math_only,
2355 options::OPT_fno_finite_math_only,
2356 options::OPT_fhonor_nans,
2357 options::OPT_fno_honor_nans))
2358 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2359 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2360 A->getOption().getID() != options::OPT_fhonor_nans)
2361 CmdArgs.push_back("-menable-no-nans");
2363 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2364 bool MathErrno = getToolChain().IsMathErrnoDefault();
2365 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2366 options::OPT_fno_fast_math,
2367 options::OPT_fmath_errno,
2368 options::OPT_fno_math_errno)) {
2369 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2370 // However, turning *off* -ffast_math merely restores the toolchain default
2371 // (which may be false).
2372 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2373 A->getOption().getID() == options::OPT_ffast_math ||
2374 A->getOption().getID() == options::OPT_Ofast)
2376 else if (A->getOption().getID() == options::OPT_fmath_errno)
2380 CmdArgs.push_back("-fmath-errno");
2382 // There are several flags which require disabling very specific
2383 // optimizations. Any of these being disabled forces us to turn off the
2384 // entire set of LLVM optimizations, so collect them through all the flag
2386 bool AssociativeMath = false;
2387 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2388 options::OPT_fno_fast_math,
2389 options::OPT_funsafe_math_optimizations,
2390 options::OPT_fno_unsafe_math_optimizations,
2391 options::OPT_fassociative_math,
2392 options::OPT_fno_associative_math))
2393 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2394 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2395 A->getOption().getID() != options::OPT_fno_associative_math)
2396 AssociativeMath = true;
2397 bool ReciprocalMath = false;
2398 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2399 options::OPT_fno_fast_math,
2400 options::OPT_funsafe_math_optimizations,
2401 options::OPT_fno_unsafe_math_optimizations,
2402 options::OPT_freciprocal_math,
2403 options::OPT_fno_reciprocal_math))
2404 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2405 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2406 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2407 ReciprocalMath = true;
2408 bool SignedZeros = true;
2409 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2410 options::OPT_fno_fast_math,
2411 options::OPT_funsafe_math_optimizations,
2412 options::OPT_fno_unsafe_math_optimizations,
2413 options::OPT_fsigned_zeros,
2414 options::OPT_fno_signed_zeros))
2415 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2416 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2417 A->getOption().getID() != options::OPT_fsigned_zeros)
2418 SignedZeros = false;
2419 bool TrappingMath = true;
2420 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2421 options::OPT_fno_fast_math,
2422 options::OPT_funsafe_math_optimizations,
2423 options::OPT_fno_unsafe_math_optimizations,
2424 options::OPT_ftrapping_math,
2425 options::OPT_fno_trapping_math))
2426 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2427 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2428 A->getOption().getID() != options::OPT_ftrapping_math)
2429 TrappingMath = false;
2430 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2432 CmdArgs.push_back("-menable-unsafe-fp-math");
2435 // Validate and pass through -fp-contract option.
2436 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2437 options::OPT_fno_fast_math,
2438 options::OPT_ffp_contract)) {
2439 if (A->getOption().getID() == options::OPT_ffp_contract) {
2440 StringRef Val = A->getValue();
2441 if (Val == "fast" || Val == "on" || Val == "off") {
2442 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2444 D.Diag(diag::err_drv_unsupported_option_argument)
2445 << A->getOption().getName() << Val;
2447 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2448 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
2449 // If fast-math is set then set the fp-contract mode to fast.
2450 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2454 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2455 // and if we find them, tell the frontend to provide the appropriate
2456 // preprocessor macros. This is distinct from enabling any optimizations as
2457 // these options induce language changes which must survive serialization
2458 // and deserialization, etc.
2459 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2460 options::OPT_fno_fast_math))
2461 if (!A->getOption().matches(options::OPT_fno_fast_math))
2462 CmdArgs.push_back("-ffast-math");
2463 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2464 if (A->getOption().matches(options::OPT_ffinite_math_only))
2465 CmdArgs.push_back("-ffinite-math-only");
2467 // Decide whether to use verbose asm. Verbose assembly is the default on
2468 // toolchains which have the integrated assembler on by default.
2469 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2470 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
2471 IsVerboseAsmDefault) ||
2472 Args.hasArg(options::OPT_dA))
2473 CmdArgs.push_back("-masm-verbose");
2475 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2476 CmdArgs.push_back("-mdebug-pass");
2477 CmdArgs.push_back("Structure");
2479 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2480 CmdArgs.push_back("-mdebug-pass");
2481 CmdArgs.push_back("Arguments");
2484 // Enable -mconstructor-aliases except on darwin, where we have to
2485 // work around a linker bug; see <rdar://problem/7651567>.
2486 if (!getToolChain().getTriple().isOSDarwin())
2487 CmdArgs.push_back("-mconstructor-aliases");
2489 // Darwin's kernel doesn't support guard variables; just die if we
2491 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
2492 CmdArgs.push_back("-fforbid-guard-variables");
2494 if (Args.hasArg(options::OPT_mms_bitfields)) {
2495 CmdArgs.push_back("-mms-bitfields");
2498 // This is a coarse approximation of what llvm-gcc actually does, both
2499 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2500 // complicated ways.
2501 bool AsynchronousUnwindTables =
2502 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2503 options::OPT_fno_asynchronous_unwind_tables,
2504 getToolChain().IsUnwindTablesDefault() &&
2506 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2507 AsynchronousUnwindTables))
2508 CmdArgs.push_back("-munwind-tables");
2510 getToolChain().addClangTargetOptions(Args, CmdArgs);
2512 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2513 CmdArgs.push_back("-mlimit-float-precision");
2514 CmdArgs.push_back(A->getValue());
2517 // FIXME: Handle -mtune=.
2518 (void) Args.hasArg(options::OPT_mtune_EQ);
2520 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2521 CmdArgs.push_back("-mcode-model");
2522 CmdArgs.push_back(A->getValue());
2525 // Add the target cpu
2526 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2527 llvm::Triple ETriple(ETripleStr);
2528 std::string CPU = getCPUName(Args, ETriple);
2530 CmdArgs.push_back("-target-cpu");
2531 CmdArgs.push_back(Args.MakeArgString(CPU));
2534 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2535 CmdArgs.push_back("-mfpmath");
2536 CmdArgs.push_back(A->getValue());
2539 // Add the target features
2540 getTargetFeatures(D, ETriple, Args, CmdArgs);
2542 // Add target specific flags.
2543 switch(getToolChain().getArch()) {
2547 case llvm::Triple::arm:
2548 case llvm::Triple::thumb:
2549 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2552 case llvm::Triple::mips:
2553 case llvm::Triple::mipsel:
2554 case llvm::Triple::mips64:
2555 case llvm::Triple::mips64el:
2556 AddMIPSTargetArgs(Args, CmdArgs);
2559 case llvm::Triple::sparc:
2560 AddSparcTargetArgs(Args, CmdArgs);
2563 case llvm::Triple::x86:
2564 case llvm::Triple::x86_64:
2565 AddX86TargetArgs(Args, CmdArgs);
2568 case llvm::Triple::hexagon:
2569 AddHexagonTargetArgs(Args, CmdArgs);
2573 // Add clang-cl arguments.
2574 if (getToolChain().getDriver().IsCLMode())
2575 AddClangCLArgs(Args, CmdArgs);
2577 // Pass the linker version in use.
2578 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2579 CmdArgs.push_back("-target-linker-version");
2580 CmdArgs.push_back(A->getValue());
2583 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
2584 CmdArgs.push_back("-momit-leaf-frame-pointer");
2586 // Explicitly error on some things we know we don't support and can't just
2588 types::ID InputType = Inputs[0].getType();
2589 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2591 if (types::isCXX(InputType) &&
2592 getToolChain().getTriple().isOSDarwin() &&
2593 getToolChain().getArch() == llvm::Triple::x86) {
2594 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2595 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
2596 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
2597 << Unsupported->getOption().getName();
2601 Args.AddAllArgs(CmdArgs, options::OPT_v);
2602 Args.AddLastArg(CmdArgs, options::OPT_H);
2603 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
2604 CmdArgs.push_back("-header-include-file");
2605 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2606 D.CCPrintHeadersFilename : "-");
2608 Args.AddLastArg(CmdArgs, options::OPT_P);
2609 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
2611 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2612 CmdArgs.push_back("-diagnostic-log-file");
2613 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2614 D.CCLogDiagnosticsFilename : "-");
2617 // Use the last option from "-g" group. "-gline-tables-only"
2618 // is preserved, all other debug options are substituted with "-g".
2619 Args.ClaimAllArgs(options::OPT_g_Group);
2620 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2621 if (A->getOption().matches(options::OPT_gline_tables_only))
2622 CmdArgs.push_back("-gline-tables-only");
2623 else if (A->getOption().matches(options::OPT_gdwarf_2))
2624 CmdArgs.push_back("-gdwarf-2");
2625 else if (A->getOption().matches(options::OPT_gdwarf_3))
2626 CmdArgs.push_back("-gdwarf-3");
2627 else if (A->getOption().matches(options::OPT_gdwarf_4))
2628 CmdArgs.push_back("-gdwarf-4");
2629 else if (!A->getOption().matches(options::OPT_g0) &&
2630 !A->getOption().matches(options::OPT_ggdb0)) {
2631 // Default is dwarf-2 for darwin and FreeBSD <= 10.
2632 const llvm::Triple &Triple = getToolChain().getTriple();
2633 if (Triple.isOSDarwin() || (Triple.getOS() == llvm::Triple::FreeBSD &&
2634 Triple.getOSMajorVersion() <= 10))
2635 CmdArgs.push_back("-gdwarf-2");
2637 CmdArgs.push_back("-g");
2641 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2642 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2643 if (Args.hasArg(options::OPT_gcolumn_info))
2644 CmdArgs.push_back("-dwarf-column-info");
2646 // FIXME: Move backend command line options to the module.
2647 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2648 // splitting and extraction.
2649 // FIXME: Currently only works on Linux.
2650 if (getToolChain().getTriple().isOSLinux() &&
2651 Args.hasArg(options::OPT_gsplit_dwarf)) {
2652 CmdArgs.push_back("-g");
2653 CmdArgs.push_back("-backend-option");
2654 CmdArgs.push_back("-split-dwarf=Enable");
2657 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2658 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2659 CmdArgs.push_back("-backend-option");
2660 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2663 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2665 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2666 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2668 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2670 if (Args.hasArg(options::OPT_ftest_coverage) ||
2671 Args.hasArg(options::OPT_coverage))
2672 CmdArgs.push_back("-femit-coverage-notes");
2673 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2674 Args.hasArg(options::OPT_coverage))
2675 CmdArgs.push_back("-femit-coverage-data");
2677 if (C.getArgs().hasArg(options::OPT_c) ||
2678 C.getArgs().hasArg(options::OPT_S)) {
2679 if (Output.isFilename()) {
2680 CmdArgs.push_back("-coverage-file");
2681 SmallString<128> CoverageFilename(Output.getFilename());
2682 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2683 SmallString<128> Pwd;
2684 if (!llvm::sys::fs::current_path(Pwd)) {
2685 llvm::sys::path::append(Pwd, CoverageFilename.str());
2686 CoverageFilename.swap(Pwd);
2689 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2693 // Pass options for controlling the default header search paths.
2694 if (Args.hasArg(options::OPT_nostdinc)) {
2695 CmdArgs.push_back("-nostdsysteminc");
2696 CmdArgs.push_back("-nobuiltininc");
2698 if (Args.hasArg(options::OPT_nostdlibinc))
2699 CmdArgs.push_back("-nostdsysteminc");
2700 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2701 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2704 // Pass the path to compiler resource files.
2705 CmdArgs.push_back("-resource-dir");
2706 CmdArgs.push_back(D.ResourceDir.c_str());
2708 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2710 bool ARCMTEnabled = false;
2711 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
2712 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
2713 options::OPT_ccc_arcmt_modify,
2714 options::OPT_ccc_arcmt_migrate)) {
2715 ARCMTEnabled = true;
2716 switch (A->getOption().getID()) {
2718 llvm_unreachable("missed a case");
2719 case options::OPT_ccc_arcmt_check:
2720 CmdArgs.push_back("-arcmt-check");
2722 case options::OPT_ccc_arcmt_modify:
2723 CmdArgs.push_back("-arcmt-modify");
2725 case options::OPT_ccc_arcmt_migrate:
2726 CmdArgs.push_back("-arcmt-migrate");
2727 CmdArgs.push_back("-mt-migrate-directory");
2728 CmdArgs.push_back(A->getValue());
2730 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2731 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
2736 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2737 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2738 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
2741 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2743 D.Diag(diag::err_drv_argument_not_allowed_with)
2744 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2746 CmdArgs.push_back("-mt-migrate-directory");
2747 CmdArgs.push_back(A->getValue());
2749 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2750 options::OPT_objcmt_migrate_subscripting,
2751 options::OPT_objcmt_migrate_property)) {
2752 // None specified, means enable them all.
2753 CmdArgs.push_back("-objcmt-migrate-literals");
2754 CmdArgs.push_back("-objcmt-migrate-subscripting");
2755 CmdArgs.push_back("-objcmt-migrate-property");
2757 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2758 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2759 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2762 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2763 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2764 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2765 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2766 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2767 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2768 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2769 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2770 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2771 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2772 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2773 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2774 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
2775 Args.AddLastArg(CmdArgs, options::OPT_objcmt_white_list_dir_path);
2778 // Add preprocessing options like -I, -D, etc. if we are using the
2781 // FIXME: Support -fpreprocessed
2782 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
2783 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
2785 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2786 // that "The compiler can only warn and ignore the option if not recognized".
2787 // When building with ccache, it will pass -D options to clang even on
2788 // preprocessed inputs and configure concludes that -fPIC is not supported.
2789 Args.ClaimAllArgs(options::OPT_D);
2791 // Manually translate -O4 to -O3; let clang reject others.
2792 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2793 if (A->getOption().matches(options::OPT_O4)) {
2794 CmdArgs.push_back("-O3");
2795 D.Diag(diag::warn_O4_is_O3);
2797 A->render(Args, CmdArgs);
2801 // Don't warn about unused -flto. This can happen when we're preprocessing or
2803 Args.ClaimAllArgs(options::OPT_flto);
2805 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
2806 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2807 CmdArgs.push_back("-pedantic");
2808 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
2809 Args.AddLastArg(CmdArgs, options::OPT_w);
2811 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2812 // (-ansi is equivalent to -std=c89 or -std=c++98).
2814 // If a std is supplied, only add -trigraphs if it follows the
2816 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2817 if (Std->getOption().matches(options::OPT_ansi))
2818 if (types::isCXX(InputType))
2819 CmdArgs.push_back("-std=c++98");
2821 CmdArgs.push_back("-std=c89");
2823 Std->render(Args, CmdArgs);
2825 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2826 options::OPT_trigraphs))
2828 A->render(Args, CmdArgs);
2830 // Honor -std-default.
2832 // FIXME: Clang doesn't correctly handle -std= when the input language
2833 // doesn't match. For the time being just ignore this for C++ inputs;
2834 // eventually we want to do all the standard defaulting here instead of
2835 // splitting it between the driver and clang -cc1.
2836 if (!types::isCXX(InputType))
2837 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2838 "-std=", /*Joined=*/true);
2839 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2840 CmdArgs.push_back("-std=c++11");
2842 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
2845 // GCC's behavior for -Wwrite-strings is a bit strange:
2846 // * In C, this "warning flag" changes the types of string literals from
2847 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2848 // for the discarded qualifier.
2849 // * In C++, this is just a normal warning flag.
2851 // Implementing this warning correctly in C is hard, so we follow GCC's
2852 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2853 // a non-const char* in C, rather than using this crude hack.
2854 if (!types::isCXX(InputType)) {
2855 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2856 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2857 if (DiagLevel > DiagnosticsEngine::Ignored)
2858 CmdArgs.push_back("-fconst-strings");
2861 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
2862 // during C++ compilation, which it is by default. GCC keeps this define even
2863 // in the presence of '-w', match this behavior bug-for-bug.
2864 if (types::isCXX(InputType) &&
2865 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2867 CmdArgs.push_back("-fdeprecated-macro");
2870 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2871 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2872 if (Asm->getOption().matches(options::OPT_fasm))
2873 CmdArgs.push_back("-fgnu-keywords");
2875 CmdArgs.push_back("-fno-gnu-keywords");
2878 if (ShouldDisableCFI(Args, getToolChain()))
2879 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2881 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2882 CmdArgs.push_back("-fno-dwarf-directory-asm");
2884 if (ShouldDisableAutolink(Args, getToolChain()))
2885 CmdArgs.push_back("-fno-autolink");
2887 // Add in -fdebug-compilation-dir if necessary.
2888 addDebugCompDirArg(Args, CmdArgs);
2890 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2891 options::OPT_ftemplate_depth_EQ)) {
2892 CmdArgs.push_back("-ftemplate-depth");
2893 CmdArgs.push_back(A->getValue());
2896 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2897 CmdArgs.push_back("-foperator-arrow-depth");
2898 CmdArgs.push_back(A->getValue());
2901 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2902 CmdArgs.push_back("-fconstexpr-depth");
2903 CmdArgs.push_back(A->getValue());
2906 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2907 CmdArgs.push_back("-fconstexpr-steps");
2908 CmdArgs.push_back(A->getValue());
2911 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2912 CmdArgs.push_back("-fbracket-depth");
2913 CmdArgs.push_back(A->getValue());
2916 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2917 options::OPT_Wlarge_by_value_copy_def)) {
2918 if (A->getNumValues()) {
2919 StringRef bytes = A->getValue();
2920 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2922 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
2926 if (Args.hasArg(options::OPT_relocatable_pch))
2927 CmdArgs.push_back("-relocatable-pch");
2929 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2930 CmdArgs.push_back("-fconstant-string-class");
2931 CmdArgs.push_back(A->getValue());
2934 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2935 CmdArgs.push_back("-ftabstop");
2936 CmdArgs.push_back(A->getValue());
2939 CmdArgs.push_back("-ferror-limit");
2940 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2941 CmdArgs.push_back(A->getValue());
2943 CmdArgs.push_back("19");
2945 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2946 CmdArgs.push_back("-fmacro-backtrace-limit");
2947 CmdArgs.push_back(A->getValue());
2950 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2951 CmdArgs.push_back("-ftemplate-backtrace-limit");
2952 CmdArgs.push_back(A->getValue());
2955 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2956 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2957 CmdArgs.push_back(A->getValue());
2960 // Pass -fmessage-length=.
2961 CmdArgs.push_back("-fmessage-length");
2962 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
2963 CmdArgs.push_back(A->getValue());
2965 // If -fmessage-length=N was not specified, determine whether this is a
2966 // terminal and, if so, implicitly define -fmessage-length appropriately.
2967 unsigned N = llvm::sys::Process::StandardErrColumns();
2968 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
2971 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2972 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2973 options::OPT_fvisibility_ms_compat)) {
2974 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2975 CmdArgs.push_back("-fvisibility");
2976 CmdArgs.push_back(A->getValue());
2978 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2979 CmdArgs.push_back("-fvisibility");
2980 CmdArgs.push_back("hidden");
2981 CmdArgs.push_back("-ftype-visibility");
2982 CmdArgs.push_back("default");
2986 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
2988 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2990 // -fhosted is default.
2991 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2993 CmdArgs.push_back("-ffreestanding");
2995 // Forward -f (flag) options which we can pass directly.
2996 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
2997 Args.AddLastArg(CmdArgs, options::OPT_fformat_extensions);
2998 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
2999 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
3000 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
3001 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
3002 // AltiVec language extensions aren't relevant for assembling.
3003 if (!isa<PreprocessJobAction>(JA) ||
3004 Output.getType() != types::TY_PP_Asm)
3005 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
3006 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3007 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
3009 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3010 Sanitize.addArgs(Args, CmdArgs);
3012 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3013 options::OPT_fno_sanitize_recover,
3015 CmdArgs.push_back("-fno-sanitize-recover");
3017 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
3018 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3019 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3020 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3022 // Report an error for -faltivec on anything other than PowerPC.
3023 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
3024 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
3025 getToolChain().getArch() == llvm::Triple::ppc64 ||
3026 getToolChain().getArch() == llvm::Triple::ppc64le))
3027 D.Diag(diag::err_drv_argument_only_allowed_with)
3028 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
3030 if (getToolChain().SupportsProfiling())
3031 Args.AddLastArg(CmdArgs, options::OPT_pg);
3033 // -flax-vector-conversions is default.
3034 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3035 options::OPT_fno_lax_vector_conversions))
3036 CmdArgs.push_back("-fno-lax-vector-conversions");
3038 if (Args.getLastArg(options::OPT_fapple_kext))
3039 CmdArgs.push_back("-fapple-kext");
3041 if (Args.hasFlag(options::OPT_frewrite_includes,
3042 options::OPT_fno_rewrite_includes, false))
3043 CmdArgs.push_back("-frewrite-includes");
3045 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
3046 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
3047 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
3048 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3049 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
3051 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3052 CmdArgs.push_back("-ftrapv-handler");
3053 CmdArgs.push_back(A->getValue());
3056 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
3058 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3059 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3060 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3061 options::OPT_fno_wrapv)) {
3062 if (A->getOption().matches(options::OPT_fwrapv))
3063 CmdArgs.push_back("-fwrapv");
3064 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3065 options::OPT_fno_strict_overflow)) {
3066 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3067 CmdArgs.push_back("-fwrapv");
3070 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3071 options::OPT_fno_reroll_loops))
3072 if (A->getOption().matches(options::OPT_freroll_loops))
3073 CmdArgs.push_back("-freroll-loops");
3075 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
3076 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3077 options::OPT_fno_unroll_loops);
3079 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3082 // -stack-protector=0 is default.
3083 unsigned StackProtectorLevel = 0;
3084 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3085 options::OPT_fstack_protector_all,
3086 options::OPT_fstack_protector)) {
3087 if (A->getOption().matches(options::OPT_fstack_protector))
3088 StackProtectorLevel = 1;
3089 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3090 StackProtectorLevel = 2;
3092 StackProtectorLevel =
3093 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3095 if (StackProtectorLevel) {
3096 CmdArgs.push_back("-stack-protector");
3097 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
3100 // --param ssp-buffer-size=
3101 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3102 ie = Args.filtered_end(); it != ie; ++it) {
3103 StringRef Str((*it)->getValue());
3104 if (Str.startswith("ssp-buffer-size=")) {
3105 if (StackProtectorLevel) {
3106 CmdArgs.push_back("-stack-protector-buffer-size");
3107 // FIXME: Verify the argument is a valid integer.
3108 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
3114 // Translate -mstackrealign
3115 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3117 CmdArgs.push_back("-backend-option");
3118 CmdArgs.push_back("-force-align-stack");
3120 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3122 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3125 if (Args.hasArg(options::OPT_mstack_alignment)) {
3126 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3127 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
3129 // -mkernel implies -mstrict-align; don't add the redundant option.
3130 if (!KernelOrKext) {
3131 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3132 options::OPT_munaligned_access)) {
3133 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3134 CmdArgs.push_back("-backend-option");
3135 CmdArgs.push_back("-arm-strict-align");
3137 CmdArgs.push_back("-backend-option");
3138 CmdArgs.push_back("-arm-no-strict-align");
3143 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3144 options::OPT_mno_restrict_it)) {
3145 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3146 CmdArgs.push_back("-backend-option");
3147 CmdArgs.push_back("-arm-restrict-it");
3149 CmdArgs.push_back("-backend-option");
3150 CmdArgs.push_back("-arm-no-restrict-it");
3154 // Forward -f options with positive and negative forms; we translate
3156 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3157 StringRef fname = A->getValue();
3158 if (!llvm::sys::fs::exists(fname))
3159 D.Diag(diag::err_drv_no_such_file) << fname;
3161 A->render(Args, CmdArgs);
3164 if (Args.hasArg(options::OPT_mkernel)) {
3165 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
3166 CmdArgs.push_back("-fapple-kext");
3167 if (!Args.hasArg(options::OPT_fbuiltin))
3168 CmdArgs.push_back("-fno-builtin");
3169 Args.ClaimAllArgs(options::OPT_fno_builtin);
3171 // -fbuiltin is default.
3172 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
3173 CmdArgs.push_back("-fno-builtin");
3175 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3176 options::OPT_fno_assume_sane_operator_new))
3177 CmdArgs.push_back("-fno-assume-sane-operator-new");
3179 // -fblocks=0 is default.
3180 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
3181 getToolChain().IsBlocksDefault()) ||
3182 (Args.hasArg(options::OPT_fgnu_runtime) &&
3183 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3184 !Args.hasArg(options::OPT_fno_blocks))) {
3185 CmdArgs.push_back("-fblocks");
3187 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3188 !getToolChain().hasBlocksRuntime())
3189 CmdArgs.push_back("-fblocks-runtime-optional");
3192 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3193 // users must also pass -fcxx-modules. The latter flag will disappear once the
3194 // modules implementation is solid for C++/Objective-C++ programs as well.
3195 bool HaveModules = false;
3196 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3197 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3198 options::OPT_fno_cxx_modules,
3200 if (AllowedInCXX || !types::isCXX(InputType)) {
3201 CmdArgs.push_back("-fmodules");
3206 // -fmodule-maps enables module map processing (off by default) for header
3207 // checking. It is implied by -fmodules.
3208 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3210 CmdArgs.push_back("-fmodule-maps");
3213 // -fmodules-decluse checks that modules used are declared so (off by
3215 if (Args.hasFlag(options::OPT_fmodules_decluse,
3216 options::OPT_fno_modules_decluse,
3218 CmdArgs.push_back("-fmodules-decluse");
3221 // -fmodule-name specifies the module that is currently being built (or
3222 // used for header checking by -fmodule-maps).
3223 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3225 A->render(Args, CmdArgs);
3228 // -fmodule-map-file can be used to specify a file containing module
3230 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3232 A->render(Args, CmdArgs);
3235 // If a module path was provided, pass it along. Otherwise, use a temporary
3237 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3240 A->render(Args, CmdArgs);
3242 } else if (HaveModules) {
3243 SmallString<128> DefaultModuleCache;
3244 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3245 DefaultModuleCache);
3246 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3247 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
3248 const char Arg[] = "-fmodules-cache-path=";
3249 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3250 Arg, Arg + strlen(Arg));
3251 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3254 // Pass through all -fmodules-ignore-macro arguments.
3255 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
3256 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3257 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
3259 // -faccess-control is default.
3260 if (Args.hasFlag(options::OPT_fno_access_control,
3261 options::OPT_faccess_control,
3263 CmdArgs.push_back("-fno-access-control");
3265 // -felide-constructors is the default.
3266 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3267 options::OPT_felide_constructors,
3269 CmdArgs.push_back("-fno-elide-constructors");
3271 // -frtti is default.
3272 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
3274 CmdArgs.push_back("-fno-rtti");
3276 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
3277 if (Sanitize.sanitizesVptr()) {
3278 std::string NoRttiArg =
3279 Args.getLastArg(options::OPT_mkernel,
3280 options::OPT_fapple_kext,
3281 options::OPT_fno_rtti)->getAsString(Args);
3282 D.Diag(diag::err_drv_argument_not_allowed_with)
3283 << "-fsanitize=vptr" << NoRttiArg;
3287 // -fshort-enums=0 is default for all architectures except Hexagon.
3288 if (Args.hasFlag(options::OPT_fshort_enums,
3289 options::OPT_fno_short_enums,
3290 getToolChain().getArch() ==
3291 llvm::Triple::hexagon))
3292 CmdArgs.push_back("-fshort-enums");
3294 // -fsigned-char is default.
3295 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
3296 isSignedCharDefault(getToolChain().getTriple())))
3297 CmdArgs.push_back("-fno-signed-char");
3299 // -fthreadsafe-static is default.
3300 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
3301 options::OPT_fno_threadsafe_statics))
3302 CmdArgs.push_back("-fno-threadsafe-statics");
3304 // -fuse-cxa-atexit is default.
3306 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3307 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3308 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
3309 getToolChain().getArch() != llvm::Triple::hexagon &&
3310 getToolChain().getArch() != llvm::Triple::xcore) ||
3312 CmdArgs.push_back("-fno-use-cxa-atexit");
3314 // -fms-extensions=0 is default.
3315 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3316 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3317 CmdArgs.push_back("-fms-extensions");
3319 // -fms-compatibility=0 is default.
3320 if (Args.hasFlag(options::OPT_fms_compatibility,
3321 options::OPT_fno_ms_compatibility,
3322 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3323 Args.hasFlag(options::OPT_fms_extensions,
3324 options::OPT_fno_ms_extensions,
3326 CmdArgs.push_back("-fms-compatibility");
3328 // -fmsc-version=1700 is default.
3329 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3330 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3331 Args.hasArg(options::OPT_fmsc_version)) {
3332 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
3333 if (msc_ver.empty())
3334 CmdArgs.push_back("-fmsc-version=1700");
3336 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3340 // -fno-borland-extensions is default.
3341 if (Args.hasFlag(options::OPT_fborland_extensions,
3342 options::OPT_fno_borland_extensions, false))
3343 CmdArgs.push_back("-fborland-extensions");
3345 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3347 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3348 options::OPT_fno_delayed_template_parsing,
3349 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3350 CmdArgs.push_back("-fdelayed-template-parsing");
3352 // -fgnu-keywords default varies depending on language; only pass if
3354 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
3355 options::OPT_fno_gnu_keywords))
3356 A->render(Args, CmdArgs);
3358 if (Args.hasFlag(options::OPT_fgnu89_inline,
3359 options::OPT_fno_gnu89_inline,
3361 CmdArgs.push_back("-fgnu89-inline");
3363 if (Args.hasArg(options::OPT_fno_inline))
3364 CmdArgs.push_back("-fno-inline");
3366 if (Args.hasArg(options::OPT_fno_inline_functions))
3367 CmdArgs.push_back("-fno-inline-functions");
3369 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
3371 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3372 // legacy is the default. Next runtime is always legacy dispatch and
3373 // -fno-objc-legacy-dispatch gets ignored silently.
3374 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
3375 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3376 options::OPT_fno_objc_legacy_dispatch,
3377 objcRuntime.isLegacyDispatchDefaultForArch(
3378 getToolChain().getArch()))) {
3379 if (getToolChain().UseObjCMixedDispatch())
3380 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3382 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3386 // When ObjectiveC legacy runtime is in effect on MacOSX,
3387 // turn on the option to do Array/Dictionary subscripting
3389 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3390 getToolChain().getTriple().isMacOSX() &&
3391 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3392 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
3393 objcRuntime.isNeXTFamily())
3394 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3396 // -fencode-extended-block-signature=1 is default.
3397 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3398 CmdArgs.push_back("-fencode-extended-block-signature");
3401 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3402 // NOTE: This logic is duplicated in ToolChains.cpp.
3403 bool ARC = isObjCAutoRefCount(Args);
3405 getToolChain().CheckObjCARC();
3407 CmdArgs.push_back("-fobjc-arc");
3409 // FIXME: It seems like this entire block, and several around it should be
3410 // wrapped in isObjC, but for now we just use it here as this is where it
3411 // was being used previously.
3412 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3413 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3414 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3416 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3419 // Allow the user to enable full exceptions code emission.
3420 // We define off for Objective-CC, on for Objective-C++.
3421 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3422 options::OPT_fno_objc_arc_exceptions,
3423 /*default*/ types::isCXX(InputType)))
3424 CmdArgs.push_back("-fobjc-arc-exceptions");
3427 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3429 if (rewriteKind != RK_None)
3430 CmdArgs.push_back("-fno-objc-infer-related-result-type");
3432 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3433 // takes precedence.
3434 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3436 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3439 D.Diag(diag::err_drv_objc_gc_arr)
3440 << GCArg->getAsString(Args);
3441 } else if (getToolChain().SupportsObjCGC()) {
3442 GCArg->render(Args, CmdArgs);
3444 // FIXME: We should move this to a hard error.
3445 D.Diag(diag::warn_drv_objc_gc_unsupported)
3446 << GCArg->getAsString(Args);
3450 // Add exception args.
3451 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
3452 KernelOrKext, objcRuntime, CmdArgs);
3454 if (getToolChain().UseSjLjExceptions())
3455 CmdArgs.push_back("-fsjlj-exceptions");
3457 // C++ "sane" operator new.
3458 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3459 options::OPT_fno_assume_sane_operator_new))
3460 CmdArgs.push_back("-fno-assume-sane-operator-new");
3462 // -fconstant-cfstrings is default, and may be subject to argument translation
3464 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3465 options::OPT_fno_constant_cfstrings) ||
3466 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3467 options::OPT_mno_constant_cfstrings))
3468 CmdArgs.push_back("-fno-constant-cfstrings");
3470 // -fshort-wchar default varies depending on platform; only
3471 // pass if specified.
3472 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3473 A->render(Args, CmdArgs);
3475 // -fno-pascal-strings is default, only pass non-default.
3476 if (Args.hasFlag(options::OPT_fpascal_strings,
3477 options::OPT_fno_pascal_strings,
3479 CmdArgs.push_back("-fpascal-strings");
3481 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3482 // -fno-pack-struct doesn't apply to -fpack-struct=.
3483 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
3484 std::string PackStructStr = "-fpack-struct=";
3485 PackStructStr += A->getValue();
3486 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
3487 } else if (Args.hasFlag(options::OPT_fpack_struct,
3488 options::OPT_fno_pack_struct, false)) {
3489 CmdArgs.push_back("-fpack-struct=1");
3492 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
3493 if (!Args.hasArg(options::OPT_fcommon))
3494 CmdArgs.push_back("-fno-common");
3495 Args.ClaimAllArgs(options::OPT_fno_common);
3498 // -fcommon is default, only pass non-default.
3499 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
3500 CmdArgs.push_back("-fno-common");
3502 // -fsigned-bitfields is default, and clang doesn't yet support
3503 // -funsigned-bitfields.
3504 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
3505 options::OPT_funsigned_bitfields))
3506 D.Diag(diag::warn_drv_clang_unsupported)
3507 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3509 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3510 if (!Args.hasFlag(options::OPT_ffor_scope,
3511 options::OPT_fno_for_scope))
3512 D.Diag(diag::err_drv_clang_unsupported)
3513 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3515 // -fcaret-diagnostics is default.
3516 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3517 options::OPT_fno_caret_diagnostics, true))
3518 CmdArgs.push_back("-fno-caret-diagnostics");
3520 // -fdiagnostics-fixit-info is default, only pass non-default.
3521 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
3522 options::OPT_fno_diagnostics_fixit_info))
3523 CmdArgs.push_back("-fno-diagnostics-fixit-info");
3525 // Enable -fdiagnostics-show-option by default.
3526 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
3527 options::OPT_fno_diagnostics_show_option))
3528 CmdArgs.push_back("-fdiagnostics-show-option");
3531 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3532 CmdArgs.push_back("-fdiagnostics-show-category");
3533 CmdArgs.push_back(A->getValue());
3537 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3538 CmdArgs.push_back("-fdiagnostics-format");
3539 CmdArgs.push_back(A->getValue());
3542 if (Arg *A = Args.getLastArg(
3543 options::OPT_fdiagnostics_show_note_include_stack,
3544 options::OPT_fno_diagnostics_show_note_include_stack)) {
3545 if (A->getOption().matches(
3546 options::OPT_fdiagnostics_show_note_include_stack))
3547 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3549 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3552 // Color diagnostics are the default, unless the terminal doesn't support
3554 // Support both clang's -f[no-]color-diagnostics and gcc's
3555 // -f[no-]diagnostics-colors[=never|always|auto].
3556 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3557 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3559 const Option &O = (*it)->getOption();
3560 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3561 !O.matches(options::OPT_fdiagnostics_color) &&
3562 !O.matches(options::OPT_fno_color_diagnostics) &&
3563 !O.matches(options::OPT_fno_diagnostics_color) &&
3564 !O.matches(options::OPT_fdiagnostics_color_EQ))
3568 if (O.matches(options::OPT_fcolor_diagnostics) ||
3569 O.matches(options::OPT_fdiagnostics_color)) {
3570 ShowColors = Colors_On;
3571 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3572 O.matches(options::OPT_fno_diagnostics_color)) {
3573 ShowColors = Colors_Off;
3575 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3576 StringRef value((*it)->getValue());
3577 if (value == "always")
3578 ShowColors = Colors_On;
3579 else if (value == "never")
3580 ShowColors = Colors_Off;
3581 else if (value == "auto")
3582 ShowColors = Colors_Auto;
3584 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3585 << ("-fdiagnostics-color=" + value).str();
3588 if (ShowColors == Colors_On ||
3589 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
3590 CmdArgs.push_back("-fcolor-diagnostics");
3592 if (Args.hasArg(options::OPT_fansi_escape_codes))
3593 CmdArgs.push_back("-fansi-escape-codes");
3595 if (!Args.hasFlag(options::OPT_fshow_source_location,
3596 options::OPT_fno_show_source_location))
3597 CmdArgs.push_back("-fno-show-source-location");
3599 if (!Args.hasFlag(options::OPT_fshow_column,
3600 options::OPT_fno_show_column,
3602 CmdArgs.push_back("-fno-show-column");
3604 if (!Args.hasFlag(options::OPT_fspell_checking,
3605 options::OPT_fno_spell_checking))
3606 CmdArgs.push_back("-fno-spell-checking");
3609 // -fno-asm-blocks is default.
3610 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3612 CmdArgs.push_back("-fasm-blocks");
3614 // Enable vectorization per default according to the optimization level
3615 // selected. For optimization levels that want vectorization we use the alias
3616 // option to simplify the hasFlag logic.
3617 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3618 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
3619 options::OPT_fvectorize;
3620 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
3621 options::OPT_fno_vectorize, EnableVec))
3622 CmdArgs.push_back("-vectorize-loops");
3624 // -fslp-vectorize is default.
3625 if (Args.hasFlag(options::OPT_fslp_vectorize,
3626 options::OPT_fno_slp_vectorize, true))
3627 CmdArgs.push_back("-vectorize-slp");
3629 // -fno-slp-vectorize-aggressive is default.
3630 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3631 options::OPT_fno_slp_vectorize_aggressive, false))
3632 CmdArgs.push_back("-vectorize-slp-aggressive");
3634 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3635 A->render(Args, CmdArgs);
3637 // -fdollars-in-identifiers default varies depending on platform and
3638 // language; only pass if specified.
3639 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
3640 options::OPT_fno_dollars_in_identifiers)) {
3641 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
3642 CmdArgs.push_back("-fdollars-in-identifiers");
3644 CmdArgs.push_back("-fno-dollars-in-identifiers");
3647 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3648 // practical purposes.
3649 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
3650 options::OPT_fno_unit_at_a_time)) {
3651 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
3652 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
3655 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3656 options::OPT_fno_apple_pragma_pack, false))
3657 CmdArgs.push_back("-fapple-pragma-pack");
3659 // le32-specific flags:
3660 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3662 if (getToolChain().getArch() == llvm::Triple::le32) {
3663 CmdArgs.push_back("-fno-math-builtin");
3666 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
3668 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
3670 if (getToolChain().getTriple().isOSDarwin() &&
3671 (getToolChain().getArch() == llvm::Triple::arm ||
3672 getToolChain().getArch() == llvm::Triple::thumb)) {
3673 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3674 CmdArgs.push_back("-fno-builtin-strcat");
3675 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3676 CmdArgs.push_back("-fno-builtin-strcpy");
3680 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
3681 if (Arg *A = Args.getLastArg(options::OPT_traditional,
3682 options::OPT_traditional_cpp)) {
3683 if (isa<PreprocessJobAction>(JA))
3684 CmdArgs.push_back("-traditional-cpp");
3686 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
3689 Args.AddLastArg(CmdArgs, options::OPT_dM);
3690 Args.AddLastArg(CmdArgs, options::OPT_dD);
3692 // Handle serialized diagnostics.
3693 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3694 CmdArgs.push_back("-serialize-diagnostic-file");
3695 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
3698 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3699 CmdArgs.push_back("-fretain-comments-from-system-headers");
3701 // Forward -fcomment-block-commands to -cc1.
3702 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
3703 // Forward -fparse-all-comments to -cc1.
3704 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
3706 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3708 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
3709 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3710 ie = Args.filtered_end(); it != ie; ++it) {
3713 // We translate this by hand to the -cc1 argument, since nightly test uses
3714 // it and developers have been trained to spell it with -mllvm.
3715 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
3716 CmdArgs.push_back("-disable-llvm-optzns");
3718 (*it)->render(Args, CmdArgs);
3721 if (Output.getType() == types::TY_Dependencies) {
3722 // Handled with other dependency code.
3723 } else if (Output.isFilename()) {
3724 CmdArgs.push_back("-o");
3725 CmdArgs.push_back(Output.getFilename());
3727 assert(Output.isNothing() && "Invalid output.");
3730 for (InputInfoList::const_iterator
3731 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3732 const InputInfo &II = *it;
3733 CmdArgs.push_back("-x");
3734 if (Args.hasArg(options::OPT_rewrite_objc))
3735 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3737 CmdArgs.push_back(types::getTypeName(II.getType()));
3738 if (II.isFilename())
3739 CmdArgs.push_back(II.getFilename());
3741 II.getInputArg().renderAsInput(Args, CmdArgs);
3744 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3746 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3748 // Optionally embed the -cc1 level arguments into the debug info, for build
3750 if (getToolChain().UseDwarfDebugFlags()) {
3751 ArgStringList OriginalArgs;
3752 for (ArgList::const_iterator it = Args.begin(),
3753 ie = Args.end(); it != ie; ++it)
3754 (*it)->render(Args, OriginalArgs);
3756 SmallString<256> Flags;
3758 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3760 Flags += OriginalArgs[i];
3762 CmdArgs.push_back("-dwarf-debug-flags");
3763 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3766 // Add the split debug info name to the command lines here so we
3767 // can propagate it to the backend.
3768 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3769 getToolChain().getTriple().isOSLinux() &&
3770 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
3771 const char *SplitDwarfOut;
3773 CmdArgs.push_back("-split-dwarf-file");
3774 SplitDwarfOut = SplitDebugName(Args, Inputs);
3775 CmdArgs.push_back(SplitDwarfOut);
3778 // Finally add the compile command to the compilation.
3779 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3780 tools::visualstudio::Compile CL(getToolChain());
3781 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3783 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3785 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3789 // Handle the debug info splitting at object creation time if we're
3790 // creating an object.
3791 // TODO: Currently only works on linux with newer objcopy.
3792 if (SplitDwarf && !isa<CompileJobAction>(JA))
3793 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
3795 if (Arg *A = Args.getLastArg(options::OPT_pg))
3796 if (Args.hasArg(options::OPT_fomit_frame_pointer))
3797 D.Diag(diag::err_drv_argument_not_allowed_with)
3798 << "-fomit-frame-pointer" << A->getAsString(Args);
3800 // Claim some arguments which clang supports automatically.
3802 // -fpch-preprocess is used with gcc to add a special marker in the output to
3803 // include the PCH file. Clang's PTH solution is completely transparent, so we
3804 // do not need to deal with it at all.
3805 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
3807 // Claim some arguments which clang doesn't support, but we don't
3808 // care to warn the user about.
3809 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3810 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
3812 // Disable warnings for clang -E -emit-llvm foo.c
3813 Args.ClaimAllArgs(options::OPT_emit_llvm);
3816 /// Add options related to the Objective-C runtime/ABI.
3818 /// Returns true if the runtime is non-fragile.
3819 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3820 ArgStringList &cmdArgs,
3821 RewriteKind rewriteKind) const {
3822 // Look for the controlling runtime option.
3823 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3824 options::OPT_fgnu_runtime,
3825 options::OPT_fobjc_runtime_EQ);
3827 // Just forward -fobjc-runtime= to the frontend. This supercedes
3828 // options about fragility.
3830 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3831 ObjCRuntime runtime;
3832 StringRef value = runtimeArg->getValue();
3833 if (runtime.tryParse(value)) {
3834 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3838 runtimeArg->render(args, cmdArgs);
3842 // Otherwise, we'll need the ABI "version". Version numbers are
3843 // slightly confusing for historical reasons:
3844 // 1 - Traditional "fragile" ABI
3845 // 2 - Non-fragile ABI, version 1
3846 // 3 - Non-fragile ABI, version 2
3847 unsigned objcABIVersion = 1;
3848 // If -fobjc-abi-version= is present, use that to set the version.
3849 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
3850 StringRef value = abiArg->getValue();
3853 else if (value == "2")
3855 else if (value == "3")
3858 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3861 // Otherwise, determine if we are using the non-fragile ABI.
3862 bool nonFragileABIIsDefault =
3863 (rewriteKind == RK_NonFragile ||
3864 (rewriteKind == RK_None &&
3865 getToolChain().IsObjCNonFragileABIDefault()));
3866 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3867 options::OPT_fno_objc_nonfragile_abi,
3868 nonFragileABIIsDefault)) {
3869 // Determine the non-fragile ABI version to use.
3870 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3871 unsigned nonFragileABIVersion = 1;
3873 unsigned nonFragileABIVersion = 2;
3876 if (Arg *abiArg = args.getLastArg(
3877 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3878 StringRef value = abiArg->getValue();
3880 nonFragileABIVersion = 1;
3881 else if (value == "2")
3882 nonFragileABIVersion = 2;
3884 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3888 objcABIVersion = 1 + nonFragileABIVersion;
3894 // We don't actually care about the ABI version other than whether
3895 // it's non-fragile.
3896 bool isNonFragile = objcABIVersion != 1;
3898 // If we have no runtime argument, ask the toolchain for its default runtime.
3899 // However, the rewriter only really supports the Mac runtime, so assume that.
3900 ObjCRuntime runtime;
3902 switch (rewriteKind) {
3904 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3907 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3910 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3915 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3916 // On Darwin, make this use the default behavior for the toolchain.
3917 if (getToolChain().getTriple().isOSDarwin()) {
3918 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3920 // Otherwise, build for a generic macosx port.
3922 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3927 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
3928 // Legacy behaviour is to target the gnustep runtime if we are i
3929 // non-fragile mode or the GCC runtime in fragile mode.
3931 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
3933 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
3936 cmdArgs.push_back(args.MakeArgString(
3937 "-fobjc-runtime=" + runtime.getAsString()));
3941 void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3942 unsigned RTOptionID = options::OPT__SLASH_MT;
3944 if (Args.hasArg(options::OPT__SLASH_LDd))
3945 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3946 // but defining _DEBUG is sticky.
3947 RTOptionID = options::OPT__SLASH_MTd;
3949 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
3950 RTOptionID = A->getOption().getID();
3952 switch(RTOptionID) {
3953 case options::OPT__SLASH_MD:
3954 if (Args.hasArg(options::OPT__SLASH_LDd))
3955 CmdArgs.push_back("-D_DEBUG");
3956 CmdArgs.push_back("-D_MT");
3957 CmdArgs.push_back("-D_DLL");
3958 CmdArgs.push_back("--dependent-lib=msvcrt");
3960 case options::OPT__SLASH_MDd:
3961 CmdArgs.push_back("-D_DEBUG");
3962 CmdArgs.push_back("-D_MT");
3963 CmdArgs.push_back("-D_DLL");
3964 CmdArgs.push_back("--dependent-lib=msvcrtd");
3966 case options::OPT__SLASH_MT:
3967 if (Args.hasArg(options::OPT__SLASH_LDd))
3968 CmdArgs.push_back("-D_DEBUG");
3969 CmdArgs.push_back("-D_MT");
3970 CmdArgs.push_back("--dependent-lib=libcmt");
3972 case options::OPT__SLASH_MTd:
3973 CmdArgs.push_back("-D_DEBUG");
3974 CmdArgs.push_back("-D_MT");
3975 CmdArgs.push_back("--dependent-lib=libcmtd");
3978 llvm_unreachable("Unexpected option ID.");
3981 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3982 // users want. The /Za flag to cl.exe turns this off, but it's not
3983 // implemented in clang.
3984 CmdArgs.push_back("--dependent-lib=oldnames");
3986 // FIXME: Make this default for the win32 triple.
3987 CmdArgs.push_back("-cxx-abi");
3988 CmdArgs.push_back("microsoft");
3990 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3991 A->render(Args, CmdArgs);
3993 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3994 CmdArgs.push_back("-fdiagnostics-format");
3995 if (Args.hasArg(options::OPT__SLASH_fallback))
3996 CmdArgs.push_back("msvc-fallback");
3998 CmdArgs.push_back("msvc");
4002 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
4003 const InputInfo &Output,
4004 const InputInfoList &Inputs,
4005 const ArgList &Args,
4006 const char *LinkingOutput) const {
4007 ArgStringList CmdArgs;
4009 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4010 const InputInfo &Input = Inputs[0];
4012 // Don't warn about "clang -w -c foo.s"
4013 Args.ClaimAllArgs(options::OPT_w);
4014 // and "clang -emit-llvm -c foo.s"
4015 Args.ClaimAllArgs(options::OPT_emit_llvm);
4017 // Invoke ourselves in -cc1as mode.
4019 // FIXME: Implement custom jobs for internal actions.
4020 CmdArgs.push_back("-cc1as");
4022 // Add the "effective" target triple.
4023 CmdArgs.push_back("-triple");
4024 std::string TripleStr =
4025 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
4026 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4028 // Set the output mode, we currently only expect to be used as a real
4030 CmdArgs.push_back("-filetype");
4031 CmdArgs.push_back("obj");
4033 // Set the main file name, so that debug info works even with
4034 // -save-temps or preprocessed assembly.
4035 CmdArgs.push_back("-main-file-name");
4036 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4038 // Add the target cpu
4039 const llvm::Triple &Triple = getToolChain().getTriple();
4040 std::string CPU = getCPUName(Args, Triple);
4042 CmdArgs.push_back("-target-cpu");
4043 CmdArgs.push_back(Args.MakeArgString(CPU));
4046 // Add the target features
4047 const Driver &D = getToolChain().getDriver();
4048 getTargetFeatures(D, Triple, Args, CmdArgs);
4050 // Ignore explicit -force_cpusubtype_ALL option.
4051 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
4053 // Determine the original source input.
4054 const Action *SourceAction = &JA;
4055 while (SourceAction->getKind() != Action::InputClass) {
4056 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4057 SourceAction = SourceAction->getInputs()[0];
4060 // Forward -g and handle debug info related flags, assuming we are dealing
4061 // with an actual assembly file.
4062 if (SourceAction->getType() == types::TY_Asm ||
4063 SourceAction->getType() == types::TY_PP_Asm) {
4064 Args.ClaimAllArgs(options::OPT_g_Group);
4065 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4066 if (!A->getOption().matches(options::OPT_g0))
4067 CmdArgs.push_back("-g");
4069 // Add the -fdebug-compilation-dir flag if needed.
4070 addDebugCompDirArg(Args, CmdArgs);
4072 // Set the AT_producer to the clang version when using the integrated
4073 // assembler on assembly source files.
4074 CmdArgs.push_back("-dwarf-debug-producer");
4075 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
4078 // Optionally embed the -cc1as level arguments into the debug info, for build
4080 if (getToolChain().UseDwarfDebugFlags()) {
4081 ArgStringList OriginalArgs;
4082 for (ArgList::const_iterator it = Args.begin(),
4083 ie = Args.end(); it != ie; ++it)
4084 (*it)->render(Args, OriginalArgs);
4086 SmallString<256> Flags;
4087 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4089 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4091 Flags += OriginalArgs[i];
4093 CmdArgs.push_back("-dwarf-debug-flags");
4094 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4097 // FIXME: Add -static support, once we have it.
4099 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4100 getToolChain().getDriver());
4102 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
4104 assert(Output.isFilename() && "Unexpected lipo output.");
4105 CmdArgs.push_back("-o");
4106 CmdArgs.push_back(Output.getFilename());
4108 assert(Input.isFilename() && "Invalid input.");
4109 CmdArgs.push_back(Input.getFilename());
4111 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4112 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4114 // Handle the debug info splitting at object creation time if we're
4115 // creating an object.
4116 // TODO: Currently only works on linux with newer objcopy.
4117 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
4118 getToolChain().getTriple().isOSLinux())
4119 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4120 SplitDebugName(Args, Inputs));
4123 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
4124 const InputInfo &Output,
4125 const InputInfoList &Inputs,
4126 const ArgList &Args,
4127 const char *LinkingOutput) const {
4128 const Driver &D = getToolChain().getDriver();
4129 ArgStringList CmdArgs;
4131 for (ArgList::const_iterator
4132 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
4134 if (forwardToGCC(A->getOption())) {
4135 // Don't forward any -g arguments to assembly steps.
4136 if (isa<AssembleJobAction>(JA) &&
4137 A->getOption().matches(options::OPT_g_Group))
4140 // Don't forward any -W arguments to assembly and link steps.
4141 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4142 A->getOption().matches(options::OPT_W_Group))
4145 // It is unfortunate that we have to claim here, as this means
4146 // we will basically never report anything interesting for
4147 // platforms using a generic gcc, even if we are just using gcc
4148 // to get to the assembler.
4150 A->render(Args, CmdArgs);
4154 RenderExtraToolArgs(JA, CmdArgs);
4156 // If using a driver driver, force the arch.
4157 llvm::Triple::ArchType Arch = getToolChain().getArch();
4158 if (getToolChain().getTriple().isOSDarwin()) {
4159 CmdArgs.push_back("-arch");
4161 // FIXME: Remove these special cases.
4162 if (Arch == llvm::Triple::ppc)
4163 CmdArgs.push_back("ppc");
4164 else if (Arch == llvm::Triple::ppc64)
4165 CmdArgs.push_back("ppc64");
4166 else if (Arch == llvm::Triple::ppc64le)
4167 CmdArgs.push_back("ppc64le");
4169 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
4172 // Try to force gcc to match the tool chain we want, if we recognize
4175 // FIXME: The triple class should directly provide the information we want
4177 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
4178 CmdArgs.push_back("-m32");
4179 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4180 Arch == llvm::Triple::ppc64le)
4181 CmdArgs.push_back("-m64");
4183 if (Output.isFilename()) {
4184 CmdArgs.push_back("-o");
4185 CmdArgs.push_back(Output.getFilename());
4187 assert(Output.isNothing() && "Unexpected output");
4188 CmdArgs.push_back("-fsyntax-only");
4191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4192 options::OPT_Xassembler);
4194 // Only pass -x if gcc will understand it; otherwise hope gcc
4195 // understands the suffix correctly. The main use case this would go
4196 // wrong in is for linker inputs if they happened to have an odd
4197 // suffix; really the only way to get this to happen is a command
4198 // like '-x foobar a.c' which will treat a.c like a linker input.
4200 // FIXME: For the linker case specifically, can we safely convert
4201 // inputs into '-Wl,' options?
4202 for (InputInfoList::const_iterator
4203 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4204 const InputInfo &II = *it;
4206 // Don't try to pass LLVM or AST inputs to a generic gcc.
4207 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4208 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4209 D.Diag(diag::err_drv_no_linker_llvm_support)
4210 << getToolChain().getTripleString();
4211 else if (II.getType() == types::TY_AST)
4212 D.Diag(diag::err_drv_no_ast_support)
4213 << getToolChain().getTripleString();
4214 else if (II.getType() == types::TY_ModuleFile)
4215 D.Diag(diag::err_drv_no_module_support)
4216 << getToolChain().getTripleString();
4218 if (types::canTypeBeUserSpecified(II.getType())) {
4219 CmdArgs.push_back("-x");
4220 CmdArgs.push_back(types::getTypeName(II.getType()));
4223 if (II.isFilename())
4224 CmdArgs.push_back(II.getFilename());
4226 const Arg &A = II.getInputArg();
4228 // Reverse translate some rewritten options.
4229 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4230 CmdArgs.push_back("-lstdc++");
4234 // Don't render as input, we need gcc to do the translations.
4235 A.render(Args, CmdArgs);
4239 const std::string customGCCName = D.getCCCGenericGCCName();
4240 const char *GCCName;
4241 if (!customGCCName.empty())
4242 GCCName = customGCCName.c_str();
4243 else if (D.CCCIsCXX()) {
4249 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4250 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4253 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4254 ArgStringList &CmdArgs) const {
4255 CmdArgs.push_back("-E");
4258 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4259 ArgStringList &CmdArgs) const {
4260 // The type is good enough.
4263 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4264 ArgStringList &CmdArgs) const {
4265 const Driver &D = getToolChain().getDriver();
4267 // If -flto, etc. are present then make sure not to force assembly output.
4268 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4269 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
4270 CmdArgs.push_back("-c");
4272 if (JA.getType() != types::TY_PP_Asm)
4273 D.Diag(diag::err_drv_invalid_gcc_output_type)
4274 << getTypeName(JA.getType());
4276 CmdArgs.push_back("-S");
4280 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4281 ArgStringList &CmdArgs) const {
4282 CmdArgs.push_back("-c");
4285 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4286 ArgStringList &CmdArgs) const {
4287 // The types are (hopefully) good enough.
4290 // Hexagon tools start.
4291 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4292 ArgStringList &CmdArgs) const {
4295 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4296 const InputInfo &Output,
4297 const InputInfoList &Inputs,
4298 const ArgList &Args,
4299 const char *LinkingOutput) const {
4301 const Driver &D = getToolChain().getDriver();
4302 ArgStringList CmdArgs;
4304 std::string MarchString = "-march=";
4305 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
4306 CmdArgs.push_back(Args.MakeArgString(MarchString));
4308 RenderExtraToolArgs(JA, CmdArgs);
4310 if (Output.isFilename()) {
4311 CmdArgs.push_back("-o");
4312 CmdArgs.push_back(Output.getFilename());
4314 assert(Output.isNothing() && "Unexpected output");
4315 CmdArgs.push_back("-fsyntax-only");
4318 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4319 if (!SmallDataThreshold.empty())
4321 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4323 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4324 options::OPT_Xassembler);
4326 // Only pass -x if gcc will understand it; otherwise hope gcc
4327 // understands the suffix correctly. The main use case this would go
4328 // wrong in is for linker inputs if they happened to have an odd
4329 // suffix; really the only way to get this to happen is a command
4330 // like '-x foobar a.c' which will treat a.c like a linker input.
4332 // FIXME: For the linker case specifically, can we safely convert
4333 // inputs into '-Wl,' options?
4334 for (InputInfoList::const_iterator
4335 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4336 const InputInfo &II = *it;
4338 // Don't try to pass LLVM or AST inputs to a generic gcc.
4339 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4340 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4341 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4342 << getToolChain().getTripleString();
4343 else if (II.getType() == types::TY_AST)
4344 D.Diag(clang::diag::err_drv_no_ast_support)
4345 << getToolChain().getTripleString();
4346 else if (II.getType() == types::TY_ModuleFile)
4347 D.Diag(diag::err_drv_no_module_support)
4348 << getToolChain().getTripleString();
4350 if (II.isFilename())
4351 CmdArgs.push_back(II.getFilename());
4353 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4354 II.getInputArg().render(Args, CmdArgs);
4357 const char *GCCName = "hexagon-as";
4359 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4360 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4363 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4364 ArgStringList &CmdArgs) const {
4365 // The types are (hopefully) good enough.
4368 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4369 const InputInfo &Output,
4370 const InputInfoList &Inputs,
4371 const ArgList &Args,
4372 const char *LinkingOutput) const {
4374 const toolchains::Hexagon_TC& ToolChain =
4375 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4376 const Driver &D = ToolChain.getDriver();
4378 ArgStringList CmdArgs;
4380 //----------------------------------------------------------------------------
4382 //----------------------------------------------------------------------------
4383 bool hasStaticArg = Args.hasArg(options::OPT_static);
4384 bool buildingLib = Args.hasArg(options::OPT_shared);
4385 bool buildPIE = Args.hasArg(options::OPT_pie);
4386 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4387 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4388 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4389 bool useShared = buildingLib && !hasStaticArg;
4391 //----------------------------------------------------------------------------
4392 // Silence warnings for various options
4393 //----------------------------------------------------------------------------
4395 Args.ClaimAllArgs(options::OPT_g_Group);
4396 Args.ClaimAllArgs(options::OPT_emit_llvm);
4397 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4398 // handled somewhere else.
4399 Args.ClaimAllArgs(options::OPT_static_libgcc);
4401 //----------------------------------------------------------------------------
4403 //----------------------------------------------------------------------------
4404 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4405 e = ToolChain.ExtraOpts.end();
4407 CmdArgs.push_back(i->c_str());
4409 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4410 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
4413 CmdArgs.push_back("-shared");
4414 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4419 CmdArgs.push_back("-static");
4421 if (buildPIE && !buildingLib)
4422 CmdArgs.push_back("-pie");
4424 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4425 if (!SmallDataThreshold.empty()) {
4427 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4430 //----------------------------------------------------------------------------
4432 //----------------------------------------------------------------------------
4433 CmdArgs.push_back("-o");
4434 CmdArgs.push_back(Output.getFilename());
4436 const std::string MarchSuffix = "/" + MarchString;
4437 const std::string G0Suffix = "/G0";
4438 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4439 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4441 const std::string StartFilesDir = RootDir
4444 ? MarchG0Suffix : MarchSuffix);
4446 //----------------------------------------------------------------------------
4448 //----------------------------------------------------------------------------
4449 std::vector<std::string> oslibs;
4450 bool hasStandalone= false;
4452 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4453 ie = Args.filtered_end(); it != ie; ++it) {
4455 oslibs.push_back((*it)->getValue());
4456 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
4458 if (oslibs.empty()) {
4459 oslibs.push_back("standalone");
4460 hasStandalone = true;
4463 //----------------------------------------------------------------------------
4465 //----------------------------------------------------------------------------
4466 if (incStdLib && incStartFiles) {
4469 if (hasStandalone) {
4471 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4473 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4475 std::string initObj = useShared ? "/initS.o" : "/init.o";
4476 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4479 //----------------------------------------------------------------------------
4480 // Library Search Paths
4481 //----------------------------------------------------------------------------
4482 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4483 for (ToolChain::path_list::const_iterator
4484 i = LibPaths.begin(),
4488 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4490 //----------------------------------------------------------------------------
4492 //----------------------------------------------------------------------------
4493 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4494 Args.AddAllArgs(CmdArgs, options::OPT_e);
4495 Args.AddAllArgs(CmdArgs, options::OPT_s);
4496 Args.AddAllArgs(CmdArgs, options::OPT_t);
4497 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4499 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4501 //----------------------------------------------------------------------------
4503 //----------------------------------------------------------------------------
4504 if (incStdLib && incDefLibs) {
4506 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4507 CmdArgs.push_back("-lm");
4510 CmdArgs.push_back("--start-group");
4513 for(std::vector<std::string>::iterator i = oslibs.begin(),
4514 e = oslibs.end(); i != e; ++i)
4515 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4516 CmdArgs.push_back("-lc");
4518 CmdArgs.push_back("-lgcc");
4520 CmdArgs.push_back("--end-group");
4523 //----------------------------------------------------------------------------
4525 //----------------------------------------------------------------------------
4526 if (incStdLib && incStartFiles) {
4527 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4528 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4531 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4532 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
4534 // Hexagon tools end.
4536 llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4537 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4538 // archs which Darwin doesn't use.
4540 // The matching this routine does is fairly pointless, since it is neither the
4541 // complete architecture list, nor a reasonable subset. The problem is that
4542 // historically the driver driver accepts this and also ties its -march=
4543 // handling to the architecture name, so we need to be careful before removing
4546 // This code must be kept in sync with Clang's Darwin specific argument
4549 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4550 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4551 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4552 .Case("ppc64", llvm::Triple::ppc64)
4553 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4554 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4556 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
4557 // This is derived from the driver driver.
4558 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4559 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4560 .Cases("armv7s", "xscale", llvm::Triple::arm)
4561 .Case("r600", llvm::Triple::r600)
4562 .Case("nvptx", llvm::Triple::nvptx)
4563 .Case("nvptx64", llvm::Triple::nvptx64)
4564 .Case("amdil", llvm::Triple::amdil)
4565 .Case("spir", llvm::Triple::spir)
4566 .Default(llvm::Triple::UnknownArch);
4569 const char *Clang::getBaseInputName(const ArgList &Args,
4570 const InputInfoList &Inputs) {
4571 return Args.MakeArgString(
4572 llvm::sys::path::filename(Inputs[0].getBaseInput()));
4575 const char *Clang::getBaseInputStem(const ArgList &Args,
4576 const InputInfoList &Inputs) {
4577 const char *Str = getBaseInputName(Args, Inputs);
4579 if (const char *End = strrchr(Str, '.'))
4580 return Args.MakeArgString(std::string(Str, End));
4585 const char *Clang::getDependencyFileName(const ArgList &Args,
4586 const InputInfoList &Inputs) {
4587 // FIXME: Think about this more.
4590 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
4591 std::string Str(OutputOpt->getValue());
4592 Res = Str.substr(0, Str.rfind('.'));
4594 Res = getBaseInputStem(Args, Inputs);
4596 return Args.MakeArgString(Res + ".d");
4599 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4600 const InputInfo &Output,
4601 const InputInfoList &Inputs,
4602 const ArgList &Args,
4603 const char *LinkingOutput) const {
4604 ArgStringList CmdArgs;
4606 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4607 const InputInfo &Input = Inputs[0];
4609 // Determine the original source input.
4610 const Action *SourceAction = &JA;
4611 while (SourceAction->getKind() != Action::InputClass) {
4612 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4613 SourceAction = SourceAction->getInputs()[0];
4616 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4617 // sure it runs its system assembler not clang's integrated assembler.
4618 if (Args.hasArg(options::OPT_no_integrated_as))
4619 CmdArgs.push_back("-Q");
4621 // Forward -g, assuming we are dealing with an actual assembly file.
4622 if (SourceAction->getType() == types::TY_Asm ||
4623 SourceAction->getType() == types::TY_PP_Asm) {
4624 if (Args.hasArg(options::OPT_gstabs))
4625 CmdArgs.push_back("--gstabs");
4626 else if (Args.hasArg(options::OPT_g_Group))
4627 CmdArgs.push_back("-g");
4630 // Derived from asm spec.
4631 AddDarwinArch(Args, CmdArgs);
4633 // Use -force_cpusubtype_ALL on x86 by default.
4634 if (getToolChain().getArch() == llvm::Triple::x86 ||
4635 getToolChain().getArch() == llvm::Triple::x86_64 ||
4636 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4637 CmdArgs.push_back("-force_cpusubtype_ALL");
4639 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
4640 (((Args.hasArg(options::OPT_mkernel) ||
4641 Args.hasArg(options::OPT_fapple_kext)) &&
4642 (!getDarwinToolChain().isTargetIPhoneOS() ||
4643 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4644 Args.hasArg(options::OPT_static)))
4645 CmdArgs.push_back("-static");
4647 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4648 options::OPT_Xassembler);
4650 assert(Output.isFilename() && "Unexpected lipo output.");
4651 CmdArgs.push_back("-o");
4652 CmdArgs.push_back(Output.getFilename());
4654 assert(Input.isFilename() && "Invalid input.");
4655 CmdArgs.push_back(Input.getFilename());
4657 // asm_final spec is empty.
4660 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4661 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4664 void darwin::DarwinTool::anchor() {}
4666 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4667 ArgStringList &CmdArgs) const {
4668 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
4670 // Derived from darwin_arch spec.
4671 CmdArgs.push_back("-arch");
4672 CmdArgs.push_back(Args.MakeArgString(ArchName));
4674 // FIXME: Is this needed anymore?
4675 if (ArchName == "arm")
4676 CmdArgs.push_back("-force_cpusubtype_ALL");
4679 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4680 // We only need to generate a temp path for LTO if we aren't compiling object
4681 // files. When compiling source files, we run 'dsymutil' after linking. We
4682 // don't run 'dsymutil' when compiling object files.
4683 for (InputInfoList::const_iterator
4684 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4685 if (it->getType() != types::TY_Object)
4691 void darwin::Link::AddLinkArgs(Compilation &C,
4692 const ArgList &Args,
4693 ArgStringList &CmdArgs,
4694 const InputInfoList &Inputs) const {
4695 const Driver &D = getToolChain().getDriver();
4696 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
4698 unsigned Version[3] = { 0, 0, 0 };
4699 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4701 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
4702 Version[1], Version[2], HadExtra) ||
4704 D.Diag(diag::err_drv_invalid_version_number)
4705 << A->getAsString(Args);
4708 // Newer linkers support -demangle, pass it if supported and not disabled by
4710 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
4711 // Don't pass -demangle to ld_classic.
4713 // FIXME: This is a temporary workaround, ld should be handling this.
4714 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4715 Args.hasArg(options::OPT_static));
4716 if (getToolChain().getArch() == llvm::Triple::x86) {
4717 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4718 options::OPT_Wl_COMMA),
4719 ie = Args.filtered_end(); it != ie; ++it) {
4721 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
4722 if (StringRef(A->getValue(i)) == "-kext")
4723 UsesLdClassic = true;
4727 CmdArgs.push_back("-demangle");
4730 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4731 CmdArgs.push_back("-export_dynamic");
4733 // If we are using LTO, then automatically create a temporary file path for
4734 // the linker to use, so that it's lifetime will extend past a possible
4736 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4737 const char *TmpPath = C.getArgs().MakeArgString(
4738 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4739 C.addTempFile(TmpPath);
4740 CmdArgs.push_back("-object_path_lto");
4741 CmdArgs.push_back(TmpPath);
4744 // Derived from the "link" spec.
4745 Args.AddAllArgs(CmdArgs, options::OPT_static);
4746 if (!Args.hasArg(options::OPT_static))
4747 CmdArgs.push_back("-dynamic");
4748 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4749 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4750 // here. How do we wish to handle such things?
4753 if (!Args.hasArg(options::OPT_dynamiclib)) {
4754 AddDarwinArch(Args, CmdArgs);
4755 // FIXME: Why do this only on this path?
4756 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
4758 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4759 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4760 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4763 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4764 (A = Args.getLastArg(options::OPT_current__version)) ||
4765 (A = Args.getLastArg(options::OPT_install__name)))
4766 D.Diag(diag::err_drv_argument_only_allowed_with)
4767 << A->getAsString(Args) << "-dynamiclib";
4769 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4770 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4771 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4773 CmdArgs.push_back("-dylib");
4776 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4777 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4778 (A = Args.getLastArg(options::OPT_client__name)) ||
4779 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4780 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4781 (A = Args.getLastArg(options::OPT_private__bundle)))
4782 D.Diag(diag::err_drv_argument_not_allowed_with)
4783 << A->getAsString(Args) << "-dynamiclib";
4785 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4786 "-dylib_compatibility_version");
4787 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4788 "-dylib_current_version");
4790 AddDarwinArch(Args, CmdArgs);
4792 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4793 "-dylib_install_name");
4796 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4797 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4798 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4799 if (DarwinTC.isTargetIPhoneOS())
4800 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
4801 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4802 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4803 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4804 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4805 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4806 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
4807 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
4808 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4809 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4810 Args.AddAllArgs(CmdArgs, options::OPT_init);
4812 // Add the deployment target.
4813 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4815 // If we had an explicit -mios-simulator-version-min argument, honor that,
4816 // otherwise use the traditional deployment targets. We can't just check the
4817 // is-sim attribute because existing code follows this path, and the linker
4818 // may not handle the argument.
4820 // FIXME: We may be able to remove this, once we can verify no one depends on
4822 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4823 CmdArgs.push_back("-ios_simulator_version_min");
4824 else if (DarwinTC.isTargetIPhoneOS())
4825 CmdArgs.push_back("-iphoneos_version_min");
4827 CmdArgs.push_back("-macosx_version_min");
4828 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4830 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4831 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4832 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4833 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4834 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4836 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4837 options::OPT_fno_pie,
4838 options::OPT_fno_PIE)) {
4839 if (A->getOption().matches(options::OPT_fpie) ||
4840 A->getOption().matches(options::OPT_fPIE))
4841 CmdArgs.push_back("-pie");
4843 CmdArgs.push_back("-no_pie");
4846 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4847 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4848 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4849 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4850 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4851 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4852 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4853 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4854 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4855 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4856 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4857 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4858 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4859 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4860 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4861 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4863 // Give --sysroot= preference, over the Apple specific behavior to also use
4864 // --isysroot as the syslibroot.
4865 StringRef sysroot = C.getSysRoot();
4866 if (sysroot != "") {
4867 CmdArgs.push_back("-syslibroot");
4868 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4869 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4870 CmdArgs.push_back("-syslibroot");
4871 CmdArgs.push_back(A->getValue());
4874 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4875 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4876 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4877 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4878 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4879 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
4880 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4881 Args.AddAllArgs(CmdArgs, options::OPT_y);
4882 Args.AddLastArg(CmdArgs, options::OPT_w);
4883 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4884 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4885 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4886 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4887 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4888 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4889 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4890 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4891 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4892 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4893 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4894 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4897 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
4898 const InputInfo &Output,
4899 const InputInfoList &Inputs,
4900 const ArgList &Args,
4901 const char *LinkingOutput) const {
4902 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4904 // The logic here is derived from gcc's behavior; most of which
4905 // comes from specs (starting with link_command). Consult gcc for
4906 // more information.
4907 ArgStringList CmdArgs;
4909 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4910 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4911 options::OPT_ccc_arcmt_migrate)) {
4912 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4915 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4916 CmdArgs.push_back(Output.getFilename());
4917 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4921 // I'm not sure why this particular decomposition exists in gcc, but
4922 // we follow suite for ease of comparison.
4923 AddLinkArgs(C, Args, CmdArgs, Inputs);
4925 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4926 Args.AddAllArgs(CmdArgs, options::OPT_s);
4927 Args.AddAllArgs(CmdArgs, options::OPT_t);
4928 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4929 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4930 Args.AddLastArg(CmdArgs, options::OPT_e);
4931 Args.AddAllArgs(CmdArgs, options::OPT_r);
4933 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4934 // members of static archive libraries which implement Objective-C classes or
4936 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4937 CmdArgs.push_back("-ObjC");
4939 CmdArgs.push_back("-o");
4940 CmdArgs.push_back(Output.getFilename());
4942 if (!Args.hasArg(options::OPT_nostdlib) &&
4943 !Args.hasArg(options::OPT_nostartfiles)) {
4944 // Derived from startfile spec.
4945 if (Args.hasArg(options::OPT_dynamiclib)) {
4946 // Derived from darwin_dylib1 spec.
4947 if (getDarwinToolChain().isTargetIOSSimulator()) {
4948 // The simulator doesn't have a versioned crt1 file.
4949 CmdArgs.push_back("-ldylib1.o");
4950 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4951 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4952 CmdArgs.push_back("-ldylib1.o");
4954 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4955 CmdArgs.push_back("-ldylib1.o");
4956 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4957 CmdArgs.push_back("-ldylib1.10.5.o");
4960 if (Args.hasArg(options::OPT_bundle)) {
4961 if (!Args.hasArg(options::OPT_static)) {
4962 // Derived from darwin_bundle1 spec.
4963 if (getDarwinToolChain().isTargetIOSSimulator()) {
4964 // The simulator doesn't have a versioned crt1 file.
4965 CmdArgs.push_back("-lbundle1.o");
4966 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4967 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4968 CmdArgs.push_back("-lbundle1.o");
4970 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4971 CmdArgs.push_back("-lbundle1.o");
4975 if (Args.hasArg(options::OPT_pg) &&
4976 getToolChain().SupportsProfiling()) {
4977 if (Args.hasArg(options::OPT_static) ||
4978 Args.hasArg(options::OPT_object) ||
4979 Args.hasArg(options::OPT_preload)) {
4980 CmdArgs.push_back("-lgcrt0.o");
4982 CmdArgs.push_back("-lgcrt1.o");
4984 // darwin_crt2 spec is empty.
4986 // By default on OS X 10.8 and later, we don't link with a crt1.o
4987 // file and the linker knows to use _main as the entry point. But,
4988 // when compiling with -pg, we need to link with the gcrt1.o file,
4989 // so pass the -no_new_main option to tell the linker to use the
4990 // "start" symbol as the entry point.
4991 if (getDarwinToolChain().isTargetMacOS() &&
4992 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4993 CmdArgs.push_back("-no_new_main");
4995 if (Args.hasArg(options::OPT_static) ||
4996 Args.hasArg(options::OPT_object) ||
4997 Args.hasArg(options::OPT_preload)) {
4998 CmdArgs.push_back("-lcrt0.o");
5000 // Derived from darwin_crt1 spec.
5001 if (getDarwinToolChain().isTargetIOSSimulator()) {
5002 // The simulator doesn't have a versioned crt1 file.
5003 CmdArgs.push_back("-lcrt1.o");
5004 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
5005 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5006 CmdArgs.push_back("-lcrt1.o");
5007 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
5008 CmdArgs.push_back("-lcrt1.3.1.o");
5010 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5011 CmdArgs.push_back("-lcrt1.o");
5012 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5013 CmdArgs.push_back("-lcrt1.10.5.o");
5014 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
5015 CmdArgs.push_back("-lcrt1.10.6.o");
5017 // darwin_crt2 spec is empty.
5024 if (!getDarwinToolChain().isTargetIPhoneOS() &&
5025 Args.hasArg(options::OPT_shared_libgcc) &&
5026 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
5028 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
5029 CmdArgs.push_back(Str);
5033 Args.AddAllArgs(CmdArgs, options::OPT_L);
5035 if (Args.hasArg(options::OPT_fopenmp))
5036 // This is more complicated in gcc...
5037 CmdArgs.push_back("-lgomp");
5039 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5041 if (isObjCRuntimeLinked(Args) &&
5042 !Args.hasArg(options::OPT_nostdlib) &&
5043 !Args.hasArg(options::OPT_nodefaultlibs)) {
5044 // Avoid linking compatibility stubs on i386 mac.
5045 if (!getDarwinToolChain().isTargetMacOS() ||
5046 getDarwinToolChain().getArch() != llvm::Triple::x86) {
5047 // If we don't have ARC or subscripting runtime support, link in the
5048 // runtime stubs. We have to do this *before* adding any of the normal
5049 // linker inputs so that its initializer gets run first.
5050 ObjCRuntime runtime =
5051 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
5052 // We use arclite library for both ARC and subscripting support.
5053 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
5054 !runtime.hasSubscripting())
5055 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
5057 CmdArgs.push_back("-framework");
5058 CmdArgs.push_back("Foundation");
5060 CmdArgs.push_back("-lobjc");
5063 if (LinkingOutput) {
5064 CmdArgs.push_back("-arch_multiple");
5065 CmdArgs.push_back("-final_output");
5066 CmdArgs.push_back(LinkingOutput);
5069 if (Args.hasArg(options::OPT_fnested_functions))
5070 CmdArgs.push_back("-allow_stack_execute");
5072 if (!Args.hasArg(options::OPT_nostdlib) &&
5073 !Args.hasArg(options::OPT_nodefaultlibs)) {
5074 if (getToolChain().getDriver().CCCIsCXX())
5075 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5077 // link_ssp spec is empty.
5079 // Let the tool chain choose which runtime library to link.
5080 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
5083 if (!Args.hasArg(options::OPT_nostdlib) &&
5084 !Args.hasArg(options::OPT_nostartfiles)) {
5085 // endfile_spec is empty.
5088 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5089 Args.AddAllArgs(CmdArgs, options::OPT_F);
5092 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5093 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5096 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
5097 const InputInfo &Output,
5098 const InputInfoList &Inputs,
5099 const ArgList &Args,
5100 const char *LinkingOutput) const {
5101 ArgStringList CmdArgs;
5103 CmdArgs.push_back("-create");
5104 assert(Output.isFilename() && "Unexpected lipo output.");
5106 CmdArgs.push_back("-output");
5107 CmdArgs.push_back(Output.getFilename());
5109 for (InputInfoList::const_iterator
5110 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5111 const InputInfo &II = *it;
5112 assert(II.isFilename() && "Unexpected lipo input.");
5113 CmdArgs.push_back(II.getFilename());
5116 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
5117 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5120 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
5121 const InputInfo &Output,
5122 const InputInfoList &Inputs,
5123 const ArgList &Args,
5124 const char *LinkingOutput) const {
5125 ArgStringList CmdArgs;
5127 CmdArgs.push_back("-o");
5128 CmdArgs.push_back(Output.getFilename());
5130 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5131 const InputInfo &Input = Inputs[0];
5132 assert(Input.isFilename() && "Unexpected dsymutil input.");
5133 CmdArgs.push_back(Input.getFilename());
5136 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
5137 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5140 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
5141 const InputInfo &Output,
5142 const InputInfoList &Inputs,
5143 const ArgList &Args,
5144 const char *LinkingOutput) const {
5145 ArgStringList CmdArgs;
5146 CmdArgs.push_back("--verify");
5147 CmdArgs.push_back("--debug-info");
5148 CmdArgs.push_back("--eh-frame");
5149 CmdArgs.push_back("--quiet");
5151 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5152 const InputInfo &Input = Inputs[0];
5153 assert(Input.isFilename() && "Unexpected verify input");
5155 // Grabbing the output of the earlier dsymutil run.
5156 CmdArgs.push_back(Input.getFilename());
5159 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5160 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5163 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5164 const InputInfo &Output,
5165 const InputInfoList &Inputs,
5166 const ArgList &Args,
5167 const char *LinkingOutput) const {
5168 ArgStringList CmdArgs;
5170 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5171 options::OPT_Xassembler);
5173 CmdArgs.push_back("-o");
5174 CmdArgs.push_back(Output.getFilename());
5176 for (InputInfoList::const_iterator
5177 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5178 const InputInfo &II = *it;
5179 CmdArgs.push_back(II.getFilename());
5183 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5184 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5188 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5189 const InputInfo &Output,
5190 const InputInfoList &Inputs,
5191 const ArgList &Args,
5192 const char *LinkingOutput) const {
5193 // FIXME: Find a real GCC, don't hard-code versions here
5194 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5195 const llvm::Triple &T = getToolChain().getTriple();
5196 std::string LibPath = "/usr/lib/";
5197 llvm::Triple::ArchType Arch = T.getArch();
5199 case llvm::Triple::x86:
5201 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5203 case llvm::Triple::x86_64:
5204 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5205 GCCLibPath += "/4.5.2/amd64/";
5206 LibPath += "amd64/";
5209 llvm_unreachable("Unsupported architecture");
5212 ArgStringList CmdArgs;
5214 // Demangle C++ names in errors
5215 CmdArgs.push_back("-C");
5217 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5218 (!Args.hasArg(options::OPT_shared))) {
5219 CmdArgs.push_back("-e");
5220 CmdArgs.push_back("_start");
5223 if (Args.hasArg(options::OPT_static)) {
5224 CmdArgs.push_back("-Bstatic");
5225 CmdArgs.push_back("-dn");
5227 CmdArgs.push_back("-Bdynamic");
5228 if (Args.hasArg(options::OPT_shared)) {
5229 CmdArgs.push_back("-shared");
5231 CmdArgs.push_back("--dynamic-linker");
5232 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5236 if (Output.isFilename()) {
5237 CmdArgs.push_back("-o");
5238 CmdArgs.push_back(Output.getFilename());
5240 assert(Output.isNothing() && "Invalid output.");
5243 if (!Args.hasArg(options::OPT_nostdlib) &&
5244 !Args.hasArg(options::OPT_nostartfiles)) {
5245 if (!Args.hasArg(options::OPT_shared)) {
5246 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5247 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5248 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5249 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5251 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5252 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5253 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5255 if (getToolChain().getDriver().CCCIsCXX())
5256 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
5259 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5261 Args.AddAllArgs(CmdArgs, options::OPT_L);
5262 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5263 Args.AddAllArgs(CmdArgs, options::OPT_e);
5264 Args.AddAllArgs(CmdArgs, options::OPT_r);
5266 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5268 if (!Args.hasArg(options::OPT_nostdlib) &&
5269 !Args.hasArg(options::OPT_nodefaultlibs)) {
5270 if (getToolChain().getDriver().CCCIsCXX())
5271 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5272 CmdArgs.push_back("-lgcc_s");
5273 if (!Args.hasArg(options::OPT_shared)) {
5274 CmdArgs.push_back("-lgcc");
5275 CmdArgs.push_back("-lc");
5276 CmdArgs.push_back("-lm");
5280 if (!Args.hasArg(options::OPT_nostdlib) &&
5281 !Args.hasArg(options::OPT_nostartfiles)) {
5282 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
5284 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
5286 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5289 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5290 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5293 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5294 const InputInfo &Output,
5295 const InputInfoList &Inputs,
5296 const ArgList &Args,
5297 const char *LinkingOutput) const {
5298 ArgStringList CmdArgs;
5300 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5301 options::OPT_Xassembler);
5303 CmdArgs.push_back("-o");
5304 CmdArgs.push_back(Output.getFilename());
5306 for (InputInfoList::const_iterator
5307 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5308 const InputInfo &II = *it;
5309 CmdArgs.push_back(II.getFilename());
5313 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
5314 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5317 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
5318 const InputInfo &Output,
5319 const InputInfoList &Inputs,
5320 const ArgList &Args,
5321 const char *LinkingOutput) const {
5322 ArgStringList CmdArgs;
5324 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5325 (!Args.hasArg(options::OPT_shared))) {
5326 CmdArgs.push_back("-e");
5327 CmdArgs.push_back("_start");
5330 if (Args.hasArg(options::OPT_static)) {
5331 CmdArgs.push_back("-Bstatic");
5332 CmdArgs.push_back("-dn");
5334 // CmdArgs.push_back("--eh-frame-hdr");
5335 CmdArgs.push_back("-Bdynamic");
5336 if (Args.hasArg(options::OPT_shared)) {
5337 CmdArgs.push_back("-shared");
5339 CmdArgs.push_back("--dynamic-linker");
5340 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5344 if (Output.isFilename()) {
5345 CmdArgs.push_back("-o");
5346 CmdArgs.push_back(Output.getFilename());
5348 assert(Output.isNothing() && "Invalid output.");
5351 if (!Args.hasArg(options::OPT_nostdlib) &&
5352 !Args.hasArg(options::OPT_nostartfiles)) {
5353 if (!Args.hasArg(options::OPT_shared)) {
5354 CmdArgs.push_back(Args.MakeArgString(
5355 getToolChain().GetFilePath("crt1.o")));
5356 CmdArgs.push_back(Args.MakeArgString(
5357 getToolChain().GetFilePath("crti.o")));
5358 CmdArgs.push_back(Args.MakeArgString(
5359 getToolChain().GetFilePath("crtbegin.o")));
5361 CmdArgs.push_back(Args.MakeArgString(
5362 getToolChain().GetFilePath("crti.o")));
5364 CmdArgs.push_back(Args.MakeArgString(
5365 getToolChain().GetFilePath("crtn.o")));
5368 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5369 + getToolChain().getTripleString()
5372 Args.AddAllArgs(CmdArgs, options::OPT_L);
5373 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5374 Args.AddAllArgs(CmdArgs, options::OPT_e);
5376 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5378 if (!Args.hasArg(options::OPT_nostdlib) &&
5379 !Args.hasArg(options::OPT_nodefaultlibs)) {
5380 // FIXME: For some reason GCC passes -lgcc before adding
5381 // the default system libraries. Just mimic this for now.
5382 CmdArgs.push_back("-lgcc");
5384 if (Args.hasArg(options::OPT_pthread))
5385 CmdArgs.push_back("-pthread");
5386 if (!Args.hasArg(options::OPT_shared))
5387 CmdArgs.push_back("-lc");
5388 CmdArgs.push_back("-lgcc");
5391 if (!Args.hasArg(options::OPT_nostdlib) &&
5392 !Args.hasArg(options::OPT_nostartfiles)) {
5393 if (!Args.hasArg(options::OPT_shared))
5394 CmdArgs.push_back(Args.MakeArgString(
5395 getToolChain().GetFilePath("crtend.o")));
5398 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5401 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5402 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5405 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5406 const InputInfo &Output,
5407 const InputInfoList &Inputs,
5408 const ArgList &Args,
5409 const char *LinkingOutput) const {
5410 ArgStringList CmdArgs;
5412 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5413 // instruct as in the base system to assemble 32-bit code.
5414 if (getToolChain().getArch() == llvm::Triple::x86)
5415 CmdArgs.push_back("--32");
5416 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5417 CmdArgs.push_back("-mppc");
5418 CmdArgs.push_back("-many");
5419 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5420 getToolChain().getArch() == llvm::Triple::mips64el) {
5423 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5425 CmdArgs.push_back("-mabi");
5426 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5428 if (getToolChain().getArch() == llvm::Triple::mips64)
5429 CmdArgs.push_back("-EB");
5431 CmdArgs.push_back("-EL");
5433 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5434 options::OPT_fpic, options::OPT_fno_pic,
5435 options::OPT_fPIE, options::OPT_fno_PIE,
5436 options::OPT_fpie, options::OPT_fno_pie);
5438 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5439 LastPICArg->getOption().matches(options::OPT_fpic) ||
5440 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5441 LastPICArg->getOption().matches(options::OPT_fpie))) {
5442 CmdArgs.push_back("-KPIC");
5446 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5447 options::OPT_Xassembler);
5449 CmdArgs.push_back("-o");
5450 CmdArgs.push_back(Output.getFilename());
5452 for (InputInfoList::const_iterator
5453 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5454 const InputInfo &II = *it;
5455 CmdArgs.push_back(II.getFilename());
5459 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5460 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5463 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5464 const InputInfo &Output,
5465 const InputInfoList &Inputs,
5466 const ArgList &Args,
5467 const char *LinkingOutput) const {
5468 const Driver &D = getToolChain().getDriver();
5469 ArgStringList CmdArgs;
5471 // Silence warning for "clang -g foo.o -o foo"
5472 Args.ClaimAllArgs(options::OPT_g_Group);
5473 // and "clang -emit-llvm foo.o -o foo"
5474 Args.ClaimAllArgs(options::OPT_emit_llvm);
5475 // and for "clang -w foo.o -o foo". Other warning options are already
5476 // handled somewhere else.
5477 Args.ClaimAllArgs(options::OPT_w);
5479 if (getToolChain().getArch() == llvm::Triple::mips64)
5480 CmdArgs.push_back("-EB");
5481 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5482 CmdArgs.push_back("-EL");
5484 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5485 (!Args.hasArg(options::OPT_shared))) {
5486 CmdArgs.push_back("-e");
5487 CmdArgs.push_back("__start");
5490 if (Args.hasArg(options::OPT_static)) {
5491 CmdArgs.push_back("-Bstatic");
5493 if (Args.hasArg(options::OPT_rdynamic))
5494 CmdArgs.push_back("-export-dynamic");
5495 CmdArgs.push_back("--eh-frame-hdr");
5496 CmdArgs.push_back("-Bdynamic");
5497 if (Args.hasArg(options::OPT_shared)) {
5498 CmdArgs.push_back("-shared");
5500 CmdArgs.push_back("-dynamic-linker");
5501 CmdArgs.push_back("/usr/libexec/ld.so");
5505 if (Args.hasArg(options::OPT_nopie))
5506 CmdArgs.push_back("-nopie");
5508 if (Output.isFilename()) {
5509 CmdArgs.push_back("-o");
5510 CmdArgs.push_back(Output.getFilename());
5512 assert(Output.isNothing() && "Invalid output.");
5515 if (!Args.hasArg(options::OPT_nostdlib) &&
5516 !Args.hasArg(options::OPT_nostartfiles)) {
5517 if (!Args.hasArg(options::OPT_shared)) {
5518 if (Args.hasArg(options::OPT_pg))
5519 CmdArgs.push_back(Args.MakeArgString(
5520 getToolChain().GetFilePath("gcrt0.o")));
5522 CmdArgs.push_back(Args.MakeArgString(
5523 getToolChain().GetFilePath("crt0.o")));
5524 CmdArgs.push_back(Args.MakeArgString(
5525 getToolChain().GetFilePath("crtbegin.o")));
5527 CmdArgs.push_back(Args.MakeArgString(
5528 getToolChain().GetFilePath("crtbeginS.o")));
5532 std::string Triple = getToolChain().getTripleString();
5533 if (Triple.substr(0, 6) == "x86_64")
5534 Triple.replace(0, 6, "amd64");
5535 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
5538 Args.AddAllArgs(CmdArgs, options::OPT_L);
5539 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5540 Args.AddAllArgs(CmdArgs, options::OPT_e);
5541 Args.AddAllArgs(CmdArgs, options::OPT_s);
5542 Args.AddAllArgs(CmdArgs, options::OPT_t);
5543 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5544 Args.AddAllArgs(CmdArgs, options::OPT_r);
5546 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5548 if (!Args.hasArg(options::OPT_nostdlib) &&
5549 !Args.hasArg(options::OPT_nodefaultlibs)) {
5551 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5552 if (Args.hasArg(options::OPT_pg))
5553 CmdArgs.push_back("-lm_p");
5555 CmdArgs.push_back("-lm");
5558 // FIXME: For some reason GCC passes -lgcc before adding
5559 // the default system libraries. Just mimic this for now.
5560 CmdArgs.push_back("-lgcc");
5562 if (Args.hasArg(options::OPT_pthread)) {
5563 if (!Args.hasArg(options::OPT_shared) &&
5564 Args.hasArg(options::OPT_pg))
5565 CmdArgs.push_back("-lpthread_p");
5567 CmdArgs.push_back("-lpthread");
5570 if (!Args.hasArg(options::OPT_shared)) {
5571 if (Args.hasArg(options::OPT_pg))
5572 CmdArgs.push_back("-lc_p");
5574 CmdArgs.push_back("-lc");
5577 CmdArgs.push_back("-lgcc");
5580 if (!Args.hasArg(options::OPT_nostdlib) &&
5581 !Args.hasArg(options::OPT_nostartfiles)) {
5582 if (!Args.hasArg(options::OPT_shared))
5583 CmdArgs.push_back(Args.MakeArgString(
5584 getToolChain().GetFilePath("crtend.o")));
5586 CmdArgs.push_back(Args.MakeArgString(
5587 getToolChain().GetFilePath("crtendS.o")));
5591 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5592 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5595 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5596 const InputInfo &Output,
5597 const InputInfoList &Inputs,
5598 const ArgList &Args,
5599 const char *LinkingOutput) const {
5600 ArgStringList CmdArgs;
5602 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5603 options::OPT_Xassembler);
5605 CmdArgs.push_back("-o");
5606 CmdArgs.push_back(Output.getFilename());
5608 for (InputInfoList::const_iterator
5609 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5610 const InputInfo &II = *it;
5611 CmdArgs.push_back(II.getFilename());
5615 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5616 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5619 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5620 const InputInfo &Output,
5621 const InputInfoList &Inputs,
5622 const ArgList &Args,
5623 const char *LinkingOutput) const {
5624 const Driver &D = getToolChain().getDriver();
5625 ArgStringList CmdArgs;
5627 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5628 (!Args.hasArg(options::OPT_shared))) {
5629 CmdArgs.push_back("-e");
5630 CmdArgs.push_back("__start");
5633 if (Args.hasArg(options::OPT_static)) {
5634 CmdArgs.push_back("-Bstatic");
5636 if (Args.hasArg(options::OPT_rdynamic))
5637 CmdArgs.push_back("-export-dynamic");
5638 CmdArgs.push_back("--eh-frame-hdr");
5639 CmdArgs.push_back("-Bdynamic");
5640 if (Args.hasArg(options::OPT_shared)) {
5641 CmdArgs.push_back("-shared");
5643 CmdArgs.push_back("-dynamic-linker");
5644 CmdArgs.push_back("/usr/libexec/ld.so");
5648 if (Output.isFilename()) {
5649 CmdArgs.push_back("-o");
5650 CmdArgs.push_back(Output.getFilename());
5652 assert(Output.isNothing() && "Invalid output.");
5655 if (!Args.hasArg(options::OPT_nostdlib) &&
5656 !Args.hasArg(options::OPT_nostartfiles)) {
5657 if (!Args.hasArg(options::OPT_shared)) {
5658 if (Args.hasArg(options::OPT_pg))
5659 CmdArgs.push_back(Args.MakeArgString(
5660 getToolChain().GetFilePath("gcrt0.o")));
5662 CmdArgs.push_back(Args.MakeArgString(
5663 getToolChain().GetFilePath("crt0.o")));
5664 CmdArgs.push_back(Args.MakeArgString(
5665 getToolChain().GetFilePath("crtbegin.o")));
5667 CmdArgs.push_back(Args.MakeArgString(
5668 getToolChain().GetFilePath("crtbeginS.o")));
5672 Args.AddAllArgs(CmdArgs, options::OPT_L);
5673 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5674 Args.AddAllArgs(CmdArgs, options::OPT_e);
5676 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5678 if (!Args.hasArg(options::OPT_nostdlib) &&
5679 !Args.hasArg(options::OPT_nodefaultlibs)) {
5681 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5682 if (Args.hasArg(options::OPT_pg))
5683 CmdArgs.push_back("-lm_p");
5685 CmdArgs.push_back("-lm");
5688 if (Args.hasArg(options::OPT_pthread)) {
5689 if (!Args.hasArg(options::OPT_shared) &&
5690 Args.hasArg(options::OPT_pg))
5691 CmdArgs.push_back("-lpthread_p");
5693 CmdArgs.push_back("-lpthread");
5696 if (!Args.hasArg(options::OPT_shared)) {
5697 if (Args.hasArg(options::OPT_pg))
5698 CmdArgs.push_back("-lc_p");
5700 CmdArgs.push_back("-lc");
5704 switch (getToolChain().getTriple().getArch()) {
5705 case llvm::Triple::arm:
5708 case llvm::Triple::x86:
5711 case llvm::Triple::x86_64:
5715 llvm_unreachable("Unsupported architecture");
5717 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
5720 if (!Args.hasArg(options::OPT_nostdlib) &&
5721 !Args.hasArg(options::OPT_nostartfiles)) {
5722 if (!Args.hasArg(options::OPT_shared))
5723 CmdArgs.push_back(Args.MakeArgString(
5724 getToolChain().GetFilePath("crtend.o")));
5726 CmdArgs.push_back(Args.MakeArgString(
5727 getToolChain().GetFilePath("crtendS.o")));
5731 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5732 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5735 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5736 const InputInfo &Output,
5737 const InputInfoList &Inputs,
5738 const ArgList &Args,
5739 const char *LinkingOutput) const {
5740 ArgStringList CmdArgs;
5742 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5743 // instruct as in the base system to assemble 32-bit code.
5744 if (getToolChain().getArch() == llvm::Triple::x86)
5745 CmdArgs.push_back("--32");
5746 else if (getToolChain().getArch() == llvm::Triple::ppc)
5747 CmdArgs.push_back("-a32");
5748 else if (getToolChain().getArch() == llvm::Triple::mips ||
5749 getToolChain().getArch() == llvm::Triple::mipsel ||
5750 getToolChain().getArch() == llvm::Triple::mips64 ||
5751 getToolChain().getArch() == llvm::Triple::mips64el) {
5754 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5756 CmdArgs.push_back("-march");
5757 CmdArgs.push_back(CPUName.data());
5759 CmdArgs.push_back("-mabi");
5760 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5762 if (getToolChain().getArch() == llvm::Triple::mips ||
5763 getToolChain().getArch() == llvm::Triple::mips64)
5764 CmdArgs.push_back("-EB");
5766 CmdArgs.push_back("-EL");
5768 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5769 options::OPT_fpic, options::OPT_fno_pic,
5770 options::OPT_fPIE, options::OPT_fno_PIE,
5771 options::OPT_fpie, options::OPT_fno_pie);
5773 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5774 LastPICArg->getOption().matches(options::OPT_fpic) ||
5775 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5776 LastPICArg->getOption().matches(options::OPT_fpie))) {
5777 CmdArgs.push_back("-KPIC");
5779 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5780 getToolChain().getArch() == llvm::Triple::thumb) {
5781 CmdArgs.push_back("-mfpu=softvfp");
5782 switch(getToolChain().getTriple().getEnvironment()) {
5783 case llvm::Triple::GNUEABI:
5784 case llvm::Triple::EABI:
5785 CmdArgs.push_back("-meabi=5");
5789 CmdArgs.push_back("-matpcs");
5791 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
5792 getToolChain().getArch() == llvm::Triple::sparcv9) {
5793 if (getToolChain().getArch() == llvm::Triple::sparc)
5794 CmdArgs.push_back("-Av8plusa");
5796 CmdArgs.push_back("-Av9a");
5798 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5799 options::OPT_fpic, options::OPT_fno_pic,
5800 options::OPT_fPIE, options::OPT_fno_PIE,
5801 options::OPT_fpie, options::OPT_fno_pie);
5803 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5804 LastPICArg->getOption().matches(options::OPT_fpic) ||
5805 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5806 LastPICArg->getOption().matches(options::OPT_fpie))) {
5807 CmdArgs.push_back("-KPIC");
5811 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5812 options::OPT_Xassembler);
5814 CmdArgs.push_back("-o");
5815 CmdArgs.push_back(Output.getFilename());
5817 for (InputInfoList::const_iterator
5818 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5819 const InputInfo &II = *it;
5820 CmdArgs.push_back(II.getFilename());
5824 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5825 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5828 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5829 const InputInfo &Output,
5830 const InputInfoList &Inputs,
5831 const ArgList &Args,
5832 const char *LinkingOutput) const {
5833 const toolchains::FreeBSD& ToolChain =
5834 static_cast<const toolchains::FreeBSD&>(getToolChain());
5835 const Driver &D = ToolChain.getDriver();
5836 ArgStringList CmdArgs;
5838 // Silence warning for "clang -g foo.o -o foo"
5839 Args.ClaimAllArgs(options::OPT_g_Group);
5840 // and "clang -emit-llvm foo.o -o foo"
5841 Args.ClaimAllArgs(options::OPT_emit_llvm);
5842 // and for "clang -w foo.o -o foo". Other warning options are already
5843 // handled somewhere else.
5844 Args.ClaimAllArgs(options::OPT_w);
5846 if (!D.SysRoot.empty())
5847 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5849 if (Args.hasArg(options::OPT_pie))
5850 CmdArgs.push_back("-pie");
5852 if (Args.hasArg(options::OPT_static)) {
5853 CmdArgs.push_back("-Bstatic");
5855 if (Args.hasArg(options::OPT_rdynamic))
5856 CmdArgs.push_back("-export-dynamic");
5857 CmdArgs.push_back("--eh-frame-hdr");
5858 if (Args.hasArg(options::OPT_shared)) {
5859 CmdArgs.push_back("-Bshareable");
5861 CmdArgs.push_back("-dynamic-linker");
5862 CmdArgs.push_back("/libexec/ld-elf.so.1");
5864 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5865 llvm::Triple::ArchType Arch = ToolChain.getArch();
5866 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5867 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5868 CmdArgs.push_back("--hash-style=both");
5871 CmdArgs.push_back("--enable-new-dtags");
5874 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5875 // instruct ld in the base system to link 32-bit code.
5876 if (ToolChain.getArch() == llvm::Triple::x86) {
5877 CmdArgs.push_back("-m");
5878 CmdArgs.push_back("elf_i386_fbsd");
5881 if (ToolChain.getArch() == llvm::Triple::ppc) {
5882 CmdArgs.push_back("-m");
5883 CmdArgs.push_back("elf32ppc_fbsd");
5886 if (Output.isFilename()) {
5887 CmdArgs.push_back("-o");
5888 CmdArgs.push_back(Output.getFilename());
5890 assert(Output.isNothing() && "Invalid output.");
5893 if (!Args.hasArg(options::OPT_nostdlib) &&
5894 !Args.hasArg(options::OPT_nostartfiles)) {
5895 const char *crt1 = NULL;
5896 if (!Args.hasArg(options::OPT_shared)) {
5897 if (Args.hasArg(options::OPT_pg))
5899 else if (Args.hasArg(options::OPT_pie))
5905 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5907 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5909 const char *crtbegin = NULL;
5910 if (Args.hasArg(options::OPT_static))
5911 crtbegin = "crtbeginT.o";
5912 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5913 crtbegin = "crtbeginS.o";
5915 crtbegin = "crtbegin.o";
5917 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5920 Args.AddAllArgs(CmdArgs, options::OPT_L);
5921 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5922 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5924 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5925 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5926 Args.AddAllArgs(CmdArgs, options::OPT_e);
5927 Args.AddAllArgs(CmdArgs, options::OPT_s);
5928 Args.AddAllArgs(CmdArgs, options::OPT_t);
5929 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5930 Args.AddAllArgs(CmdArgs, options::OPT_r);
5932 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5933 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5935 if (D.IsUsingLTO(Args)) {
5936 CmdArgs.push_back("-plugin");
5937 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5938 CmdArgs.push_back(Args.MakeArgString(Plugin));
5940 // Try to pass driver level flags relevant to LTO code generation down to
5943 // Handle flags for selecting CPU variants.
5944 std::string CPU = getCPUName(Args, ToolChain.getTriple());
5947 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5952 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5954 if (!Args.hasArg(options::OPT_nostdlib) &&
5955 !Args.hasArg(options::OPT_nodefaultlibs)) {
5957 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5958 if (Args.hasArg(options::OPT_pg))
5959 CmdArgs.push_back("-lm_p");
5961 CmdArgs.push_back("-lm");
5963 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5964 // the default system libraries. Just mimic this for now.
5965 if (Args.hasArg(options::OPT_pg))
5966 CmdArgs.push_back("-lgcc_p");
5968 CmdArgs.push_back("-lgcc");
5969 if (Args.hasArg(options::OPT_static)) {
5970 CmdArgs.push_back("-lgcc_eh");
5971 } else if (Args.hasArg(options::OPT_pg)) {
5972 CmdArgs.push_back("-lgcc_eh_p");
5974 CmdArgs.push_back("--as-needed");
5975 CmdArgs.push_back("-lgcc_s");
5976 CmdArgs.push_back("--no-as-needed");
5979 if (Args.hasArg(options::OPT_pthread)) {
5980 if (Args.hasArg(options::OPT_pg))
5981 CmdArgs.push_back("-lpthread_p");
5983 CmdArgs.push_back("-lpthread");
5986 if (Args.hasArg(options::OPT_pg)) {
5987 if (Args.hasArg(options::OPT_shared))
5988 CmdArgs.push_back("-lc");
5990 CmdArgs.push_back("-lc_p");
5991 CmdArgs.push_back("-lgcc_p");
5993 CmdArgs.push_back("-lc");
5994 CmdArgs.push_back("-lgcc");
5997 if (Args.hasArg(options::OPT_static)) {
5998 CmdArgs.push_back("-lgcc_eh");
5999 } else if (Args.hasArg(options::OPT_pg)) {
6000 CmdArgs.push_back("-lgcc_eh_p");
6002 CmdArgs.push_back("--as-needed");
6003 CmdArgs.push_back("-lgcc_s");
6004 CmdArgs.push_back("--no-as-needed");
6008 if (!Args.hasArg(options::OPT_nostdlib) &&
6009 !Args.hasArg(options::OPT_nostartfiles)) {
6010 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6011 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
6013 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6014 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6017 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
6020 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
6021 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6024 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6025 const InputInfo &Output,
6026 const InputInfoList &Inputs,
6027 const ArgList &Args,
6028 const char *LinkingOutput) const {
6029 ArgStringList CmdArgs;
6031 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6032 // instruct as in the base system to assemble 32-bit code.
6033 if (getToolChain().getArch() == llvm::Triple::x86)
6034 CmdArgs.push_back("--32");
6036 // Pass the target CPU to GNU as for ARM, since the source code might
6037 // not have the correct .cpu annotation.
6038 if (getToolChain().getArch() == llvm::Triple::arm) {
6039 std::string MArch(getARMTargetCPU(Args, getToolChain().getTriple()));
6040 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6043 if (getToolChain().getArch() == llvm::Triple::mips ||
6044 getToolChain().getArch() == llvm::Triple::mipsel ||
6045 getToolChain().getArch() == llvm::Triple::mips64 ||
6046 getToolChain().getArch() == llvm::Triple::mips64el) {
6049 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6051 CmdArgs.push_back("-march");
6052 CmdArgs.push_back(CPUName.data());
6054 CmdArgs.push_back("-mabi");
6055 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6057 if (getToolChain().getArch() == llvm::Triple::mips ||
6058 getToolChain().getArch() == llvm::Triple::mips64)
6059 CmdArgs.push_back("-EB");
6061 CmdArgs.push_back("-EL");
6063 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6064 options::OPT_fpic, options::OPT_fno_pic,
6065 options::OPT_fPIE, options::OPT_fno_PIE,
6066 options::OPT_fpie, options::OPT_fno_pie);
6068 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6069 LastPICArg->getOption().matches(options::OPT_fpic) ||
6070 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6071 LastPICArg->getOption().matches(options::OPT_fpie))) {
6072 CmdArgs.push_back("-KPIC");
6076 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6077 options::OPT_Xassembler);
6079 CmdArgs.push_back("-o");
6080 CmdArgs.push_back(Output.getFilename());
6082 for (InputInfoList::const_iterator
6083 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6084 const InputInfo &II = *it;
6085 CmdArgs.push_back(II.getFilename());
6088 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
6089 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6092 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6093 const InputInfo &Output,
6094 const InputInfoList &Inputs,
6095 const ArgList &Args,
6096 const char *LinkingOutput) const {
6097 const Driver &D = getToolChain().getDriver();
6098 ArgStringList CmdArgs;
6100 if (!D.SysRoot.empty())
6101 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6103 if (Args.hasArg(options::OPT_static)) {
6104 CmdArgs.push_back("-Bstatic");
6106 if (Args.hasArg(options::OPT_rdynamic))
6107 CmdArgs.push_back("-export-dynamic");
6108 CmdArgs.push_back("--eh-frame-hdr");
6109 if (Args.hasArg(options::OPT_shared)) {
6110 CmdArgs.push_back("-Bshareable");
6112 CmdArgs.push_back("-dynamic-linker");
6113 CmdArgs.push_back("/libexec/ld.elf_so");
6117 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6118 // instruct ld in the base system to link 32-bit code.
6119 if (getToolChain().getArch() == llvm::Triple::x86) {
6120 CmdArgs.push_back("-m");
6121 CmdArgs.push_back("elf_i386");
6124 if (Output.isFilename()) {
6125 CmdArgs.push_back("-o");
6126 CmdArgs.push_back(Output.getFilename());
6128 assert(Output.isNothing() && "Invalid output.");
6131 if (!Args.hasArg(options::OPT_nostdlib) &&
6132 !Args.hasArg(options::OPT_nostartfiles)) {
6133 if (!Args.hasArg(options::OPT_shared)) {
6134 CmdArgs.push_back(Args.MakeArgString(
6135 getToolChain().GetFilePath("crt0.o")));
6136 CmdArgs.push_back(Args.MakeArgString(
6137 getToolChain().GetFilePath("crti.o")));
6138 CmdArgs.push_back(Args.MakeArgString(
6139 getToolChain().GetFilePath("crtbegin.o")));
6141 CmdArgs.push_back(Args.MakeArgString(
6142 getToolChain().GetFilePath("crti.o")));
6143 CmdArgs.push_back(Args.MakeArgString(
6144 getToolChain().GetFilePath("crtbeginS.o")));
6148 Args.AddAllArgs(CmdArgs, options::OPT_L);
6149 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6150 Args.AddAllArgs(CmdArgs, options::OPT_e);
6151 Args.AddAllArgs(CmdArgs, options::OPT_s);
6152 Args.AddAllArgs(CmdArgs, options::OPT_t);
6153 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6154 Args.AddAllArgs(CmdArgs, options::OPT_r);
6156 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6158 unsigned Major, Minor, Micro;
6159 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6160 bool useLibgcc = true;
6161 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6162 if (getToolChain().getArch() == llvm::Triple::x86 ||
6163 getToolChain().getArch() == llvm::Triple::x86_64)
6167 if (!Args.hasArg(options::OPT_nostdlib) &&
6168 !Args.hasArg(options::OPT_nodefaultlibs)) {
6170 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6171 CmdArgs.push_back("-lm");
6173 if (Args.hasArg(options::OPT_pthread))
6174 CmdArgs.push_back("-lpthread");
6175 CmdArgs.push_back("-lc");
6178 if (Args.hasArg(options::OPT_static)) {
6179 // libgcc_eh depends on libc, so resolve as much as possible,
6180 // pull in any new requirements from libc and then get the rest
6182 CmdArgs.push_back("-lgcc_eh");
6183 CmdArgs.push_back("-lc");
6184 CmdArgs.push_back("-lgcc");
6186 CmdArgs.push_back("-lgcc");
6187 CmdArgs.push_back("--as-needed");
6188 CmdArgs.push_back("-lgcc_s");
6189 CmdArgs.push_back("--no-as-needed");
6194 if (!Args.hasArg(options::OPT_nostdlib) &&
6195 !Args.hasArg(options::OPT_nostartfiles)) {
6196 if (!Args.hasArg(options::OPT_shared))
6197 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6200 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6202 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6206 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6208 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6209 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6212 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6213 const InputInfo &Output,
6214 const InputInfoList &Inputs,
6215 const ArgList &Args,
6216 const char *LinkingOutput) const {
6217 ArgStringList CmdArgs;
6218 bool NeedsKPIC = false;
6220 // Add --32/--64 to make sure we get the format we want.
6221 // This is incomplete
6222 if (getToolChain().getArch() == llvm::Triple::x86) {
6223 CmdArgs.push_back("--32");
6224 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6225 CmdArgs.push_back("--64");
6226 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6227 CmdArgs.push_back("-a32");
6228 CmdArgs.push_back("-mppc");
6229 CmdArgs.push_back("-many");
6230 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6231 CmdArgs.push_back("-a64");
6232 CmdArgs.push_back("-mppc64");
6233 CmdArgs.push_back("-many");
6234 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6235 CmdArgs.push_back("-a64");
6236 CmdArgs.push_back("-mppc64le");
6237 CmdArgs.push_back("-many");
6238 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6239 CmdArgs.push_back("-32");
6240 CmdArgs.push_back("-Av8plusa");
6242 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6243 CmdArgs.push_back("-64");
6244 CmdArgs.push_back("-Av9a");
6246 } else if (getToolChain().getArch() == llvm::Triple::arm) {
6247 StringRef MArch = getToolChain().getArchName();
6248 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6249 CmdArgs.push_back("-mfpu=neon");
6250 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6251 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
6253 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6254 getToolChain().getTriple());
6255 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
6257 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6258 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6259 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
6260 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6261 getToolChain().getArch() == llvm::Triple::mipsel ||
6262 getToolChain().getArch() == llvm::Triple::mips64 ||
6263 getToolChain().getArch() == llvm::Triple::mips64el) {
6266 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6268 CmdArgs.push_back("-march");
6269 CmdArgs.push_back(CPUName.data());
6271 CmdArgs.push_back("-mabi");
6272 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6274 if (getToolChain().getArch() == llvm::Triple::mips ||
6275 getToolChain().getArch() == llvm::Triple::mips64)
6276 CmdArgs.push_back("-EB");
6278 CmdArgs.push_back("-EL");
6280 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6281 if (StringRef(A->getValue()) == "2008")
6282 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6285 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfp64)) {
6286 if (A->getOption().matches(options::OPT_mfp32))
6287 CmdArgs.push_back(Args.MakeArgString("-mfp32"));
6289 CmdArgs.push_back(Args.MakeArgString("-mfp64"));
6292 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6293 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6294 options::OPT_mno_micromips);
6295 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6296 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6298 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6299 // Do not use AddLastArg because not all versions of MIPS assembler
6300 // support -mmsa / -mno-msa options.
6301 if (A->getOption().matches(options::OPT_mmsa))
6302 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6306 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6307 // Always pass an -march option, since our default of z10 is later
6308 // than the GNU assembler's default.
6309 StringRef CPUName = getSystemZTargetCPU(Args);
6310 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6314 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6315 options::OPT_fpic, options::OPT_fno_pic,
6316 options::OPT_fPIE, options::OPT_fno_PIE,
6317 options::OPT_fpie, options::OPT_fno_pie);
6319 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6320 LastPICArg->getOption().matches(options::OPT_fpic) ||
6321 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6322 LastPICArg->getOption().matches(options::OPT_fpie))) {
6323 CmdArgs.push_back("-KPIC");
6327 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6328 options::OPT_Xassembler);
6330 CmdArgs.push_back("-o");
6331 CmdArgs.push_back(Output.getFilename());
6333 for (InputInfoList::const_iterator
6334 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6335 const InputInfo &II = *it;
6336 CmdArgs.push_back(II.getFilename());
6340 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6341 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6343 // Handle the debug info splitting at object creation time if we're
6344 // creating an object.
6345 // TODO: Currently only works on linux with newer objcopy.
6346 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
6347 getToolChain().getTriple().isOSLinux())
6348 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6349 SplitDebugName(Args, Inputs));
6352 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6353 ArgStringList &CmdArgs, const ArgList &Args) {
6354 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
6355 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6356 Args.hasArg(options::OPT_static);
6358 CmdArgs.push_back("-lgcc");
6360 if (StaticLibgcc || isAndroid) {
6362 CmdArgs.push_back("-lgcc");
6365 CmdArgs.push_back("--as-needed");
6366 CmdArgs.push_back("-lgcc_s");
6368 CmdArgs.push_back("--no-as-needed");
6371 if (StaticLibgcc && !isAndroid)
6372 CmdArgs.push_back("-lgcc_eh");
6373 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
6374 CmdArgs.push_back("-lgcc");
6376 // According to Android ABI, we have to link with libdl if we are
6377 // linking with non-static libgcc.
6379 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6380 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6381 if (isAndroid && !StaticLibgcc)
6382 CmdArgs.push_back("-ldl");
6385 static bool hasMipsN32ABIArg(const ArgList &Args) {
6386 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6387 return A && (A->getValue() == StringRef("n32"));
6390 static StringRef getLinuxDynamicLinker(const ArgList &Args,
6391 const toolchains::Linux &ToolChain) {
6392 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6393 return "/system/bin/linker";
6394 else if (ToolChain.getArch() == llvm::Triple::x86 ||
6395 ToolChain.getArch() == llvm::Triple::sparc)
6396 return "/lib/ld-linux.so.2";
6397 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6398 return "/lib/ld-linux-aarch64.so.1";
6399 else if (ToolChain.getArch() == llvm::Triple::arm ||
6400 ToolChain.getArch() == llvm::Triple::thumb) {
6401 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6402 return "/lib/ld-linux-armhf.so.3";
6404 return "/lib/ld-linux.so.3";
6405 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6406 ToolChain.getArch() == llvm::Triple::mipsel)
6407 return "/lib/ld.so.1";
6408 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6409 ToolChain.getArch() == llvm::Triple::mips64el) {
6410 if (hasMipsN32ABIArg(Args))
6411 return "/lib32/ld.so.1";
6413 return "/lib64/ld.so.1";
6414 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6415 return "/lib/ld.so.1";
6416 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6417 ToolChain.getArch() == llvm::Triple::ppc64le ||
6418 ToolChain.getArch() == llvm::Triple::systemz)
6419 return "/lib64/ld64.so.1";
6420 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6421 return "/lib64/ld-linux.so.2";
6423 return "/lib64/ld-linux-x86-64.so.2";
6426 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6427 const InputInfo &Output,
6428 const InputInfoList &Inputs,
6429 const ArgList &Args,
6430 const char *LinkingOutput) const {
6431 const toolchains::Linux& ToolChain =
6432 static_cast<const toolchains::Linux&>(getToolChain());
6433 const Driver &D = ToolChain.getDriver();
6434 const bool isAndroid =
6435 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
6436 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
6438 !Args.hasArg(options::OPT_shared) &&
6439 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
6441 ArgStringList CmdArgs;
6443 // Silence warning for "clang -g foo.o -o foo"
6444 Args.ClaimAllArgs(options::OPT_g_Group);
6445 // and "clang -emit-llvm foo.o -o foo"
6446 Args.ClaimAllArgs(options::OPT_emit_llvm);
6447 // and for "clang -w foo.o -o foo". Other warning options are already
6448 // handled somewhere else.
6449 Args.ClaimAllArgs(options::OPT_w);
6451 if (!D.SysRoot.empty())
6452 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6455 CmdArgs.push_back("-pie");
6457 if (Args.hasArg(options::OPT_rdynamic))
6458 CmdArgs.push_back("-export-dynamic");
6460 if (Args.hasArg(options::OPT_s))
6461 CmdArgs.push_back("-s");
6463 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6464 e = ToolChain.ExtraOpts.end();
6466 CmdArgs.push_back(i->c_str());
6468 if (!Args.hasArg(options::OPT_static)) {
6469 CmdArgs.push_back("--eh-frame-hdr");
6472 CmdArgs.push_back("-m");
6473 if (ToolChain.getArch() == llvm::Triple::x86)
6474 CmdArgs.push_back("elf_i386");
6475 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6476 CmdArgs.push_back("aarch64linux");
6477 else if (ToolChain.getArch() == llvm::Triple::arm
6478 || ToolChain.getArch() == llvm::Triple::thumb)
6479 CmdArgs.push_back("armelf_linux_eabi");
6480 else if (ToolChain.getArch() == llvm::Triple::ppc)
6481 CmdArgs.push_back("elf32ppclinux");
6482 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6483 CmdArgs.push_back("elf64ppc");
6484 else if (ToolChain.getArch() == llvm::Triple::sparc)
6485 CmdArgs.push_back("elf32_sparc");
6486 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6487 CmdArgs.push_back("elf64_sparc");
6488 else if (ToolChain.getArch() == llvm::Triple::mips)
6489 CmdArgs.push_back("elf32btsmip");
6490 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6491 CmdArgs.push_back("elf32ltsmip");
6492 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6493 if (hasMipsN32ABIArg(Args))
6494 CmdArgs.push_back("elf32btsmipn32");
6496 CmdArgs.push_back("elf64btsmip");
6498 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6499 if (hasMipsN32ABIArg(Args))
6500 CmdArgs.push_back("elf32ltsmipn32");
6502 CmdArgs.push_back("elf64ltsmip");
6504 else if (ToolChain.getArch() == llvm::Triple::systemz)
6505 CmdArgs.push_back("elf64_s390");
6507 CmdArgs.push_back("elf_x86_64");
6509 if (Args.hasArg(options::OPT_static)) {
6510 if (ToolChain.getArch() == llvm::Triple::arm
6511 || ToolChain.getArch() == llvm::Triple::thumb)
6512 CmdArgs.push_back("-Bstatic");
6514 CmdArgs.push_back("-static");
6515 } else if (Args.hasArg(options::OPT_shared)) {
6516 CmdArgs.push_back("-shared");
6518 CmdArgs.push_back("-Bsymbolic");
6522 if (ToolChain.getArch() == llvm::Triple::arm ||
6523 ToolChain.getArch() == llvm::Triple::thumb ||
6524 (!Args.hasArg(options::OPT_static) &&
6525 !Args.hasArg(options::OPT_shared))) {
6526 CmdArgs.push_back("-dynamic-linker");
6527 CmdArgs.push_back(Args.MakeArgString(
6528 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
6531 CmdArgs.push_back("-o");
6532 CmdArgs.push_back(Output.getFilename());
6534 if (!Args.hasArg(options::OPT_nostdlib) &&
6535 !Args.hasArg(options::OPT_nostartfiles)) {
6537 const char *crt1 = NULL;
6538 if (!Args.hasArg(options::OPT_shared)){
6539 if (Args.hasArg(options::OPT_pg))
6547 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6549 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6552 const char *crtbegin;
6553 if (Args.hasArg(options::OPT_static))
6554 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
6555 else if (Args.hasArg(options::OPT_shared))
6556 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
6558 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
6560 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
6561 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
6563 // Add crtfastmath.o if available and fast math is enabled.
6564 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
6567 Args.AddAllArgs(CmdArgs, options::OPT_L);
6569 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6571 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6573 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
6575 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6576 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6578 if (D.IsUsingLTO(Args)) {
6579 CmdArgs.push_back("-plugin");
6580 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6581 CmdArgs.push_back(Args.MakeArgString(Plugin));
6583 // Try to pass driver level flags relevant to LTO code generation down to
6586 // Handle flags for selecting CPU variants.
6587 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6590 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6596 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6597 CmdArgs.push_back("--no-demangle");
6599 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6601 // Call these before we add the C++ ABI library.
6602 if (Sanitize.needsUbsanRt())
6603 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
6604 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6605 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
6606 if (Sanitize.needsAsanRt())
6607 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6608 if (Sanitize.needsTsanRt())
6609 addTsanRTLinux(getToolChain(), Args, CmdArgs);
6610 if (Sanitize.needsMsanRt())
6611 addMsanRTLinux(getToolChain(), Args, CmdArgs);
6612 if (Sanitize.needsLsanRt())
6613 addLsanRTLinux(getToolChain(), Args, CmdArgs);
6614 if (Sanitize.needsDfsanRt())
6615 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
6617 // The profile runtime also needs access to system libraries.
6618 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6621 !Args.hasArg(options::OPT_nostdlib) &&
6622 !Args.hasArg(options::OPT_nodefaultlibs)) {
6623 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6624 !Args.hasArg(options::OPT_static);
6625 if (OnlyLibstdcxxStatic)
6626 CmdArgs.push_back("-Bstatic");
6627 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6628 if (OnlyLibstdcxxStatic)
6629 CmdArgs.push_back("-Bdynamic");
6630 CmdArgs.push_back("-lm");
6633 if (!Args.hasArg(options::OPT_nostdlib)) {
6634 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6635 if (Args.hasArg(options::OPT_static))
6636 CmdArgs.push_back("--start-group");
6638 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6640 CmdArgs.push_back("-lgomp");
6642 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6643 // librt. Most modern Linux platfroms require it, but some may not.
6644 CmdArgs.push_back("-lrt");
6647 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6649 if (Args.hasArg(options::OPT_pthread) ||
6650 Args.hasArg(options::OPT_pthreads) || OpenMP)
6651 CmdArgs.push_back("-lpthread");
6653 CmdArgs.push_back("-lc");
6655 if (Args.hasArg(options::OPT_static))
6656 CmdArgs.push_back("--end-group");
6658 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6661 if (!Args.hasArg(options::OPT_nostartfiles)) {
6663 if (Args.hasArg(options::OPT_shared))
6664 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
6666 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
6668 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
6670 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
6672 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6676 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6679 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6680 const InputInfo &Output,
6681 const InputInfoList &Inputs,
6682 const ArgList &Args,
6683 const char *LinkingOutput) const {
6684 ArgStringList CmdArgs;
6686 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6687 options::OPT_Xassembler);
6689 CmdArgs.push_back("-o");
6690 CmdArgs.push_back(Output.getFilename());
6692 for (InputInfoList::const_iterator
6693 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6694 const InputInfo &II = *it;
6695 CmdArgs.push_back(II.getFilename());
6699 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6700 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6703 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
6704 const InputInfo &Output,
6705 const InputInfoList &Inputs,
6706 const ArgList &Args,
6707 const char *LinkingOutput) const {
6708 const Driver &D = getToolChain().getDriver();
6709 ArgStringList CmdArgs;
6711 if (Output.isFilename()) {
6712 CmdArgs.push_back("-o");
6713 CmdArgs.push_back(Output.getFilename());
6715 assert(Output.isNothing() && "Invalid output.");
6718 if (!Args.hasArg(options::OPT_nostdlib) &&
6719 !Args.hasArg(options::OPT_nostartfiles)) {
6720 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6721 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6722 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6723 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6726 Args.AddAllArgs(CmdArgs, options::OPT_L);
6727 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6728 Args.AddAllArgs(CmdArgs, options::OPT_e);
6730 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6732 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6734 if (!Args.hasArg(options::OPT_nostdlib) &&
6735 !Args.hasArg(options::OPT_nodefaultlibs)) {
6737 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6738 CmdArgs.push_back("-lm");
6742 if (!Args.hasArg(options::OPT_nostdlib) &&
6743 !Args.hasArg(options::OPT_nostartfiles)) {
6744 if (Args.hasArg(options::OPT_pthread))
6745 CmdArgs.push_back("-lpthread");
6746 CmdArgs.push_back("-lc");
6747 CmdArgs.push_back("-lCompilerRT-Generic");
6748 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6750 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
6753 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6754 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6759 // For now, DragonFly Assemble does just about the same as for
6760 // FreeBSD, but this may change soon.
6761 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6762 const InputInfo &Output,
6763 const InputInfoList &Inputs,
6764 const ArgList &Args,
6765 const char *LinkingOutput) const {
6766 ArgStringList CmdArgs;
6768 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6769 // instruct as in the base system to assemble 32-bit code.
6770 if (getToolChain().getArch() == llvm::Triple::x86)
6771 CmdArgs.push_back("--32");
6773 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6774 options::OPT_Xassembler);
6776 CmdArgs.push_back("-o");
6777 CmdArgs.push_back(Output.getFilename());
6779 for (InputInfoList::const_iterator
6780 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6781 const InputInfo &II = *it;
6782 CmdArgs.push_back(II.getFilename());
6786 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6787 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6790 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
6791 const InputInfo &Output,
6792 const InputInfoList &Inputs,
6793 const ArgList &Args,
6794 const char *LinkingOutput) const {
6795 bool UseGCC47 = false;
6796 const Driver &D = getToolChain().getDriver();
6797 ArgStringList CmdArgs;
6799 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6802 if (!D.SysRoot.empty())
6803 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6805 CmdArgs.push_back("--eh-frame-hdr");
6806 if (Args.hasArg(options::OPT_static)) {
6807 CmdArgs.push_back("-Bstatic");
6809 if (Args.hasArg(options::OPT_rdynamic))
6810 CmdArgs.push_back("-export-dynamic");
6811 if (Args.hasArg(options::OPT_shared))
6812 CmdArgs.push_back("-Bshareable");
6814 CmdArgs.push_back("-dynamic-linker");
6815 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6817 CmdArgs.push_back("--hash-style=both");
6820 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6821 // instruct ld in the base system to link 32-bit code.
6822 if (getToolChain().getArch() == llvm::Triple::x86) {
6823 CmdArgs.push_back("-m");
6824 CmdArgs.push_back("elf_i386");
6827 if (Output.isFilename()) {
6828 CmdArgs.push_back("-o");
6829 CmdArgs.push_back(Output.getFilename());
6831 assert(Output.isNothing() && "Invalid output.");
6834 if (!Args.hasArg(options::OPT_nostdlib) &&
6835 !Args.hasArg(options::OPT_nostartfiles)) {
6836 if (!Args.hasArg(options::OPT_shared)) {
6837 if (Args.hasArg(options::OPT_pg))
6838 CmdArgs.push_back(Args.MakeArgString(
6839 getToolChain().GetFilePath("gcrt1.o")));
6841 if (Args.hasArg(options::OPT_pie))
6842 CmdArgs.push_back(Args.MakeArgString(
6843 getToolChain().GetFilePath("Scrt1.o")));
6845 CmdArgs.push_back(Args.MakeArgString(
6846 getToolChain().GetFilePath("crt1.o")));
6849 CmdArgs.push_back(Args.MakeArgString(
6850 getToolChain().GetFilePath("crti.o")));
6851 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6852 CmdArgs.push_back(Args.MakeArgString(
6853 getToolChain().GetFilePath("crtbeginS.o")));
6855 CmdArgs.push_back(Args.MakeArgString(
6856 getToolChain().GetFilePath("crtbegin.o")));
6859 Args.AddAllArgs(CmdArgs, options::OPT_L);
6860 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6861 Args.AddAllArgs(CmdArgs, options::OPT_e);
6863 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6865 if (!Args.hasArg(options::OPT_nostdlib) &&
6866 !Args.hasArg(options::OPT_nodefaultlibs)) {
6867 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6870 CmdArgs.push_back("-L/usr/lib/gcc47");
6872 CmdArgs.push_back("-L/usr/lib/gcc44");
6874 if (!Args.hasArg(options::OPT_static)) {
6876 CmdArgs.push_back("-rpath");
6877 CmdArgs.push_back("/usr/lib/gcc47");
6879 CmdArgs.push_back("-rpath");
6880 CmdArgs.push_back("/usr/lib/gcc44");
6885 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6886 CmdArgs.push_back("-lm");
6889 if (Args.hasArg(options::OPT_pthread))
6890 CmdArgs.push_back("-lpthread");
6892 if (!Args.hasArg(options::OPT_nolibc)) {
6893 CmdArgs.push_back("-lc");
6897 if (Args.hasArg(options::OPT_static) ||
6898 Args.hasArg(options::OPT_static_libgcc)) {
6899 CmdArgs.push_back("-lgcc");
6900 CmdArgs.push_back("-lgcc_eh");
6902 if (Args.hasArg(options::OPT_shared_libgcc)) {
6903 CmdArgs.push_back("-lgcc_pic");
6904 if (!Args.hasArg(options::OPT_shared))
6905 CmdArgs.push_back("-lgcc");
6907 CmdArgs.push_back("-lgcc");
6908 CmdArgs.push_back("--as-needed");
6909 CmdArgs.push_back("-lgcc_pic");
6910 CmdArgs.push_back("--no-as-needed");
6914 if (Args.hasArg(options::OPT_shared)) {
6915 CmdArgs.push_back("-lgcc_pic");
6917 CmdArgs.push_back("-lgcc");
6922 if (!Args.hasArg(options::OPT_nostdlib) &&
6923 !Args.hasArg(options::OPT_nostartfiles)) {
6924 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6925 CmdArgs.push_back(Args.MakeArgString(
6926 getToolChain().GetFilePath("crtendS.o")));
6928 CmdArgs.push_back(Args.MakeArgString(
6929 getToolChain().GetFilePath("crtend.o")));
6930 CmdArgs.push_back(Args.MakeArgString(
6931 getToolChain().GetFilePath("crtn.o")));
6934 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6937 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6938 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6941 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6942 const InputInfo &Output,
6943 const InputInfoList &Inputs,
6944 const ArgList &Args,
6945 const char *LinkingOutput) const {
6946 ArgStringList CmdArgs;
6948 if (Output.isFilename()) {
6949 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6950 Output.getFilename()));
6952 assert(Output.isNothing() && "Invalid output.");
6955 if (!Args.hasArg(options::OPT_nostdlib) &&
6956 !Args.hasArg(options::OPT_nostartfiles) &&
6957 !C.getDriver().IsCLMode()) {
6958 CmdArgs.push_back("-defaultlib:libcmt");
6961 CmdArgs.push_back("-nologo");
6963 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6966 CmdArgs.push_back(Args.MakeArgString("-dll"));
6968 SmallString<128> ImplibName(Output.getFilename());
6969 llvm::sys::path::replace_extension(ImplibName, "lib");
6970 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6974 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
6975 CmdArgs.push_back(Args.MakeArgString("-debug"));
6976 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
6977 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
6978 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6980 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
6982 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6984 // FIXME: Handle 64-bit.
6985 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6988 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6989 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
6991 // Add filenames immediately.
6992 for (InputInfoList::const_iterator
6993 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6994 if (it->isFilename())
6995 CmdArgs.push_back(it->getFilename());
6997 it->getInputArg().renderAsInput(Args, CmdArgs);
7001 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
7002 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7005 void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7006 const InputInfo &Output,
7007 const InputInfoList &Inputs,
7008 const ArgList &Args,
7009 const char *LinkingOutput) const {
7010 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7013 // Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7014 // If one cannot be found, return FallbackName.
7015 // We do this special search to prevent clang-cl from falling back onto itself
7016 // if it's available as cl.exe on the path.
7017 static std::string FindFallback(const char *FallbackName,
7018 const char *ClangProgramPath) {
7019 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7020 if (!OptPath.hasValue())
7021 return FallbackName;
7023 #ifdef LLVM_ON_WIN32
7024 const StringRef PathSeparators = ";";
7026 const StringRef PathSeparators = ":";
7029 SmallVector<StringRef, 8> PathSegments;
7030 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7032 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7033 const StringRef &PathSegment = PathSegments[i];
7034 if (PathSegment.empty())
7037 SmallString<128> FilePath(PathSegment);
7038 llvm::sys::path::append(FilePath, FallbackName);
7039 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7040 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7041 return FilePath.str();
7044 return FallbackName;
7047 Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7048 const InputInfo &Output,
7049 const InputInfoList &Inputs,
7050 const ArgList &Args,
7051 const char *LinkingOutput) const {
7052 ArgStringList CmdArgs;
7053 CmdArgs.push_back("/nologo");
7054 CmdArgs.push_back("/c"); // Compile only.
7055 CmdArgs.push_back("/W0"); // No warnings.
7057 // The goal is to be able to invoke this tool correctly based on
7058 // any flag accepted by clang-cl.
7060 // These are spelled the same way in clang and cl.exe,.
7061 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7062 Args.AddAllArgs(CmdArgs, options::OPT_I);
7064 // Optimization level.
7065 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7066 if (A->getOption().getID() == options::OPT_O0) {
7067 CmdArgs.push_back("/Od");
7069 StringRef OptLevel = A->getValue();
7070 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7071 A->render(Args, CmdArgs);
7072 else if (OptLevel == "3")
7073 CmdArgs.push_back("/Ox");
7077 // Flags for which clang-cl have an alias.
7078 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7080 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7081 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7083 if (Args.hasArg(options::OPT_fsyntax_only))
7084 CmdArgs.push_back("/Zs");
7086 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7087 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7088 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7090 // Flags that can simply be passed through.
7091 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7092 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7094 // The order of these flags is relevant, so pick the last one.
7095 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7096 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7097 A->render(Args, CmdArgs);
7101 assert(Inputs.size() == 1);
7102 const InputInfo &II = Inputs[0];
7103 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7104 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7105 if (II.isFilename())
7106 CmdArgs.push_back(II.getFilename());
7108 II.getInputArg().renderAsInput(Args, CmdArgs);
7111 assert(Output.getType() == types::TY_Object);
7112 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7113 Output.getFilename());
7114 CmdArgs.push_back(Fo);
7116 const Driver &D = getToolChain().getDriver();
7117 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
7119 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
7124 // We pass assemble and link construction to the xcc tool.
7126 void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7127 const InputInfo &Output,
7128 const InputInfoList &Inputs,
7129 const ArgList &Args,
7130 const char *LinkingOutput) const {
7131 ArgStringList CmdArgs;
7133 CmdArgs.push_back("-o");
7134 CmdArgs.push_back(Output.getFilename());
7136 CmdArgs.push_back("-c");
7138 if (Args.hasArg(options::OPT_g_Group)) {
7139 CmdArgs.push_back("-g");
7142 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7143 options::OPT_Xassembler);
7145 for (InputInfoList::const_iterator
7146 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7147 const InputInfo &II = *it;
7148 CmdArgs.push_back(II.getFilename());
7152 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7153 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7156 void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7157 const InputInfo &Output,
7158 const InputInfoList &Inputs,
7159 const ArgList &Args,
7160 const char *LinkingOutput) const {
7161 ArgStringList CmdArgs;
7163 if (Output.isFilename()) {
7164 CmdArgs.push_back("-o");
7165 CmdArgs.push_back(Output.getFilename());
7167 assert(Output.isNothing() && "Invalid output.");
7170 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7173 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7174 C.addCommand(new Command(JA, *this, Exec, CmdArgs));