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 /// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2000 static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2001 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2002 if (A->getOption().matches(options::OPT_O4) ||
2003 A->getOption().matches(options::OPT_Ofast))
2006 if (A->getOption().matches(options::OPT_O0))
2009 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2012 StringRef S(A->getValue());
2016 // Don't vectorize -Oz.
2020 unsigned OptLevel = 0;
2021 if (S.getAsInteger(10, OptLevel))
2024 return OptLevel > 1;
2030 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
2031 const InputInfo &Output,
2032 const InputInfoList &Inputs,
2033 const ArgList &Args,
2034 const char *LinkingOutput) const {
2035 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2036 options::OPT_fapple_kext);
2037 const Driver &D = getToolChain().getDriver();
2038 ArgStringList CmdArgs;
2040 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2042 // Invoke ourselves in -cc1 mode.
2044 // FIXME: Implement custom jobs for internal actions.
2045 CmdArgs.push_back("-cc1");
2047 // Add the "effective" target triple.
2048 CmdArgs.push_back("-triple");
2049 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2050 CmdArgs.push_back(Args.MakeArgString(TripleStr));
2052 // Select the appropriate action.
2053 RewriteKind rewriteKind = RK_None;
2055 if (isa<AnalyzeJobAction>(JA)) {
2056 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2057 CmdArgs.push_back("-analyze");
2058 } else if (isa<MigrateJobAction>(JA)) {
2059 CmdArgs.push_back("-migrate");
2060 } else if (isa<PreprocessJobAction>(JA)) {
2061 if (Output.getType() == types::TY_Dependencies)
2062 CmdArgs.push_back("-Eonly");
2064 CmdArgs.push_back("-E");
2065 if (Args.hasArg(options::OPT_rewrite_objc) &&
2066 !Args.hasArg(options::OPT_g_Group))
2067 CmdArgs.push_back("-P");
2069 } else if (isa<AssembleJobAction>(JA)) {
2070 CmdArgs.push_back("-emit-obj");
2072 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
2074 // Also ignore explicit -force_cpusubtype_ALL option.
2075 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
2076 } else if (isa<PrecompileJobAction>(JA)) {
2077 // Use PCH if the user requested it.
2078 bool UsePCH = D.CCCUsePCH;
2080 if (JA.getType() == types::TY_Nothing)
2081 CmdArgs.push_back("-fsyntax-only");
2083 CmdArgs.push_back("-emit-pch");
2085 CmdArgs.push_back("-emit-pth");
2087 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
2089 if (JA.getType() == types::TY_Nothing) {
2090 CmdArgs.push_back("-fsyntax-only");
2091 } else if (JA.getType() == types::TY_LLVM_IR ||
2092 JA.getType() == types::TY_LTO_IR) {
2093 CmdArgs.push_back("-emit-llvm");
2094 } else if (JA.getType() == types::TY_LLVM_BC ||
2095 JA.getType() == types::TY_LTO_BC) {
2096 CmdArgs.push_back("-emit-llvm-bc");
2097 } else if (JA.getType() == types::TY_PP_Asm) {
2098 CmdArgs.push_back("-S");
2099 } else if (JA.getType() == types::TY_AST) {
2100 CmdArgs.push_back("-emit-pch");
2101 } else if (JA.getType() == types::TY_ModuleFile) {
2102 CmdArgs.push_back("-module-file-info");
2103 } else if (JA.getType() == types::TY_RewrittenObjC) {
2104 CmdArgs.push_back("-rewrite-objc");
2105 rewriteKind = RK_NonFragile;
2106 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2107 CmdArgs.push_back("-rewrite-objc");
2108 rewriteKind = RK_Fragile;
2110 assert(JA.getType() == types::TY_PP_Asm &&
2111 "Unexpected output type!");
2115 // The make clang go fast button.
2116 CmdArgs.push_back("-disable-free");
2118 // Disable the verification pass in -asserts builds.
2120 CmdArgs.push_back("-disable-llvm-verifier");
2123 // Set the main file name, so that debug info works even with
2125 CmdArgs.push_back("-main-file-name");
2126 CmdArgs.push_back(getBaseInputName(Args, Inputs));
2128 // Some flags which affect the language (via preprocessor
2130 if (Args.hasArg(options::OPT_static))
2131 CmdArgs.push_back("-static-define");
2133 if (isa<AnalyzeJobAction>(JA)) {
2134 // Enable region store model by default.
2135 CmdArgs.push_back("-analyzer-store=region");
2137 // Treat blocks as analysis entry points.
2138 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2140 CmdArgs.push_back("-analyzer-eagerly-assume");
2142 // Add default argument set.
2143 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
2144 CmdArgs.push_back("-analyzer-checker=core");
2146 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2147 CmdArgs.push_back("-analyzer-checker=unix");
2149 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
2150 CmdArgs.push_back("-analyzer-checker=osx");
2152 CmdArgs.push_back("-analyzer-checker=deadcode");
2154 if (types::isCXX(Inputs[0].getType()))
2155 CmdArgs.push_back("-analyzer-checker=cplusplus");
2157 // Enable the following experimental checkers for testing.
2158 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2159 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2160 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2161 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2162 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2163 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
2166 // Set the output format. The default is plist, for (lame) historical
2168 CmdArgs.push_back("-analyzer-output");
2169 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
2170 CmdArgs.push_back(A->getValue());
2172 CmdArgs.push_back("plist");
2174 // Disable the presentation of standard compiler warnings when
2175 // using --analyze. We only want to show static analyzer diagnostics
2176 // or frontend errors.
2177 CmdArgs.push_back("-w");
2179 // Add -Xanalyzer arguments when running as analyzer.
2180 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
2183 CheckCodeGenerationOptions(D, Args);
2185 bool PIE = getToolChain().isPIEDefault();
2186 bool PIC = PIE || getToolChain().isPICDefault();
2187 bool IsPICLevelTwo = PIC;
2189 // For the PIC and PIE flag options, this logic is different from the
2190 // legacy logic in very old versions of GCC, as that logic was just
2191 // a bug no one had ever fixed. This logic is both more rational and
2192 // consistent with GCC's new logic now that the bugs are fixed. The last
2193 // argument relating to either PIC or PIE wins, and no other argument is
2194 // used. If the last argument is any flavor of the '-fno-...' arguments,
2195 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2196 // at the same level.
2197 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2198 options::OPT_fpic, options::OPT_fno_pic,
2199 options::OPT_fPIE, options::OPT_fno_PIE,
2200 options::OPT_fpie, options::OPT_fno_pie);
2201 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2202 // is forced, then neither PIC nor PIE flags will have no effect.
2203 if (!getToolChain().isPICDefaultForced()) {
2205 Option O = LastPICArg->getOption();
2206 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2207 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2208 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2209 PIC = PIE || O.matches(options::OPT_fPIC) ||
2210 O.matches(options::OPT_fpic);
2211 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2212 O.matches(options::OPT_fPIC);
2219 // Introduce a Darwin-specific hack. If the default is PIC but the flags
2220 // specified while enabling PIC enabled level 1 PIC, just force it back to
2221 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2222 // informal testing).
2223 if (PIC && getToolChain().getTriple().isOSDarwin())
2224 IsPICLevelTwo |= getToolChain().isPICDefault();
2226 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2227 // PIC or PIE options above, if these show up, PIC is disabled.
2228 llvm::Triple Triple(TripleStr);
2230 (!Triple.isiOS() || Triple.isOSVersionLT(6)))
2232 if (Args.hasArg(options::OPT_static))
2235 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2236 // This is a very special mode. It trumps the other modes, almost no one
2237 // uses it, and it isn't even valid on any OS but Darwin.
2238 if (!getToolChain().getTriple().isOSDarwin())
2239 D.Diag(diag::err_drv_unsupported_opt_for_target)
2240 << A->getSpelling() << getToolChain().getTriple().str();
2242 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2244 CmdArgs.push_back("-mrelocation-model");
2245 CmdArgs.push_back("dynamic-no-pic");
2247 // Only a forced PIC mode can cause the actual compile to have PIC defines
2248 // etc., no flags are sufficient. This behavior was selected to closely
2249 // match that of llvm-gcc and Apple GCC before that.
2250 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2251 CmdArgs.push_back("-pic-level");
2252 CmdArgs.push_back("2");
2255 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2256 // handled in Clang's IRGen by the -pie-level flag.
2257 CmdArgs.push_back("-mrelocation-model");
2258 CmdArgs.push_back(PIC ? "pic" : "static");
2261 CmdArgs.push_back("-pic-level");
2262 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2264 CmdArgs.push_back("-pie-level");
2265 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2270 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2271 options::OPT_fno_merge_all_constants))
2272 CmdArgs.push_back("-fno-merge-all-constants");
2274 // LLVM Code Generator Options.
2276 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2277 CmdArgs.push_back("-mregparm");
2278 CmdArgs.push_back(A->getValue());
2281 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2282 options::OPT_freg_struct_return)) {
2283 if (getToolChain().getArch() != llvm::Triple::x86) {
2284 D.Diag(diag::err_drv_unsupported_opt_for_target)
2285 << A->getSpelling() << getToolChain().getTriple().str();
2286 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2287 CmdArgs.push_back("-fpcc-struct-return");
2289 assert(A->getOption().matches(options::OPT_freg_struct_return));
2290 CmdArgs.push_back("-freg-struct-return");
2294 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2295 CmdArgs.push_back("-mrtd");
2297 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
2298 CmdArgs.push_back("-mdisable-fp-elim");
2299 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2300 options::OPT_fno_zero_initialized_in_bss))
2301 CmdArgs.push_back("-mno-zero-initialized-in-bss");
2303 bool OFastEnabled = isOptimizationLevelFast(Args);
2304 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2305 // enabled. This alias option is being used to simplify the hasFlag logic.
2306 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2307 options::OPT_fstrict_aliasing;
2308 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
2309 options::OPT_fno_strict_aliasing, true))
2310 CmdArgs.push_back("-relaxed-aliasing");
2311 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2312 options::OPT_fno_struct_path_tbaa))
2313 CmdArgs.push_back("-no-struct-path-tbaa");
2314 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2316 CmdArgs.push_back("-fstrict-enums");
2317 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2318 options::OPT_fno_optimize_sibling_calls))
2319 CmdArgs.push_back("-mdisable-tail-calls");
2321 // Handle segmented stacks.
2322 if (Args.hasArg(options::OPT_fsplit_stack))
2323 CmdArgs.push_back("-split-stacks");
2325 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2326 // This alias option is being used to simplify the getLastArg logic.
2327 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2328 options::OPT_ffast_math;
2330 // Handle various floating point optimization flags, mapping them to the
2331 // appropriate LLVM code generation flags. The pattern for all of these is to
2332 // default off the codegen optimizations, and if any flag enables them and no
2333 // flag disables them after the flag enabling them, enable the codegen
2334 // optimization. This is complicated by several "umbrella" flags.
2335 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2336 options::OPT_fno_fast_math,
2337 options::OPT_ffinite_math_only,
2338 options::OPT_fno_finite_math_only,
2339 options::OPT_fhonor_infinities,
2340 options::OPT_fno_honor_infinities))
2341 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2342 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2343 A->getOption().getID() != options::OPT_fhonor_infinities)
2344 CmdArgs.push_back("-menable-no-infs");
2345 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2346 options::OPT_fno_fast_math,
2347 options::OPT_ffinite_math_only,
2348 options::OPT_fno_finite_math_only,
2349 options::OPT_fhonor_nans,
2350 options::OPT_fno_honor_nans))
2351 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2352 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2353 A->getOption().getID() != options::OPT_fhonor_nans)
2354 CmdArgs.push_back("-menable-no-nans");
2356 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2357 bool MathErrno = getToolChain().IsMathErrnoDefault();
2358 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2359 options::OPT_fno_fast_math,
2360 options::OPT_fmath_errno,
2361 options::OPT_fno_math_errno)) {
2362 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2363 // However, turning *off* -ffast_math merely restores the toolchain default
2364 // (which may be false).
2365 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2366 A->getOption().getID() == options::OPT_ffast_math ||
2367 A->getOption().getID() == options::OPT_Ofast)
2369 else if (A->getOption().getID() == options::OPT_fmath_errno)
2373 CmdArgs.push_back("-fmath-errno");
2375 // There are several flags which require disabling very specific
2376 // optimizations. Any of these being disabled forces us to turn off the
2377 // entire set of LLVM optimizations, so collect them through all the flag
2379 bool AssociativeMath = false;
2380 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2381 options::OPT_fno_fast_math,
2382 options::OPT_funsafe_math_optimizations,
2383 options::OPT_fno_unsafe_math_optimizations,
2384 options::OPT_fassociative_math,
2385 options::OPT_fno_associative_math))
2386 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2387 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2388 A->getOption().getID() != options::OPT_fno_associative_math)
2389 AssociativeMath = true;
2390 bool ReciprocalMath = false;
2391 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2392 options::OPT_fno_fast_math,
2393 options::OPT_funsafe_math_optimizations,
2394 options::OPT_fno_unsafe_math_optimizations,
2395 options::OPT_freciprocal_math,
2396 options::OPT_fno_reciprocal_math))
2397 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2398 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2399 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2400 ReciprocalMath = true;
2401 bool SignedZeros = true;
2402 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2403 options::OPT_fno_fast_math,
2404 options::OPT_funsafe_math_optimizations,
2405 options::OPT_fno_unsafe_math_optimizations,
2406 options::OPT_fsigned_zeros,
2407 options::OPT_fno_signed_zeros))
2408 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2409 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2410 A->getOption().getID() != options::OPT_fsigned_zeros)
2411 SignedZeros = false;
2412 bool TrappingMath = true;
2413 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2414 options::OPT_fno_fast_math,
2415 options::OPT_funsafe_math_optimizations,
2416 options::OPT_fno_unsafe_math_optimizations,
2417 options::OPT_ftrapping_math,
2418 options::OPT_fno_trapping_math))
2419 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2420 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2421 A->getOption().getID() != options::OPT_ftrapping_math)
2422 TrappingMath = false;
2423 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2425 CmdArgs.push_back("-menable-unsafe-fp-math");
2428 // Validate and pass through -fp-contract option.
2429 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2430 options::OPT_fno_fast_math,
2431 options::OPT_ffp_contract)) {
2432 if (A->getOption().getID() == options::OPT_ffp_contract) {
2433 StringRef Val = A->getValue();
2434 if (Val == "fast" || Val == "on" || Val == "off") {
2435 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2437 D.Diag(diag::err_drv_unsupported_option_argument)
2438 << A->getOption().getName() << Val;
2440 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2441 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
2442 // If fast-math is set then set the fp-contract mode to fast.
2443 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2447 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2448 // and if we find them, tell the frontend to provide the appropriate
2449 // preprocessor macros. This is distinct from enabling any optimizations as
2450 // these options induce language changes which must survive serialization
2451 // and deserialization, etc.
2452 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2453 options::OPT_fno_fast_math))
2454 if (!A->getOption().matches(options::OPT_fno_fast_math))
2455 CmdArgs.push_back("-ffast-math");
2456 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2457 if (A->getOption().matches(options::OPT_ffinite_math_only))
2458 CmdArgs.push_back("-ffinite-math-only");
2460 // Decide whether to use verbose asm. Verbose assembly is the default on
2461 // toolchains which have the integrated assembler on by default.
2462 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2463 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
2464 IsVerboseAsmDefault) ||
2465 Args.hasArg(options::OPT_dA))
2466 CmdArgs.push_back("-masm-verbose");
2468 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2469 CmdArgs.push_back("-mdebug-pass");
2470 CmdArgs.push_back("Structure");
2472 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2473 CmdArgs.push_back("-mdebug-pass");
2474 CmdArgs.push_back("Arguments");
2477 // Enable -mconstructor-aliases except on darwin, where we have to
2478 // work around a linker bug; see <rdar://problem/7651567>.
2479 if (!getToolChain().getTriple().isOSDarwin())
2480 CmdArgs.push_back("-mconstructor-aliases");
2482 // Darwin's kernel doesn't support guard variables; just die if we
2484 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
2485 CmdArgs.push_back("-fforbid-guard-variables");
2487 if (Args.hasArg(options::OPT_mms_bitfields)) {
2488 CmdArgs.push_back("-mms-bitfields");
2491 // This is a coarse approximation of what llvm-gcc actually does, both
2492 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2493 // complicated ways.
2494 bool AsynchronousUnwindTables =
2495 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2496 options::OPT_fno_asynchronous_unwind_tables,
2497 getToolChain().IsUnwindTablesDefault() &&
2499 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2500 AsynchronousUnwindTables))
2501 CmdArgs.push_back("-munwind-tables");
2503 getToolChain().addClangTargetOptions(Args, CmdArgs);
2505 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2506 CmdArgs.push_back("-mlimit-float-precision");
2507 CmdArgs.push_back(A->getValue());
2510 // FIXME: Handle -mtune=.
2511 (void) Args.hasArg(options::OPT_mtune_EQ);
2513 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2514 CmdArgs.push_back("-mcode-model");
2515 CmdArgs.push_back(A->getValue());
2518 // Add the target cpu
2519 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2520 llvm::Triple ETriple(ETripleStr);
2521 std::string CPU = getCPUName(Args, ETriple);
2523 CmdArgs.push_back("-target-cpu");
2524 CmdArgs.push_back(Args.MakeArgString(CPU));
2527 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2528 CmdArgs.push_back("-mfpmath");
2529 CmdArgs.push_back(A->getValue());
2532 // Add the target features
2533 getTargetFeatures(D, ETriple, Args, CmdArgs);
2535 // Add target specific flags.
2536 switch(getToolChain().getArch()) {
2540 case llvm::Triple::arm:
2541 case llvm::Triple::thumb:
2542 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2545 case llvm::Triple::mips:
2546 case llvm::Triple::mipsel:
2547 case llvm::Triple::mips64:
2548 case llvm::Triple::mips64el:
2549 AddMIPSTargetArgs(Args, CmdArgs);
2552 case llvm::Triple::sparc:
2553 AddSparcTargetArgs(Args, CmdArgs);
2556 case llvm::Triple::x86:
2557 case llvm::Triple::x86_64:
2558 AddX86TargetArgs(Args, CmdArgs);
2561 case llvm::Triple::hexagon:
2562 AddHexagonTargetArgs(Args, CmdArgs);
2566 // Add clang-cl arguments.
2567 if (getToolChain().getDriver().IsCLMode())
2568 AddClangCLArgs(Args, CmdArgs);
2570 // Pass the linker version in use.
2571 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2572 CmdArgs.push_back("-target-linker-version");
2573 CmdArgs.push_back(A->getValue());
2576 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
2577 CmdArgs.push_back("-momit-leaf-frame-pointer");
2579 // Explicitly error on some things we know we don't support and can't just
2581 types::ID InputType = Inputs[0].getType();
2582 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2584 if (types::isCXX(InputType) &&
2585 getToolChain().getTriple().isOSDarwin() &&
2586 getToolChain().getArch() == llvm::Triple::x86) {
2587 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2588 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
2589 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
2590 << Unsupported->getOption().getName();
2594 Args.AddAllArgs(CmdArgs, options::OPT_v);
2595 Args.AddLastArg(CmdArgs, options::OPT_H);
2596 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
2597 CmdArgs.push_back("-header-include-file");
2598 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2599 D.CCPrintHeadersFilename : "-");
2601 Args.AddLastArg(CmdArgs, options::OPT_P);
2602 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
2604 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2605 CmdArgs.push_back("-diagnostic-log-file");
2606 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2607 D.CCLogDiagnosticsFilename : "-");
2610 // Use the last option from "-g" group. "-gline-tables-only"
2611 // is preserved, all other debug options are substituted with "-g".
2612 Args.ClaimAllArgs(options::OPT_g_Group);
2613 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2614 if (A->getOption().matches(options::OPT_gline_tables_only))
2615 CmdArgs.push_back("-gline-tables-only");
2616 else if (A->getOption().matches(options::OPT_gdwarf_2))
2617 CmdArgs.push_back("-gdwarf-2");
2618 else if (A->getOption().matches(options::OPT_gdwarf_3))
2619 CmdArgs.push_back("-gdwarf-3");
2620 else if (A->getOption().matches(options::OPT_gdwarf_4))
2621 CmdArgs.push_back("-gdwarf-4");
2622 else if (!A->getOption().matches(options::OPT_g0) &&
2623 !A->getOption().matches(options::OPT_ggdb0)) {
2624 // Default is dwarf-2 for darwin and FreeBSD.
2625 const llvm::Triple &Triple = getToolChain().getTriple();
2626 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::FreeBSD)
2627 CmdArgs.push_back("-gdwarf-2");
2629 CmdArgs.push_back("-g");
2633 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2634 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2635 if (Args.hasArg(options::OPT_gcolumn_info))
2636 CmdArgs.push_back("-dwarf-column-info");
2638 // FIXME: Move backend command line options to the module.
2639 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2640 // splitting and extraction.
2641 // FIXME: Currently only works on Linux.
2642 if (getToolChain().getTriple().isOSLinux() &&
2643 Args.hasArg(options::OPT_gsplit_dwarf)) {
2644 CmdArgs.push_back("-g");
2645 CmdArgs.push_back("-backend-option");
2646 CmdArgs.push_back("-split-dwarf=Enable");
2649 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2650 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2651 CmdArgs.push_back("-backend-option");
2652 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2655 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2657 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2658 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2660 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2662 if (Args.hasArg(options::OPT_ftest_coverage) ||
2663 Args.hasArg(options::OPT_coverage))
2664 CmdArgs.push_back("-femit-coverage-notes");
2665 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2666 Args.hasArg(options::OPT_coverage))
2667 CmdArgs.push_back("-femit-coverage-data");
2669 if (C.getArgs().hasArg(options::OPT_c) ||
2670 C.getArgs().hasArg(options::OPT_S)) {
2671 if (Output.isFilename()) {
2672 CmdArgs.push_back("-coverage-file");
2673 SmallString<128> CoverageFilename(Output.getFilename());
2674 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2675 SmallString<128> Pwd;
2676 if (!llvm::sys::fs::current_path(Pwd)) {
2677 llvm::sys::path::append(Pwd, CoverageFilename.str());
2678 CoverageFilename.swap(Pwd);
2681 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2685 // Pass options for controlling the default header search paths.
2686 if (Args.hasArg(options::OPT_nostdinc)) {
2687 CmdArgs.push_back("-nostdsysteminc");
2688 CmdArgs.push_back("-nobuiltininc");
2690 if (Args.hasArg(options::OPT_nostdlibinc))
2691 CmdArgs.push_back("-nostdsysteminc");
2692 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2693 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2696 // Pass the path to compiler resource files.
2697 CmdArgs.push_back("-resource-dir");
2698 CmdArgs.push_back(D.ResourceDir.c_str());
2700 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2702 bool ARCMTEnabled = false;
2703 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
2704 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
2705 options::OPT_ccc_arcmt_modify,
2706 options::OPT_ccc_arcmt_migrate)) {
2707 ARCMTEnabled = true;
2708 switch (A->getOption().getID()) {
2710 llvm_unreachable("missed a case");
2711 case options::OPT_ccc_arcmt_check:
2712 CmdArgs.push_back("-arcmt-check");
2714 case options::OPT_ccc_arcmt_modify:
2715 CmdArgs.push_back("-arcmt-modify");
2717 case options::OPT_ccc_arcmt_migrate:
2718 CmdArgs.push_back("-arcmt-migrate");
2719 CmdArgs.push_back("-mt-migrate-directory");
2720 CmdArgs.push_back(A->getValue());
2722 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2723 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
2728 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2729 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2730 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
2733 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2735 D.Diag(diag::err_drv_argument_not_allowed_with)
2736 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2738 CmdArgs.push_back("-mt-migrate-directory");
2739 CmdArgs.push_back(A->getValue());
2741 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2742 options::OPT_objcmt_migrate_subscripting,
2743 options::OPT_objcmt_migrate_property)) {
2744 // None specified, means enable them all.
2745 CmdArgs.push_back("-objcmt-migrate-literals");
2746 CmdArgs.push_back("-objcmt-migrate-subscripting");
2747 CmdArgs.push_back("-objcmt-migrate-property");
2749 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2750 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2751 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2754 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2755 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2756 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2757 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2758 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2759 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2760 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2761 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2762 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2763 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2764 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2765 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2766 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
2767 Args.AddLastArg(CmdArgs, options::OPT_objcmt_white_list_dir_path);
2770 // Add preprocessing options like -I, -D, etc. if we are using the
2773 // FIXME: Support -fpreprocessed
2774 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
2775 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
2777 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2778 // that "The compiler can only warn and ignore the option if not recognized".
2779 // When building with ccache, it will pass -D options to clang even on
2780 // preprocessed inputs and configure concludes that -fPIC is not supported.
2781 Args.ClaimAllArgs(options::OPT_D);
2783 // Manually translate -O4 to -O3; let clang reject others.
2784 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2785 if (A->getOption().matches(options::OPT_O4)) {
2786 CmdArgs.push_back("-O3");
2787 D.Diag(diag::warn_O4_is_O3);
2789 A->render(Args, CmdArgs);
2793 // Don't warn about unused -flto. This can happen when we're preprocessing or
2795 Args.ClaimAllArgs(options::OPT_flto);
2797 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
2798 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2799 CmdArgs.push_back("-pedantic");
2800 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
2801 Args.AddLastArg(CmdArgs, options::OPT_w);
2803 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2804 // (-ansi is equivalent to -std=c89 or -std=c++98).
2806 // If a std is supplied, only add -trigraphs if it follows the
2808 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2809 if (Std->getOption().matches(options::OPT_ansi))
2810 if (types::isCXX(InputType))
2811 CmdArgs.push_back("-std=c++98");
2813 CmdArgs.push_back("-std=c89");
2815 Std->render(Args, CmdArgs);
2817 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2818 options::OPT_trigraphs))
2820 A->render(Args, CmdArgs);
2822 // Honor -std-default.
2824 // FIXME: Clang doesn't correctly handle -std= when the input language
2825 // doesn't match. For the time being just ignore this for C++ inputs;
2826 // eventually we want to do all the standard defaulting here instead of
2827 // splitting it between the driver and clang -cc1.
2828 if (!types::isCXX(InputType))
2829 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2830 "-std=", /*Joined=*/true);
2831 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2832 CmdArgs.push_back("-std=c++11");
2834 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
2837 // GCC's behavior for -Wwrite-strings is a bit strange:
2838 // * In C, this "warning flag" changes the types of string literals from
2839 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
2840 // for the discarded qualifier.
2841 // * In C++, this is just a normal warning flag.
2843 // Implementing this warning correctly in C is hard, so we follow GCC's
2844 // behavior for now. FIXME: Directly diagnose uses of a string literal as
2845 // a non-const char* in C, rather than using this crude hack.
2846 if (!types::isCXX(InputType)) {
2847 DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel(
2848 diag::warn_deprecated_string_literal_conversion_c, SourceLocation());
2849 if (DiagLevel > DiagnosticsEngine::Ignored)
2850 CmdArgs.push_back("-fconst-strings");
2853 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
2854 // during C++ compilation, which it is by default. GCC keeps this define even
2855 // in the presence of '-w', match this behavior bug-for-bug.
2856 if (types::isCXX(InputType) &&
2857 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2859 CmdArgs.push_back("-fdeprecated-macro");
2862 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2863 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2864 if (Asm->getOption().matches(options::OPT_fasm))
2865 CmdArgs.push_back("-fgnu-keywords");
2867 CmdArgs.push_back("-fno-gnu-keywords");
2870 if (ShouldDisableCFI(Args, getToolChain()))
2871 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2873 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2874 CmdArgs.push_back("-fno-dwarf-directory-asm");
2876 if (ShouldDisableAutolink(Args, getToolChain()))
2877 CmdArgs.push_back("-fno-autolink");
2879 // Add in -fdebug-compilation-dir if necessary.
2880 addDebugCompDirArg(Args, CmdArgs);
2882 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2883 options::OPT_ftemplate_depth_EQ)) {
2884 CmdArgs.push_back("-ftemplate-depth");
2885 CmdArgs.push_back(A->getValue());
2888 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
2889 CmdArgs.push_back("-foperator-arrow-depth");
2890 CmdArgs.push_back(A->getValue());
2893 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2894 CmdArgs.push_back("-fconstexpr-depth");
2895 CmdArgs.push_back(A->getValue());
2898 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2899 CmdArgs.push_back("-fconstexpr-steps");
2900 CmdArgs.push_back(A->getValue());
2903 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2904 CmdArgs.push_back("-fbracket-depth");
2905 CmdArgs.push_back(A->getValue());
2908 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2909 options::OPT_Wlarge_by_value_copy_def)) {
2910 if (A->getNumValues()) {
2911 StringRef bytes = A->getValue();
2912 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2914 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
2918 if (Args.hasArg(options::OPT_relocatable_pch))
2919 CmdArgs.push_back("-relocatable-pch");
2921 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2922 CmdArgs.push_back("-fconstant-string-class");
2923 CmdArgs.push_back(A->getValue());
2926 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2927 CmdArgs.push_back("-ftabstop");
2928 CmdArgs.push_back(A->getValue());
2931 CmdArgs.push_back("-ferror-limit");
2932 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2933 CmdArgs.push_back(A->getValue());
2935 CmdArgs.push_back("19");
2937 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2938 CmdArgs.push_back("-fmacro-backtrace-limit");
2939 CmdArgs.push_back(A->getValue());
2942 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2943 CmdArgs.push_back("-ftemplate-backtrace-limit");
2944 CmdArgs.push_back(A->getValue());
2947 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2948 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2949 CmdArgs.push_back(A->getValue());
2952 // Pass -fmessage-length=.
2953 CmdArgs.push_back("-fmessage-length");
2954 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
2955 CmdArgs.push_back(A->getValue());
2957 // If -fmessage-length=N was not specified, determine whether this is a
2958 // terminal and, if so, implicitly define -fmessage-length appropriately.
2959 unsigned N = llvm::sys::Process::StandardErrColumns();
2960 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
2963 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2964 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2965 options::OPT_fvisibility_ms_compat)) {
2966 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2967 CmdArgs.push_back("-fvisibility");
2968 CmdArgs.push_back(A->getValue());
2970 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2971 CmdArgs.push_back("-fvisibility");
2972 CmdArgs.push_back("hidden");
2973 CmdArgs.push_back("-ftype-visibility");
2974 CmdArgs.push_back("default");
2978 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
2980 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2982 // -fhosted is default.
2983 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2985 CmdArgs.push_back("-ffreestanding");
2987 // Forward -f (flag) options which we can pass directly.
2988 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
2989 Args.AddLastArg(CmdArgs, options::OPT_fformat_extensions);
2990 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
2991 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
2992 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
2993 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
2994 // AltiVec language extensions aren't relevant for assembling.
2995 if (!isa<PreprocessJobAction>(JA) ||
2996 Output.getType() != types::TY_PP_Asm)
2997 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
2998 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2999 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
3001 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3002 Sanitize.addArgs(Args, CmdArgs);
3004 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3005 options::OPT_fno_sanitize_recover,
3007 CmdArgs.push_back("-fno-sanitize-recover");
3009 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
3010 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3011 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3012 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3014 // Report an error for -faltivec on anything other than PowerPC.
3015 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
3016 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
3017 getToolChain().getArch() == llvm::Triple::ppc64 ||
3018 getToolChain().getArch() == llvm::Triple::ppc64le))
3019 D.Diag(diag::err_drv_argument_only_allowed_with)
3020 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
3022 if (getToolChain().SupportsProfiling())
3023 Args.AddLastArg(CmdArgs, options::OPT_pg);
3025 // -flax-vector-conversions is default.
3026 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3027 options::OPT_fno_lax_vector_conversions))
3028 CmdArgs.push_back("-fno-lax-vector-conversions");
3030 if (Args.getLastArg(options::OPT_fapple_kext))
3031 CmdArgs.push_back("-fapple-kext");
3033 if (Args.hasFlag(options::OPT_frewrite_includes,
3034 options::OPT_fno_rewrite_includes, false))
3035 CmdArgs.push_back("-frewrite-includes");
3037 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
3038 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
3039 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
3040 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3041 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
3043 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3044 CmdArgs.push_back("-ftrapv-handler");
3045 CmdArgs.push_back(A->getValue());
3048 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
3050 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3051 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3052 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3053 options::OPT_fno_wrapv)) {
3054 if (A->getOption().matches(options::OPT_fwrapv))
3055 CmdArgs.push_back("-fwrapv");
3056 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3057 options::OPT_fno_strict_overflow)) {
3058 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3059 CmdArgs.push_back("-fwrapv");
3062 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3063 options::OPT_fno_reroll_loops))
3064 if (A->getOption().matches(options::OPT_freroll_loops))
3065 CmdArgs.push_back("-freroll-loops");
3067 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
3068 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3069 options::OPT_fno_unroll_loops);
3071 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3074 // -stack-protector=0 is default.
3075 unsigned StackProtectorLevel = 0;
3076 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3077 options::OPT_fstack_protector_all,
3078 options::OPT_fstack_protector)) {
3079 if (A->getOption().matches(options::OPT_fstack_protector))
3080 StackProtectorLevel = 1;
3081 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3082 StackProtectorLevel = 2;
3084 StackProtectorLevel =
3085 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3087 if (StackProtectorLevel) {
3088 CmdArgs.push_back("-stack-protector");
3089 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
3092 // --param ssp-buffer-size=
3093 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3094 ie = Args.filtered_end(); it != ie; ++it) {
3095 StringRef Str((*it)->getValue());
3096 if (Str.startswith("ssp-buffer-size=")) {
3097 if (StackProtectorLevel) {
3098 CmdArgs.push_back("-stack-protector-buffer-size");
3099 // FIXME: Verify the argument is a valid integer.
3100 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
3106 // Translate -mstackrealign
3107 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3109 CmdArgs.push_back("-backend-option");
3110 CmdArgs.push_back("-force-align-stack");
3112 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3114 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3117 if (Args.hasArg(options::OPT_mstack_alignment)) {
3118 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3119 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
3121 // -mkernel implies -mstrict-align; don't add the redundant option.
3122 if (!KernelOrKext) {
3123 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3124 options::OPT_munaligned_access)) {
3125 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3126 CmdArgs.push_back("-backend-option");
3127 CmdArgs.push_back("-arm-strict-align");
3129 CmdArgs.push_back("-backend-option");
3130 CmdArgs.push_back("-arm-no-strict-align");
3135 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3136 options::OPT_mno_restrict_it)) {
3137 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3138 CmdArgs.push_back("-backend-option");
3139 CmdArgs.push_back("-arm-restrict-it");
3141 CmdArgs.push_back("-backend-option");
3142 CmdArgs.push_back("-arm-no-restrict-it");
3146 // Forward -f options with positive and negative forms; we translate
3148 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3149 StringRef fname = A->getValue();
3150 if (!llvm::sys::fs::exists(fname))
3151 D.Diag(diag::err_drv_no_such_file) << fname;
3153 A->render(Args, CmdArgs);
3156 if (Args.hasArg(options::OPT_mkernel)) {
3157 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
3158 CmdArgs.push_back("-fapple-kext");
3159 if (!Args.hasArg(options::OPT_fbuiltin))
3160 CmdArgs.push_back("-fno-builtin");
3161 Args.ClaimAllArgs(options::OPT_fno_builtin);
3163 // -fbuiltin is default.
3164 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
3165 CmdArgs.push_back("-fno-builtin");
3167 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3168 options::OPT_fno_assume_sane_operator_new))
3169 CmdArgs.push_back("-fno-assume-sane-operator-new");
3171 // -fblocks=0 is default.
3172 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
3173 getToolChain().IsBlocksDefault()) ||
3174 (Args.hasArg(options::OPT_fgnu_runtime) &&
3175 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3176 !Args.hasArg(options::OPT_fno_blocks))) {
3177 CmdArgs.push_back("-fblocks");
3179 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3180 !getToolChain().hasBlocksRuntime())
3181 CmdArgs.push_back("-fblocks-runtime-optional");
3184 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3185 // users must also pass -fcxx-modules. The latter flag will disappear once the
3186 // modules implementation is solid for C++/Objective-C++ programs as well.
3187 bool HaveModules = false;
3188 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3189 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3190 options::OPT_fno_cxx_modules,
3192 if (AllowedInCXX || !types::isCXX(InputType)) {
3193 CmdArgs.push_back("-fmodules");
3198 // -fmodule-maps enables module map processing (off by default) for header
3199 // checking. It is implied by -fmodules.
3200 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3202 CmdArgs.push_back("-fmodule-maps");
3205 // -fmodules-decluse checks that modules used are declared so (off by
3207 if (Args.hasFlag(options::OPT_fmodules_decluse,
3208 options::OPT_fno_modules_decluse,
3210 CmdArgs.push_back("-fmodules-decluse");
3213 // -fmodule-name specifies the module that is currently being built (or
3214 // used for header checking by -fmodule-maps).
3215 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3217 A->render(Args, CmdArgs);
3220 // -fmodule-map-file can be used to specify a file containing module
3222 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3224 A->render(Args, CmdArgs);
3227 // If a module path was provided, pass it along. Otherwise, use a temporary
3229 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3232 A->render(Args, CmdArgs);
3234 } else if (HaveModules) {
3235 SmallString<128> DefaultModuleCache;
3236 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3237 DefaultModuleCache);
3238 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3239 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
3240 const char Arg[] = "-fmodules-cache-path=";
3241 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3242 Arg, Arg + strlen(Arg));
3243 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3246 // Pass through all -fmodules-ignore-macro arguments.
3247 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
3248 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3249 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
3251 // -faccess-control is default.
3252 if (Args.hasFlag(options::OPT_fno_access_control,
3253 options::OPT_faccess_control,
3255 CmdArgs.push_back("-fno-access-control");
3257 // -felide-constructors is the default.
3258 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3259 options::OPT_felide_constructors,
3261 CmdArgs.push_back("-fno-elide-constructors");
3263 // -frtti is default.
3264 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
3266 CmdArgs.push_back("-fno-rtti");
3268 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
3269 if (Sanitize.sanitizesVptr()) {
3270 std::string NoRttiArg =
3271 Args.getLastArg(options::OPT_mkernel,
3272 options::OPT_fapple_kext,
3273 options::OPT_fno_rtti)->getAsString(Args);
3274 D.Diag(diag::err_drv_argument_not_allowed_with)
3275 << "-fsanitize=vptr" << NoRttiArg;
3279 // -fshort-enums=0 is default for all architectures except Hexagon.
3280 if (Args.hasFlag(options::OPT_fshort_enums,
3281 options::OPT_fno_short_enums,
3282 getToolChain().getArch() ==
3283 llvm::Triple::hexagon))
3284 CmdArgs.push_back("-fshort-enums");
3286 // -fsigned-char is default.
3287 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
3288 isSignedCharDefault(getToolChain().getTriple())))
3289 CmdArgs.push_back("-fno-signed-char");
3291 // -fthreadsafe-static is default.
3292 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
3293 options::OPT_fno_threadsafe_statics))
3294 CmdArgs.push_back("-fno-threadsafe-statics");
3296 // -fuse-cxa-atexit is default.
3298 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
3299 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3300 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
3301 getToolChain().getArch() != llvm::Triple::hexagon &&
3302 getToolChain().getArch() != llvm::Triple::xcore) ||
3304 CmdArgs.push_back("-fno-use-cxa-atexit");
3306 // -fms-extensions=0 is default.
3307 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3308 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3309 CmdArgs.push_back("-fms-extensions");
3311 // -fms-compatibility=0 is default.
3312 if (Args.hasFlag(options::OPT_fms_compatibility,
3313 options::OPT_fno_ms_compatibility,
3314 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3315 Args.hasFlag(options::OPT_fms_extensions,
3316 options::OPT_fno_ms_extensions,
3318 CmdArgs.push_back("-fms-compatibility");
3320 // -fmsc-version=1700 is default.
3321 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3322 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3323 Args.hasArg(options::OPT_fmsc_version)) {
3324 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
3325 if (msc_ver.empty())
3326 CmdArgs.push_back("-fmsc-version=1700");
3328 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3332 // -fno-borland-extensions is default.
3333 if (Args.hasFlag(options::OPT_fborland_extensions,
3334 options::OPT_fno_borland_extensions, false))
3335 CmdArgs.push_back("-fborland-extensions");
3337 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3339 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3340 options::OPT_fno_delayed_template_parsing,
3341 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3342 CmdArgs.push_back("-fdelayed-template-parsing");
3344 // -fgnu-keywords default varies depending on language; only pass if
3346 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
3347 options::OPT_fno_gnu_keywords))
3348 A->render(Args, CmdArgs);
3350 if (Args.hasFlag(options::OPT_fgnu89_inline,
3351 options::OPT_fno_gnu89_inline,
3353 CmdArgs.push_back("-fgnu89-inline");
3355 if (Args.hasArg(options::OPT_fno_inline))
3356 CmdArgs.push_back("-fno-inline");
3358 if (Args.hasArg(options::OPT_fno_inline_functions))
3359 CmdArgs.push_back("-fno-inline-functions");
3361 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
3363 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3364 // legacy is the default. Next runtime is always legacy dispatch and
3365 // -fno-objc-legacy-dispatch gets ignored silently.
3366 if (objcRuntime.isNonFragile() && !objcRuntime.isNeXTFamily()) {
3367 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3368 options::OPT_fno_objc_legacy_dispatch,
3369 objcRuntime.isLegacyDispatchDefaultForArch(
3370 getToolChain().getArch()))) {
3371 if (getToolChain().UseObjCMixedDispatch())
3372 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3374 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3378 // When ObjectiveC legacy runtime is in effect on MacOSX,
3379 // turn on the option to do Array/Dictionary subscripting
3381 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3382 getToolChain().getTriple().isMacOSX() &&
3383 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3384 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
3385 objcRuntime.isNeXTFamily())
3386 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3388 // -fencode-extended-block-signature=1 is default.
3389 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3390 CmdArgs.push_back("-fencode-extended-block-signature");
3393 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3394 // NOTE: This logic is duplicated in ToolChains.cpp.
3395 bool ARC = isObjCAutoRefCount(Args);
3397 getToolChain().CheckObjCARC();
3399 CmdArgs.push_back("-fobjc-arc");
3401 // FIXME: It seems like this entire block, and several around it should be
3402 // wrapped in isObjC, but for now we just use it here as this is where it
3403 // was being used previously.
3404 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3405 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3406 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3408 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3411 // Allow the user to enable full exceptions code emission.
3412 // We define off for Objective-CC, on for Objective-C++.
3413 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3414 options::OPT_fno_objc_arc_exceptions,
3415 /*default*/ types::isCXX(InputType)))
3416 CmdArgs.push_back("-fobjc-arc-exceptions");
3419 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3421 if (rewriteKind != RK_None)
3422 CmdArgs.push_back("-fno-objc-infer-related-result-type");
3424 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3425 // takes precedence.
3426 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3428 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3431 D.Diag(diag::err_drv_objc_gc_arr)
3432 << GCArg->getAsString(Args);
3433 } else if (getToolChain().SupportsObjCGC()) {
3434 GCArg->render(Args, CmdArgs);
3436 // FIXME: We should move this to a hard error.
3437 D.Diag(diag::warn_drv_objc_gc_unsupported)
3438 << GCArg->getAsString(Args);
3442 // Add exception args.
3443 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
3444 KernelOrKext, objcRuntime, CmdArgs);
3446 if (getToolChain().UseSjLjExceptions())
3447 CmdArgs.push_back("-fsjlj-exceptions");
3449 // C++ "sane" operator new.
3450 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3451 options::OPT_fno_assume_sane_operator_new))
3452 CmdArgs.push_back("-fno-assume-sane-operator-new");
3454 // -fconstant-cfstrings is default, and may be subject to argument translation
3456 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3457 options::OPT_fno_constant_cfstrings) ||
3458 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3459 options::OPT_mno_constant_cfstrings))
3460 CmdArgs.push_back("-fno-constant-cfstrings");
3462 // -fshort-wchar default varies depending on platform; only
3463 // pass if specified.
3464 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3465 A->render(Args, CmdArgs);
3467 // -fno-pascal-strings is default, only pass non-default.
3468 if (Args.hasFlag(options::OPT_fpascal_strings,
3469 options::OPT_fno_pascal_strings,
3471 CmdArgs.push_back("-fpascal-strings");
3473 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3474 // -fno-pack-struct doesn't apply to -fpack-struct=.
3475 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
3476 std::string PackStructStr = "-fpack-struct=";
3477 PackStructStr += A->getValue();
3478 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
3479 } else if (Args.hasFlag(options::OPT_fpack_struct,
3480 options::OPT_fno_pack_struct, false)) {
3481 CmdArgs.push_back("-fpack-struct=1");
3484 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
3485 if (!Args.hasArg(options::OPT_fcommon))
3486 CmdArgs.push_back("-fno-common");
3487 Args.ClaimAllArgs(options::OPT_fno_common);
3490 // -fcommon is default, only pass non-default.
3491 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
3492 CmdArgs.push_back("-fno-common");
3494 // -fsigned-bitfields is default, and clang doesn't yet support
3495 // -funsigned-bitfields.
3496 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
3497 options::OPT_funsigned_bitfields))
3498 D.Diag(diag::warn_drv_clang_unsupported)
3499 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3501 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3502 if (!Args.hasFlag(options::OPT_ffor_scope,
3503 options::OPT_fno_for_scope))
3504 D.Diag(diag::err_drv_clang_unsupported)
3505 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3507 // -fcaret-diagnostics is default.
3508 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3509 options::OPT_fno_caret_diagnostics, true))
3510 CmdArgs.push_back("-fno-caret-diagnostics");
3512 // -fdiagnostics-fixit-info is default, only pass non-default.
3513 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
3514 options::OPT_fno_diagnostics_fixit_info))
3515 CmdArgs.push_back("-fno-diagnostics-fixit-info");
3517 // Enable -fdiagnostics-show-option by default.
3518 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
3519 options::OPT_fno_diagnostics_show_option))
3520 CmdArgs.push_back("-fdiagnostics-show-option");
3523 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3524 CmdArgs.push_back("-fdiagnostics-show-category");
3525 CmdArgs.push_back(A->getValue());
3529 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3530 CmdArgs.push_back("-fdiagnostics-format");
3531 CmdArgs.push_back(A->getValue());
3534 if (Arg *A = Args.getLastArg(
3535 options::OPT_fdiagnostics_show_note_include_stack,
3536 options::OPT_fno_diagnostics_show_note_include_stack)) {
3537 if (A->getOption().matches(
3538 options::OPT_fdiagnostics_show_note_include_stack))
3539 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3541 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3544 // Color diagnostics are the default, unless the terminal doesn't support
3546 // Support both clang's -f[no-]color-diagnostics and gcc's
3547 // -f[no-]diagnostics-colors[=never|always|auto].
3548 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3549 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3551 const Option &O = (*it)->getOption();
3552 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3553 !O.matches(options::OPT_fdiagnostics_color) &&
3554 !O.matches(options::OPT_fno_color_diagnostics) &&
3555 !O.matches(options::OPT_fno_diagnostics_color) &&
3556 !O.matches(options::OPT_fdiagnostics_color_EQ))
3560 if (O.matches(options::OPT_fcolor_diagnostics) ||
3561 O.matches(options::OPT_fdiagnostics_color)) {
3562 ShowColors = Colors_On;
3563 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3564 O.matches(options::OPT_fno_diagnostics_color)) {
3565 ShowColors = Colors_Off;
3567 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3568 StringRef value((*it)->getValue());
3569 if (value == "always")
3570 ShowColors = Colors_On;
3571 else if (value == "never")
3572 ShowColors = Colors_Off;
3573 else if (value == "auto")
3574 ShowColors = Colors_Auto;
3576 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3577 << ("-fdiagnostics-color=" + value).str();
3580 if (ShowColors == Colors_On ||
3581 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
3582 CmdArgs.push_back("-fcolor-diagnostics");
3584 if (Args.hasArg(options::OPT_fansi_escape_codes))
3585 CmdArgs.push_back("-fansi-escape-codes");
3587 if (!Args.hasFlag(options::OPT_fshow_source_location,
3588 options::OPT_fno_show_source_location))
3589 CmdArgs.push_back("-fno-show-source-location");
3591 if (!Args.hasFlag(options::OPT_fshow_column,
3592 options::OPT_fno_show_column,
3594 CmdArgs.push_back("-fno-show-column");
3596 if (!Args.hasFlag(options::OPT_fspell_checking,
3597 options::OPT_fno_spell_checking))
3598 CmdArgs.push_back("-fno-spell-checking");
3601 // -fno-asm-blocks is default.
3602 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3604 CmdArgs.push_back("-fasm-blocks");
3606 // Enable vectorization per default according to the optimization level
3607 // selected. For optimization levels that want vectorization we use the alias
3608 // option to simplify the hasFlag logic.
3609 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3610 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
3611 options::OPT_fvectorize;
3612 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
3613 options::OPT_fno_vectorize, EnableVec))
3614 CmdArgs.push_back("-vectorize-loops");
3616 // -fslp-vectorize is default.
3617 if (Args.hasFlag(options::OPT_fslp_vectorize,
3618 options::OPT_fno_slp_vectorize, true))
3619 CmdArgs.push_back("-vectorize-slp");
3621 // -fno-slp-vectorize-aggressive is default.
3622 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3623 options::OPT_fno_slp_vectorize_aggressive, false))
3624 CmdArgs.push_back("-vectorize-slp-aggressive");
3626 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3627 A->render(Args, CmdArgs);
3629 // -fdollars-in-identifiers default varies depending on platform and
3630 // language; only pass if specified.
3631 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
3632 options::OPT_fno_dollars_in_identifiers)) {
3633 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
3634 CmdArgs.push_back("-fdollars-in-identifiers");
3636 CmdArgs.push_back("-fno-dollars-in-identifiers");
3639 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3640 // practical purposes.
3641 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
3642 options::OPT_fno_unit_at_a_time)) {
3643 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
3644 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
3647 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3648 options::OPT_fno_apple_pragma_pack, false))
3649 CmdArgs.push_back("-fapple-pragma-pack");
3651 // le32-specific flags:
3652 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3654 if (getToolChain().getArch() == llvm::Triple::le32) {
3655 CmdArgs.push_back("-fno-math-builtin");
3658 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
3660 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
3662 if (getToolChain().getTriple().isOSDarwin() &&
3663 (getToolChain().getArch() == llvm::Triple::arm ||
3664 getToolChain().getArch() == llvm::Triple::thumb)) {
3665 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3666 CmdArgs.push_back("-fno-builtin-strcat");
3667 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3668 CmdArgs.push_back("-fno-builtin-strcpy");
3672 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
3673 if (Arg *A = Args.getLastArg(options::OPT_traditional,
3674 options::OPT_traditional_cpp)) {
3675 if (isa<PreprocessJobAction>(JA))
3676 CmdArgs.push_back("-traditional-cpp");
3678 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
3681 Args.AddLastArg(CmdArgs, options::OPT_dM);
3682 Args.AddLastArg(CmdArgs, options::OPT_dD);
3684 // Handle serialized diagnostics.
3685 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3686 CmdArgs.push_back("-serialize-diagnostic-file");
3687 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
3690 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3691 CmdArgs.push_back("-fretain-comments-from-system-headers");
3693 // Forward -fcomment-block-commands to -cc1.
3694 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
3695 // Forward -fparse-all-comments to -cc1.
3696 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
3698 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3700 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
3701 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3702 ie = Args.filtered_end(); it != ie; ++it) {
3705 // We translate this by hand to the -cc1 argument, since nightly test uses
3706 // it and developers have been trained to spell it with -mllvm.
3707 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
3708 CmdArgs.push_back("-disable-llvm-optzns");
3710 (*it)->render(Args, CmdArgs);
3713 if (Output.getType() == types::TY_Dependencies) {
3714 // Handled with other dependency code.
3715 } else if (Output.isFilename()) {
3716 CmdArgs.push_back("-o");
3717 CmdArgs.push_back(Output.getFilename());
3719 assert(Output.isNothing() && "Invalid output.");
3722 for (InputInfoList::const_iterator
3723 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3724 const InputInfo &II = *it;
3725 CmdArgs.push_back("-x");
3726 if (Args.hasArg(options::OPT_rewrite_objc))
3727 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3729 CmdArgs.push_back(types::getTypeName(II.getType()));
3730 if (II.isFilename())
3731 CmdArgs.push_back(II.getFilename());
3733 II.getInputArg().renderAsInput(Args, CmdArgs);
3736 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3738 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3740 // Optionally embed the -cc1 level arguments into the debug info, for build
3742 if (getToolChain().UseDwarfDebugFlags()) {
3743 ArgStringList OriginalArgs;
3744 for (ArgList::const_iterator it = Args.begin(),
3745 ie = Args.end(); it != ie; ++it)
3746 (*it)->render(Args, OriginalArgs);
3748 SmallString<256> Flags;
3750 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3752 Flags += OriginalArgs[i];
3754 CmdArgs.push_back("-dwarf-debug-flags");
3755 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3758 // Add the split debug info name to the command lines here so we
3759 // can propagate it to the backend.
3760 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3761 getToolChain().getTriple().isOSLinux() &&
3762 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
3763 const char *SplitDwarfOut;
3765 CmdArgs.push_back("-split-dwarf-file");
3766 SplitDwarfOut = SplitDebugName(Args, Inputs);
3767 CmdArgs.push_back(SplitDwarfOut);
3770 // Finally add the compile command to the compilation.
3771 if (Args.hasArg(options::OPT__SLASH_fallback)) {
3772 tools::visualstudio::Compile CL(getToolChain());
3773 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3775 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3777 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3781 // Handle the debug info splitting at object creation time if we're
3782 // creating an object.
3783 // TODO: Currently only works on linux with newer objcopy.
3784 if (SplitDwarf && !isa<CompileJobAction>(JA))
3785 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
3787 if (Arg *A = Args.getLastArg(options::OPT_pg))
3788 if (Args.hasArg(options::OPT_fomit_frame_pointer))
3789 D.Diag(diag::err_drv_argument_not_allowed_with)
3790 << "-fomit-frame-pointer" << A->getAsString(Args);
3792 // Claim some arguments which clang supports automatically.
3794 // -fpch-preprocess is used with gcc to add a special marker in the output to
3795 // include the PCH file. Clang's PTH solution is completely transparent, so we
3796 // do not need to deal with it at all.
3797 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
3799 // Claim some arguments which clang doesn't support, but we don't
3800 // care to warn the user about.
3801 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3802 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
3804 // Disable warnings for clang -E -emit-llvm foo.c
3805 Args.ClaimAllArgs(options::OPT_emit_llvm);
3808 /// Add options related to the Objective-C runtime/ABI.
3810 /// Returns true if the runtime is non-fragile.
3811 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3812 ArgStringList &cmdArgs,
3813 RewriteKind rewriteKind) const {
3814 // Look for the controlling runtime option.
3815 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3816 options::OPT_fgnu_runtime,
3817 options::OPT_fobjc_runtime_EQ);
3819 // Just forward -fobjc-runtime= to the frontend. This supercedes
3820 // options about fragility.
3822 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3823 ObjCRuntime runtime;
3824 StringRef value = runtimeArg->getValue();
3825 if (runtime.tryParse(value)) {
3826 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3830 runtimeArg->render(args, cmdArgs);
3834 // Otherwise, we'll need the ABI "version". Version numbers are
3835 // slightly confusing for historical reasons:
3836 // 1 - Traditional "fragile" ABI
3837 // 2 - Non-fragile ABI, version 1
3838 // 3 - Non-fragile ABI, version 2
3839 unsigned objcABIVersion = 1;
3840 // If -fobjc-abi-version= is present, use that to set the version.
3841 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
3842 StringRef value = abiArg->getValue();
3845 else if (value == "2")
3847 else if (value == "3")
3850 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3853 // Otherwise, determine if we are using the non-fragile ABI.
3854 bool nonFragileABIIsDefault =
3855 (rewriteKind == RK_NonFragile ||
3856 (rewriteKind == RK_None &&
3857 getToolChain().IsObjCNonFragileABIDefault()));
3858 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3859 options::OPT_fno_objc_nonfragile_abi,
3860 nonFragileABIIsDefault)) {
3861 // Determine the non-fragile ABI version to use.
3862 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3863 unsigned nonFragileABIVersion = 1;
3865 unsigned nonFragileABIVersion = 2;
3868 if (Arg *abiArg = args.getLastArg(
3869 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3870 StringRef value = abiArg->getValue();
3872 nonFragileABIVersion = 1;
3873 else if (value == "2")
3874 nonFragileABIVersion = 2;
3876 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3880 objcABIVersion = 1 + nonFragileABIVersion;
3886 // We don't actually care about the ABI version other than whether
3887 // it's non-fragile.
3888 bool isNonFragile = objcABIVersion != 1;
3890 // If we have no runtime argument, ask the toolchain for its default runtime.
3891 // However, the rewriter only really supports the Mac runtime, so assume that.
3892 ObjCRuntime runtime;
3894 switch (rewriteKind) {
3896 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3899 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3902 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3907 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3908 // On Darwin, make this use the default behavior for the toolchain.
3909 if (getToolChain().getTriple().isOSDarwin()) {
3910 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3912 // Otherwise, build for a generic macosx port.
3914 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3919 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
3920 // Legacy behaviour is to target the gnustep runtime if we are i
3921 // non-fragile mode or the GCC runtime in fragile mode.
3923 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
3925 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
3928 cmdArgs.push_back(args.MakeArgString(
3929 "-fobjc-runtime=" + runtime.getAsString()));
3933 void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
3934 unsigned RTOptionID = options::OPT__SLASH_MT;
3936 if (Args.hasArg(options::OPT__SLASH_LDd))
3937 // The /LDd option implies /MTd. The dependent lib part can be overridden,
3938 // but defining _DEBUG is sticky.
3939 RTOptionID = options::OPT__SLASH_MTd;
3941 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
3942 RTOptionID = A->getOption().getID();
3944 switch(RTOptionID) {
3945 case options::OPT__SLASH_MD:
3946 if (Args.hasArg(options::OPT__SLASH_LDd))
3947 CmdArgs.push_back("-D_DEBUG");
3948 CmdArgs.push_back("-D_MT");
3949 CmdArgs.push_back("-D_DLL");
3950 CmdArgs.push_back("--dependent-lib=msvcrt");
3952 case options::OPT__SLASH_MDd:
3953 CmdArgs.push_back("-D_DEBUG");
3954 CmdArgs.push_back("-D_MT");
3955 CmdArgs.push_back("-D_DLL");
3956 CmdArgs.push_back("--dependent-lib=msvcrtd");
3958 case options::OPT__SLASH_MT:
3959 if (Args.hasArg(options::OPT__SLASH_LDd))
3960 CmdArgs.push_back("-D_DEBUG");
3961 CmdArgs.push_back("-D_MT");
3962 CmdArgs.push_back("--dependent-lib=libcmt");
3964 case options::OPT__SLASH_MTd:
3965 CmdArgs.push_back("-D_DEBUG");
3966 CmdArgs.push_back("-D_MT");
3967 CmdArgs.push_back("--dependent-lib=libcmtd");
3970 llvm_unreachable("Unexpected option ID.");
3973 // This provides POSIX compatibility (maps 'open' to '_open'), which most
3974 // users want. The /Za flag to cl.exe turns this off, but it's not
3975 // implemented in clang.
3976 CmdArgs.push_back("--dependent-lib=oldnames");
3978 // FIXME: Make this default for the win32 triple.
3979 CmdArgs.push_back("-cxx-abi");
3980 CmdArgs.push_back("microsoft");
3982 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
3983 A->render(Args, CmdArgs);
3985 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
3986 CmdArgs.push_back("-fdiagnostics-format");
3987 if (Args.hasArg(options::OPT__SLASH_fallback))
3988 CmdArgs.push_back("msvc-fallback");
3990 CmdArgs.push_back("msvc");
3994 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
3995 const InputInfo &Output,
3996 const InputInfoList &Inputs,
3997 const ArgList &Args,
3998 const char *LinkingOutput) const {
3999 ArgStringList CmdArgs;
4001 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4002 const InputInfo &Input = Inputs[0];
4004 // Don't warn about "clang -w -c foo.s"
4005 Args.ClaimAllArgs(options::OPT_w);
4006 // and "clang -emit-llvm -c foo.s"
4007 Args.ClaimAllArgs(options::OPT_emit_llvm);
4009 // Invoke ourselves in -cc1as mode.
4011 // FIXME: Implement custom jobs for internal actions.
4012 CmdArgs.push_back("-cc1as");
4014 // Add the "effective" target triple.
4015 CmdArgs.push_back("-triple");
4016 std::string TripleStr =
4017 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
4018 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4020 // Set the output mode, we currently only expect to be used as a real
4022 CmdArgs.push_back("-filetype");
4023 CmdArgs.push_back("obj");
4025 // Set the main file name, so that debug info works even with
4026 // -save-temps or preprocessed assembly.
4027 CmdArgs.push_back("-main-file-name");
4028 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4030 // Add the target cpu
4031 const llvm::Triple &Triple = getToolChain().getTriple();
4032 std::string CPU = getCPUName(Args, Triple);
4034 CmdArgs.push_back("-target-cpu");
4035 CmdArgs.push_back(Args.MakeArgString(CPU));
4038 // Add the target features
4039 const Driver &D = getToolChain().getDriver();
4040 getTargetFeatures(D, Triple, Args, CmdArgs);
4042 // Ignore explicit -force_cpusubtype_ALL option.
4043 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
4045 // Determine the original source input.
4046 const Action *SourceAction = &JA;
4047 while (SourceAction->getKind() != Action::InputClass) {
4048 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4049 SourceAction = SourceAction->getInputs()[0];
4052 // Forward -g and handle debug info related flags, assuming we are dealing
4053 // with an actual assembly file.
4054 if (SourceAction->getType() == types::TY_Asm ||
4055 SourceAction->getType() == types::TY_PP_Asm) {
4056 Args.ClaimAllArgs(options::OPT_g_Group);
4057 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4058 if (!A->getOption().matches(options::OPT_g0))
4059 CmdArgs.push_back("-g");
4061 // Add the -fdebug-compilation-dir flag if needed.
4062 addDebugCompDirArg(Args, CmdArgs);
4064 // Set the AT_producer to the clang version when using the integrated
4065 // assembler on assembly source files.
4066 CmdArgs.push_back("-dwarf-debug-producer");
4067 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
4070 // Optionally embed the -cc1as level arguments into the debug info, for build
4072 if (getToolChain().UseDwarfDebugFlags()) {
4073 ArgStringList OriginalArgs;
4074 for (ArgList::const_iterator it = Args.begin(),
4075 ie = Args.end(); it != ie; ++it)
4076 (*it)->render(Args, OriginalArgs);
4078 SmallString<256> Flags;
4079 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4081 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4083 Flags += OriginalArgs[i];
4085 CmdArgs.push_back("-dwarf-debug-flags");
4086 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4089 // FIXME: Add -static support, once we have it.
4091 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4092 getToolChain().getDriver());
4094 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
4096 assert(Output.isFilename() && "Unexpected lipo output.");
4097 CmdArgs.push_back("-o");
4098 CmdArgs.push_back(Output.getFilename());
4100 assert(Input.isFilename() && "Invalid input.");
4101 CmdArgs.push_back(Input.getFilename());
4103 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4104 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4106 // Handle the debug info splitting at object creation time if we're
4107 // creating an object.
4108 // TODO: Currently only works on linux with newer objcopy.
4109 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
4110 getToolChain().getTriple().isOSLinux())
4111 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4112 SplitDebugName(Args, Inputs));
4115 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
4116 const InputInfo &Output,
4117 const InputInfoList &Inputs,
4118 const ArgList &Args,
4119 const char *LinkingOutput) const {
4120 const Driver &D = getToolChain().getDriver();
4121 ArgStringList CmdArgs;
4123 for (ArgList::const_iterator
4124 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
4126 if (forwardToGCC(A->getOption())) {
4127 // Don't forward any -g arguments to assembly steps.
4128 if (isa<AssembleJobAction>(JA) &&
4129 A->getOption().matches(options::OPT_g_Group))
4132 // Don't forward any -W arguments to assembly and link steps.
4133 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4134 A->getOption().matches(options::OPT_W_Group))
4137 // It is unfortunate that we have to claim here, as this means
4138 // we will basically never report anything interesting for
4139 // platforms using a generic gcc, even if we are just using gcc
4140 // to get to the assembler.
4142 A->render(Args, CmdArgs);
4146 RenderExtraToolArgs(JA, CmdArgs);
4148 // If using a driver driver, force the arch.
4149 llvm::Triple::ArchType Arch = getToolChain().getArch();
4150 if (getToolChain().getTriple().isOSDarwin()) {
4151 CmdArgs.push_back("-arch");
4153 // FIXME: Remove these special cases.
4154 if (Arch == llvm::Triple::ppc)
4155 CmdArgs.push_back("ppc");
4156 else if (Arch == llvm::Triple::ppc64)
4157 CmdArgs.push_back("ppc64");
4158 else if (Arch == llvm::Triple::ppc64le)
4159 CmdArgs.push_back("ppc64le");
4161 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
4164 // Try to force gcc to match the tool chain we want, if we recognize
4167 // FIXME: The triple class should directly provide the information we want
4169 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
4170 CmdArgs.push_back("-m32");
4171 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4172 Arch == llvm::Triple::ppc64le)
4173 CmdArgs.push_back("-m64");
4175 if (Output.isFilename()) {
4176 CmdArgs.push_back("-o");
4177 CmdArgs.push_back(Output.getFilename());
4179 assert(Output.isNothing() && "Unexpected output");
4180 CmdArgs.push_back("-fsyntax-only");
4183 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4184 options::OPT_Xassembler);
4186 // Only pass -x if gcc will understand it; otherwise hope gcc
4187 // understands the suffix correctly. The main use case this would go
4188 // wrong in is for linker inputs if they happened to have an odd
4189 // suffix; really the only way to get this to happen is a command
4190 // like '-x foobar a.c' which will treat a.c like a linker input.
4192 // FIXME: For the linker case specifically, can we safely convert
4193 // inputs into '-Wl,' options?
4194 for (InputInfoList::const_iterator
4195 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4196 const InputInfo &II = *it;
4198 // Don't try to pass LLVM or AST inputs to a generic gcc.
4199 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4200 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4201 D.Diag(diag::err_drv_no_linker_llvm_support)
4202 << getToolChain().getTripleString();
4203 else if (II.getType() == types::TY_AST)
4204 D.Diag(diag::err_drv_no_ast_support)
4205 << getToolChain().getTripleString();
4206 else if (II.getType() == types::TY_ModuleFile)
4207 D.Diag(diag::err_drv_no_module_support)
4208 << getToolChain().getTripleString();
4210 if (types::canTypeBeUserSpecified(II.getType())) {
4211 CmdArgs.push_back("-x");
4212 CmdArgs.push_back(types::getTypeName(II.getType()));
4215 if (II.isFilename())
4216 CmdArgs.push_back(II.getFilename());
4218 const Arg &A = II.getInputArg();
4220 // Reverse translate some rewritten options.
4221 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4222 CmdArgs.push_back("-lstdc++");
4226 // Don't render as input, we need gcc to do the translations.
4227 A.render(Args, CmdArgs);
4231 const std::string customGCCName = D.getCCCGenericGCCName();
4232 const char *GCCName;
4233 if (!customGCCName.empty())
4234 GCCName = customGCCName.c_str();
4235 else if (D.CCCIsCXX()) {
4241 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4242 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4245 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4246 ArgStringList &CmdArgs) const {
4247 CmdArgs.push_back("-E");
4250 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4251 ArgStringList &CmdArgs) const {
4252 // The type is good enough.
4255 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4256 ArgStringList &CmdArgs) const {
4257 const Driver &D = getToolChain().getDriver();
4259 // If -flto, etc. are present then make sure not to force assembly output.
4260 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4261 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
4262 CmdArgs.push_back("-c");
4264 if (JA.getType() != types::TY_PP_Asm)
4265 D.Diag(diag::err_drv_invalid_gcc_output_type)
4266 << getTypeName(JA.getType());
4268 CmdArgs.push_back("-S");
4272 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4273 ArgStringList &CmdArgs) const {
4274 CmdArgs.push_back("-c");
4277 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4278 ArgStringList &CmdArgs) const {
4279 // The types are (hopefully) good enough.
4282 // Hexagon tools start.
4283 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4284 ArgStringList &CmdArgs) const {
4287 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4288 const InputInfo &Output,
4289 const InputInfoList &Inputs,
4290 const ArgList &Args,
4291 const char *LinkingOutput) const {
4293 const Driver &D = getToolChain().getDriver();
4294 ArgStringList CmdArgs;
4296 std::string MarchString = "-march=";
4297 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
4298 CmdArgs.push_back(Args.MakeArgString(MarchString));
4300 RenderExtraToolArgs(JA, CmdArgs);
4302 if (Output.isFilename()) {
4303 CmdArgs.push_back("-o");
4304 CmdArgs.push_back(Output.getFilename());
4306 assert(Output.isNothing() && "Unexpected output");
4307 CmdArgs.push_back("-fsyntax-only");
4310 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4311 if (!SmallDataThreshold.empty())
4313 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4315 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4316 options::OPT_Xassembler);
4318 // Only pass -x if gcc will understand it; otherwise hope gcc
4319 // understands the suffix correctly. The main use case this would go
4320 // wrong in is for linker inputs if they happened to have an odd
4321 // suffix; really the only way to get this to happen is a command
4322 // like '-x foobar a.c' which will treat a.c like a linker input.
4324 // FIXME: For the linker case specifically, can we safely convert
4325 // inputs into '-Wl,' options?
4326 for (InputInfoList::const_iterator
4327 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4328 const InputInfo &II = *it;
4330 // Don't try to pass LLVM or AST inputs to a generic gcc.
4331 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4332 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4333 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4334 << getToolChain().getTripleString();
4335 else if (II.getType() == types::TY_AST)
4336 D.Diag(clang::diag::err_drv_no_ast_support)
4337 << getToolChain().getTripleString();
4338 else if (II.getType() == types::TY_ModuleFile)
4339 D.Diag(diag::err_drv_no_module_support)
4340 << getToolChain().getTripleString();
4342 if (II.isFilename())
4343 CmdArgs.push_back(II.getFilename());
4345 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4346 II.getInputArg().render(Args, CmdArgs);
4349 const char *GCCName = "hexagon-as";
4351 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4352 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4355 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4356 ArgStringList &CmdArgs) const {
4357 // The types are (hopefully) good enough.
4360 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4361 const InputInfo &Output,
4362 const InputInfoList &Inputs,
4363 const ArgList &Args,
4364 const char *LinkingOutput) const {
4366 const toolchains::Hexagon_TC& ToolChain =
4367 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4368 const Driver &D = ToolChain.getDriver();
4370 ArgStringList CmdArgs;
4372 //----------------------------------------------------------------------------
4374 //----------------------------------------------------------------------------
4375 bool hasStaticArg = Args.hasArg(options::OPT_static);
4376 bool buildingLib = Args.hasArg(options::OPT_shared);
4377 bool buildPIE = Args.hasArg(options::OPT_pie);
4378 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4379 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4380 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4381 bool useShared = buildingLib && !hasStaticArg;
4383 //----------------------------------------------------------------------------
4384 // Silence warnings for various options
4385 //----------------------------------------------------------------------------
4387 Args.ClaimAllArgs(options::OPT_g_Group);
4388 Args.ClaimAllArgs(options::OPT_emit_llvm);
4389 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4390 // handled somewhere else.
4391 Args.ClaimAllArgs(options::OPT_static_libgcc);
4393 //----------------------------------------------------------------------------
4395 //----------------------------------------------------------------------------
4396 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4397 e = ToolChain.ExtraOpts.end();
4399 CmdArgs.push_back(i->c_str());
4401 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4402 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
4405 CmdArgs.push_back("-shared");
4406 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4411 CmdArgs.push_back("-static");
4413 if (buildPIE && !buildingLib)
4414 CmdArgs.push_back("-pie");
4416 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4417 if (!SmallDataThreshold.empty()) {
4419 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4422 //----------------------------------------------------------------------------
4424 //----------------------------------------------------------------------------
4425 CmdArgs.push_back("-o");
4426 CmdArgs.push_back(Output.getFilename());
4428 const std::string MarchSuffix = "/" + MarchString;
4429 const std::string G0Suffix = "/G0";
4430 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4431 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4433 const std::string StartFilesDir = RootDir
4436 ? MarchG0Suffix : MarchSuffix);
4438 //----------------------------------------------------------------------------
4440 //----------------------------------------------------------------------------
4441 std::vector<std::string> oslibs;
4442 bool hasStandalone= false;
4444 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4445 ie = Args.filtered_end(); it != ie; ++it) {
4447 oslibs.push_back((*it)->getValue());
4448 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
4450 if (oslibs.empty()) {
4451 oslibs.push_back("standalone");
4452 hasStandalone = true;
4455 //----------------------------------------------------------------------------
4457 //----------------------------------------------------------------------------
4458 if (incStdLib && incStartFiles) {
4461 if (hasStandalone) {
4463 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4465 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4467 std::string initObj = useShared ? "/initS.o" : "/init.o";
4468 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4471 //----------------------------------------------------------------------------
4472 // Library Search Paths
4473 //----------------------------------------------------------------------------
4474 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4475 for (ToolChain::path_list::const_iterator
4476 i = LibPaths.begin(),
4480 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4482 //----------------------------------------------------------------------------
4484 //----------------------------------------------------------------------------
4485 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4486 Args.AddAllArgs(CmdArgs, options::OPT_e);
4487 Args.AddAllArgs(CmdArgs, options::OPT_s);
4488 Args.AddAllArgs(CmdArgs, options::OPT_t);
4489 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4491 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4493 //----------------------------------------------------------------------------
4495 //----------------------------------------------------------------------------
4496 if (incStdLib && incDefLibs) {
4498 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4499 CmdArgs.push_back("-lm");
4502 CmdArgs.push_back("--start-group");
4505 for(std::vector<std::string>::iterator i = oslibs.begin(),
4506 e = oslibs.end(); i != e; ++i)
4507 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4508 CmdArgs.push_back("-lc");
4510 CmdArgs.push_back("-lgcc");
4512 CmdArgs.push_back("--end-group");
4515 //----------------------------------------------------------------------------
4517 //----------------------------------------------------------------------------
4518 if (incStdLib && incStartFiles) {
4519 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4520 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4523 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4524 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
4526 // Hexagon tools end.
4528 llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4529 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4530 // archs which Darwin doesn't use.
4532 // The matching this routine does is fairly pointless, since it is neither the
4533 // complete architecture list, nor a reasonable subset. The problem is that
4534 // historically the driver driver accepts this and also ties its -march=
4535 // handling to the architecture name, so we need to be careful before removing
4538 // This code must be kept in sync with Clang's Darwin specific argument
4541 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4542 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4543 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4544 .Case("ppc64", llvm::Triple::ppc64)
4545 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4546 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4548 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
4549 // This is derived from the driver driver.
4550 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4551 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4552 .Cases("armv7s", "xscale", llvm::Triple::arm)
4553 .Case("r600", llvm::Triple::r600)
4554 .Case("nvptx", llvm::Triple::nvptx)
4555 .Case("nvptx64", llvm::Triple::nvptx64)
4556 .Case("amdil", llvm::Triple::amdil)
4557 .Case("spir", llvm::Triple::spir)
4558 .Default(llvm::Triple::UnknownArch);
4561 const char *Clang::getBaseInputName(const ArgList &Args,
4562 const InputInfoList &Inputs) {
4563 return Args.MakeArgString(
4564 llvm::sys::path::filename(Inputs[0].getBaseInput()));
4567 const char *Clang::getBaseInputStem(const ArgList &Args,
4568 const InputInfoList &Inputs) {
4569 const char *Str = getBaseInputName(Args, Inputs);
4571 if (const char *End = strrchr(Str, '.'))
4572 return Args.MakeArgString(std::string(Str, End));
4577 const char *Clang::getDependencyFileName(const ArgList &Args,
4578 const InputInfoList &Inputs) {
4579 // FIXME: Think about this more.
4582 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
4583 std::string Str(OutputOpt->getValue());
4584 Res = Str.substr(0, Str.rfind('.'));
4586 Res = getBaseInputStem(Args, Inputs);
4588 return Args.MakeArgString(Res + ".d");
4591 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4592 const InputInfo &Output,
4593 const InputInfoList &Inputs,
4594 const ArgList &Args,
4595 const char *LinkingOutput) const {
4596 ArgStringList CmdArgs;
4598 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4599 const InputInfo &Input = Inputs[0];
4601 // Determine the original source input.
4602 const Action *SourceAction = &JA;
4603 while (SourceAction->getKind() != Action::InputClass) {
4604 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4605 SourceAction = SourceAction->getInputs()[0];
4608 // If -no_integrated_as is used add -Q to the darwin assember driver to make
4609 // sure it runs its system assembler not clang's integrated assembler.
4610 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
4611 // FIXME: at run-time detect assembler capabilities or rely on version
4612 // information forwarded by -target-assembler-version (future)
4613 if (Args.hasArg(options::OPT_no_integrated_as)) {
4614 const llvm::Triple& t(getToolChain().getTriple());
4615 if (!(t.isMacOSX() && t.isMacOSXVersionLT(10, 7)))
4616 CmdArgs.push_back("-Q");
4619 // Forward -g, assuming we are dealing with an actual assembly file.
4620 if (SourceAction->getType() == types::TY_Asm ||
4621 SourceAction->getType() == types::TY_PP_Asm) {
4622 if (Args.hasArg(options::OPT_gstabs))
4623 CmdArgs.push_back("--gstabs");
4624 else if (Args.hasArg(options::OPT_g_Group))
4625 CmdArgs.push_back("-g");
4628 // Derived from asm spec.
4629 AddDarwinArch(Args, CmdArgs);
4631 // Use -force_cpusubtype_ALL on x86 by default.
4632 if (getToolChain().getArch() == llvm::Triple::x86 ||
4633 getToolChain().getArch() == llvm::Triple::x86_64 ||
4634 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4635 CmdArgs.push_back("-force_cpusubtype_ALL");
4637 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
4638 (((Args.hasArg(options::OPT_mkernel) ||
4639 Args.hasArg(options::OPT_fapple_kext)) &&
4640 (!getDarwinToolChain().isTargetIPhoneOS() ||
4641 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4642 Args.hasArg(options::OPT_static)))
4643 CmdArgs.push_back("-static");
4645 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4646 options::OPT_Xassembler);
4648 assert(Output.isFilename() && "Unexpected lipo output.");
4649 CmdArgs.push_back("-o");
4650 CmdArgs.push_back(Output.getFilename());
4652 assert(Input.isFilename() && "Invalid input.");
4653 CmdArgs.push_back(Input.getFilename());
4655 // asm_final spec is empty.
4658 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4659 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4662 void darwin::DarwinTool::anchor() {}
4664 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4665 ArgStringList &CmdArgs) const {
4666 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
4668 // Derived from darwin_arch spec.
4669 CmdArgs.push_back("-arch");
4670 CmdArgs.push_back(Args.MakeArgString(ArchName));
4672 // FIXME: Is this needed anymore?
4673 if (ArchName == "arm")
4674 CmdArgs.push_back("-force_cpusubtype_ALL");
4677 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4678 // We only need to generate a temp path for LTO if we aren't compiling object
4679 // files. When compiling source files, we run 'dsymutil' after linking. We
4680 // don't run 'dsymutil' when compiling object files.
4681 for (InputInfoList::const_iterator
4682 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4683 if (it->getType() != types::TY_Object)
4689 void darwin::Link::AddLinkArgs(Compilation &C,
4690 const ArgList &Args,
4691 ArgStringList &CmdArgs,
4692 const InputInfoList &Inputs) const {
4693 const Driver &D = getToolChain().getDriver();
4694 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
4696 unsigned Version[3] = { 0, 0, 0 };
4697 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4699 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
4700 Version[1], Version[2], HadExtra) ||
4702 D.Diag(diag::err_drv_invalid_version_number)
4703 << A->getAsString(Args);
4706 // Newer linkers support -demangle, pass it if supported and not disabled by
4708 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
4709 // Don't pass -demangle to ld_classic.
4711 // FIXME: This is a temporary workaround, ld should be handling this.
4712 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4713 Args.hasArg(options::OPT_static));
4714 if (getToolChain().getArch() == llvm::Triple::x86) {
4715 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4716 options::OPT_Wl_COMMA),
4717 ie = Args.filtered_end(); it != ie; ++it) {
4719 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
4720 if (StringRef(A->getValue(i)) == "-kext")
4721 UsesLdClassic = true;
4725 CmdArgs.push_back("-demangle");
4728 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4729 CmdArgs.push_back("-export_dynamic");
4731 // If we are using LTO, then automatically create a temporary file path for
4732 // the linker to use, so that it's lifetime will extend past a possible
4734 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4735 const char *TmpPath = C.getArgs().MakeArgString(
4736 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4737 C.addTempFile(TmpPath);
4738 CmdArgs.push_back("-object_path_lto");
4739 CmdArgs.push_back(TmpPath);
4742 // Derived from the "link" spec.
4743 Args.AddAllArgs(CmdArgs, options::OPT_static);
4744 if (!Args.hasArg(options::OPT_static))
4745 CmdArgs.push_back("-dynamic");
4746 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4747 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4748 // here. How do we wish to handle such things?
4751 if (!Args.hasArg(options::OPT_dynamiclib)) {
4752 AddDarwinArch(Args, CmdArgs);
4753 // FIXME: Why do this only on this path?
4754 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
4756 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4757 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4758 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4761 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4762 (A = Args.getLastArg(options::OPT_current__version)) ||
4763 (A = Args.getLastArg(options::OPT_install__name)))
4764 D.Diag(diag::err_drv_argument_only_allowed_with)
4765 << A->getAsString(Args) << "-dynamiclib";
4767 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4768 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4769 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4771 CmdArgs.push_back("-dylib");
4774 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4775 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4776 (A = Args.getLastArg(options::OPT_client__name)) ||
4777 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4778 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4779 (A = Args.getLastArg(options::OPT_private__bundle)))
4780 D.Diag(diag::err_drv_argument_not_allowed_with)
4781 << A->getAsString(Args) << "-dynamiclib";
4783 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4784 "-dylib_compatibility_version");
4785 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4786 "-dylib_current_version");
4788 AddDarwinArch(Args, CmdArgs);
4790 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4791 "-dylib_install_name");
4794 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4795 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4796 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4797 if (DarwinTC.isTargetIPhoneOS())
4798 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
4799 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4800 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4801 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4802 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4803 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4804 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
4805 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
4806 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4807 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4808 Args.AddAllArgs(CmdArgs, options::OPT_init);
4810 // Add the deployment target.
4811 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4813 // If we had an explicit -mios-simulator-version-min argument, honor that,
4814 // otherwise use the traditional deployment targets. We can't just check the
4815 // is-sim attribute because existing code follows this path, and the linker
4816 // may not handle the argument.
4818 // FIXME: We may be able to remove this, once we can verify no one depends on
4820 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4821 CmdArgs.push_back("-ios_simulator_version_min");
4822 else if (DarwinTC.isTargetIPhoneOS())
4823 CmdArgs.push_back("-iphoneos_version_min");
4825 CmdArgs.push_back("-macosx_version_min");
4826 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4828 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4829 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4830 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4831 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4832 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4834 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4835 options::OPT_fno_pie,
4836 options::OPT_fno_PIE)) {
4837 if (A->getOption().matches(options::OPT_fpie) ||
4838 A->getOption().matches(options::OPT_fPIE))
4839 CmdArgs.push_back("-pie");
4841 CmdArgs.push_back("-no_pie");
4844 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4845 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4846 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4847 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4848 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4849 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4850 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4851 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4852 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4853 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4854 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4855 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4856 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4857 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4858 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4859 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4861 // Give --sysroot= preference, over the Apple specific behavior to also use
4862 // --isysroot as the syslibroot.
4863 StringRef sysroot = C.getSysRoot();
4864 if (sysroot != "") {
4865 CmdArgs.push_back("-syslibroot");
4866 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4867 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4868 CmdArgs.push_back("-syslibroot");
4869 CmdArgs.push_back(A->getValue());
4872 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4873 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4874 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4875 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4876 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4877 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
4878 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4879 Args.AddAllArgs(CmdArgs, options::OPT_y);
4880 Args.AddLastArg(CmdArgs, options::OPT_w);
4881 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4882 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4883 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4884 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4885 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4886 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4887 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4888 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4889 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4890 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4891 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4892 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4895 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
4896 const InputInfo &Output,
4897 const InputInfoList &Inputs,
4898 const ArgList &Args,
4899 const char *LinkingOutput) const {
4900 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4902 // The logic here is derived from gcc's behavior; most of which
4903 // comes from specs (starting with link_command). Consult gcc for
4904 // more information.
4905 ArgStringList CmdArgs;
4907 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4908 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4909 options::OPT_ccc_arcmt_migrate)) {
4910 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4913 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4914 CmdArgs.push_back(Output.getFilename());
4915 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4919 // I'm not sure why this particular decomposition exists in gcc, but
4920 // we follow suite for ease of comparison.
4921 AddLinkArgs(C, Args, CmdArgs, Inputs);
4923 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4924 Args.AddAllArgs(CmdArgs, options::OPT_s);
4925 Args.AddAllArgs(CmdArgs, options::OPT_t);
4926 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4927 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4928 Args.AddLastArg(CmdArgs, options::OPT_e);
4929 Args.AddAllArgs(CmdArgs, options::OPT_r);
4931 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4932 // members of static archive libraries which implement Objective-C classes or
4934 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4935 CmdArgs.push_back("-ObjC");
4937 CmdArgs.push_back("-o");
4938 CmdArgs.push_back(Output.getFilename());
4940 if (!Args.hasArg(options::OPT_nostdlib) &&
4941 !Args.hasArg(options::OPT_nostartfiles)) {
4942 // Derived from startfile spec.
4943 if (Args.hasArg(options::OPT_dynamiclib)) {
4944 // Derived from darwin_dylib1 spec.
4945 if (getDarwinToolChain().isTargetIOSSimulator()) {
4946 // The simulator doesn't have a versioned crt1 file.
4947 CmdArgs.push_back("-ldylib1.o");
4948 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4949 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4950 CmdArgs.push_back("-ldylib1.o");
4952 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4953 CmdArgs.push_back("-ldylib1.o");
4954 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4955 CmdArgs.push_back("-ldylib1.10.5.o");
4958 if (Args.hasArg(options::OPT_bundle)) {
4959 if (!Args.hasArg(options::OPT_static)) {
4960 // Derived from darwin_bundle1 spec.
4961 if (getDarwinToolChain().isTargetIOSSimulator()) {
4962 // The simulator doesn't have a versioned crt1 file.
4963 CmdArgs.push_back("-lbundle1.o");
4964 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4965 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4966 CmdArgs.push_back("-lbundle1.o");
4968 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4969 CmdArgs.push_back("-lbundle1.o");
4973 if (Args.hasArg(options::OPT_pg) &&
4974 getToolChain().SupportsProfiling()) {
4975 if (Args.hasArg(options::OPT_static) ||
4976 Args.hasArg(options::OPT_object) ||
4977 Args.hasArg(options::OPT_preload)) {
4978 CmdArgs.push_back("-lgcrt0.o");
4980 CmdArgs.push_back("-lgcrt1.o");
4982 // darwin_crt2 spec is empty.
4984 // By default on OS X 10.8 and later, we don't link with a crt1.o
4985 // file and the linker knows to use _main as the entry point. But,
4986 // when compiling with -pg, we need to link with the gcrt1.o file,
4987 // so pass the -no_new_main option to tell the linker to use the
4988 // "start" symbol as the entry point.
4989 if (getDarwinToolChain().isTargetMacOS() &&
4990 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4991 CmdArgs.push_back("-no_new_main");
4993 if (Args.hasArg(options::OPT_static) ||
4994 Args.hasArg(options::OPT_object) ||
4995 Args.hasArg(options::OPT_preload)) {
4996 CmdArgs.push_back("-lcrt0.o");
4998 // Derived from darwin_crt1 spec.
4999 if (getDarwinToolChain().isTargetIOSSimulator()) {
5000 // The simulator doesn't have a versioned crt1 file.
5001 CmdArgs.push_back("-lcrt1.o");
5002 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
5003 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
5004 CmdArgs.push_back("-lcrt1.o");
5005 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
5006 CmdArgs.push_back("-lcrt1.3.1.o");
5008 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
5009 CmdArgs.push_back("-lcrt1.o");
5010 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
5011 CmdArgs.push_back("-lcrt1.10.5.o");
5012 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
5013 CmdArgs.push_back("-lcrt1.10.6.o");
5015 // darwin_crt2 spec is empty.
5022 if (!getDarwinToolChain().isTargetIPhoneOS() &&
5023 Args.hasArg(options::OPT_shared_libgcc) &&
5024 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
5026 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
5027 CmdArgs.push_back(Str);
5031 Args.AddAllArgs(CmdArgs, options::OPT_L);
5033 if (Args.hasArg(options::OPT_fopenmp))
5034 // This is more complicated in gcc...
5035 CmdArgs.push_back("-lgomp");
5037 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5039 if (isObjCRuntimeLinked(Args) &&
5040 !Args.hasArg(options::OPT_nostdlib) &&
5041 !Args.hasArg(options::OPT_nodefaultlibs)) {
5042 // Avoid linking compatibility stubs on i386 mac.
5043 if (!getDarwinToolChain().isTargetMacOS() ||
5044 getDarwinToolChain().getArch() != llvm::Triple::x86) {
5045 // If we don't have ARC or subscripting runtime support, link in the
5046 // runtime stubs. We have to do this *before* adding any of the normal
5047 // linker inputs so that its initializer gets run first.
5048 ObjCRuntime runtime =
5049 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
5050 // We use arclite library for both ARC and subscripting support.
5051 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
5052 !runtime.hasSubscripting())
5053 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
5055 CmdArgs.push_back("-framework");
5056 CmdArgs.push_back("Foundation");
5058 CmdArgs.push_back("-lobjc");
5061 if (LinkingOutput) {
5062 CmdArgs.push_back("-arch_multiple");
5063 CmdArgs.push_back("-final_output");
5064 CmdArgs.push_back(LinkingOutput);
5067 if (Args.hasArg(options::OPT_fnested_functions))
5068 CmdArgs.push_back("-allow_stack_execute");
5070 if (!Args.hasArg(options::OPT_nostdlib) &&
5071 !Args.hasArg(options::OPT_nodefaultlibs)) {
5072 if (getToolChain().getDriver().CCCIsCXX())
5073 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5075 // link_ssp spec is empty.
5077 // Let the tool chain choose which runtime library to link.
5078 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
5081 if (!Args.hasArg(options::OPT_nostdlib) &&
5082 !Args.hasArg(options::OPT_nostartfiles)) {
5083 // endfile_spec is empty.
5086 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5087 Args.AddAllArgs(CmdArgs, options::OPT_F);
5090 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5091 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5094 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
5095 const InputInfo &Output,
5096 const InputInfoList &Inputs,
5097 const ArgList &Args,
5098 const char *LinkingOutput) const {
5099 ArgStringList CmdArgs;
5101 CmdArgs.push_back("-create");
5102 assert(Output.isFilename() && "Unexpected lipo output.");
5104 CmdArgs.push_back("-output");
5105 CmdArgs.push_back(Output.getFilename());
5107 for (InputInfoList::const_iterator
5108 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5109 const InputInfo &II = *it;
5110 assert(II.isFilename() && "Unexpected lipo input.");
5111 CmdArgs.push_back(II.getFilename());
5114 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
5115 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5118 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
5119 const InputInfo &Output,
5120 const InputInfoList &Inputs,
5121 const ArgList &Args,
5122 const char *LinkingOutput) const {
5123 ArgStringList CmdArgs;
5125 CmdArgs.push_back("-o");
5126 CmdArgs.push_back(Output.getFilename());
5128 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5129 const InputInfo &Input = Inputs[0];
5130 assert(Input.isFilename() && "Unexpected dsymutil input.");
5131 CmdArgs.push_back(Input.getFilename());
5134 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
5135 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5138 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
5139 const InputInfo &Output,
5140 const InputInfoList &Inputs,
5141 const ArgList &Args,
5142 const char *LinkingOutput) const {
5143 ArgStringList CmdArgs;
5144 CmdArgs.push_back("--verify");
5145 CmdArgs.push_back("--debug-info");
5146 CmdArgs.push_back("--eh-frame");
5147 CmdArgs.push_back("--quiet");
5149 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5150 const InputInfo &Input = Inputs[0];
5151 assert(Input.isFilename() && "Unexpected verify input");
5153 // Grabbing the output of the earlier dsymutil run.
5154 CmdArgs.push_back(Input.getFilename());
5157 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5158 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5161 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5162 const InputInfo &Output,
5163 const InputInfoList &Inputs,
5164 const ArgList &Args,
5165 const char *LinkingOutput) const {
5166 ArgStringList CmdArgs;
5168 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5169 options::OPT_Xassembler);
5171 CmdArgs.push_back("-o");
5172 CmdArgs.push_back(Output.getFilename());
5174 for (InputInfoList::const_iterator
5175 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5176 const InputInfo &II = *it;
5177 CmdArgs.push_back(II.getFilename());
5181 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5182 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5186 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5187 const InputInfo &Output,
5188 const InputInfoList &Inputs,
5189 const ArgList &Args,
5190 const char *LinkingOutput) const {
5191 // FIXME: Find a real GCC, don't hard-code versions here
5192 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5193 const llvm::Triple &T = getToolChain().getTriple();
5194 std::string LibPath = "/usr/lib/";
5195 llvm::Triple::ArchType Arch = T.getArch();
5197 case llvm::Triple::x86:
5199 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5201 case llvm::Triple::x86_64:
5202 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5203 GCCLibPath += "/4.5.2/amd64/";
5204 LibPath += "amd64/";
5207 llvm_unreachable("Unsupported architecture");
5210 ArgStringList CmdArgs;
5212 // Demangle C++ names in errors
5213 CmdArgs.push_back("-C");
5215 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5216 (!Args.hasArg(options::OPT_shared))) {
5217 CmdArgs.push_back("-e");
5218 CmdArgs.push_back("_start");
5221 if (Args.hasArg(options::OPT_static)) {
5222 CmdArgs.push_back("-Bstatic");
5223 CmdArgs.push_back("-dn");
5225 CmdArgs.push_back("-Bdynamic");
5226 if (Args.hasArg(options::OPT_shared)) {
5227 CmdArgs.push_back("-shared");
5229 CmdArgs.push_back("--dynamic-linker");
5230 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5234 if (Output.isFilename()) {
5235 CmdArgs.push_back("-o");
5236 CmdArgs.push_back(Output.getFilename());
5238 assert(Output.isNothing() && "Invalid output.");
5241 if (!Args.hasArg(options::OPT_nostdlib) &&
5242 !Args.hasArg(options::OPT_nostartfiles)) {
5243 if (!Args.hasArg(options::OPT_shared)) {
5244 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5245 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5246 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5247 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5249 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5250 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5251 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5253 if (getToolChain().getDriver().CCCIsCXX())
5254 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
5257 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5259 Args.AddAllArgs(CmdArgs, options::OPT_L);
5260 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5261 Args.AddAllArgs(CmdArgs, options::OPT_e);
5262 Args.AddAllArgs(CmdArgs, options::OPT_r);
5264 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5266 if (!Args.hasArg(options::OPT_nostdlib) &&
5267 !Args.hasArg(options::OPT_nodefaultlibs)) {
5268 if (getToolChain().getDriver().CCCIsCXX())
5269 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5270 CmdArgs.push_back("-lgcc_s");
5271 if (!Args.hasArg(options::OPT_shared)) {
5272 CmdArgs.push_back("-lgcc");
5273 CmdArgs.push_back("-lc");
5274 CmdArgs.push_back("-lm");
5278 if (!Args.hasArg(options::OPT_nostdlib) &&
5279 !Args.hasArg(options::OPT_nostartfiles)) {
5280 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
5282 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
5284 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5287 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5288 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5291 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5292 const InputInfo &Output,
5293 const InputInfoList &Inputs,
5294 const ArgList &Args,
5295 const char *LinkingOutput) const {
5296 ArgStringList CmdArgs;
5298 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5299 options::OPT_Xassembler);
5301 CmdArgs.push_back("-o");
5302 CmdArgs.push_back(Output.getFilename());
5304 for (InputInfoList::const_iterator
5305 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5306 const InputInfo &II = *it;
5307 CmdArgs.push_back(II.getFilename());
5311 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
5312 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5315 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
5316 const InputInfo &Output,
5317 const InputInfoList &Inputs,
5318 const ArgList &Args,
5319 const char *LinkingOutput) const {
5320 ArgStringList CmdArgs;
5322 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5323 (!Args.hasArg(options::OPT_shared))) {
5324 CmdArgs.push_back("-e");
5325 CmdArgs.push_back("_start");
5328 if (Args.hasArg(options::OPT_static)) {
5329 CmdArgs.push_back("-Bstatic");
5330 CmdArgs.push_back("-dn");
5332 // CmdArgs.push_back("--eh-frame-hdr");
5333 CmdArgs.push_back("-Bdynamic");
5334 if (Args.hasArg(options::OPT_shared)) {
5335 CmdArgs.push_back("-shared");
5337 CmdArgs.push_back("--dynamic-linker");
5338 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5342 if (Output.isFilename()) {
5343 CmdArgs.push_back("-o");
5344 CmdArgs.push_back(Output.getFilename());
5346 assert(Output.isNothing() && "Invalid output.");
5349 if (!Args.hasArg(options::OPT_nostdlib) &&
5350 !Args.hasArg(options::OPT_nostartfiles)) {
5351 if (!Args.hasArg(options::OPT_shared)) {
5352 CmdArgs.push_back(Args.MakeArgString(
5353 getToolChain().GetFilePath("crt1.o")));
5354 CmdArgs.push_back(Args.MakeArgString(
5355 getToolChain().GetFilePath("crti.o")));
5356 CmdArgs.push_back(Args.MakeArgString(
5357 getToolChain().GetFilePath("crtbegin.o")));
5359 CmdArgs.push_back(Args.MakeArgString(
5360 getToolChain().GetFilePath("crti.o")));
5362 CmdArgs.push_back(Args.MakeArgString(
5363 getToolChain().GetFilePath("crtn.o")));
5366 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5367 + getToolChain().getTripleString()
5370 Args.AddAllArgs(CmdArgs, options::OPT_L);
5371 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5372 Args.AddAllArgs(CmdArgs, options::OPT_e);
5374 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5376 if (!Args.hasArg(options::OPT_nostdlib) &&
5377 !Args.hasArg(options::OPT_nodefaultlibs)) {
5378 // FIXME: For some reason GCC passes -lgcc before adding
5379 // the default system libraries. Just mimic this for now.
5380 CmdArgs.push_back("-lgcc");
5382 if (Args.hasArg(options::OPT_pthread))
5383 CmdArgs.push_back("-pthread");
5384 if (!Args.hasArg(options::OPT_shared))
5385 CmdArgs.push_back("-lc");
5386 CmdArgs.push_back("-lgcc");
5389 if (!Args.hasArg(options::OPT_nostdlib) &&
5390 !Args.hasArg(options::OPT_nostartfiles)) {
5391 if (!Args.hasArg(options::OPT_shared))
5392 CmdArgs.push_back(Args.MakeArgString(
5393 getToolChain().GetFilePath("crtend.o")));
5396 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5399 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5400 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5403 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5404 const InputInfo &Output,
5405 const InputInfoList &Inputs,
5406 const ArgList &Args,
5407 const char *LinkingOutput) const {
5408 ArgStringList CmdArgs;
5410 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5411 // instruct as in the base system to assemble 32-bit code.
5412 if (getToolChain().getArch() == llvm::Triple::x86)
5413 CmdArgs.push_back("--32");
5414 else if (getToolChain().getArch() == llvm::Triple::ppc) {
5415 CmdArgs.push_back("-mppc");
5416 CmdArgs.push_back("-many");
5417 } else if (getToolChain().getArch() == llvm::Triple::mips64 ||
5418 getToolChain().getArch() == llvm::Triple::mips64el) {
5421 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5423 CmdArgs.push_back("-mabi");
5424 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5426 if (getToolChain().getArch() == llvm::Triple::mips64)
5427 CmdArgs.push_back("-EB");
5429 CmdArgs.push_back("-EL");
5431 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5432 options::OPT_fpic, options::OPT_fno_pic,
5433 options::OPT_fPIE, options::OPT_fno_PIE,
5434 options::OPT_fpie, options::OPT_fno_pie);
5436 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5437 LastPICArg->getOption().matches(options::OPT_fpic) ||
5438 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5439 LastPICArg->getOption().matches(options::OPT_fpie))) {
5440 CmdArgs.push_back("-KPIC");
5444 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5445 options::OPT_Xassembler);
5447 CmdArgs.push_back("-o");
5448 CmdArgs.push_back(Output.getFilename());
5450 for (InputInfoList::const_iterator
5451 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5452 const InputInfo &II = *it;
5453 CmdArgs.push_back(II.getFilename());
5457 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5458 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5461 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5462 const InputInfo &Output,
5463 const InputInfoList &Inputs,
5464 const ArgList &Args,
5465 const char *LinkingOutput) const {
5466 const Driver &D = getToolChain().getDriver();
5467 ArgStringList CmdArgs;
5469 // Silence warning for "clang -g foo.o -o foo"
5470 Args.ClaimAllArgs(options::OPT_g_Group);
5471 // and "clang -emit-llvm foo.o -o foo"
5472 Args.ClaimAllArgs(options::OPT_emit_llvm);
5473 // and for "clang -w foo.o -o foo". Other warning options are already
5474 // handled somewhere else.
5475 Args.ClaimAllArgs(options::OPT_w);
5477 if (getToolChain().getArch() == llvm::Triple::mips64)
5478 CmdArgs.push_back("-EB");
5479 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5480 CmdArgs.push_back("-EL");
5482 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5483 (!Args.hasArg(options::OPT_shared))) {
5484 CmdArgs.push_back("-e");
5485 CmdArgs.push_back("__start");
5488 if (Args.hasArg(options::OPT_static)) {
5489 CmdArgs.push_back("-Bstatic");
5491 if (Args.hasArg(options::OPT_rdynamic))
5492 CmdArgs.push_back("-export-dynamic");
5493 CmdArgs.push_back("--eh-frame-hdr");
5494 CmdArgs.push_back("-Bdynamic");
5495 if (Args.hasArg(options::OPT_shared)) {
5496 CmdArgs.push_back("-shared");
5498 CmdArgs.push_back("-dynamic-linker");
5499 CmdArgs.push_back("/usr/libexec/ld.so");
5503 if (Args.hasArg(options::OPT_nopie))
5504 CmdArgs.push_back("-nopie");
5506 if (Output.isFilename()) {
5507 CmdArgs.push_back("-o");
5508 CmdArgs.push_back(Output.getFilename());
5510 assert(Output.isNothing() && "Invalid output.");
5513 if (!Args.hasArg(options::OPT_nostdlib) &&
5514 !Args.hasArg(options::OPT_nostartfiles)) {
5515 if (!Args.hasArg(options::OPT_shared)) {
5516 if (Args.hasArg(options::OPT_pg))
5517 CmdArgs.push_back(Args.MakeArgString(
5518 getToolChain().GetFilePath("gcrt0.o")));
5520 CmdArgs.push_back(Args.MakeArgString(
5521 getToolChain().GetFilePath("crt0.o")));
5522 CmdArgs.push_back(Args.MakeArgString(
5523 getToolChain().GetFilePath("crtbegin.o")));
5525 CmdArgs.push_back(Args.MakeArgString(
5526 getToolChain().GetFilePath("crtbeginS.o")));
5530 std::string Triple = getToolChain().getTripleString();
5531 if (Triple.substr(0, 6) == "x86_64")
5532 Triple.replace(0, 6, "amd64");
5533 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
5536 Args.AddAllArgs(CmdArgs, options::OPT_L);
5537 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5538 Args.AddAllArgs(CmdArgs, options::OPT_e);
5539 Args.AddAllArgs(CmdArgs, options::OPT_s);
5540 Args.AddAllArgs(CmdArgs, options::OPT_t);
5541 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5542 Args.AddAllArgs(CmdArgs, options::OPT_r);
5544 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5546 if (!Args.hasArg(options::OPT_nostdlib) &&
5547 !Args.hasArg(options::OPT_nodefaultlibs)) {
5549 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5550 if (Args.hasArg(options::OPT_pg))
5551 CmdArgs.push_back("-lm_p");
5553 CmdArgs.push_back("-lm");
5556 // FIXME: For some reason GCC passes -lgcc before adding
5557 // the default system libraries. Just mimic this for now.
5558 CmdArgs.push_back("-lgcc");
5560 if (Args.hasArg(options::OPT_pthread)) {
5561 if (!Args.hasArg(options::OPT_shared) &&
5562 Args.hasArg(options::OPT_pg))
5563 CmdArgs.push_back("-lpthread_p");
5565 CmdArgs.push_back("-lpthread");
5568 if (!Args.hasArg(options::OPT_shared)) {
5569 if (Args.hasArg(options::OPT_pg))
5570 CmdArgs.push_back("-lc_p");
5572 CmdArgs.push_back("-lc");
5575 CmdArgs.push_back("-lgcc");
5578 if (!Args.hasArg(options::OPT_nostdlib) &&
5579 !Args.hasArg(options::OPT_nostartfiles)) {
5580 if (!Args.hasArg(options::OPT_shared))
5581 CmdArgs.push_back(Args.MakeArgString(
5582 getToolChain().GetFilePath("crtend.o")));
5584 CmdArgs.push_back(Args.MakeArgString(
5585 getToolChain().GetFilePath("crtendS.o")));
5589 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5590 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5593 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5594 const InputInfo &Output,
5595 const InputInfoList &Inputs,
5596 const ArgList &Args,
5597 const char *LinkingOutput) const {
5598 ArgStringList CmdArgs;
5600 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5601 options::OPT_Xassembler);
5603 CmdArgs.push_back("-o");
5604 CmdArgs.push_back(Output.getFilename());
5606 for (InputInfoList::const_iterator
5607 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5608 const InputInfo &II = *it;
5609 CmdArgs.push_back(II.getFilename());
5613 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5614 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5617 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5618 const InputInfo &Output,
5619 const InputInfoList &Inputs,
5620 const ArgList &Args,
5621 const char *LinkingOutput) const {
5622 const Driver &D = getToolChain().getDriver();
5623 ArgStringList CmdArgs;
5625 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5626 (!Args.hasArg(options::OPT_shared))) {
5627 CmdArgs.push_back("-e");
5628 CmdArgs.push_back("__start");
5631 if (Args.hasArg(options::OPT_static)) {
5632 CmdArgs.push_back("-Bstatic");
5634 if (Args.hasArg(options::OPT_rdynamic))
5635 CmdArgs.push_back("-export-dynamic");
5636 CmdArgs.push_back("--eh-frame-hdr");
5637 CmdArgs.push_back("-Bdynamic");
5638 if (Args.hasArg(options::OPT_shared)) {
5639 CmdArgs.push_back("-shared");
5641 CmdArgs.push_back("-dynamic-linker");
5642 CmdArgs.push_back("/usr/libexec/ld.so");
5646 if (Output.isFilename()) {
5647 CmdArgs.push_back("-o");
5648 CmdArgs.push_back(Output.getFilename());
5650 assert(Output.isNothing() && "Invalid output.");
5653 if (!Args.hasArg(options::OPT_nostdlib) &&
5654 !Args.hasArg(options::OPT_nostartfiles)) {
5655 if (!Args.hasArg(options::OPT_shared)) {
5656 if (Args.hasArg(options::OPT_pg))
5657 CmdArgs.push_back(Args.MakeArgString(
5658 getToolChain().GetFilePath("gcrt0.o")));
5660 CmdArgs.push_back(Args.MakeArgString(
5661 getToolChain().GetFilePath("crt0.o")));
5662 CmdArgs.push_back(Args.MakeArgString(
5663 getToolChain().GetFilePath("crtbegin.o")));
5665 CmdArgs.push_back(Args.MakeArgString(
5666 getToolChain().GetFilePath("crtbeginS.o")));
5670 Args.AddAllArgs(CmdArgs, options::OPT_L);
5671 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5672 Args.AddAllArgs(CmdArgs, options::OPT_e);
5674 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5676 if (!Args.hasArg(options::OPT_nostdlib) &&
5677 !Args.hasArg(options::OPT_nodefaultlibs)) {
5679 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5680 if (Args.hasArg(options::OPT_pg))
5681 CmdArgs.push_back("-lm_p");
5683 CmdArgs.push_back("-lm");
5686 if (Args.hasArg(options::OPT_pthread)) {
5687 if (!Args.hasArg(options::OPT_shared) &&
5688 Args.hasArg(options::OPT_pg))
5689 CmdArgs.push_back("-lpthread_p");
5691 CmdArgs.push_back("-lpthread");
5694 if (!Args.hasArg(options::OPT_shared)) {
5695 if (Args.hasArg(options::OPT_pg))
5696 CmdArgs.push_back("-lc_p");
5698 CmdArgs.push_back("-lc");
5702 switch (getToolChain().getTriple().getArch()) {
5703 case llvm::Triple::arm:
5706 case llvm::Triple::x86:
5709 case llvm::Triple::x86_64:
5713 llvm_unreachable("Unsupported architecture");
5715 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
5718 if (!Args.hasArg(options::OPT_nostdlib) &&
5719 !Args.hasArg(options::OPT_nostartfiles)) {
5720 if (!Args.hasArg(options::OPT_shared))
5721 CmdArgs.push_back(Args.MakeArgString(
5722 getToolChain().GetFilePath("crtend.o")));
5724 CmdArgs.push_back(Args.MakeArgString(
5725 getToolChain().GetFilePath("crtendS.o")));
5729 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5730 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5733 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5734 const InputInfo &Output,
5735 const InputInfoList &Inputs,
5736 const ArgList &Args,
5737 const char *LinkingOutput) const {
5738 ArgStringList CmdArgs;
5740 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5741 // instruct as in the base system to assemble 32-bit code.
5742 if (getToolChain().getArch() == llvm::Triple::x86)
5743 CmdArgs.push_back("--32");
5744 else if (getToolChain().getArch() == llvm::Triple::ppc)
5745 CmdArgs.push_back("-a32");
5746 else if (getToolChain().getArch() == llvm::Triple::mips ||
5747 getToolChain().getArch() == llvm::Triple::mipsel ||
5748 getToolChain().getArch() == llvm::Triple::mips64 ||
5749 getToolChain().getArch() == llvm::Triple::mips64el) {
5752 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5754 CmdArgs.push_back("-march");
5755 CmdArgs.push_back(CPUName.data());
5757 CmdArgs.push_back("-mabi");
5758 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5760 if (getToolChain().getArch() == llvm::Triple::mips ||
5761 getToolChain().getArch() == llvm::Triple::mips64)
5762 CmdArgs.push_back("-EB");
5764 CmdArgs.push_back("-EL");
5766 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5767 options::OPT_fpic, options::OPT_fno_pic,
5768 options::OPT_fPIE, options::OPT_fno_PIE,
5769 options::OPT_fpie, options::OPT_fno_pie);
5771 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5772 LastPICArg->getOption().matches(options::OPT_fpic) ||
5773 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5774 LastPICArg->getOption().matches(options::OPT_fpie))) {
5775 CmdArgs.push_back("-KPIC");
5777 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5778 getToolChain().getArch() == llvm::Triple::thumb) {
5779 CmdArgs.push_back("-mfpu=softvfp");
5780 switch(getToolChain().getTriple().getEnvironment()) {
5781 case llvm::Triple::GNUEABI:
5782 case llvm::Triple::EABI:
5783 CmdArgs.push_back("-meabi=5");
5787 CmdArgs.push_back("-matpcs");
5789 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
5790 getToolChain().getArch() == llvm::Triple::sparcv9) {
5791 if (getToolChain().getArch() == llvm::Triple::sparc)
5792 CmdArgs.push_back("-Av8plusa");
5794 CmdArgs.push_back("-Av9a");
5796 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5797 options::OPT_fpic, options::OPT_fno_pic,
5798 options::OPT_fPIE, options::OPT_fno_PIE,
5799 options::OPT_fpie, options::OPT_fno_pie);
5801 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5802 LastPICArg->getOption().matches(options::OPT_fpic) ||
5803 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5804 LastPICArg->getOption().matches(options::OPT_fpie))) {
5805 CmdArgs.push_back("-KPIC");
5809 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5810 options::OPT_Xassembler);
5812 CmdArgs.push_back("-o");
5813 CmdArgs.push_back(Output.getFilename());
5815 for (InputInfoList::const_iterator
5816 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5817 const InputInfo &II = *it;
5818 CmdArgs.push_back(II.getFilename());
5822 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5823 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5826 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5827 const InputInfo &Output,
5828 const InputInfoList &Inputs,
5829 const ArgList &Args,
5830 const char *LinkingOutput) const {
5831 const toolchains::FreeBSD& ToolChain =
5832 static_cast<const toolchains::FreeBSD&>(getToolChain());
5833 const Driver &D = ToolChain.getDriver();
5834 ArgStringList CmdArgs;
5836 // Silence warning for "clang -g foo.o -o foo"
5837 Args.ClaimAllArgs(options::OPT_g_Group);
5838 // and "clang -emit-llvm foo.o -o foo"
5839 Args.ClaimAllArgs(options::OPT_emit_llvm);
5840 // and for "clang -w foo.o -o foo". Other warning options are already
5841 // handled somewhere else.
5842 Args.ClaimAllArgs(options::OPT_w);
5844 if (!D.SysRoot.empty())
5845 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5847 if (Args.hasArg(options::OPT_pie))
5848 CmdArgs.push_back("-pie");
5850 if (Args.hasArg(options::OPT_static)) {
5851 CmdArgs.push_back("-Bstatic");
5853 if (Args.hasArg(options::OPT_rdynamic))
5854 CmdArgs.push_back("-export-dynamic");
5855 CmdArgs.push_back("--eh-frame-hdr");
5856 if (Args.hasArg(options::OPT_shared)) {
5857 CmdArgs.push_back("-Bshareable");
5859 CmdArgs.push_back("-dynamic-linker");
5860 CmdArgs.push_back("/libexec/ld-elf.so.1");
5862 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5863 llvm::Triple::ArchType Arch = ToolChain.getArch();
5864 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5865 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5866 CmdArgs.push_back("--hash-style=both");
5869 CmdArgs.push_back("--enable-new-dtags");
5872 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5873 // instruct ld in the base system to link 32-bit code.
5874 if (ToolChain.getArch() == llvm::Triple::x86) {
5875 CmdArgs.push_back("-m");
5876 CmdArgs.push_back("elf_i386_fbsd");
5879 if (ToolChain.getArch() == llvm::Triple::ppc) {
5880 CmdArgs.push_back("-m");
5881 CmdArgs.push_back("elf32ppc");
5884 if (Output.isFilename()) {
5885 CmdArgs.push_back("-o");
5886 CmdArgs.push_back(Output.getFilename());
5888 assert(Output.isNothing() && "Invalid output.");
5891 if (!Args.hasArg(options::OPT_nostdlib) &&
5892 !Args.hasArg(options::OPT_nostartfiles)) {
5893 const char *crt1 = NULL;
5894 if (!Args.hasArg(options::OPT_shared)) {
5895 if (Args.hasArg(options::OPT_pg))
5897 else if (Args.hasArg(options::OPT_pie))
5903 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5905 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5907 const char *crtbegin = NULL;
5908 if (Args.hasArg(options::OPT_static))
5909 crtbegin = "crtbeginT.o";
5910 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5911 crtbegin = "crtbeginS.o";
5913 crtbegin = "crtbegin.o";
5915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5918 Args.AddAllArgs(CmdArgs, options::OPT_L);
5919 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5920 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5922 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5923 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5924 Args.AddAllArgs(CmdArgs, options::OPT_e);
5925 Args.AddAllArgs(CmdArgs, options::OPT_s);
5926 Args.AddAllArgs(CmdArgs, options::OPT_t);
5927 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5928 Args.AddAllArgs(CmdArgs, options::OPT_r);
5930 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5931 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5933 if (D.IsUsingLTO(Args)) {
5934 CmdArgs.push_back("-plugin");
5935 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5936 CmdArgs.push_back(Args.MakeArgString(Plugin));
5938 // Try to pass driver level flags relevant to LTO code generation down to
5941 // Handle flags for selecting CPU variants.
5942 std::string CPU = getCPUName(Args, ToolChain.getTriple());
5945 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5950 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5952 if (!Args.hasArg(options::OPT_nostdlib) &&
5953 !Args.hasArg(options::OPT_nodefaultlibs)) {
5955 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5956 if (Args.hasArg(options::OPT_pg))
5957 CmdArgs.push_back("-lm_p");
5959 CmdArgs.push_back("-lm");
5961 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5962 // the default system libraries. Just mimic this for now.
5963 if (Args.hasArg(options::OPT_pg))
5964 CmdArgs.push_back("-lgcc_p");
5966 CmdArgs.push_back("-lgcc");
5967 if (Args.hasArg(options::OPT_static)) {
5968 CmdArgs.push_back("-lgcc_eh");
5969 } else if (Args.hasArg(options::OPT_pg)) {
5970 CmdArgs.push_back("-lgcc_eh_p");
5972 CmdArgs.push_back("--as-needed");
5973 CmdArgs.push_back("-lgcc_s");
5974 CmdArgs.push_back("--no-as-needed");
5977 if (Args.hasArg(options::OPT_pthread)) {
5978 if (Args.hasArg(options::OPT_pg))
5979 CmdArgs.push_back("-lpthread_p");
5981 CmdArgs.push_back("-lpthread");
5984 if (Args.hasArg(options::OPT_pg)) {
5985 if (Args.hasArg(options::OPT_shared))
5986 CmdArgs.push_back("-lc");
5988 CmdArgs.push_back("-lc_p");
5989 CmdArgs.push_back("-lgcc_p");
5991 CmdArgs.push_back("-lc");
5992 CmdArgs.push_back("-lgcc");
5995 if (Args.hasArg(options::OPT_static)) {
5996 CmdArgs.push_back("-lgcc_eh");
5997 } else if (Args.hasArg(options::OPT_pg)) {
5998 CmdArgs.push_back("-lgcc_eh_p");
6000 CmdArgs.push_back("--as-needed");
6001 CmdArgs.push_back("-lgcc_s");
6002 CmdArgs.push_back("--no-as-needed");
6006 if (!Args.hasArg(options::OPT_nostdlib) &&
6007 !Args.hasArg(options::OPT_nostartfiles)) {
6008 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6009 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
6011 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6012 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6015 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
6018 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
6019 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6022 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6023 const InputInfo &Output,
6024 const InputInfoList &Inputs,
6025 const ArgList &Args,
6026 const char *LinkingOutput) const {
6027 ArgStringList CmdArgs;
6029 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6030 // instruct as in the base system to assemble 32-bit code.
6031 if (getToolChain().getArch() == llvm::Triple::x86)
6032 CmdArgs.push_back("--32");
6034 // Pass the target CPU to GNU as for ARM, since the source code might
6035 // not have the correct .cpu annotation.
6036 if (getToolChain().getArch() == llvm::Triple::arm) {
6037 std::string MArch(getARMTargetCPU(Args, getToolChain().getTriple()));
6038 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6041 if (getToolChain().getArch() == llvm::Triple::mips ||
6042 getToolChain().getArch() == llvm::Triple::mipsel ||
6043 getToolChain().getArch() == llvm::Triple::mips64 ||
6044 getToolChain().getArch() == llvm::Triple::mips64el) {
6047 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6049 CmdArgs.push_back("-march");
6050 CmdArgs.push_back(CPUName.data());
6052 CmdArgs.push_back("-mabi");
6053 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6055 if (getToolChain().getArch() == llvm::Triple::mips ||
6056 getToolChain().getArch() == llvm::Triple::mips64)
6057 CmdArgs.push_back("-EB");
6059 CmdArgs.push_back("-EL");
6061 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6062 options::OPT_fpic, options::OPT_fno_pic,
6063 options::OPT_fPIE, options::OPT_fno_PIE,
6064 options::OPT_fpie, options::OPT_fno_pie);
6066 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6067 LastPICArg->getOption().matches(options::OPT_fpic) ||
6068 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6069 LastPICArg->getOption().matches(options::OPT_fpie))) {
6070 CmdArgs.push_back("-KPIC");
6074 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6075 options::OPT_Xassembler);
6077 CmdArgs.push_back("-o");
6078 CmdArgs.push_back(Output.getFilename());
6080 for (InputInfoList::const_iterator
6081 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6082 const InputInfo &II = *it;
6083 CmdArgs.push_back(II.getFilename());
6086 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
6087 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6090 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6091 const InputInfo &Output,
6092 const InputInfoList &Inputs,
6093 const ArgList &Args,
6094 const char *LinkingOutput) const {
6095 const Driver &D = getToolChain().getDriver();
6096 ArgStringList CmdArgs;
6098 if (!D.SysRoot.empty())
6099 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6101 if (Args.hasArg(options::OPT_static)) {
6102 CmdArgs.push_back("-Bstatic");
6104 if (Args.hasArg(options::OPT_rdynamic))
6105 CmdArgs.push_back("-export-dynamic");
6106 CmdArgs.push_back("--eh-frame-hdr");
6107 if (Args.hasArg(options::OPT_shared)) {
6108 CmdArgs.push_back("-Bshareable");
6110 CmdArgs.push_back("-dynamic-linker");
6111 CmdArgs.push_back("/libexec/ld.elf_so");
6115 // When building 32-bit code on NetBSD/amd64, we have to explicitly
6116 // instruct ld in the base system to link 32-bit code.
6117 if (getToolChain().getArch() == llvm::Triple::x86) {
6118 CmdArgs.push_back("-m");
6119 CmdArgs.push_back("elf_i386");
6122 if (Output.isFilename()) {
6123 CmdArgs.push_back("-o");
6124 CmdArgs.push_back(Output.getFilename());
6126 assert(Output.isNothing() && "Invalid output.");
6129 if (!Args.hasArg(options::OPT_nostdlib) &&
6130 !Args.hasArg(options::OPT_nostartfiles)) {
6131 if (!Args.hasArg(options::OPT_shared)) {
6132 CmdArgs.push_back(Args.MakeArgString(
6133 getToolChain().GetFilePath("crt0.o")));
6134 CmdArgs.push_back(Args.MakeArgString(
6135 getToolChain().GetFilePath("crti.o")));
6136 CmdArgs.push_back(Args.MakeArgString(
6137 getToolChain().GetFilePath("crtbegin.o")));
6139 CmdArgs.push_back(Args.MakeArgString(
6140 getToolChain().GetFilePath("crti.o")));
6141 CmdArgs.push_back(Args.MakeArgString(
6142 getToolChain().GetFilePath("crtbeginS.o")));
6146 Args.AddAllArgs(CmdArgs, options::OPT_L);
6147 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6148 Args.AddAllArgs(CmdArgs, options::OPT_e);
6149 Args.AddAllArgs(CmdArgs, options::OPT_s);
6150 Args.AddAllArgs(CmdArgs, options::OPT_t);
6151 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6152 Args.AddAllArgs(CmdArgs, options::OPT_r);
6154 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6156 unsigned Major, Minor, Micro;
6157 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6158 bool useLibgcc = true;
6159 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
6160 if (getToolChain().getArch() == llvm::Triple::x86 ||
6161 getToolChain().getArch() == llvm::Triple::x86_64)
6165 if (!Args.hasArg(options::OPT_nostdlib) &&
6166 !Args.hasArg(options::OPT_nodefaultlibs)) {
6168 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6169 CmdArgs.push_back("-lm");
6171 if (Args.hasArg(options::OPT_pthread))
6172 CmdArgs.push_back("-lpthread");
6173 CmdArgs.push_back("-lc");
6176 if (Args.hasArg(options::OPT_static)) {
6177 // libgcc_eh depends on libc, so resolve as much as possible,
6178 // pull in any new requirements from libc and then get the rest
6180 CmdArgs.push_back("-lgcc_eh");
6181 CmdArgs.push_back("-lc");
6182 CmdArgs.push_back("-lgcc");
6184 CmdArgs.push_back("-lgcc");
6185 CmdArgs.push_back("--as-needed");
6186 CmdArgs.push_back("-lgcc_s");
6187 CmdArgs.push_back("--no-as-needed");
6192 if (!Args.hasArg(options::OPT_nostdlib) &&
6193 !Args.hasArg(options::OPT_nostartfiles)) {
6194 if (!Args.hasArg(options::OPT_shared))
6195 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6198 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6200 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6204 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6206 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6207 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6210 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6211 const InputInfo &Output,
6212 const InputInfoList &Inputs,
6213 const ArgList &Args,
6214 const char *LinkingOutput) const {
6215 ArgStringList CmdArgs;
6216 bool NeedsKPIC = false;
6218 // Add --32/--64 to make sure we get the format we want.
6219 // This is incomplete
6220 if (getToolChain().getArch() == llvm::Triple::x86) {
6221 CmdArgs.push_back("--32");
6222 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6223 CmdArgs.push_back("--64");
6224 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6225 CmdArgs.push_back("-a32");
6226 CmdArgs.push_back("-mppc");
6227 CmdArgs.push_back("-many");
6228 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6229 CmdArgs.push_back("-a64");
6230 CmdArgs.push_back("-mppc64");
6231 CmdArgs.push_back("-many");
6232 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6233 CmdArgs.push_back("-a64");
6234 CmdArgs.push_back("-mppc64le");
6235 CmdArgs.push_back("-many");
6236 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6237 CmdArgs.push_back("-32");
6238 CmdArgs.push_back("-Av8plusa");
6240 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6241 CmdArgs.push_back("-64");
6242 CmdArgs.push_back("-Av9a");
6244 } else if (getToolChain().getArch() == llvm::Triple::arm) {
6245 StringRef MArch = getToolChain().getArchName();
6246 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6247 CmdArgs.push_back("-mfpu=neon");
6248 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a")
6249 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
6251 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
6252 getToolChain().getTriple());
6253 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
6255 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6256 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6257 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
6258 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6259 getToolChain().getArch() == llvm::Triple::mipsel ||
6260 getToolChain().getArch() == llvm::Triple::mips64 ||
6261 getToolChain().getArch() == llvm::Triple::mips64el) {
6264 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6266 CmdArgs.push_back("-march");
6267 CmdArgs.push_back(CPUName.data());
6269 CmdArgs.push_back("-mabi");
6270 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6272 if (getToolChain().getArch() == llvm::Triple::mips ||
6273 getToolChain().getArch() == llvm::Triple::mips64)
6274 CmdArgs.push_back("-EB");
6276 CmdArgs.push_back("-EL");
6278 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6279 if (StringRef(A->getValue()) == "2008")
6280 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6283 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfp64)) {
6284 if (A->getOption().matches(options::OPT_mfp32))
6285 CmdArgs.push_back(Args.MakeArgString("-mfp32"));
6287 CmdArgs.push_back(Args.MakeArgString("-mfp64"));
6290 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6291 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6292 options::OPT_mno_micromips);
6293 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6294 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6296 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6297 // Do not use AddLastArg because not all versions of MIPS assembler
6298 // support -mmsa / -mno-msa options.
6299 if (A->getOption().matches(options::OPT_mmsa))
6300 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6304 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6305 // Always pass an -march option, since our default of z10 is later
6306 // than the GNU assembler's default.
6307 StringRef CPUName = getSystemZTargetCPU(Args);
6308 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6312 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
6313 options::OPT_fpic, options::OPT_fno_pic,
6314 options::OPT_fPIE, options::OPT_fno_PIE,
6315 options::OPT_fpie, options::OPT_fno_pie);
6317 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
6318 LastPICArg->getOption().matches(options::OPT_fpic) ||
6319 LastPICArg->getOption().matches(options::OPT_fPIE) ||
6320 LastPICArg->getOption().matches(options::OPT_fpie))) {
6321 CmdArgs.push_back("-KPIC");
6325 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6326 options::OPT_Xassembler);
6328 CmdArgs.push_back("-o");
6329 CmdArgs.push_back(Output.getFilename());
6331 for (InputInfoList::const_iterator
6332 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6333 const InputInfo &II = *it;
6334 CmdArgs.push_back(II.getFilename());
6338 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6339 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6341 // Handle the debug info splitting at object creation time if we're
6342 // creating an object.
6343 // TODO: Currently only works on linux with newer objcopy.
6344 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
6345 getToolChain().getTriple().isOSLinux())
6346 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6347 SplitDebugName(Args, Inputs));
6350 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6351 ArgStringList &CmdArgs, const ArgList &Args) {
6352 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
6353 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6354 Args.hasArg(options::OPT_static);
6356 CmdArgs.push_back("-lgcc");
6358 if (StaticLibgcc || isAndroid) {
6360 CmdArgs.push_back("-lgcc");
6363 CmdArgs.push_back("--as-needed");
6364 CmdArgs.push_back("-lgcc_s");
6366 CmdArgs.push_back("--no-as-needed");
6369 if (StaticLibgcc && !isAndroid)
6370 CmdArgs.push_back("-lgcc_eh");
6371 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
6372 CmdArgs.push_back("-lgcc");
6374 // According to Android ABI, we have to link with libdl if we are
6375 // linking with non-static libgcc.
6377 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6378 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6379 if (isAndroid && !StaticLibgcc)
6380 CmdArgs.push_back("-ldl");
6383 static bool hasMipsN32ABIArg(const ArgList &Args) {
6384 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6385 return A && (A->getValue() == StringRef("n32"));
6388 static StringRef getLinuxDynamicLinker(const ArgList &Args,
6389 const toolchains::Linux &ToolChain) {
6390 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6391 return "/system/bin/linker";
6392 else if (ToolChain.getArch() == llvm::Triple::x86 ||
6393 ToolChain.getArch() == llvm::Triple::sparc)
6394 return "/lib/ld-linux.so.2";
6395 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6396 return "/lib/ld-linux-aarch64.so.1";
6397 else if (ToolChain.getArch() == llvm::Triple::arm ||
6398 ToolChain.getArch() == llvm::Triple::thumb) {
6399 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6400 return "/lib/ld-linux-armhf.so.3";
6402 return "/lib/ld-linux.so.3";
6403 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6404 ToolChain.getArch() == llvm::Triple::mipsel)
6405 return "/lib/ld.so.1";
6406 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6407 ToolChain.getArch() == llvm::Triple::mips64el) {
6408 if (hasMipsN32ABIArg(Args))
6409 return "/lib32/ld.so.1";
6411 return "/lib64/ld.so.1";
6412 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6413 return "/lib/ld.so.1";
6414 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6415 ToolChain.getArch() == llvm::Triple::ppc64le ||
6416 ToolChain.getArch() == llvm::Triple::systemz)
6417 return "/lib64/ld64.so.1";
6418 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6419 return "/lib64/ld-linux.so.2";
6421 return "/lib64/ld-linux-x86-64.so.2";
6424 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6425 const InputInfo &Output,
6426 const InputInfoList &Inputs,
6427 const ArgList &Args,
6428 const char *LinkingOutput) const {
6429 const toolchains::Linux& ToolChain =
6430 static_cast<const toolchains::Linux&>(getToolChain());
6431 const Driver &D = ToolChain.getDriver();
6432 const bool isAndroid =
6433 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
6434 const SanitizerArgs &Sanitize = ToolChain.getSanitizerArgs();
6436 !Args.hasArg(options::OPT_shared) &&
6437 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
6439 ArgStringList CmdArgs;
6441 // Silence warning for "clang -g foo.o -o foo"
6442 Args.ClaimAllArgs(options::OPT_g_Group);
6443 // and "clang -emit-llvm foo.o -o foo"
6444 Args.ClaimAllArgs(options::OPT_emit_llvm);
6445 // and for "clang -w foo.o -o foo". Other warning options are already
6446 // handled somewhere else.
6447 Args.ClaimAllArgs(options::OPT_w);
6449 if (!D.SysRoot.empty())
6450 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6453 CmdArgs.push_back("-pie");
6455 if (Args.hasArg(options::OPT_rdynamic))
6456 CmdArgs.push_back("-export-dynamic");
6458 if (Args.hasArg(options::OPT_s))
6459 CmdArgs.push_back("-s");
6461 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6462 e = ToolChain.ExtraOpts.end();
6464 CmdArgs.push_back(i->c_str());
6466 if (!Args.hasArg(options::OPT_static)) {
6467 CmdArgs.push_back("--eh-frame-hdr");
6470 CmdArgs.push_back("-m");
6471 if (ToolChain.getArch() == llvm::Triple::x86)
6472 CmdArgs.push_back("elf_i386");
6473 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6474 CmdArgs.push_back("aarch64linux");
6475 else if (ToolChain.getArch() == llvm::Triple::arm
6476 || ToolChain.getArch() == llvm::Triple::thumb)
6477 CmdArgs.push_back("armelf_linux_eabi");
6478 else if (ToolChain.getArch() == llvm::Triple::ppc)
6479 CmdArgs.push_back("elf32ppclinux");
6480 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6481 CmdArgs.push_back("elf64ppc");
6482 else if (ToolChain.getArch() == llvm::Triple::sparc)
6483 CmdArgs.push_back("elf32_sparc");
6484 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6485 CmdArgs.push_back("elf64_sparc");
6486 else if (ToolChain.getArch() == llvm::Triple::mips)
6487 CmdArgs.push_back("elf32btsmip");
6488 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6489 CmdArgs.push_back("elf32ltsmip");
6490 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6491 if (hasMipsN32ABIArg(Args))
6492 CmdArgs.push_back("elf32btsmipn32");
6494 CmdArgs.push_back("elf64btsmip");
6496 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6497 if (hasMipsN32ABIArg(Args))
6498 CmdArgs.push_back("elf32ltsmipn32");
6500 CmdArgs.push_back("elf64ltsmip");
6502 else if (ToolChain.getArch() == llvm::Triple::systemz)
6503 CmdArgs.push_back("elf64_s390");
6505 CmdArgs.push_back("elf_x86_64");
6507 if (Args.hasArg(options::OPT_static)) {
6508 if (ToolChain.getArch() == llvm::Triple::arm
6509 || ToolChain.getArch() == llvm::Triple::thumb)
6510 CmdArgs.push_back("-Bstatic");
6512 CmdArgs.push_back("-static");
6513 } else if (Args.hasArg(options::OPT_shared)) {
6514 CmdArgs.push_back("-shared");
6516 CmdArgs.push_back("-Bsymbolic");
6520 if (ToolChain.getArch() == llvm::Triple::arm ||
6521 ToolChain.getArch() == llvm::Triple::thumb ||
6522 (!Args.hasArg(options::OPT_static) &&
6523 !Args.hasArg(options::OPT_shared))) {
6524 CmdArgs.push_back("-dynamic-linker");
6525 CmdArgs.push_back(Args.MakeArgString(
6526 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
6529 CmdArgs.push_back("-o");
6530 CmdArgs.push_back(Output.getFilename());
6532 if (!Args.hasArg(options::OPT_nostdlib) &&
6533 !Args.hasArg(options::OPT_nostartfiles)) {
6535 const char *crt1 = NULL;
6536 if (!Args.hasArg(options::OPT_shared)){
6537 if (Args.hasArg(options::OPT_pg))
6545 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6547 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6550 const char *crtbegin;
6551 if (Args.hasArg(options::OPT_static))
6552 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
6553 else if (Args.hasArg(options::OPT_shared))
6554 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
6556 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
6558 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
6559 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
6561 // Add crtfastmath.o if available and fast math is enabled.
6562 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
6565 Args.AddAllArgs(CmdArgs, options::OPT_L);
6567 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6569 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6571 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
6573 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6574 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6576 if (D.IsUsingLTO(Args)) {
6577 CmdArgs.push_back("-plugin");
6578 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6579 CmdArgs.push_back(Args.MakeArgString(Plugin));
6581 // Try to pass driver level flags relevant to LTO code generation down to
6584 // Handle flags for selecting CPU variants.
6585 std::string CPU = getCPUName(Args, ToolChain.getTriple());
6588 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6594 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6595 CmdArgs.push_back("--no-demangle");
6597 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6599 // Call these before we add the C++ ABI library.
6600 if (Sanitize.needsUbsanRt())
6601 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
6602 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6603 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
6604 if (Sanitize.needsAsanRt())
6605 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6606 if (Sanitize.needsTsanRt())
6607 addTsanRTLinux(getToolChain(), Args, CmdArgs);
6608 if (Sanitize.needsMsanRt())
6609 addMsanRTLinux(getToolChain(), Args, CmdArgs);
6610 if (Sanitize.needsLsanRt())
6611 addLsanRTLinux(getToolChain(), Args, CmdArgs);
6612 if (Sanitize.needsDfsanRt())
6613 addDfsanRTLinux(getToolChain(), Args, CmdArgs);
6615 // The profile runtime also needs access to system libraries.
6616 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6619 !Args.hasArg(options::OPT_nostdlib) &&
6620 !Args.hasArg(options::OPT_nodefaultlibs)) {
6621 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6622 !Args.hasArg(options::OPT_static);
6623 if (OnlyLibstdcxxStatic)
6624 CmdArgs.push_back("-Bstatic");
6625 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6626 if (OnlyLibstdcxxStatic)
6627 CmdArgs.push_back("-Bdynamic");
6628 CmdArgs.push_back("-lm");
6631 if (!Args.hasArg(options::OPT_nostdlib)) {
6632 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6633 if (Args.hasArg(options::OPT_static))
6634 CmdArgs.push_back("--start-group");
6636 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6638 CmdArgs.push_back("-lgomp");
6640 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6641 // librt. Most modern Linux platfroms require it, but some may not.
6642 CmdArgs.push_back("-lrt");
6645 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6647 if (Args.hasArg(options::OPT_pthread) ||
6648 Args.hasArg(options::OPT_pthreads) || OpenMP)
6649 CmdArgs.push_back("-lpthread");
6651 CmdArgs.push_back("-lc");
6653 if (Args.hasArg(options::OPT_static))
6654 CmdArgs.push_back("--end-group");
6656 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6659 if (!Args.hasArg(options::OPT_nostartfiles)) {
6661 if (Args.hasArg(options::OPT_shared))
6662 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
6664 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
6666 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
6668 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
6670 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6674 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6677 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6678 const InputInfo &Output,
6679 const InputInfoList &Inputs,
6680 const ArgList &Args,
6681 const char *LinkingOutput) const {
6682 ArgStringList CmdArgs;
6684 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6685 options::OPT_Xassembler);
6687 CmdArgs.push_back("-o");
6688 CmdArgs.push_back(Output.getFilename());
6690 for (InputInfoList::const_iterator
6691 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6692 const InputInfo &II = *it;
6693 CmdArgs.push_back(II.getFilename());
6697 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6698 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6701 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
6702 const InputInfo &Output,
6703 const InputInfoList &Inputs,
6704 const ArgList &Args,
6705 const char *LinkingOutput) const {
6706 const Driver &D = getToolChain().getDriver();
6707 ArgStringList CmdArgs;
6709 if (Output.isFilename()) {
6710 CmdArgs.push_back("-o");
6711 CmdArgs.push_back(Output.getFilename());
6713 assert(Output.isNothing() && "Invalid output.");
6716 if (!Args.hasArg(options::OPT_nostdlib) &&
6717 !Args.hasArg(options::OPT_nostartfiles)) {
6718 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6719 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6720 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6721 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6724 Args.AddAllArgs(CmdArgs, options::OPT_L);
6725 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6726 Args.AddAllArgs(CmdArgs, options::OPT_e);
6728 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6730 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6732 if (!Args.hasArg(options::OPT_nostdlib) &&
6733 !Args.hasArg(options::OPT_nodefaultlibs)) {
6735 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6736 CmdArgs.push_back("-lm");
6740 if (!Args.hasArg(options::OPT_nostdlib) &&
6741 !Args.hasArg(options::OPT_nostartfiles)) {
6742 if (Args.hasArg(options::OPT_pthread))
6743 CmdArgs.push_back("-lpthread");
6744 CmdArgs.push_back("-lc");
6745 CmdArgs.push_back("-lCompilerRT-Generic");
6746 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6748 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
6751 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6752 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6757 // For now, DragonFly Assemble does just about the same as for
6758 // FreeBSD, but this may change soon.
6759 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6760 const InputInfo &Output,
6761 const InputInfoList &Inputs,
6762 const ArgList &Args,
6763 const char *LinkingOutput) const {
6764 ArgStringList CmdArgs;
6766 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6767 // instruct as in the base system to assemble 32-bit code.
6768 if (getToolChain().getArch() == llvm::Triple::x86)
6769 CmdArgs.push_back("--32");
6771 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6772 options::OPT_Xassembler);
6774 CmdArgs.push_back("-o");
6775 CmdArgs.push_back(Output.getFilename());
6777 for (InputInfoList::const_iterator
6778 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6779 const InputInfo &II = *it;
6780 CmdArgs.push_back(II.getFilename());
6784 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6785 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6788 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
6789 const InputInfo &Output,
6790 const InputInfoList &Inputs,
6791 const ArgList &Args,
6792 const char *LinkingOutput) const {
6793 bool UseGCC47 = false;
6794 const Driver &D = getToolChain().getDriver();
6795 ArgStringList CmdArgs;
6797 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6800 if (!D.SysRoot.empty())
6801 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6803 CmdArgs.push_back("--eh-frame-hdr");
6804 if (Args.hasArg(options::OPT_static)) {
6805 CmdArgs.push_back("-Bstatic");
6807 if (Args.hasArg(options::OPT_rdynamic))
6808 CmdArgs.push_back("-export-dynamic");
6809 if (Args.hasArg(options::OPT_shared))
6810 CmdArgs.push_back("-Bshareable");
6812 CmdArgs.push_back("-dynamic-linker");
6813 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6815 CmdArgs.push_back("--hash-style=both");
6818 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6819 // instruct ld in the base system to link 32-bit code.
6820 if (getToolChain().getArch() == llvm::Triple::x86) {
6821 CmdArgs.push_back("-m");
6822 CmdArgs.push_back("elf_i386");
6825 if (Output.isFilename()) {
6826 CmdArgs.push_back("-o");
6827 CmdArgs.push_back(Output.getFilename());
6829 assert(Output.isNothing() && "Invalid output.");
6832 if (!Args.hasArg(options::OPT_nostdlib) &&
6833 !Args.hasArg(options::OPT_nostartfiles)) {
6834 if (!Args.hasArg(options::OPT_shared)) {
6835 if (Args.hasArg(options::OPT_pg))
6836 CmdArgs.push_back(Args.MakeArgString(
6837 getToolChain().GetFilePath("gcrt1.o")));
6839 if (Args.hasArg(options::OPT_pie))
6840 CmdArgs.push_back(Args.MakeArgString(
6841 getToolChain().GetFilePath("Scrt1.o")));
6843 CmdArgs.push_back(Args.MakeArgString(
6844 getToolChain().GetFilePath("crt1.o")));
6847 CmdArgs.push_back(Args.MakeArgString(
6848 getToolChain().GetFilePath("crti.o")));
6849 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6850 CmdArgs.push_back(Args.MakeArgString(
6851 getToolChain().GetFilePath("crtbeginS.o")));
6853 CmdArgs.push_back(Args.MakeArgString(
6854 getToolChain().GetFilePath("crtbegin.o")));
6857 Args.AddAllArgs(CmdArgs, options::OPT_L);
6858 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6859 Args.AddAllArgs(CmdArgs, options::OPT_e);
6861 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6863 if (!Args.hasArg(options::OPT_nostdlib) &&
6864 !Args.hasArg(options::OPT_nodefaultlibs)) {
6865 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6868 CmdArgs.push_back("-L/usr/lib/gcc47");
6870 CmdArgs.push_back("-L/usr/lib/gcc44");
6872 if (!Args.hasArg(options::OPT_static)) {
6874 CmdArgs.push_back("-rpath");
6875 CmdArgs.push_back("/usr/lib/gcc47");
6877 CmdArgs.push_back("-rpath");
6878 CmdArgs.push_back("/usr/lib/gcc44");
6883 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6884 CmdArgs.push_back("-lm");
6887 if (Args.hasArg(options::OPT_pthread))
6888 CmdArgs.push_back("-lpthread");
6890 if (!Args.hasArg(options::OPT_nolibc)) {
6891 CmdArgs.push_back("-lc");
6895 if (Args.hasArg(options::OPT_static) ||
6896 Args.hasArg(options::OPT_static_libgcc)) {
6897 CmdArgs.push_back("-lgcc");
6898 CmdArgs.push_back("-lgcc_eh");
6900 if (Args.hasArg(options::OPT_shared_libgcc)) {
6901 CmdArgs.push_back("-lgcc_pic");
6902 if (!Args.hasArg(options::OPT_shared))
6903 CmdArgs.push_back("-lgcc");
6905 CmdArgs.push_back("-lgcc");
6906 CmdArgs.push_back("--as-needed");
6907 CmdArgs.push_back("-lgcc_pic");
6908 CmdArgs.push_back("--no-as-needed");
6912 if (Args.hasArg(options::OPT_shared)) {
6913 CmdArgs.push_back("-lgcc_pic");
6915 CmdArgs.push_back("-lgcc");
6920 if (!Args.hasArg(options::OPT_nostdlib) &&
6921 !Args.hasArg(options::OPT_nostartfiles)) {
6922 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6923 CmdArgs.push_back(Args.MakeArgString(
6924 getToolChain().GetFilePath("crtendS.o")));
6926 CmdArgs.push_back(Args.MakeArgString(
6927 getToolChain().GetFilePath("crtend.o")));
6928 CmdArgs.push_back(Args.MakeArgString(
6929 getToolChain().GetFilePath("crtn.o")));
6932 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6935 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6936 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6939 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6940 const InputInfo &Output,
6941 const InputInfoList &Inputs,
6942 const ArgList &Args,
6943 const char *LinkingOutput) const {
6944 ArgStringList CmdArgs;
6946 if (Output.isFilename()) {
6947 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6948 Output.getFilename()));
6950 assert(Output.isNothing() && "Invalid output.");
6953 if (!Args.hasArg(options::OPT_nostdlib) &&
6954 !Args.hasArg(options::OPT_nostartfiles) &&
6955 !C.getDriver().IsCLMode()) {
6956 CmdArgs.push_back("-defaultlib:libcmt");
6959 CmdArgs.push_back("-nologo");
6961 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
6964 CmdArgs.push_back(Args.MakeArgString("-dll"));
6966 SmallString<128> ImplibName(Output.getFilename());
6967 llvm::sys::path::replace_extension(ImplibName, "lib");
6968 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
6972 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
6973 CmdArgs.push_back(Args.MakeArgString("-debug"));
6974 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
6975 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
6976 llvm::sys::path::append(LibSanitizer, "lib", "windows");
6978 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
6980 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
6982 // FIXME: Handle 64-bit.
6983 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
6986 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6987 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
6989 // Add filenames immediately.
6990 for (InputInfoList::const_iterator
6991 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6992 if (it->isFilename())
6993 CmdArgs.push_back(it->getFilename());
6995 it->getInputArg().renderAsInput(Args, CmdArgs);
6999 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
7000 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7003 void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7004 const InputInfo &Output,
7005 const InputInfoList &Inputs,
7006 const ArgList &Args,
7007 const char *LinkingOutput) const {
7008 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7011 // Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7012 // If one cannot be found, return FallbackName.
7013 // We do this special search to prevent clang-cl from falling back onto itself
7014 // if it's available as cl.exe on the path.
7015 static std::string FindFallback(const char *FallbackName,
7016 const char *ClangProgramPath) {
7017 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7018 if (!OptPath.hasValue())
7019 return FallbackName;
7021 #ifdef LLVM_ON_WIN32
7022 const StringRef PathSeparators = ";";
7024 const StringRef PathSeparators = ":";
7027 SmallVector<StringRef, 8> PathSegments;
7028 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7030 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7031 const StringRef &PathSegment = PathSegments[i];
7032 if (PathSegment.empty())
7035 SmallString<128> FilePath(PathSegment);
7036 llvm::sys::path::append(FilePath, FallbackName);
7037 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7038 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7039 return FilePath.str();
7042 return FallbackName;
7045 Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7046 const InputInfo &Output,
7047 const InputInfoList &Inputs,
7048 const ArgList &Args,
7049 const char *LinkingOutput) const {
7050 ArgStringList CmdArgs;
7051 CmdArgs.push_back("/nologo");
7052 CmdArgs.push_back("/c"); // Compile only.
7053 CmdArgs.push_back("/W0"); // No warnings.
7055 // The goal is to be able to invoke this tool correctly based on
7056 // any flag accepted by clang-cl.
7058 // These are spelled the same way in clang and cl.exe,.
7059 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7060 Args.AddAllArgs(CmdArgs, options::OPT_I);
7062 // Optimization level.
7063 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7064 if (A->getOption().getID() == options::OPT_O0) {
7065 CmdArgs.push_back("/Od");
7067 StringRef OptLevel = A->getValue();
7068 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7069 A->render(Args, CmdArgs);
7070 else if (OptLevel == "3")
7071 CmdArgs.push_back("/Ox");
7075 // Flags for which clang-cl have an alias.
7076 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7078 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7079 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7081 if (Args.hasArg(options::OPT_fsyntax_only))
7082 CmdArgs.push_back("/Zs");
7084 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7085 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7086 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7088 // Flags that can simply be passed through.
7089 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7090 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7092 // The order of these flags is relevant, so pick the last one.
7093 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7094 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7095 A->render(Args, CmdArgs);
7099 assert(Inputs.size() == 1);
7100 const InputInfo &II = Inputs[0];
7101 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7102 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7103 if (II.isFilename())
7104 CmdArgs.push_back(II.getFilename());
7106 II.getInputArg().renderAsInput(Args, CmdArgs);
7109 assert(Output.getType() == types::TY_Object);
7110 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7111 Output.getFilename());
7112 CmdArgs.push_back(Fo);
7114 const Driver &D = getToolChain().getDriver();
7115 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
7117 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
7122 // We pass assemble and link construction to the xcc tool.
7124 void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7125 const InputInfo &Output,
7126 const InputInfoList &Inputs,
7127 const ArgList &Args,
7128 const char *LinkingOutput) const {
7129 ArgStringList CmdArgs;
7131 CmdArgs.push_back("-o");
7132 CmdArgs.push_back(Output.getFilename());
7134 CmdArgs.push_back("-c");
7136 if (Args.hasArg(options::OPT_g_Group)) {
7137 CmdArgs.push_back("-g");
7140 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7141 options::OPT_Xassembler);
7143 for (InputInfoList::const_iterator
7144 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7145 const InputInfo &II = *it;
7146 CmdArgs.push_back(II.getFilename());
7150 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7151 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7154 void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7155 const InputInfo &Output,
7156 const InputInfoList &Inputs,
7157 const ArgList &Args,
7158 const char *LinkingOutput) const {
7159 ArgStringList CmdArgs;
7161 if (Output.isFilename()) {
7162 CmdArgs.push_back("-o");
7163 CmdArgs.push_back(Output.getFilename());
7165 assert(Output.isNothing() && "Invalid output.");
7168 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7171 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7172 C.addCommand(new Command(JA, *this, Exec, CmdArgs));