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 "SanitizerArgs.h"
13 #include "ToolChains.h"
14 #include "clang/Basic/ObjCRuntime.h"
15 #include "clang/Basic/Version.h"
16 #include "clang/Driver/Action.h"
17 #include "clang/Driver/Compilation.h"
18 #include "clang/Driver/Driver.h"
19 #include "clang/Driver/DriverDiagnostic.h"
20 #include "clang/Driver/Job.h"
21 #include "clang/Driver/Options.h"
22 #include "clang/Driver/ToolChain.h"
23 #include "clang/Driver/Util.h"
24 #include "llvm/ADT/SmallString.h"
25 #include "llvm/ADT/StringSwitch.h"
26 #include "llvm/ADT/Twine.h"
27 #include "llvm/Option/Arg.h"
28 #include "llvm/Option/ArgList.h"
29 #include "llvm/Option/Option.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/FileSystem.h"
32 #include "llvm/Support/Format.h"
33 #include "llvm/Support/Host.h"
34 #include "llvm/Support/Program.h"
35 #include "llvm/Support/Process.h"
36 #include "llvm/Support/raw_ostream.h"
39 using namespace clang::driver;
40 using namespace clang::driver::tools;
41 using namespace clang;
42 using namespace llvm::opt;
44 /// CheckPreprocessingOptions - Perform some validation of preprocessing
45 /// arguments that is shared with gcc.
46 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
47 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
48 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
49 D.Diag(diag::err_drv_argument_only_allowed_with)
50 << A->getAsString(Args) << "-E";
53 /// CheckCodeGenerationOptions - Perform some validation of code generation
54 /// arguments that is shared with gcc.
55 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
56 // In gcc, only ARM checks this, but it seems reasonable to check universally.
57 if (Args.hasArg(options::OPT_static))
58 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
59 options::OPT_mdynamic_no_pic))
60 D.Diag(diag::err_drv_argument_not_allowed_with)
61 << A->getAsString(Args) << "-static";
64 // Quote target names for inclusion in GNU Make dependency files.
65 // Only the characters '$', '#', ' ', '\t' are quoted.
66 static void QuoteTarget(StringRef Target,
67 SmallVectorImpl<char> &Res) {
68 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
72 // Escape the preceding backslashes
73 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
76 // Escape the space/tab
89 Res.push_back(Target[i]);
93 static void addDirectoryList(const ArgList &Args,
94 ArgStringList &CmdArgs,
97 const char *DirList = ::getenv(EnvVar);
98 bool CombinedArg = false;
101 return; // Nothing to do.
103 StringRef Name(ArgName);
104 if (Name.equals("-I") || Name.equals("-L"))
107 StringRef Dirs(DirList);
108 if (Dirs.empty()) // Empty string should not add '.'.
111 StringRef::size_type Delim;
112 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
113 if (Delim == 0) { // Leading colon.
115 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
117 CmdArgs.push_back(ArgName);
118 CmdArgs.push_back(".");
122 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
124 CmdArgs.push_back(ArgName);
125 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
128 Dirs = Dirs.substr(Delim + 1);
131 if (Dirs.empty()) { // Trailing colon.
133 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
135 CmdArgs.push_back(ArgName);
136 CmdArgs.push_back(".");
138 } else { // Add the last path.
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(Args.MakeArgString(Dirs));
148 static void AddLinkerInputs(const ToolChain &TC,
149 const InputInfoList &Inputs, const ArgList &Args,
150 ArgStringList &CmdArgs) {
151 const Driver &D = TC.getDriver();
153 // Add extra linker input arguments which are not treated as inputs
154 // (constructed via -Xarch_).
155 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
157 for (InputInfoList::const_iterator
158 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
159 const InputInfo &II = *it;
161 if (!TC.HasNativeLLVMSupport()) {
162 // Don't try to pass LLVM inputs unless we have native support.
163 if (II.getType() == types::TY_LLVM_IR ||
164 II.getType() == types::TY_LTO_IR ||
165 II.getType() == types::TY_LLVM_BC ||
166 II.getType() == types::TY_LTO_BC)
167 D.Diag(diag::err_drv_no_linker_llvm_support)
168 << TC.getTripleString();
171 // Add filenames immediately.
172 if (II.isFilename()) {
173 CmdArgs.push_back(II.getFilename());
177 // Otherwise, this is a linker input argument.
178 const Arg &A = II.getInputArg();
180 // Handle reserved library options.
181 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
182 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
183 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
184 TC.AddCCKextLibArgs(Args, CmdArgs);
186 A.renderAsInput(Args, CmdArgs);
189 // LIBRARY_PATH - included following the user specified library paths.
190 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
193 /// \brief Determine whether Objective-C automated reference counting is
195 static bool isObjCAutoRefCount(const ArgList &Args) {
196 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
199 /// \brief Determine whether we are linking the ObjC runtime.
200 static bool isObjCRuntimeLinked(const ArgList &Args) {
201 if (isObjCAutoRefCount(Args)) {
202 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
205 return Args.hasArg(options::OPT_fobjc_link_runtime);
208 static void addProfileRT(const ToolChain &TC, const ArgList &Args,
209 ArgStringList &CmdArgs,
210 llvm::Triple Triple) {
211 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
212 Args.hasArg(options::OPT_fprofile_generate) ||
213 Args.hasArg(options::OPT_fcreate_profile) ||
214 Args.hasArg(options::OPT_coverage)))
217 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
218 // the link line. We cannot do the same thing because unlike gcov there is a
219 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
220 // not supported by old linkers.
221 std::string ProfileRT =
222 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
224 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
227 static bool forwardToGCC(const Option &O) {
228 // Don't forward inputs from the original command line. They are added from
230 return O.getKind() != Option::InputClass &&
231 !O.hasFlag(options::DriverOption) &&
232 !O.hasFlag(options::LinkerInput);
235 void Clang::AddPreprocessingOptions(Compilation &C,
239 ArgStringList &CmdArgs,
240 const InputInfo &Output,
241 const InputInfoList &Inputs) const {
244 CheckPreprocessingOptions(D, Args);
246 Args.AddLastArg(CmdArgs, options::OPT_C);
247 Args.AddLastArg(CmdArgs, options::OPT_CC);
249 // Handle dependency file generation.
250 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
251 (A = Args.getLastArg(options::OPT_MD)) ||
252 (A = Args.getLastArg(options::OPT_MMD))) {
253 // Determine the output location.
255 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
256 DepFile = MF->getValue();
257 C.addFailureResultFile(DepFile, &JA);
258 } else if (Output.getType() == types::TY_Dependencies) {
259 DepFile = Output.getFilename();
260 } else if (A->getOption().matches(options::OPT_M) ||
261 A->getOption().matches(options::OPT_MM)) {
264 DepFile = getDependencyFileName(Args, Inputs);
265 C.addFailureResultFile(DepFile, &JA);
267 CmdArgs.push_back("-dependency-file");
268 CmdArgs.push_back(DepFile);
270 // Add a default target if one wasn't specified.
271 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
272 const char *DepTarget;
274 // If user provided -o, that is the dependency target, except
275 // when we are only generating a dependency file.
276 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
277 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
278 DepTarget = OutputOpt->getValue();
280 // Otherwise derive from the base input.
282 // FIXME: This should use the computed output file location.
283 SmallString<128> P(Inputs[0].getBaseInput());
284 llvm::sys::path::replace_extension(P, "o");
285 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
288 CmdArgs.push_back("-MT");
289 SmallString<128> Quoted;
290 QuoteTarget(DepTarget, Quoted);
291 CmdArgs.push_back(Args.MakeArgString(Quoted));
294 if (A->getOption().matches(options::OPT_M) ||
295 A->getOption().matches(options::OPT_MD))
296 CmdArgs.push_back("-sys-header-deps");
299 if (Args.hasArg(options::OPT_MG)) {
300 if (!A || A->getOption().matches(options::OPT_MD) ||
301 A->getOption().matches(options::OPT_MMD))
302 D.Diag(diag::err_drv_mg_requires_m_or_mm);
303 CmdArgs.push_back("-MG");
306 Args.AddLastArg(CmdArgs, options::OPT_MP);
308 // Convert all -MQ <target> args to -MT <quoted target>
309 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
311 ie = Args.filtered_end(); it != ie; ++it) {
315 if (A->getOption().matches(options::OPT_MQ)) {
316 CmdArgs.push_back("-MT");
317 SmallString<128> Quoted;
318 QuoteTarget(A->getValue(), Quoted);
319 CmdArgs.push_back(Args.MakeArgString(Quoted));
321 // -MT flag - no change
323 A->render(Args, CmdArgs);
327 // Add -i* options, and automatically translate to
328 // -include-pch/-include-pth for transparent PCH support. It's
329 // wonky, but we include looking for .gch so we can support seamless
330 // replacement into a build system already set up to be generating
332 bool RenderedImplicitInclude = false;
333 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
334 ie = Args.filtered_end(); it != ie; ++it) {
337 if (A->getOption().matches(options::OPT_include)) {
338 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
339 RenderedImplicitInclude = true;
341 // Use PCH if the user requested it.
342 bool UsePCH = D.CCCUsePCH;
344 bool FoundPTH = false;
345 bool FoundPCH = false;
346 SmallString<128> P(A->getValue());
347 // We want the files to have a name like foo.h.pch. Add a dummy extension
348 // so that replace_extension does the right thing.
351 llvm::sys::path::replace_extension(P, "pch");
352 if (llvm::sys::fs::exists(P.str()))
357 llvm::sys::path::replace_extension(P, "pth");
358 if (llvm::sys::fs::exists(P.str()))
362 if (!FoundPCH && !FoundPTH) {
363 llvm::sys::path::replace_extension(P, "gch");
364 if (llvm::sys::fs::exists(P.str())) {
370 if (FoundPCH || FoundPTH) {
371 if (IsFirstImplicitInclude) {
374 CmdArgs.push_back("-include-pch");
376 CmdArgs.push_back("-include-pth");
377 CmdArgs.push_back(Args.MakeArgString(P.str()));
380 // Ignore the PCH if not first on command line and emit warning.
381 D.Diag(diag::warn_drv_pch_not_first_include)
382 << P.str() << A->getAsString(Args);
387 // Not translated, render as usual.
389 A->render(Args, CmdArgs);
392 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
393 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
394 options::OPT_index_header_map);
396 // Add -Wp, and -Xassembler if using the preprocessor.
398 // FIXME: There is a very unfortunate problem here, some troubled
399 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
400 // really support that we would have to parse and then translate
402 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
403 options::OPT_Xpreprocessor);
405 // -I- is a deprecated GCC feature, reject it.
406 if (Arg *A = Args.getLastArg(options::OPT_I_))
407 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
409 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
410 // -isysroot to the CC1 invocation.
411 StringRef sysroot = C.getSysRoot();
413 if (!Args.hasArg(options::OPT_isysroot)) {
414 CmdArgs.push_back("-isysroot");
415 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
419 // Parse additional include paths from environment variables.
420 // FIXME: We should probably sink the logic for handling these from the
421 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
422 // CPATH - included following the user specified includes (but prior to
423 // builtin and standard includes).
424 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
425 // C_INCLUDE_PATH - system includes enabled when compiling C.
426 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
427 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
428 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
429 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
430 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
431 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
432 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
434 // Add C++ include arguments, if needed.
435 if (types::isCXX(Inputs[0].getType()))
436 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
438 // Add system include arguments.
439 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
442 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
445 // FIXME: This is redundant with -mcpu, why does LLVM use this.
446 // FIXME: tblgen this, or kill it!
447 static const char *getLLVMArchSuffixForARM(StringRef CPU) {
448 return llvm::StringSwitch<const char *>(CPU)
449 .Case("strongarm", "v4")
450 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
451 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
452 .Cases("arm920", "arm920t", "arm922t", "v4t")
453 .Cases("arm940t", "ep9312","v4t")
454 .Cases("arm10tdmi", "arm1020t", "v5")
455 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
456 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
457 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
458 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
459 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
460 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
461 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
462 .Cases("cortex-a9", "cortex-a15", "v7")
463 .Case("cortex-r5", "v7r")
464 .Case("cortex-m0", "v6m")
465 .Case("cortex-m3", "v7m")
466 .Case("cortex-m4", "v7em")
467 .Case("cortex-a9-mp", "v7f")
468 .Case("swift", "v7s")
472 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
474 // FIXME: tblgen this.
475 static std::string getARMTargetCPU(const ArgList &Args,
476 const llvm::Triple &Triple) {
477 // FIXME: Warn on inconsistent use of -mcpu and -march.
479 // If we have -mcpu=, use that.
480 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
481 StringRef MCPU = A->getValue();
482 // Handle -mcpu=native.
483 if (MCPU == "native")
484 return llvm::sys::getHostCPUName();
490 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
491 // Otherwise, if we have -march= choose the base CPU for that arch.
492 MArch = A->getValue();
494 // Otherwise, use the Arch from the triple.
495 MArch = Triple.getArchName();
498 // Handle -march=native.
499 std::string NativeMArch;
500 if (MArch == "native") {
501 std::string CPU = llvm::sys::getHostCPUName();
502 if (CPU != "generic") {
503 // Translate the native cpu into the architecture. The switch below will
504 // then chose the minimum cpu for that arch.
505 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
510 return llvm::StringSwitch<const char *>(MArch)
511 .Cases("armv2", "armv2a","arm2")
512 .Case("armv3", "arm6")
513 .Case("armv3m", "arm7m")
514 .Case("armv4", "strongarm")
515 .Case("armv4t", "arm7tdmi")
516 .Cases("armv5", "armv5t", "arm10tdmi")
517 .Cases("armv5e", "armv5te", "arm1022e")
518 .Case("armv5tej", "arm926ej-s")
519 .Cases("armv6", "armv6k", "arm1136jf-s")
520 .Case("armv6j", "arm1136j-s")
521 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
522 .Case("armv6t2", "arm1156t2-s")
523 .Cases("armv6m", "armv6-m", "cortex-m0")
524 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
525 .Cases("armv7em", "armv7e-m", "cortex-m4")
526 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
527 .Cases("armv7s", "armv7-s", "swift")
528 .Cases("armv7r", "armv7-r", "cortex-r4")
529 .Cases("armv7m", "armv7-m", "cortex-m3")
530 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
531 .Case("ep9312", "ep9312")
532 .Case("iwmmxt", "iwmmxt")
533 .Case("xscale", "xscale")
534 // If all else failed, return the most base CPU with thumb interworking
535 // supported by LLVM.
536 .Default("arm7tdmi");
539 // FIXME: Move to target hook.
540 static bool isSignedCharDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
545 case llvm::Triple::aarch64:
546 case llvm::Triple::arm:
547 case llvm::Triple::ppc:
548 case llvm::Triple::ppc64:
549 if (Triple.isOSDarwin())
553 case llvm::Triple::ppc64le:
554 case llvm::Triple::systemz:
561 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
563 static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
564 ArgStringList &CmdArgs) {
565 StringRef FPU = A->getValue();
567 // Set the target features based on the FPU.
568 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
569 // Disable any default FPU support.
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("-vfp2");
572 CmdArgs.push_back("-target-feature");
573 CmdArgs.push_back("-vfp3");
574 CmdArgs.push_back("-target-feature");
575 CmdArgs.push_back("-neon");
576 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
577 CmdArgs.push_back("-target-feature");
578 CmdArgs.push_back("+vfp3");
579 CmdArgs.push_back("-target-feature");
580 CmdArgs.push_back("+d16");
581 CmdArgs.push_back("-target-feature");
582 CmdArgs.push_back("-neon");
583 } else if (FPU == "vfp") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("+vfp2");
586 CmdArgs.push_back("-target-feature");
587 CmdArgs.push_back("-neon");
588 } else if (FPU == "vfp3" || FPU == "vfpv3") {
589 CmdArgs.push_back("-target-feature");
590 CmdArgs.push_back("+vfp3");
591 CmdArgs.push_back("-target-feature");
592 CmdArgs.push_back("-neon");
593 } else if (FPU == "fp-armv8") {
594 CmdArgs.push_back("-target-feature");
595 CmdArgs.push_back("+v8fp");
596 } else if (FPU == "neon-fp-armv8") {
597 CmdArgs.push_back("-target-feature");
598 CmdArgs.push_back("+v8fp");
599 CmdArgs.push_back("-target-feature");
600 CmdArgs.push_back("+neon");
601 } else if (FPU == "neon") {
602 CmdArgs.push_back("-target-feature");
603 CmdArgs.push_back("+neon");
605 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
609 static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
610 ArgStringList &CmdArgs, StringRef CPU) {
611 StringRef FPMath = A->getValue();
613 // Set the target features based on the FPMath.
614 if (FPMath == "neon") {
615 CmdArgs.push_back("-target-feature");
616 CmdArgs.push_back("+neonfp");
618 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
619 CPU != "cortex-a8" && CPU != "cortex-a9" &&
620 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
621 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
623 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
625 CmdArgs.push_back("-target-feature");
626 CmdArgs.push_back("-neonfp");
628 // FIXME: Add warnings when disabling a feature not present for a given CPU.
630 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
633 // Select the float ABI as determined by -msoft-float, -mhard-float, and
635 static StringRef getARMFloatABI(const Driver &D,
637 const llvm::Triple &Triple) {
639 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
640 options::OPT_mhard_float,
641 options::OPT_mfloat_abi_EQ)) {
642 if (A->getOption().matches(options::OPT_msoft_float))
644 else if (A->getOption().matches(options::OPT_mhard_float))
647 FloatABI = A->getValue();
648 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
649 D.Diag(diag::err_drv_invalid_mfloat_abi)
650 << A->getAsString(Args);
656 // If unspecified, choose the default based on the platform.
657 if (FloatABI.empty()) {
658 switch (Triple.getOS()) {
659 case llvm::Triple::Darwin:
660 case llvm::Triple::MacOSX:
661 case llvm::Triple::IOS: {
662 // Darwin defaults to "softfp" for v6 and v7.
664 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
665 std::string ArchName =
666 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
667 if (StringRef(ArchName).startswith("v6") ||
668 StringRef(ArchName).startswith("v7"))
675 case llvm::Triple::FreeBSD:
676 // FreeBSD defaults to soft float
681 switch(Triple.getEnvironment()) {
682 case llvm::Triple::GNUEABIHF:
685 case llvm::Triple::GNUEABI:
688 case llvm::Triple::EABI:
689 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
692 case llvm::Triple::Android: {
693 std::string ArchName =
694 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
695 if (StringRef(ArchName).startswith("v7"))
702 // Assume "soft", but warn the user we are guessing.
704 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
714 void Clang::AddARMTargetArgs(const ArgList &Args,
715 ArgStringList &CmdArgs,
716 bool KernelOrKext) const {
717 const Driver &D = getToolChain().getDriver();
718 // Get the effective triple, which takes into account the deployment target.
719 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
720 llvm::Triple Triple(TripleStr);
721 std::string CPUName = getARMTargetCPU(Args, Triple);
723 // Select the ABI to use.
725 // FIXME: Support -meabi.
726 const char *ABIName = 0;
727 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
728 ABIName = A->getValue();
729 } else if (Triple.isOSDarwin()) {
730 // The backend is hardwired to assume AAPCS for M-class processors, ensure
731 // the frontend matches that.
732 if (StringRef(CPUName).startswith("cortex-m")) {
735 ABIName = "apcs-gnu";
738 // Select the default based on the platform.
739 switch(Triple.getEnvironment()) {
740 case llvm::Triple::Android:
741 case llvm::Triple::GNUEABI:
742 case llvm::Triple::GNUEABIHF:
743 ABIName = "aapcs-linux";
745 case llvm::Triple::EABI:
749 ABIName = "apcs-gnu";
752 CmdArgs.push_back("-target-abi");
753 CmdArgs.push_back(ABIName);
755 // Set the CPU based on -march= and -mcpu=.
756 CmdArgs.push_back("-target-cpu");
757 CmdArgs.push_back(Args.MakeArgString(CPUName));
759 // Determine floating point ABI from the options & target defaults.
760 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
761 if (FloatABI == "soft") {
762 // Floating point operations and argument passing are soft.
764 // FIXME: This changes CPP defines, we need -target-soft-float.
765 CmdArgs.push_back("-msoft-float");
766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("soft");
768 } else if (FloatABI == "softfp") {
769 // Floating point operations are hard, but argument passing is soft.
770 CmdArgs.push_back("-mfloat-abi");
771 CmdArgs.push_back("soft");
773 // Floating point operations and argument passing are hard.
774 assert(FloatABI == "hard" && "Invalid float abi!");
775 CmdArgs.push_back("-mfloat-abi");
776 CmdArgs.push_back("hard");
779 // Set appropriate target features for floating point mode.
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 above), and it is
783 // stripped out by the ARM target.
785 // Use software floating point operations?
786 if (FloatABI == "soft") {
787 CmdArgs.push_back("-target-feature");
788 CmdArgs.push_back("+soft-float");
791 // Use software floating point argument passing?
792 if (FloatABI != "hard") {
793 CmdArgs.push_back("-target-feature");
794 CmdArgs.push_back("+soft-float-abi");
798 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
799 addFPUArgs(D, A, Args, CmdArgs);
802 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
803 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
805 // Setting -msoft-float effectively disables NEON because of the GCC
806 // implementation, although the same isn't true of VFP or VFP3.
807 if (FloatABI == "soft") {
808 CmdArgs.push_back("-target-feature");
809 CmdArgs.push_back("-neon");
812 // Kernel code has more strict alignment requirements.
814 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
815 CmdArgs.push_back("-backend-option");
816 CmdArgs.push_back("-arm-long-calls");
819 CmdArgs.push_back("-backend-option");
820 CmdArgs.push_back("-arm-strict-align");
822 // The kext linker doesn't know how to deal with movw/movt.
823 CmdArgs.push_back("-backend-option");
824 CmdArgs.push_back("-arm-darwin-use-movt=0");
827 // Setting -mno-global-merge disables the codegen global merge pass. Setting
828 // -mglobal-merge has no effect as the pass is enabled by default.
829 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
830 options::OPT_mno_global_merge)) {
831 if (A->getOption().matches(options::OPT_mno_global_merge))
832 CmdArgs.push_back("-mno-global-merge");
835 if (!Args.hasFlag(options::OPT_mimplicit_float,
836 options::OPT_mno_implicit_float,
838 CmdArgs.push_back("-no-implicit-float");
841 // Translate MIPS CPU name alias option to CPU name.
842 static StringRef getMipsCPUFromAlias(const Arg &A) {
843 if (A.getOption().matches(options::OPT_mips32))
845 if (A.getOption().matches(options::OPT_mips32r2))
847 if (A.getOption().matches(options::OPT_mips64))
849 if (A.getOption().matches(options::OPT_mips64r2))
851 llvm_unreachable("Unexpected option");
855 // Get CPU and ABI names. They are not independent
856 // so we have to calculate them together.
857 static void getMipsCPUAndABI(const ArgList &Args,
860 StringRef &ABIName) {
861 const char *DefMips32CPU = "mips32";
862 const char *DefMips64CPU = "mips64";
864 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
865 options::OPT_mcpu_EQ,
866 options::OPT_mips_CPUs_Group)) {
867 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
868 CPUName = getMipsCPUFromAlias(*A);
870 CPUName = A->getValue();
873 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
874 ABIName = A->getValue();
875 // Convert a GNU style Mips ABI name to the name
876 // accepted by LLVM Mips backend.
877 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
883 // Setup default CPU and ABI names.
884 if (CPUName.empty() && ABIName.empty()) {
885 switch (TC.getArch()) {
887 llvm_unreachable("Unexpected triple arch name");
888 case llvm::Triple::mips:
889 case llvm::Triple::mipsel:
890 CPUName = DefMips32CPU;
892 case llvm::Triple::mips64:
893 case llvm::Triple::mips64el:
894 CPUName = DefMips64CPU;
899 if (!ABIName.empty()) {
900 // Deduce CPU name from ABI name.
901 CPUName = llvm::StringSwitch<const char *>(ABIName)
902 .Cases("32", "o32", "eabi", DefMips32CPU)
903 .Cases("n32", "n64", "64", DefMips64CPU)
906 else if (!CPUName.empty()) {
907 // Deduce ABI name from CPU name.
908 ABIName = llvm::StringSwitch<const char *>(CPUName)
909 .Cases("mips32", "mips32r2", "o32")
910 .Cases("mips64", "mips64r2", "n64")
914 // FIXME: Warn on inconsistent cpu and abi usage.
917 // Convert ABI name to the GNU tools acceptable variant.
918 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
919 return llvm::StringSwitch<llvm::StringRef>(ABI)
925 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
927 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
929 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
930 options::OPT_mhard_float,
931 options::OPT_mfloat_abi_EQ)) {
932 if (A->getOption().matches(options::OPT_msoft_float))
934 else if (A->getOption().matches(options::OPT_mhard_float))
937 FloatABI = A->getValue();
938 if (FloatABI != "soft" && FloatABI != "hard") {
939 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
945 // If unspecified, choose the default based on the platform.
946 if (FloatABI.empty()) {
947 // Assume "hard", because it's a default value used by gcc.
948 // When we start to recognize specific target MIPS processors,
949 // we will be able to select the default more correctly.
956 static void AddTargetFeature(const ArgList &Args,
957 ArgStringList &CmdArgs,
960 StringRef FeatureName) {
961 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
962 CmdArgs.push_back("-target-feature");
963 if (A->getOption().matches(OnOpt))
964 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
966 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
970 void Clang::AddMIPSTargetArgs(const ArgList &Args,
971 ArgStringList &CmdArgs) const {
972 const Driver &D = getToolChain().getDriver();
975 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
977 CmdArgs.push_back("-target-cpu");
978 CmdArgs.push_back(CPUName.data());
980 CmdArgs.push_back("-target-abi");
981 CmdArgs.push_back(ABIName.data());
983 StringRef FloatABI = getMipsFloatABI(D, Args);
985 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
987 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
988 // Floating point operations and argument passing are soft.
989 CmdArgs.push_back("-msoft-float");
990 CmdArgs.push_back("-mfloat-abi");
991 CmdArgs.push_back("soft");
993 // FIXME: Note, this is a hack. We need to pass the selected float
994 // mode to the MipsTargetInfoBase to define appropriate macros there.
995 // Now it is the only method.
996 CmdArgs.push_back("-target-feature");
997 CmdArgs.push_back("+soft-float");
999 if (FloatABI == "hard" && IsMips16) {
1000 CmdArgs.push_back("-mllvm");
1001 CmdArgs.push_back("-mips16-hard-float");
1005 // Floating point operations and argument passing are hard.
1006 assert(FloatABI == "hard" && "Invalid float abi!");
1007 CmdArgs.push_back("-mfloat-abi");
1008 CmdArgs.push_back("hard");
1011 AddTargetFeature(Args, CmdArgs,
1012 options::OPT_msingle_float, options::OPT_mdouble_float,
1014 AddTargetFeature(Args, CmdArgs,
1015 options::OPT_mips16, options::OPT_mno_mips16,
1017 AddTargetFeature(Args, CmdArgs,
1018 options::OPT_mmicromips, options::OPT_mno_micromips,
1020 AddTargetFeature(Args, CmdArgs,
1021 options::OPT_mdsp, options::OPT_mno_dsp,
1023 AddTargetFeature(Args, CmdArgs,
1024 options::OPT_mdspr2, options::OPT_mno_dspr2,
1027 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1028 if (A->getOption().matches(options::OPT_mxgot)) {
1029 CmdArgs.push_back("-mllvm");
1030 CmdArgs.push_back("-mxgot");
1034 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1035 options::OPT_mno_ldc1_sdc1)) {
1036 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1037 CmdArgs.push_back("-mllvm");
1038 CmdArgs.push_back("-mno-ldc1-sdc1");
1042 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1043 options::OPT_mno_check_zero_division)) {
1044 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1045 CmdArgs.push_back("-mllvm");
1046 CmdArgs.push_back("-mno-check-zero-division");
1050 if (Arg *A = Args.getLastArg(options::OPT_G)) {
1051 StringRef v = A->getValue();
1052 CmdArgs.push_back("-mllvm");
1053 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1058 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1059 static std::string getPPCTargetCPU(const ArgList &Args) {
1060 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1061 StringRef CPUName = A->getValue();
1063 if (CPUName == "native") {
1064 std::string CPU = llvm::sys::getHostCPUName();
1065 if (!CPU.empty() && CPU != "generic")
1071 return llvm::StringSwitch<const char *>(CPUName)
1072 .Case("common", "generic")
1074 .Case("440fp", "440")
1079 .Case("603e", "603e")
1080 .Case("603ev", "603ev")
1082 .Case("604e", "604e")
1084 .Case("630", "pwr3")
1086 .Case("7400", "7400")
1088 .Case("7450", "7450")
1095 .Case("e500mc", "e500mc")
1096 .Case("e5500", "e5500")
1097 .Case("power3", "pwr3")
1098 .Case("power4", "pwr4")
1099 .Case("power5", "pwr5")
1100 .Case("power5x", "pwr5x")
1101 .Case("power6", "pwr6")
1102 .Case("power6x", "pwr6x")
1103 .Case("power7", "pwr7")
1104 .Case("pwr3", "pwr3")
1105 .Case("pwr4", "pwr4")
1106 .Case("pwr5", "pwr5")
1107 .Case("pwr5x", "pwr5x")
1108 .Case("pwr6", "pwr6")
1109 .Case("pwr6x", "pwr6x")
1110 .Case("pwr7", "pwr7")
1111 .Case("powerpc", "ppc")
1112 .Case("powerpc64", "ppc64")
1113 .Case("powerpc64le", "ppc64le")
1120 void Clang::AddPPCTargetArgs(const ArgList &Args,
1121 ArgStringList &CmdArgs) const {
1122 std::string TargetCPUName = getPPCTargetCPU(Args);
1124 // LLVM may default to generating code for the native CPU,
1125 // but, like gcc, we default to a more generic option for
1126 // each architecture. (except on Darwin)
1127 llvm::Triple Triple = getToolChain().getTriple();
1128 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1129 if (Triple.getArch() == llvm::Triple::ppc64)
1130 TargetCPUName = "ppc64";
1131 else if (Triple.getArch() == llvm::Triple::ppc64le)
1132 TargetCPUName = "ppc64le";
1134 TargetCPUName = "ppc";
1137 if (!TargetCPUName.empty()) {
1138 CmdArgs.push_back("-target-cpu");
1139 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1142 // Allow override of the Altivec feature.
1143 AddTargetFeature(Args, CmdArgs,
1144 options::OPT_faltivec, options::OPT_fno_altivec,
1147 AddTargetFeature(Args, CmdArgs,
1148 options::OPT_mfprnd, options::OPT_mno_fprnd,
1151 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1152 AddTargetFeature(Args, CmdArgs,
1153 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1156 AddTargetFeature(Args, CmdArgs,
1157 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1160 // It is really only possible to turn qpx off because turning qpx on is tied
1161 // to using the a2q CPU.
1162 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1163 CmdArgs.push_back("-target-feature");
1164 CmdArgs.push_back("-qpx");
1168 /// Get the (LLVM) name of the R600 gpu we are targeting.
1169 static std::string getR600TargetGPU(const ArgList &Args) {
1170 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1171 std::string GPUName = A->getValue();
1172 return llvm::StringSwitch<const char *>(GPUName)
1173 .Cases("rv630", "rv635", "r600")
1174 .Cases("rv610", "rv620", "rs780", "rs880")
1175 .Case("rv740", "rv770")
1176 .Case("palm", "cedar")
1177 .Cases("sumo", "sumo2", "sumo")
1178 .Case("hemlock", "cypress")
1179 .Case("aruba", "cayman")
1180 .Default(GPUName.c_str());
1185 void Clang::AddR600TargetArgs(const ArgList &Args,
1186 ArgStringList &CmdArgs) const {
1187 std::string TargetGPUName = getR600TargetGPU(Args);
1188 CmdArgs.push_back("-target-cpu");
1189 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1192 void Clang::AddSparcTargetArgs(const ArgList &Args,
1193 ArgStringList &CmdArgs) const {
1194 const Driver &D = getToolChain().getDriver();
1196 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1197 CmdArgs.push_back("-target-cpu");
1198 CmdArgs.push_back(A->getValue());
1201 // Select the float ABI as determined by -msoft-float, -mhard-float, and
1203 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1204 options::OPT_mhard_float)) {
1205 if (A->getOption().matches(options::OPT_msoft_float))
1207 else if (A->getOption().matches(options::OPT_mhard_float))
1211 // If unspecified, choose the default based on the platform.
1212 if (FloatABI.empty()) {
1213 // Assume "soft", but warn the user we are guessing.
1215 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
1218 if (FloatABI == "soft") {
1219 // Floating point operations and argument passing are soft.
1221 // FIXME: This changes CPP defines, we need -target-soft-float.
1222 CmdArgs.push_back("-msoft-float");
1223 CmdArgs.push_back("-target-feature");
1224 CmdArgs.push_back("+soft-float");
1226 assert(FloatABI == "hard" && "Invalid float abi!");
1227 CmdArgs.push_back("-mhard-float");
1231 static const char *getSystemZTargetCPU(const ArgList &Args) {
1232 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1233 return A->getValue();
1237 void Clang::AddSystemZTargetArgs(const ArgList &Args,
1238 ArgStringList &CmdArgs) const {
1239 const char *CPUName = getSystemZTargetCPU(Args);
1240 CmdArgs.push_back("-target-cpu");
1241 CmdArgs.push_back(CPUName);
1244 static const char *getX86TargetCPU(const ArgList &Args,
1245 const llvm::Triple &Triple) {
1246 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1247 if (StringRef(A->getValue()) != "native")
1248 return A->getValue();
1250 // FIXME: Reject attempts to use -march=native unless the target matches
1253 // FIXME: We should also incorporate the detected target features for use
1255 std::string CPU = llvm::sys::getHostCPUName();
1256 if (!CPU.empty() && CPU != "generic")
1257 return Args.MakeArgString(CPU);
1260 // Select the default CPU if none was given (or detection failed).
1262 if (Triple.getArch() != llvm::Triple::x86_64 &&
1263 Triple.getArch() != llvm::Triple::x86)
1264 return 0; // This routine is only handling x86 targets.
1266 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1268 // FIXME: Need target hooks.
1269 if (Triple.isOSDarwin())
1270 return Is64Bit ? "core2" : "yonah";
1272 // Everything else goes to x86-64 in 64-bit mode.
1276 if (Triple.getOSName().startswith("haiku"))
1278 if (Triple.getOSName().startswith("openbsd"))
1280 if (Triple.getOSName().startswith("bitrig"))
1282 if (Triple.getOSName().startswith("freebsd"))
1284 if (Triple.getOSName().startswith("netbsd"))
1286 // All x86 devices running Android have core2 as their common
1287 // denominator. This makes a better choice than pentium4.
1288 if (Triple.getEnvironment() == llvm::Triple::Android)
1295 void Clang::AddX86TargetArgs(const ArgList &Args,
1296 ArgStringList &CmdArgs) const {
1297 if (!Args.hasFlag(options::OPT_mred_zone,
1298 options::OPT_mno_red_zone,
1300 Args.hasArg(options::OPT_mkernel) ||
1301 Args.hasArg(options::OPT_fapple_kext))
1302 CmdArgs.push_back("-disable-red-zone");
1304 // Default to avoid implicit floating-point for kernel/kext code, but allow
1305 // that to be overridden with -mno-soft-float.
1306 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1307 Args.hasArg(options::OPT_fapple_kext));
1308 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1309 options::OPT_mno_soft_float,
1310 options::OPT_mimplicit_float,
1311 options::OPT_mno_implicit_float)) {
1312 const Option &O = A->getOption();
1313 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1314 O.matches(options::OPT_msoft_float));
1316 if (NoImplicitFloat)
1317 CmdArgs.push_back("-no-implicit-float");
1319 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
1320 CmdArgs.push_back("-target-cpu");
1321 CmdArgs.push_back(CPUName);
1324 // The required algorithm here is slightly strange: the options are applied
1325 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1326 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1327 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1328 // former correctly, but not the latter; handle directly-overridden
1330 llvm::StringMap<unsigned> PrevFeature;
1331 std::vector<const char*> Features;
1332 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1333 ie = Args.filtered_end(); it != ie; ++it) {
1334 StringRef Name = (*it)->getOption().getName();
1338 assert(Name.startswith("m") && "Invalid feature name.");
1339 Name = Name.substr(1);
1341 bool IsNegative = Name.startswith("no-");
1343 Name = Name.substr(3);
1345 unsigned& Prev = PrevFeature[Name];
1347 Features[Prev - 1] = 0;
1348 Prev = Features.size() + 1;
1349 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1351 for (unsigned i = 0; i < Features.size(); i++) {
1353 CmdArgs.push_back("-target-feature");
1354 CmdArgs.push_back(Features[i]);
1359 static inline bool HasPICArg(const ArgList &Args) {
1360 return Args.hasArg(options::OPT_fPIC)
1361 || Args.hasArg(options::OPT_fpic);
1364 static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1365 return Args.getLastArg(options::OPT_G,
1367 options::OPT_msmall_data_threshold_EQ);
1370 static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1372 if (HasPICArg(Args))
1374 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1375 value = A->getValue();
1381 void Clang::AddHexagonTargetArgs(const ArgList &Args,
1382 ArgStringList &CmdArgs) const {
1383 llvm::Triple Triple = getToolChain().getTriple();
1385 CmdArgs.push_back("-target-cpu");
1386 CmdArgs.push_back(Args.MakeArgString(
1388 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
1389 CmdArgs.push_back("-fno-signed-char");
1390 CmdArgs.push_back("-mqdsp6-compat");
1391 CmdArgs.push_back("-Wreturn-type");
1393 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1394 if (!SmallDataThreshold.empty()) {
1395 CmdArgs.push_back ("-mllvm");
1396 CmdArgs.push_back(Args.MakeArgString(
1397 "-hexagon-small-data-threshold=" + SmallDataThreshold));
1400 if (!Args.hasArg(options::OPT_fno_short_enums))
1401 CmdArgs.push_back("-fshort-enums");
1402 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1403 CmdArgs.push_back ("-mllvm");
1404 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1406 CmdArgs.push_back ("-mllvm");
1407 CmdArgs.push_back ("-machine-sink-split=0");
1410 void Clang::AddAArch64TargetArgs(const ArgList &Args,
1411 ArgStringList &CmdArgs) const {
1412 const Driver &D = getToolChain().getDriver();
1414 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
1415 addFPUArgs(D, A, Args, CmdArgs);
1419 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1420 const llvm::Triple &Triple) {
1421 // We use the zero-cost exception tables for Objective-C if the non-fragile
1422 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1424 if (runtime.isNonFragile())
1427 if (!Triple.isOSDarwin())
1430 return (!Triple.isMacOSXVersionLT(10,5) &&
1431 (Triple.getArch() == llvm::Triple::x86_64 ||
1432 Triple.getArch() == llvm::Triple::arm));
1435 /// addExceptionArgs - Adds exception related arguments to the driver command
1436 /// arguments. There's a master flag, -fexceptions and also language specific
1437 /// flags to enable/disable C++ and Objective-C exceptions.
1438 /// This makes it possible to for example disable C++ exceptions but enable
1439 /// Objective-C exceptions.
1440 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1441 const llvm::Triple &Triple,
1443 const ObjCRuntime &objcRuntime,
1444 ArgStringList &CmdArgs) {
1446 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1447 // arguments now to avoid warnings about unused arguments.
1448 Args.ClaimAllArgs(options::OPT_fexceptions);
1449 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1450 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1451 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1452 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1453 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
1457 // Exceptions are enabled by default.
1458 bool ExceptionsEnabled = true;
1460 // This keeps track of whether exceptions were explicitly turned on or off.
1461 bool DidHaveExplicitExceptionFlag = false;
1463 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1464 options::OPT_fno_exceptions)) {
1465 if (A->getOption().matches(options::OPT_fexceptions))
1466 ExceptionsEnabled = true;
1468 ExceptionsEnabled = false;
1470 DidHaveExplicitExceptionFlag = true;
1473 bool ShouldUseExceptionTables = false;
1475 // Exception tables and cleanups can be enabled with -fexceptions even if the
1476 // language itself doesn't support exceptions.
1477 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1478 ShouldUseExceptionTables = true;
1480 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1481 // is not necessarily sensible, but follows GCC.
1482 if (types::isObjC(InputType) &&
1483 Args.hasFlag(options::OPT_fobjc_exceptions,
1484 options::OPT_fno_objc_exceptions,
1486 CmdArgs.push_back("-fobjc-exceptions");
1488 ShouldUseExceptionTables |=
1489 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
1492 if (types::isCXX(InputType)) {
1493 bool CXXExceptionsEnabled = ExceptionsEnabled;
1495 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1496 options::OPT_fno_cxx_exceptions,
1497 options::OPT_fexceptions,
1498 options::OPT_fno_exceptions)) {
1499 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1500 CXXExceptionsEnabled = true;
1501 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
1502 CXXExceptionsEnabled = false;
1505 if (CXXExceptionsEnabled) {
1506 CmdArgs.push_back("-fcxx-exceptions");
1508 ShouldUseExceptionTables = true;
1512 if (ShouldUseExceptionTables)
1513 CmdArgs.push_back("-fexceptions");
1516 static bool ShouldDisableAutolink(const ArgList &Args,
1517 const ToolChain &TC) {
1518 bool Default = true;
1519 if (TC.getTriple().isOSDarwin()) {
1520 // The native darwin assembler doesn't support the linker_option directives,
1521 // so we disable them if we think the .s file will be passed to it.
1522 Default = TC.useIntegratedAs();
1524 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1528 static bool ShouldDisableCFI(const ArgList &Args,
1529 const ToolChain &TC) {
1530 bool Default = true;
1531 if (TC.getTriple().isOSDarwin()) {
1532 // The native darwin assembler doesn't support cfi directives, so
1533 // we disable them if we think the .s file will be passed to it.
1534 Default = TC.useIntegratedAs();
1536 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1537 options::OPT_fno_dwarf2_cfi_asm,
1541 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1542 const ToolChain &TC) {
1543 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1544 options::OPT_fno_dwarf_directory_asm,
1545 TC.useIntegratedAs());
1546 return !UseDwarfDirectory;
1549 /// \brief Check whether the given input tree contains any compilation actions.
1550 static bool ContainsCompileAction(const Action *A) {
1551 if (isa<CompileJobAction>(A))
1554 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1555 if (ContainsCompileAction(*it))
1561 /// \brief Check if -relax-all should be passed to the internal assembler.
1562 /// This is done by default when compiling non-assembler source with -O0.
1563 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1564 bool RelaxDefault = true;
1566 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1567 RelaxDefault = A->getOption().matches(options::OPT_O0);
1570 RelaxDefault = false;
1571 for (ActionList::const_iterator it = C.getActions().begin(),
1572 ie = C.getActions().end(); it != ie; ++it) {
1573 if (ContainsCompileAction(*it)) {
1574 RelaxDefault = true;
1580 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1584 static void CollectArgsForIntegratedAssembler(Compilation &C,
1585 const ArgList &Args,
1586 ArgStringList &CmdArgs,
1588 if (UseRelaxAll(C, Args))
1589 CmdArgs.push_back("-mrelax-all");
1591 // When using an integrated assembler, translate -Wa, and -Xassembler
1593 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1594 options::OPT_Xassembler),
1595 ie = Args.filtered_end(); it != ie; ++it) {
1599 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1600 StringRef Value = A->getValue(i);
1602 if (Value == "-force_cpusubtype_ALL") {
1603 // Do nothing, this is the default and we don't support anything else.
1604 } else if (Value == "-L") {
1605 CmdArgs.push_back("-msave-temp-labels");
1606 } else if (Value == "--fatal-warnings") {
1607 CmdArgs.push_back("-mllvm");
1608 CmdArgs.push_back("-fatal-assembler-warnings");
1609 } else if (Value == "--noexecstack") {
1610 CmdArgs.push_back("-mnoexecstack");
1612 D.Diag(diag::err_drv_unsupported_option_argument)
1613 << A->getOption().getName() << Value;
1619 SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
1620 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1621 AsanZeroBaseShadow(false) {
1622 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1623 // at least once (possibly, disabled further).
1624 const Driver &D = TC.getDriver();
1625 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
1626 unsigned Add, Remove;
1627 if (!parse(D, Args, *I, Add, Remove, true))
1636 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1637 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1638 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1640 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1641 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1642 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1643 D.Diag(diag::err_drv_argument_not_allowed_with)
1644 << "-fcatch-undefined-behavior"
1645 << "-fno-sanitize-undefined-trap-on-error";
1648 // Warn about undefined sanitizer options that require runtime support.
1649 if (UbsanTrapOnError && notAllowedWithTrap()) {
1650 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1651 D.Diag(diag::err_drv_argument_not_allowed_with)
1652 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1653 << "-fcatch-undefined-behavior";
1654 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1655 options::OPT_fno_sanitize_undefined_trap_on_error,
1657 D.Diag(diag::err_drv_argument_not_allowed_with)
1658 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1659 << "-fsanitize-undefined-trap-on-error";
1662 // Only one runtime library can be used at once.
1663 bool NeedsAsan = needsAsanRt();
1664 bool NeedsTsan = needsTsanRt();
1665 bool NeedsMsan = needsMsanRt();
1666 bool NeedsLsan = needsLeakDetection();
1667 if (NeedsAsan && NeedsTsan)
1668 D.Diag(diag::err_drv_argument_not_allowed_with)
1669 << lastArgumentForKind(D, Args, NeedsAsanRt)
1670 << lastArgumentForKind(D, Args, NeedsTsanRt);
1671 if (NeedsAsan && NeedsMsan)
1672 D.Diag(diag::err_drv_argument_not_allowed_with)
1673 << lastArgumentForKind(D, Args, NeedsAsanRt)
1674 << lastArgumentForKind(D, Args, NeedsMsanRt);
1675 if (NeedsTsan && NeedsMsan)
1676 D.Diag(diag::err_drv_argument_not_allowed_with)
1677 << lastArgumentForKind(D, Args, NeedsTsanRt)
1678 << lastArgumentForKind(D, Args, NeedsMsanRt);
1679 if (NeedsLsan && NeedsTsan)
1680 D.Diag(diag::err_drv_argument_not_allowed_with)
1681 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1682 << lastArgumentForKind(D, Args, NeedsTsanRt);
1683 if (NeedsLsan && NeedsMsan)
1684 D.Diag(diag::err_drv_argument_not_allowed_with)
1685 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1686 << lastArgumentForKind(D, Args, NeedsMsanRt);
1687 // FIXME: Currenly -fsanitize=leak is silently ignored in the presence of
1688 // -fsanitize=address. Perhaps it should print an error, or perhaps
1689 // -f(-no)sanitize=leak should change whether leak detection is enabled by
1692 // If -fsanitize contains extra features of ASan, it should also
1693 // explicitly contain -fsanitize=address (probably, turned off later in the
1695 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1696 D.Diag(diag::warn_drv_unused_sanitizer)
1697 << lastArgumentForKind(D, Args, AddressFull)
1698 << "-fsanitize=address";
1700 // Parse -f(no-)sanitize-blacklist options.
1701 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1702 options::OPT_fno_sanitize_blacklist)) {
1703 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1704 std::string BLPath = BLArg->getValue();
1705 if (llvm::sys::fs::exists(BLPath))
1706 BlacklistFile = BLPath;
1708 D.Diag(diag::err_drv_no_such_file) << BLPath;
1711 // If no -fsanitize-blacklist option is specified, try to look up for
1712 // blacklist in the resource directory.
1714 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1715 llvm::sys::fs::exists(BLPath))
1716 BlacklistFile = BLPath;
1719 // Parse -f(no-)sanitize-memory-track-origins options.
1722 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1723 options::OPT_fno_sanitize_memory_track_origins,
1724 /* Default */false);
1726 // Parse -f(no-)sanitize-address-zero-base-shadow options.
1728 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1729 bool ZeroBaseShadowDefault = IsAndroid;
1730 AsanZeroBaseShadow =
1731 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1732 options::OPT_fno_sanitize_address_zero_base_shadow,
1733 ZeroBaseShadowDefault);
1734 // Zero-base shadow is a requirement on Android.
1735 if (IsAndroid && !AsanZeroBaseShadow) {
1736 D.Diag(diag::err_drv_argument_not_allowed_with)
1737 << "-fno-sanitize-address-zero-base-shadow"
1738 << lastArgumentForKind(D, Args, Address);
1743 static void addProfileRTLinux(
1744 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1745 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1746 Args.hasArg(options::OPT_fprofile_generate) ||
1747 Args.hasArg(options::OPT_fcreate_profile) ||
1748 Args.hasArg(options::OPT_coverage)))
1751 // The profile runtime is located in the Linux library directory and has name
1752 // "libclang_rt.profile-<ArchName>.a".
1753 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1754 llvm::sys::path::append(
1755 LibProfile, "lib", "linux",
1756 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1758 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1761 static void addSanitizerRTLinkFlagsLinux(
1762 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
1763 const StringRef Sanitizer, bool BeforeLibStdCXX,
1764 bool ExportSymbols = true) {
1765 // Sanitizer runtime is located in the Linux library directory and
1766 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1767 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1768 llvm::sys::path::append(
1769 LibSanitizer, "lib", "linux",
1770 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
1772 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1773 // etc.) so that the linker picks custom versions of the global 'operator
1774 // new' and 'operator delete' symbols. We take the extreme (but simple)
1775 // strategy of inserting it at the front of the link command. It also
1776 // needs to be forced to end up in the executable, so wrap it in
1778 SmallVector<const char *, 3> LibSanitizerArgs;
1779 LibSanitizerArgs.push_back("-whole-archive");
1780 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1781 LibSanitizerArgs.push_back("-no-whole-archive");
1783 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1784 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1786 CmdArgs.push_back("-lpthread");
1787 CmdArgs.push_back("-lrt");
1788 CmdArgs.push_back("-ldl");
1790 // If possible, use a dynamic symbols file to export the symbols from the
1791 // runtime library. If we can't do so, use -export-dynamic instead to export
1792 // all symbols from the binary.
1793 if (ExportSymbols) {
1794 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1796 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1798 CmdArgs.push_back("-export-dynamic");
1802 /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1803 /// This needs to be called before we add the C run-time (malloc, etc).
1804 static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
1805 ArgStringList &CmdArgs) {
1806 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
1807 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1808 llvm::sys::path::append(LibAsan, "lib", "linux",
1809 (Twine("libclang_rt.asan-") +
1810 TC.getArchName() + "-android.so"));
1811 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
1813 if (!Args.hasArg(options::OPT_shared))
1814 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
1818 /// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1819 /// This needs to be called before we add the C run-time (malloc, etc).
1820 static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1821 ArgStringList &CmdArgs) {
1822 if (!Args.hasArg(options::OPT_shared))
1823 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
1826 /// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1827 /// This needs to be called before we add the C run-time (malloc, etc).
1828 static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1829 ArgStringList &CmdArgs) {
1830 if (!Args.hasArg(options::OPT_shared))
1831 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
1834 /// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1835 /// This needs to be called before we add the C run-time (malloc, etc).
1836 static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1837 ArgStringList &CmdArgs) {
1838 if (!Args.hasArg(options::OPT_shared))
1839 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
1842 /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1844 static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1845 ArgStringList &CmdArgs, bool IsCXX,
1846 bool HasOtherSanitizerRt) {
1847 if (Args.hasArg(options::OPT_shared))
1850 // Need a copy of sanitizer_common. This could come from another sanitizer
1851 // runtime; if we're not including one, include our own copy.
1852 if (!HasOtherSanitizerRt)
1853 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
1855 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1857 // Only include the bits of the runtime which need a C++ ABI library if
1858 // we're linking in C++ mode.
1860 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
1863 static bool shouldUseFramePointer(const ArgList &Args,
1864 const llvm::Triple &Triple) {
1865 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1866 options::OPT_fomit_frame_pointer))
1867 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1869 // Don't use a frame pointer on linux x86, x86_64 and z if optimizing.
1870 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1871 Triple.getArch() == llvm::Triple::x86 ||
1872 Triple.getArch() == llvm::Triple::systemz) &&
1873 Triple.getOS() == llvm::Triple::Linux) {
1874 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1875 if (!A->getOption().matches(options::OPT_O0))
1882 static bool shouldUseLeafFramePointer(const ArgList &Args,
1883 const llvm::Triple &Triple) {
1884 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1885 options::OPT_momit_leaf_frame_pointer))
1886 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1888 // Don't use a leaf frame pointer on linux x86, x86_64 and z if optimizing.
1889 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1890 Triple.getArch() == llvm::Triple::x86 ||
1891 Triple.getArch() == llvm::Triple::systemz) &&
1892 Triple.getOS() == llvm::Triple::Linux) {
1893 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1894 if (!A->getOption().matches(options::OPT_O0))
1901 /// If the PWD environment variable is set, add a CC1 option to specify the
1902 /// debug compilation directory.
1903 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1904 const char *pwd = ::getenv("PWD");
1908 llvm::sys::fs::file_status PWDStatus, DotStatus;
1909 if (llvm::sys::path::is_absolute(pwd) &&
1910 !llvm::sys::fs::status(pwd, PWDStatus) &&
1911 !llvm::sys::fs::status(".", DotStatus) &&
1912 PWDStatus.getUniqueID() == DotStatus.getUniqueID()) {
1913 CmdArgs.push_back("-fdebug-compilation-dir");
1914 CmdArgs.push_back(Args.MakeArgString(pwd));
1918 // Fall back to using getcwd.
1919 SmallString<128> cwd;
1920 if (!llvm::sys::fs::current_path(cwd)) {
1921 CmdArgs.push_back("-fdebug-compilation-dir");
1922 CmdArgs.push_back(Args.MakeArgString(cwd));
1926 static const char *SplitDebugName(const ArgList &Args,
1927 const InputInfoList &Inputs) {
1928 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1929 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1930 SmallString<128> T(FinalOutput->getValue());
1931 llvm::sys::path::replace_extension(T, "dwo");
1932 return Args.MakeArgString(T);
1934 // Use the compilation dir.
1935 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1936 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1937 llvm::sys::path::replace_extension(F, "dwo");
1939 return Args.MakeArgString(F);
1943 static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1944 const Tool &T, const JobAction &JA,
1945 const ArgList &Args, const InputInfo &Output,
1946 const char *OutFile) {
1947 ArgStringList ExtractArgs;
1948 ExtractArgs.push_back("--extract-dwo");
1950 ArgStringList StripArgs;
1951 StripArgs.push_back("--strip-dwo");
1953 // Grabbing the output of the earlier compile step.
1954 StripArgs.push_back(Output.getFilename());
1955 ExtractArgs.push_back(Output.getFilename());
1956 ExtractArgs.push_back(OutFile);
1959 Args.MakeArgString(TC.GetProgramPath("objcopy"));
1961 // First extract the dwo sections.
1962 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
1964 // Then remove them from the original .o file.
1965 C.addCommand(new Command(JA, T, Exec, StripArgs));
1968 static bool isOptimizationLevelFast(const ArgList &Args) {
1969 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1970 if (A->getOption().matches(options::OPT_Ofast))
1975 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
1976 const InputInfo &Output,
1977 const InputInfoList &Inputs,
1978 const ArgList &Args,
1979 const char *LinkingOutput) const {
1980 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1981 options::OPT_fapple_kext);
1982 const Driver &D = getToolChain().getDriver();
1983 ArgStringList CmdArgs;
1985 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1987 // Invoke ourselves in -cc1 mode.
1989 // FIXME: Implement custom jobs for internal actions.
1990 CmdArgs.push_back("-cc1");
1992 // Add the "effective" target triple.
1993 CmdArgs.push_back("-triple");
1994 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1995 CmdArgs.push_back(Args.MakeArgString(TripleStr));
1997 // Select the appropriate action.
1998 RewriteKind rewriteKind = RK_None;
2000 if (isa<AnalyzeJobAction>(JA)) {
2001 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2002 CmdArgs.push_back("-analyze");
2003 } else if (isa<MigrateJobAction>(JA)) {
2004 CmdArgs.push_back("-migrate");
2005 } else if (isa<PreprocessJobAction>(JA)) {
2006 if (Output.getType() == types::TY_Dependencies)
2007 CmdArgs.push_back("-Eonly");
2009 CmdArgs.push_back("-E");
2010 if (Args.hasArg(options::OPT_rewrite_objc) &&
2011 !Args.hasArg(options::OPT_g_Group))
2012 CmdArgs.push_back("-P");
2014 } else if (isa<AssembleJobAction>(JA)) {
2015 CmdArgs.push_back("-emit-obj");
2017 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
2019 // Also ignore explicit -force_cpusubtype_ALL option.
2020 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
2021 } else if (isa<PrecompileJobAction>(JA)) {
2022 // Use PCH if the user requested it.
2023 bool UsePCH = D.CCCUsePCH;
2025 if (JA.getType() == types::TY_Nothing)
2026 CmdArgs.push_back("-fsyntax-only");
2028 CmdArgs.push_back("-emit-pch");
2030 CmdArgs.push_back("-emit-pth");
2032 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
2034 if (JA.getType() == types::TY_Nothing) {
2035 CmdArgs.push_back("-fsyntax-only");
2036 } else if (JA.getType() == types::TY_LLVM_IR ||
2037 JA.getType() == types::TY_LTO_IR) {
2038 CmdArgs.push_back("-emit-llvm");
2039 } else if (JA.getType() == types::TY_LLVM_BC ||
2040 JA.getType() == types::TY_LTO_BC) {
2041 CmdArgs.push_back("-emit-llvm-bc");
2042 } else if (JA.getType() == types::TY_PP_Asm) {
2043 CmdArgs.push_back("-S");
2044 } else if (JA.getType() == types::TY_AST) {
2045 CmdArgs.push_back("-emit-pch");
2046 } else if (JA.getType() == types::TY_ModuleFile) {
2047 CmdArgs.push_back("-module-file-info");
2048 } else if (JA.getType() == types::TY_RewrittenObjC) {
2049 CmdArgs.push_back("-rewrite-objc");
2050 rewriteKind = RK_NonFragile;
2051 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2052 CmdArgs.push_back("-rewrite-objc");
2053 rewriteKind = RK_Fragile;
2055 assert(JA.getType() == types::TY_PP_Asm &&
2056 "Unexpected output type!");
2060 // The make clang go fast button.
2061 CmdArgs.push_back("-disable-free");
2063 // Disable the verification pass in -asserts builds.
2065 CmdArgs.push_back("-disable-llvm-verifier");
2068 // Set the main file name, so that debug info works even with
2070 CmdArgs.push_back("-main-file-name");
2071 CmdArgs.push_back(getBaseInputName(Args, Inputs));
2073 // Some flags which affect the language (via preprocessor
2075 if (Args.hasArg(options::OPT_static))
2076 CmdArgs.push_back("-static-define");
2078 if (isa<AnalyzeJobAction>(JA)) {
2079 // Enable region store model by default.
2080 CmdArgs.push_back("-analyzer-store=region");
2082 // Treat blocks as analysis entry points.
2083 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2085 CmdArgs.push_back("-analyzer-eagerly-assume");
2087 // Add default argument set.
2088 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
2089 CmdArgs.push_back("-analyzer-checker=core");
2091 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2092 CmdArgs.push_back("-analyzer-checker=unix");
2094 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
2095 CmdArgs.push_back("-analyzer-checker=osx");
2097 CmdArgs.push_back("-analyzer-checker=deadcode");
2099 if (types::isCXX(Inputs[0].getType()))
2100 CmdArgs.push_back("-analyzer-checker=cplusplus");
2102 // Enable the following experimental checkers for testing.
2103 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2104 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2105 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2106 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2107 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2108 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
2111 // Set the output format. The default is plist, for (lame) historical
2113 CmdArgs.push_back("-analyzer-output");
2114 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
2115 CmdArgs.push_back(A->getValue());
2117 CmdArgs.push_back("plist");
2119 // Disable the presentation of standard compiler warnings when
2120 // using --analyze. We only want to show static analyzer diagnostics
2121 // or frontend errors.
2122 CmdArgs.push_back("-w");
2124 // Add -Xanalyzer arguments when running as analyzer.
2125 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
2128 CheckCodeGenerationOptions(D, Args);
2130 bool PIE = getToolChain().isPIEDefault();
2131 bool PIC = PIE || getToolChain().isPICDefault();
2132 bool IsPICLevelTwo = PIC;
2134 // For the PIC and PIE flag options, this logic is different from the
2135 // legacy logic in very old versions of GCC, as that logic was just
2136 // a bug no one had ever fixed. This logic is both more rational and
2137 // consistent with GCC's new logic now that the bugs are fixed. The last
2138 // argument relating to either PIC or PIE wins, and no other argument is
2139 // used. If the last argument is any flavor of the '-fno-...' arguments,
2140 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2141 // at the same level.
2142 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2143 options::OPT_fpic, options::OPT_fno_pic,
2144 options::OPT_fPIE, options::OPT_fno_PIE,
2145 options::OPT_fpie, options::OPT_fno_pie);
2146 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2147 // is forced, then neither PIC nor PIE flags will have no effect.
2148 if (!getToolChain().isPICDefaultForced()) {
2150 Option O = LastPICArg->getOption();
2151 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2152 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2153 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2154 PIC = PIE || O.matches(options::OPT_fPIC) ||
2155 O.matches(options::OPT_fpic);
2156 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2157 O.matches(options::OPT_fPIC);
2164 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2165 // specified while enabling PIC enabled level 1 PIC, just force it back to
2166 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2167 // informal testing).
2168 if (PIC && getToolChain().getTriple().isOSDarwin())
2169 IsPICLevelTwo |= getToolChain().isPICDefault();
2171 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2172 // PIC or PIE options above, if these show up, PIC is disabled.
2173 llvm::Triple Triple(TripleStr);
2175 (Triple.getOS() != llvm::Triple::IOS ||
2176 Triple.isOSVersionLT(6)))
2178 if (Args.hasArg(options::OPT_static))
2181 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2182 // This is a very special mode. It trumps the other modes, almost no one
2183 // uses it, and it isn't even valid on any OS but Darwin.
2184 if (!getToolChain().getTriple().isOSDarwin())
2185 D.Diag(diag::err_drv_unsupported_opt_for_target)
2186 << A->getSpelling() << getToolChain().getTriple().str();
2188 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2190 CmdArgs.push_back("-mrelocation-model");
2191 CmdArgs.push_back("dynamic-no-pic");
2193 // Only a forced PIC mode can cause the actual compile to have PIC defines
2194 // etc., no flags are sufficient. This behavior was selected to closely
2195 // match that of llvm-gcc and Apple GCC before that.
2196 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2197 CmdArgs.push_back("-pic-level");
2198 CmdArgs.push_back("2");
2201 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2202 // handled in Clang's IRGen by the -pie-level flag.
2203 CmdArgs.push_back("-mrelocation-model");
2204 CmdArgs.push_back(PIC ? "pic" : "static");
2207 CmdArgs.push_back("-pic-level");
2208 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2210 CmdArgs.push_back("-pie-level");
2211 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2216 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2217 options::OPT_fno_merge_all_constants))
2218 CmdArgs.push_back("-fno-merge-all-constants");
2220 // LLVM Code Generator Options.
2222 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2223 CmdArgs.push_back("-mregparm");
2224 CmdArgs.push_back(A->getValue());
2227 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2228 options::OPT_freg_struct_return)) {
2229 if (getToolChain().getArch() != llvm::Triple::x86) {
2230 D.Diag(diag::err_drv_unsupported_opt_for_target)
2231 << A->getSpelling() << getToolChain().getTriple().str();
2232 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2233 CmdArgs.push_back("-fpcc-struct-return");
2235 assert(A->getOption().matches(options::OPT_freg_struct_return));
2236 CmdArgs.push_back("-freg-struct-return");
2240 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2241 CmdArgs.push_back("-mrtd");
2243 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
2244 CmdArgs.push_back("-mdisable-fp-elim");
2245 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2246 options::OPT_fno_zero_initialized_in_bss))
2247 CmdArgs.push_back("-mno-zero-initialized-in-bss");
2249 bool OFastEnabled = isOptimizationLevelFast(Args);
2250 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2251 // enabled. This alias option is being used to simplify the hasFlag logic.
2252 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2253 options::OPT_fstrict_aliasing;
2254 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
2255 options::OPT_fno_strict_aliasing,
2256 getToolChain().IsStrictAliasingDefault()))
2257 CmdArgs.push_back("-relaxed-aliasing");
2258 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2259 CmdArgs.push_back("-struct-path-tbaa");
2260 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2262 CmdArgs.push_back("-fstrict-enums");
2263 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2264 options::OPT_fno_optimize_sibling_calls))
2265 CmdArgs.push_back("-mdisable-tail-calls");
2267 // Handle segmented stacks.
2268 if (Args.hasArg(options::OPT_fsplit_stack))
2269 CmdArgs.push_back("-split-stacks");
2271 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2272 // This alias option is being used to simplify the getLastArg logic.
2273 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2274 options::OPT_ffast_math;
2276 // Handle various floating point optimization flags, mapping them to the
2277 // appropriate LLVM code generation flags. The pattern for all of these is to
2278 // default off the codegen optimizations, and if any flag enables them and no
2279 // flag disables them after the flag enabling them, enable the codegen
2280 // optimization. This is complicated by several "umbrella" flags.
2281 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2282 options::OPT_fno_fast_math,
2283 options::OPT_ffinite_math_only,
2284 options::OPT_fno_finite_math_only,
2285 options::OPT_fhonor_infinities,
2286 options::OPT_fno_honor_infinities))
2287 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2288 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2289 A->getOption().getID() != options::OPT_fhonor_infinities)
2290 CmdArgs.push_back("-menable-no-infs");
2291 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2292 options::OPT_fno_fast_math,
2293 options::OPT_ffinite_math_only,
2294 options::OPT_fno_finite_math_only,
2295 options::OPT_fhonor_nans,
2296 options::OPT_fno_honor_nans))
2297 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2298 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2299 A->getOption().getID() != options::OPT_fhonor_nans)
2300 CmdArgs.push_back("-menable-no-nans");
2302 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2303 bool MathErrno = getToolChain().IsMathErrnoDefault();
2304 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2305 options::OPT_fno_fast_math,
2306 options::OPT_fmath_errno,
2307 options::OPT_fno_math_errno)) {
2308 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2309 // However, turning *off* -ffast_math merely restores the toolchain default
2310 // (which may be false).
2311 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2312 A->getOption().getID() == options::OPT_ffast_math ||
2313 A->getOption().getID() == options::OPT_Ofast)
2315 else if (A->getOption().getID() == options::OPT_fmath_errno)
2319 CmdArgs.push_back("-fmath-errno");
2321 // There are several flags which require disabling very specific
2322 // optimizations. Any of these being disabled forces us to turn off the
2323 // entire set of LLVM optimizations, so collect them through all the flag
2325 bool AssociativeMath = false;
2326 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2327 options::OPT_fno_fast_math,
2328 options::OPT_funsafe_math_optimizations,
2329 options::OPT_fno_unsafe_math_optimizations,
2330 options::OPT_fassociative_math,
2331 options::OPT_fno_associative_math))
2332 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2333 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2334 A->getOption().getID() != options::OPT_fno_associative_math)
2335 AssociativeMath = true;
2336 bool ReciprocalMath = false;
2337 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2338 options::OPT_fno_fast_math,
2339 options::OPT_funsafe_math_optimizations,
2340 options::OPT_fno_unsafe_math_optimizations,
2341 options::OPT_freciprocal_math,
2342 options::OPT_fno_reciprocal_math))
2343 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2344 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2345 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2346 ReciprocalMath = true;
2347 bool SignedZeros = true;
2348 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2349 options::OPT_fno_fast_math,
2350 options::OPT_funsafe_math_optimizations,
2351 options::OPT_fno_unsafe_math_optimizations,
2352 options::OPT_fsigned_zeros,
2353 options::OPT_fno_signed_zeros))
2354 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2355 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2356 A->getOption().getID() != options::OPT_fsigned_zeros)
2357 SignedZeros = false;
2358 bool TrappingMath = true;
2359 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2360 options::OPT_fno_fast_math,
2361 options::OPT_funsafe_math_optimizations,
2362 options::OPT_fno_unsafe_math_optimizations,
2363 options::OPT_ftrapping_math,
2364 options::OPT_fno_trapping_math))
2365 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2366 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2367 A->getOption().getID() != options::OPT_ftrapping_math)
2368 TrappingMath = false;
2369 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2371 CmdArgs.push_back("-menable-unsafe-fp-math");
2374 // Validate and pass through -fp-contract option.
2375 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2376 options::OPT_fno_fast_math,
2377 options::OPT_ffp_contract)) {
2378 if (A->getOption().getID() == options::OPT_ffp_contract) {
2379 StringRef Val = A->getValue();
2380 if (Val == "fast" || Val == "on" || Val == "off") {
2381 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2383 D.Diag(diag::err_drv_unsupported_option_argument)
2384 << A->getOption().getName() << Val;
2386 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2387 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
2388 // If fast-math is set then set the fp-contract mode to fast.
2389 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2393 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2394 // and if we find them, tell the frontend to provide the appropriate
2395 // preprocessor macros. This is distinct from enabling any optimizations as
2396 // these options induce language changes which must survive serialization
2397 // and deserialization, etc.
2398 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2399 options::OPT_fno_fast_math))
2400 if (!A->getOption().matches(options::OPT_fno_fast_math))
2401 CmdArgs.push_back("-ffast-math");
2402 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2403 if (A->getOption().matches(options::OPT_ffinite_math_only))
2404 CmdArgs.push_back("-ffinite-math-only");
2406 // Decide whether to use verbose asm. Verbose assembly is the default on
2407 // toolchains which have the integrated assembler on by default.
2408 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2409 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
2410 IsVerboseAsmDefault) ||
2411 Args.hasArg(options::OPT_dA))
2412 CmdArgs.push_back("-masm-verbose");
2414 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2415 CmdArgs.push_back("-mdebug-pass");
2416 CmdArgs.push_back("Structure");
2418 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2419 CmdArgs.push_back("-mdebug-pass");
2420 CmdArgs.push_back("Arguments");
2423 // Enable -mconstructor-aliases except on darwin, where we have to
2424 // work around a linker bug; see <rdar://problem/7651567>.
2425 if (!getToolChain().getTriple().isOSDarwin())
2426 CmdArgs.push_back("-mconstructor-aliases");
2428 // Darwin's kernel doesn't support guard variables; just die if we
2430 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
2431 CmdArgs.push_back("-fforbid-guard-variables");
2433 if (Args.hasArg(options::OPT_mms_bitfields)) {
2434 CmdArgs.push_back("-mms-bitfields");
2437 // This is a coarse approximation of what llvm-gcc actually does, both
2438 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2439 // complicated ways.
2440 bool AsynchronousUnwindTables =
2441 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2442 options::OPT_fno_asynchronous_unwind_tables,
2443 getToolChain().IsUnwindTablesDefault() &&
2445 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2446 AsynchronousUnwindTables))
2447 CmdArgs.push_back("-munwind-tables");
2449 getToolChain().addClangTargetOptions(Args, CmdArgs);
2451 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2452 CmdArgs.push_back("-mlimit-float-precision");
2453 CmdArgs.push_back(A->getValue());
2456 // FIXME: Handle -mtune=.
2457 (void) Args.hasArg(options::OPT_mtune_EQ);
2459 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2460 CmdArgs.push_back("-mcode-model");
2461 CmdArgs.push_back(A->getValue());
2464 // Add target specific cpu and features flags.
2465 switch(getToolChain().getArch()) {
2469 case llvm::Triple::arm:
2470 case llvm::Triple::thumb:
2471 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2474 case llvm::Triple::mips:
2475 case llvm::Triple::mipsel:
2476 case llvm::Triple::mips64:
2477 case llvm::Triple::mips64el:
2478 AddMIPSTargetArgs(Args, CmdArgs);
2481 case llvm::Triple::ppc:
2482 case llvm::Triple::ppc64:
2483 case llvm::Triple::ppc64le:
2484 AddPPCTargetArgs(Args, CmdArgs);
2487 case llvm::Triple::r600:
2488 AddR600TargetArgs(Args, CmdArgs);
2491 case llvm::Triple::sparc:
2492 AddSparcTargetArgs(Args, CmdArgs);
2495 case llvm::Triple::systemz:
2496 AddSystemZTargetArgs(Args, CmdArgs);
2499 case llvm::Triple::x86:
2500 case llvm::Triple::x86_64:
2501 AddX86TargetArgs(Args, CmdArgs);
2504 case llvm::Triple::hexagon:
2505 AddHexagonTargetArgs(Args, CmdArgs);
2508 case llvm::Triple::aarch64:
2509 AddAArch64TargetArgs(Args, CmdArgs);
2513 // Pass the linker version in use.
2514 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2515 CmdArgs.push_back("-target-linker-version");
2516 CmdArgs.push_back(A->getValue());
2519 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
2520 CmdArgs.push_back("-momit-leaf-frame-pointer");
2522 // Explicitly error on some things we know we don't support and can't just
2524 types::ID InputType = Inputs[0].getType();
2525 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2527 if (types::isCXX(InputType) &&
2528 getToolChain().getTriple().isOSDarwin() &&
2529 getToolChain().getArch() == llvm::Triple::x86) {
2530 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2531 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
2532 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
2533 << Unsupported->getOption().getName();
2537 Args.AddAllArgs(CmdArgs, options::OPT_v);
2538 Args.AddLastArg(CmdArgs, options::OPT_H);
2539 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
2540 CmdArgs.push_back("-header-include-file");
2541 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2542 D.CCPrintHeadersFilename : "-");
2544 Args.AddLastArg(CmdArgs, options::OPT_P);
2545 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
2547 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2548 CmdArgs.push_back("-diagnostic-log-file");
2549 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2550 D.CCLogDiagnosticsFilename : "-");
2553 // Use the last option from "-g" group. "-gline-tables-only"
2554 // is preserved, all other debug options are substituted with "-g".
2555 Args.ClaimAllArgs(options::OPT_g_Group);
2556 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2557 if (A->getOption().matches(options::OPT_gline_tables_only))
2558 CmdArgs.push_back("-gline-tables-only");
2559 else if (A->getOption().matches(options::OPT_gdwarf_2))
2560 CmdArgs.push_back("-gdwarf-2");
2561 else if (A->getOption().matches(options::OPT_gdwarf_3))
2562 CmdArgs.push_back("-gdwarf-3");
2563 else if (A->getOption().matches(options::OPT_gdwarf_4))
2564 CmdArgs.push_back("-gdwarf-4");
2565 else if (!A->getOption().matches(options::OPT_g0) &&
2566 !A->getOption().matches(options::OPT_ggdb0)) {
2567 // Default is dwarf-2 for darwin.
2568 if (getToolChain().getTriple().isOSDarwin())
2569 CmdArgs.push_back("-gdwarf-2");
2571 CmdArgs.push_back("-g");
2575 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2576 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2577 if (Args.hasArg(options::OPT_gcolumn_info))
2578 CmdArgs.push_back("-dwarf-column-info");
2580 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2581 // splitting and extraction.
2582 // FIXME: Currently only works on Linux.
2583 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2584 Args.hasArg(options::OPT_gsplit_dwarf)) {
2585 CmdArgs.push_back("-g");
2586 CmdArgs.push_back("-backend-option");
2587 CmdArgs.push_back("-split-dwarf=Enable");
2591 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2593 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2594 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2596 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2598 if (Args.hasArg(options::OPT_ftest_coverage) ||
2599 Args.hasArg(options::OPT_coverage))
2600 CmdArgs.push_back("-femit-coverage-notes");
2601 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2602 Args.hasArg(options::OPT_coverage))
2603 CmdArgs.push_back("-femit-coverage-data");
2605 if (C.getArgs().hasArg(options::OPT_c) ||
2606 C.getArgs().hasArg(options::OPT_S)) {
2607 if (Output.isFilename()) {
2608 CmdArgs.push_back("-coverage-file");
2609 SmallString<128> CoverageFilename(Output.getFilename());
2610 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2611 if (const char *pwd = ::getenv("PWD")) {
2612 if (llvm::sys::path::is_absolute(pwd)) {
2613 SmallString<128> Pwd(pwd);
2614 llvm::sys::path::append(Pwd, CoverageFilename.str());
2615 CoverageFilename.swap(Pwd);
2619 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2623 // Pass options for controlling the default header search paths.
2624 if (Args.hasArg(options::OPT_nostdinc)) {
2625 CmdArgs.push_back("-nostdsysteminc");
2626 CmdArgs.push_back("-nobuiltininc");
2628 if (Args.hasArg(options::OPT_nostdlibinc))
2629 CmdArgs.push_back("-nostdsysteminc");
2630 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2631 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2634 // Pass the path to compiler resource files.
2635 CmdArgs.push_back("-resource-dir");
2636 CmdArgs.push_back(D.ResourceDir.c_str());
2638 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2640 bool ARCMTEnabled = false;
2641 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
2642 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
2643 options::OPT_ccc_arcmt_modify,
2644 options::OPT_ccc_arcmt_migrate)) {
2645 ARCMTEnabled = true;
2646 switch (A->getOption().getID()) {
2648 llvm_unreachable("missed a case");
2649 case options::OPT_ccc_arcmt_check:
2650 CmdArgs.push_back("-arcmt-check");
2652 case options::OPT_ccc_arcmt_modify:
2653 CmdArgs.push_back("-arcmt-modify");
2655 case options::OPT_ccc_arcmt_migrate:
2656 CmdArgs.push_back("-arcmt-migrate");
2657 CmdArgs.push_back("-mt-migrate-directory");
2658 CmdArgs.push_back(A->getValue());
2660 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2661 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
2666 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2667 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2668 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
2671 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2673 D.Diag(diag::err_drv_argument_not_allowed_with)
2674 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2676 CmdArgs.push_back("-mt-migrate-directory");
2677 CmdArgs.push_back(A->getValue());
2679 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2680 options::OPT_objcmt_migrate_subscripting,
2681 options::OPT_objcmt_migrate_property)) {
2682 // None specified, means enable them all.
2683 CmdArgs.push_back("-objcmt-migrate-literals");
2684 CmdArgs.push_back("-objcmt-migrate-subscripting");
2685 CmdArgs.push_back("-objcmt-migrate-property");
2687 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2688 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2689 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2693 // Add preprocessing options like -I, -D, etc. if we are using the
2696 // FIXME: Support -fpreprocessed
2697 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
2698 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
2700 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2701 // that "The compiler can only warn and ignore the option if not recognized".
2702 // When building with ccache, it will pass -D options to clang even on
2703 // preprocessed inputs and configure concludes that -fPIC is not supported.
2704 Args.ClaimAllArgs(options::OPT_D);
2706 // Manually translate -O4 to -O3; let clang reject others.
2707 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2708 if (A->getOption().matches(options::OPT_O4))
2709 CmdArgs.push_back("-O3");
2711 A->render(Args, CmdArgs);
2714 // Don't warn about unused -flto. This can happen when we're preprocessing or
2716 Args.ClaimAllArgs(options::OPT_flto);
2718 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
2719 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2720 CmdArgs.push_back("-pedantic");
2721 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
2722 Args.AddLastArg(CmdArgs, options::OPT_w);
2724 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2725 // (-ansi is equivalent to -std=c89 or -std=c++98).
2727 // If a std is supplied, only add -trigraphs if it follows the
2729 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2730 if (Std->getOption().matches(options::OPT_ansi))
2731 if (types::isCXX(InputType))
2732 CmdArgs.push_back("-std=c++98");
2734 CmdArgs.push_back("-std=c89");
2736 Std->render(Args, CmdArgs);
2738 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2739 options::OPT_trigraphs))
2741 A->render(Args, CmdArgs);
2743 // Honor -std-default.
2745 // FIXME: Clang doesn't correctly handle -std= when the input language
2746 // doesn't match. For the time being just ignore this for C++ inputs;
2747 // eventually we want to do all the standard defaulting here instead of
2748 // splitting it between the driver and clang -cc1.
2749 if (!types::isCXX(InputType))
2750 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2751 "-std=", /*Joined=*/true);
2752 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2753 CmdArgs.push_back("-std=c++11");
2755 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
2758 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2759 // '-fconst-strings'; this better indicates its actual behavior.
2760 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2762 // For perfect compatibility with GCC, we do this even in the presence of
2763 // '-w'. This flag names something other than a warning for GCC.
2764 CmdArgs.push_back("-fconst-strings");
2767 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
2768 // during C++ compilation, which it is by default. GCC keeps this define even
2769 // in the presence of '-w', match this behavior bug-for-bug.
2770 if (types::isCXX(InputType) &&
2771 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2773 CmdArgs.push_back("-fdeprecated-macro");
2776 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2777 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2778 if (Asm->getOption().matches(options::OPT_fasm))
2779 CmdArgs.push_back("-fgnu-keywords");
2781 CmdArgs.push_back("-fno-gnu-keywords");
2784 if (ShouldDisableCFI(Args, getToolChain()))
2785 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2787 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2788 CmdArgs.push_back("-fno-dwarf-directory-asm");
2790 if (ShouldDisableAutolink(Args, getToolChain()))
2791 CmdArgs.push_back("-fno-autolink");
2793 // Add in -fdebug-compilation-dir if necessary.
2794 addDebugCompDirArg(Args, CmdArgs);
2796 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2797 options::OPT_ftemplate_depth_EQ)) {
2798 CmdArgs.push_back("-ftemplate-depth");
2799 CmdArgs.push_back(A->getValue());
2802 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2803 CmdArgs.push_back("-fconstexpr-depth");
2804 CmdArgs.push_back(A->getValue());
2807 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2808 CmdArgs.push_back("-fconstexpr-steps");
2809 CmdArgs.push_back(A->getValue());
2812 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2813 CmdArgs.push_back("-fbracket-depth");
2814 CmdArgs.push_back(A->getValue());
2817 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2818 options::OPT_Wlarge_by_value_copy_def)) {
2819 if (A->getNumValues()) {
2820 StringRef bytes = A->getValue();
2821 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2823 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
2827 if (Args.hasArg(options::OPT_relocatable_pch))
2828 CmdArgs.push_back("-relocatable-pch");
2830 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2831 CmdArgs.push_back("-fconstant-string-class");
2832 CmdArgs.push_back(A->getValue());
2835 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2836 CmdArgs.push_back("-ftabstop");
2837 CmdArgs.push_back(A->getValue());
2840 CmdArgs.push_back("-ferror-limit");
2841 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2842 CmdArgs.push_back(A->getValue());
2844 CmdArgs.push_back("19");
2846 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2847 CmdArgs.push_back("-fmacro-backtrace-limit");
2848 CmdArgs.push_back(A->getValue());
2851 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2852 CmdArgs.push_back("-ftemplate-backtrace-limit");
2853 CmdArgs.push_back(A->getValue());
2856 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2857 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2858 CmdArgs.push_back(A->getValue());
2861 // Pass -fmessage-length=.
2862 CmdArgs.push_back("-fmessage-length");
2863 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
2864 CmdArgs.push_back(A->getValue());
2866 // If -fmessage-length=N was not specified, determine whether this is a
2867 // terminal and, if so, implicitly define -fmessage-length appropriately.
2868 unsigned N = llvm::sys::Process::StandardErrColumns();
2869 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
2872 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2873 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2874 options::OPT_fvisibility_ms_compat)) {
2875 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2876 CmdArgs.push_back("-fvisibility");
2877 CmdArgs.push_back(A->getValue());
2879 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2880 CmdArgs.push_back("-fvisibility");
2881 CmdArgs.push_back("hidden");
2882 CmdArgs.push_back("-ftype-visibility");
2883 CmdArgs.push_back("default");
2887 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
2889 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2891 // -fhosted is default.
2892 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2894 CmdArgs.push_back("-ffreestanding");
2896 // Forward -f (flag) options which we can pass directly.
2897 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
2898 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
2899 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
2900 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
2901 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
2902 // AltiVec language extensions aren't relevant for assembling.
2903 if (!isa<PreprocessJobAction>(JA) ||
2904 Output.getType() != types::TY_PP_Asm)
2905 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
2906 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2907 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
2909 SanitizerArgs Sanitize(getToolChain(), Args);
2910 Sanitize.addArgs(Args, CmdArgs);
2912 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2913 options::OPT_fno_sanitize_recover,
2915 CmdArgs.push_back("-fno-sanitize-recover");
2917 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2918 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2919 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2920 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2922 // Report an error for -faltivec on anything other than PowerPC.
2923 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2924 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
2925 getToolChain().getArch() == llvm::Triple::ppc64 ||
2926 getToolChain().getArch() == llvm::Triple::ppc64le))
2927 D.Diag(diag::err_drv_argument_only_allowed_with)
2928 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
2930 if (getToolChain().SupportsProfiling())
2931 Args.AddLastArg(CmdArgs, options::OPT_pg);
2933 // -flax-vector-conversions is default.
2934 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2935 options::OPT_fno_lax_vector_conversions))
2936 CmdArgs.push_back("-fno-lax-vector-conversions");
2938 if (Args.getLastArg(options::OPT_fapple_kext))
2939 CmdArgs.push_back("-fapple-kext");
2941 if (Args.hasFlag(options::OPT_frewrite_includes,
2942 options::OPT_fno_rewrite_includes, false))
2943 CmdArgs.push_back("-frewrite-includes");
2945 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
2946 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
2947 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
2948 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2949 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
2951 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2952 CmdArgs.push_back("-ftrapv-handler");
2953 CmdArgs.push_back(A->getValue());
2956 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
2958 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2959 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2960 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2961 options::OPT_fno_wrapv)) {
2962 if (A->getOption().matches(options::OPT_fwrapv))
2963 CmdArgs.push_back("-fwrapv");
2964 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2965 options::OPT_fno_strict_overflow)) {
2966 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2967 CmdArgs.push_back("-fwrapv");
2969 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
2970 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
2972 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2975 // -stack-protector=0 is default.
2976 unsigned StackProtectorLevel = 0;
2977 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2978 options::OPT_fstack_protector_all,
2979 options::OPT_fstack_protector)) {
2980 if (A->getOption().matches(options::OPT_fstack_protector))
2981 StackProtectorLevel = 1;
2982 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2983 StackProtectorLevel = 2;
2985 StackProtectorLevel =
2986 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2988 if (StackProtectorLevel) {
2989 CmdArgs.push_back("-stack-protector");
2990 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
2993 // --param ssp-buffer-size=
2994 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2995 ie = Args.filtered_end(); it != ie; ++it) {
2996 StringRef Str((*it)->getValue());
2997 if (Str.startswith("ssp-buffer-size=")) {
2998 if (StackProtectorLevel) {
2999 CmdArgs.push_back("-stack-protector-buffer-size");
3000 // FIXME: Verify the argument is a valid integer.
3001 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
3007 // Translate -mstackrealign
3008 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3010 CmdArgs.push_back("-backend-option");
3011 CmdArgs.push_back("-force-align-stack");
3013 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3015 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3018 if (Args.hasArg(options::OPT_mstack_alignment)) {
3019 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3020 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
3022 // -mkernel implies -mstrict-align; don't add the redundant option.
3023 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
3024 CmdArgs.push_back("-backend-option");
3025 CmdArgs.push_back("-arm-strict-align");
3028 // Forward -f options with positive and negative forms; we translate
3031 if (Args.hasArg(options::OPT_mkernel)) {
3032 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
3033 CmdArgs.push_back("-fapple-kext");
3034 if (!Args.hasArg(options::OPT_fbuiltin))
3035 CmdArgs.push_back("-fno-builtin");
3036 Args.ClaimAllArgs(options::OPT_fno_builtin);
3038 // -fbuiltin is default.
3039 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
3040 CmdArgs.push_back("-fno-builtin");
3042 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3043 options::OPT_fno_assume_sane_operator_new))
3044 CmdArgs.push_back("-fno-assume-sane-operator-new");
3046 // -fblocks=0 is default.
3047 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
3048 getToolChain().IsBlocksDefault()) ||
3049 (Args.hasArg(options::OPT_fgnu_runtime) &&
3050 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3051 !Args.hasArg(options::OPT_fno_blocks))) {
3052 CmdArgs.push_back("-fblocks");
3054 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3055 !getToolChain().hasBlocksRuntime())
3056 CmdArgs.push_back("-fblocks-runtime-optional");
3059 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3060 // users must also pass -fcxx-modules. The latter flag will disappear once the
3061 // modules implementation is solid for C++/Objective-C++ programs as well.
3062 bool HaveModules = false;
3063 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3064 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3065 options::OPT_fno_cxx_modules,
3067 if (AllowedInCXX || !types::isCXX(InputType)) {
3068 CmdArgs.push_back("-fmodules");
3073 // If a module path was provided, pass it along. Otherwise, use a temporary
3075 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3078 A->render(Args, CmdArgs);
3080 } else if (HaveModules) {
3081 SmallString<128> DefaultModuleCache;
3082 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3083 DefaultModuleCache);
3084 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3085 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
3086 const char Arg[] = "-fmodules-cache-path=";
3087 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3088 Arg, Arg + strlen(Arg));
3089 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3092 // Pass through all -fmodules-ignore-macro arguments.
3093 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
3094 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3095 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
3097 // -faccess-control is default.
3098 if (Args.hasFlag(options::OPT_fno_access_control,
3099 options::OPT_faccess_control,
3101 CmdArgs.push_back("-fno-access-control");
3103 // -felide-constructors is the default.
3104 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3105 options::OPT_felide_constructors,
3107 CmdArgs.push_back("-fno-elide-constructors");
3109 // -frtti is default.
3110 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
3112 CmdArgs.push_back("-fno-rtti");
3114 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
3115 if (Sanitize.sanitizesVptr()) {
3116 std::string NoRttiArg =
3117 Args.getLastArg(options::OPT_mkernel,
3118 options::OPT_fapple_kext,
3119 options::OPT_fno_rtti)->getAsString(Args);
3120 D.Diag(diag::err_drv_argument_not_allowed_with)
3121 << "-fsanitize=vptr" << NoRttiArg;
3125 // -fshort-enums=0 is default for all architectures except Hexagon.
3126 if (Args.hasFlag(options::OPT_fshort_enums,
3127 options::OPT_fno_short_enums,
3128 getToolChain().getArch() ==
3129 llvm::Triple::hexagon))
3130 CmdArgs.push_back("-fshort-enums");
3132 // -fsigned-char is default.
3133 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
3134 isSignedCharDefault(getToolChain().getTriple())))
3135 CmdArgs.push_back("-fno-signed-char");
3137 // -fthreadsafe-static is default.
3138 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
3139 options::OPT_fno_threadsafe_statics))
3140 CmdArgs.push_back("-fno-threadsafe-statics");
3142 // -fuse-cxa-atexit is default.
3143 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3144 options::OPT_fno_use_cxa_atexit,
3145 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3146 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
3147 getToolChain().getArch() != llvm::Triple::hexagon) ||
3149 CmdArgs.push_back("-fno-use-cxa-atexit");
3151 // -fms-extensions=0 is default.
3152 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3153 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3154 CmdArgs.push_back("-fms-extensions");
3156 // -fms-compatibility=0 is default.
3157 if (Args.hasFlag(options::OPT_fms_compatibility,
3158 options::OPT_fno_ms_compatibility,
3159 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3160 Args.hasFlag(options::OPT_fms_extensions,
3161 options::OPT_fno_ms_extensions,
3163 CmdArgs.push_back("-fms-compatibility");
3165 // -fmsc-version=1300 is default.
3166 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3167 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3168 Args.hasArg(options::OPT_fmsc_version)) {
3169 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
3170 if (msc_ver.empty())
3171 CmdArgs.push_back("-fmsc-version=1300");
3173 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3177 // -fno-borland-extensions is default.
3178 if (Args.hasFlag(options::OPT_fborland_extensions,
3179 options::OPT_fno_borland_extensions, false))
3180 CmdArgs.push_back("-fborland-extensions");
3182 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3184 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3185 options::OPT_fno_delayed_template_parsing,
3186 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3187 CmdArgs.push_back("-fdelayed-template-parsing");
3189 // -fgnu-keywords default varies depending on language; only pass if
3191 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
3192 options::OPT_fno_gnu_keywords))
3193 A->render(Args, CmdArgs);
3195 if (Args.hasFlag(options::OPT_fgnu89_inline,
3196 options::OPT_fno_gnu89_inline,
3198 CmdArgs.push_back("-fgnu89-inline");
3200 if (Args.hasArg(options::OPT_fno_inline))
3201 CmdArgs.push_back("-fno-inline");
3203 if (Args.hasArg(options::OPT_fno_inline_functions))
3204 CmdArgs.push_back("-fno-inline-functions");
3206 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
3208 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3209 // legacy is the default.
3210 if (objcRuntime.isNonFragile()) {
3211 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3212 options::OPT_fno_objc_legacy_dispatch,
3213 objcRuntime.isLegacyDispatchDefaultForArch(
3214 getToolChain().getArch()))) {
3215 if (getToolChain().UseObjCMixedDispatch())
3216 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3218 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3222 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3223 // if the nonfragile objc abi is used.
3224 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
3225 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3228 // -fencode-extended-block-signature=1 is default.
3229 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3230 CmdArgs.push_back("-fencode-extended-block-signature");
3233 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3234 // NOTE: This logic is duplicated in ToolChains.cpp.
3235 bool ARC = isObjCAutoRefCount(Args);
3237 getToolChain().CheckObjCARC();
3239 CmdArgs.push_back("-fobjc-arc");
3241 // FIXME: It seems like this entire block, and several around it should be
3242 // wrapped in isObjC, but for now we just use it here as this is where it
3243 // was being used previously.
3244 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3245 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3246 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3248 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3251 // Allow the user to enable full exceptions code emission.
3252 // We define off for Objective-CC, on for Objective-C++.
3253 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3254 options::OPT_fno_objc_arc_exceptions,
3255 /*default*/ types::isCXX(InputType)))
3256 CmdArgs.push_back("-fobjc-arc-exceptions");
3259 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3261 if (rewriteKind != RK_None)
3262 CmdArgs.push_back("-fno-objc-infer-related-result-type");
3264 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3265 // takes precedence.
3266 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3268 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3271 D.Diag(diag::err_drv_objc_gc_arr)
3272 << GCArg->getAsString(Args);
3273 } else if (getToolChain().SupportsObjCGC()) {
3274 GCArg->render(Args, CmdArgs);
3276 // FIXME: We should move this to a hard error.
3277 D.Diag(diag::warn_drv_objc_gc_unsupported)
3278 << GCArg->getAsString(Args);
3282 // Add exception args.
3283 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
3284 KernelOrKext, objcRuntime, CmdArgs);
3286 if (getToolChain().UseSjLjExceptions())
3287 CmdArgs.push_back("-fsjlj-exceptions");
3289 // C++ "sane" operator new.
3290 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3291 options::OPT_fno_assume_sane_operator_new))
3292 CmdArgs.push_back("-fno-assume-sane-operator-new");
3294 // -fconstant-cfstrings is default, and may be subject to argument translation
3296 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3297 options::OPT_fno_constant_cfstrings) ||
3298 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3299 options::OPT_mno_constant_cfstrings))
3300 CmdArgs.push_back("-fno-constant-cfstrings");
3302 // -fshort-wchar default varies depending on platform; only
3303 // pass if specified.
3304 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3305 A->render(Args, CmdArgs);
3307 // -fno-pascal-strings is default, only pass non-default.
3308 if (Args.hasFlag(options::OPT_fpascal_strings,
3309 options::OPT_fno_pascal_strings,
3311 CmdArgs.push_back("-fpascal-strings");
3313 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3314 // -fno-pack-struct doesn't apply to -fpack-struct=.
3315 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
3316 std::string PackStructStr = "-fpack-struct=";
3317 PackStructStr += A->getValue();
3318 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
3319 } else if (Args.hasFlag(options::OPT_fpack_struct,
3320 options::OPT_fno_pack_struct, false)) {
3321 CmdArgs.push_back("-fpack-struct=1");
3325 if (!Args.hasArg(options::OPT_fcommon))
3326 CmdArgs.push_back("-fno-common");
3327 Args.ClaimAllArgs(options::OPT_fno_common);
3330 // -fcommon is default, only pass non-default.
3331 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
3332 CmdArgs.push_back("-fno-common");
3334 // -fsigned-bitfields is default, and clang doesn't yet support
3335 // -funsigned-bitfields.
3336 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
3337 options::OPT_funsigned_bitfields))
3338 D.Diag(diag::warn_drv_clang_unsupported)
3339 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3341 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3342 if (!Args.hasFlag(options::OPT_ffor_scope,
3343 options::OPT_fno_for_scope))
3344 D.Diag(diag::err_drv_clang_unsupported)
3345 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3347 // -fcaret-diagnostics is default.
3348 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3349 options::OPT_fno_caret_diagnostics, true))
3350 CmdArgs.push_back("-fno-caret-diagnostics");
3352 // -fdiagnostics-fixit-info is default, only pass non-default.
3353 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
3354 options::OPT_fno_diagnostics_fixit_info))
3355 CmdArgs.push_back("-fno-diagnostics-fixit-info");
3357 // Enable -fdiagnostics-show-option by default.
3358 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
3359 options::OPT_fno_diagnostics_show_option))
3360 CmdArgs.push_back("-fdiagnostics-show-option");
3363 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3364 CmdArgs.push_back("-fdiagnostics-show-category");
3365 CmdArgs.push_back(A->getValue());
3369 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3370 CmdArgs.push_back("-fdiagnostics-format");
3371 CmdArgs.push_back(A->getValue());
3374 if (Arg *A = Args.getLastArg(
3375 options::OPT_fdiagnostics_show_note_include_stack,
3376 options::OPT_fno_diagnostics_show_note_include_stack)) {
3377 if (A->getOption().matches(
3378 options::OPT_fdiagnostics_show_note_include_stack))
3379 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3381 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3384 // Color diagnostics are the default, unless the terminal doesn't support
3386 // Support both clang's -f[no-]color-diagnostics and gcc's
3387 // -f[no-]diagnostics-colors[=never|always|auto].
3388 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3389 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3391 const Option &O = (*it)->getOption();
3392 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3393 !O.matches(options::OPT_fdiagnostics_color) &&
3394 !O.matches(options::OPT_fno_color_diagnostics) &&
3395 !O.matches(options::OPT_fno_diagnostics_color) &&
3396 !O.matches(options::OPT_fdiagnostics_color_EQ))
3400 if (O.matches(options::OPT_fcolor_diagnostics) ||
3401 O.matches(options::OPT_fdiagnostics_color)) {
3402 ShowColors = Colors_On;
3403 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3404 O.matches(options::OPT_fno_diagnostics_color)) {
3405 ShowColors = Colors_Off;
3407 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3408 StringRef value((*it)->getValue());
3409 if (value == "always")
3410 ShowColors = Colors_On;
3411 else if (value == "never")
3412 ShowColors = Colors_Off;
3413 else if (value == "auto")
3414 ShowColors = Colors_Auto;
3416 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3417 << ("-fdiagnostics-color=" + value).str();
3420 if (ShowColors == Colors_On ||
3421 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
3422 CmdArgs.push_back("-fcolor-diagnostics");
3424 if (!Args.hasFlag(options::OPT_fshow_source_location,
3425 options::OPT_fno_show_source_location))
3426 CmdArgs.push_back("-fno-show-source-location");
3428 if (!Args.hasFlag(options::OPT_fshow_column,
3429 options::OPT_fno_show_column,
3431 CmdArgs.push_back("-fno-show-column");
3433 if (!Args.hasFlag(options::OPT_fspell_checking,
3434 options::OPT_fno_spell_checking))
3435 CmdArgs.push_back("-fno-spell-checking");
3438 // -fno-asm-blocks is default.
3439 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3441 CmdArgs.push_back("-fasm-blocks");
3443 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3444 // This alias option is being used to simplify the hasFlag logic.
3445 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3446 options::OPT_fvectorize;
3448 // -fvectorize is default.
3449 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
3450 options::OPT_fno_vectorize, true))
3451 CmdArgs.push_back("-vectorize-loops");
3453 // -fslp-vectorize is default.
3454 if (Args.hasFlag(options::OPT_fslp_vectorize,
3455 options::OPT_fno_slp_vectorize, true))
3456 CmdArgs.push_back("-vectorize-slp");
3458 // -fno-slp-vectorize-aggressive is default.
3459 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3460 options::OPT_fno_slp_vectorize_aggressive, false))
3461 CmdArgs.push_back("-vectorize-slp-aggressive");
3463 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3464 A->render(Args, CmdArgs);
3466 // -fdollars-in-identifiers default varies depending on platform and
3467 // language; only pass if specified.
3468 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
3469 options::OPT_fno_dollars_in_identifiers)) {
3470 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
3471 CmdArgs.push_back("-fdollars-in-identifiers");
3473 CmdArgs.push_back("-fno-dollars-in-identifiers");
3476 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3477 // practical purposes.
3478 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
3479 options::OPT_fno_unit_at_a_time)) {
3480 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
3481 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
3484 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3485 options::OPT_fno_apple_pragma_pack, false))
3486 CmdArgs.push_back("-fapple-pragma-pack");
3488 // le32-specific flags:
3489 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3491 if (getToolChain().getArch() == llvm::Triple::le32) {
3492 CmdArgs.push_back("-fno-math-builtin");
3495 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
3497 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
3499 if (getToolChain().getTriple().isOSDarwin() &&
3500 (getToolChain().getArch() == llvm::Triple::arm ||
3501 getToolChain().getArch() == llvm::Triple::thumb)) {
3502 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3503 CmdArgs.push_back("-fno-builtin-strcat");
3504 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3505 CmdArgs.push_back("-fno-builtin-strcpy");
3509 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
3510 if (Arg *A = Args.getLastArg(options::OPT_traditional,
3511 options::OPT_traditional_cpp)) {
3512 if (isa<PreprocessJobAction>(JA))
3513 CmdArgs.push_back("-traditional-cpp");
3515 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
3518 Args.AddLastArg(CmdArgs, options::OPT_dM);
3519 Args.AddLastArg(CmdArgs, options::OPT_dD);
3521 // Handle serialized diagnostics.
3522 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3523 CmdArgs.push_back("-serialize-diagnostic-file");
3524 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
3527 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3528 CmdArgs.push_back("-fretain-comments-from-system-headers");
3530 // Forward -fcomment-block-commands to -cc1.
3531 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
3532 // Forward -fparse-all-comments to -cc1.
3533 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
3535 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3537 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
3538 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3539 ie = Args.filtered_end(); it != ie; ++it) {
3542 // We translate this by hand to the -cc1 argument, since nightly test uses
3543 // it and developers have been trained to spell it with -mllvm.
3544 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
3545 CmdArgs.push_back("-disable-llvm-optzns");
3547 (*it)->render(Args, CmdArgs);
3550 if (Output.getType() == types::TY_Dependencies) {
3551 // Handled with other dependency code.
3552 } else if (Output.isFilename()) {
3553 CmdArgs.push_back("-o");
3554 CmdArgs.push_back(Output.getFilename());
3556 assert(Output.isNothing() && "Invalid output.");
3559 for (InputInfoList::const_iterator
3560 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3561 const InputInfo &II = *it;
3562 CmdArgs.push_back("-x");
3563 if (Args.hasArg(options::OPT_rewrite_objc))
3564 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3566 CmdArgs.push_back(types::getTypeName(II.getType()));
3567 if (II.isFilename())
3568 CmdArgs.push_back(II.getFilename());
3570 II.getInputArg().renderAsInput(Args, CmdArgs);
3573 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3575 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3577 // Optionally embed the -cc1 level arguments into the debug info, for build
3579 if (getToolChain().UseDwarfDebugFlags()) {
3580 ArgStringList OriginalArgs;
3581 for (ArgList::const_iterator it = Args.begin(),
3582 ie = Args.end(); it != ie; ++it)
3583 (*it)->render(Args, OriginalArgs);
3585 SmallString<256> Flags;
3587 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3589 Flags += OriginalArgs[i];
3591 CmdArgs.push_back("-dwarf-debug-flags");
3592 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3595 // Add the split debug info name to the command lines here so we
3596 // can propagate it to the backend.
3597 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3598 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
3599 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
3600 const char *SplitDwarfOut;
3602 CmdArgs.push_back("-split-dwarf-file");
3603 SplitDwarfOut = SplitDebugName(Args, Inputs);
3604 CmdArgs.push_back(SplitDwarfOut);
3607 // Finally add the compile command to the compilation.
3608 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3610 // Handle the debug info splitting at object creation time if we're
3611 // creating an object.
3612 // TODO: Currently only works on linux with newer objcopy.
3613 if (SplitDwarf && !isa<CompileJobAction>(JA))
3614 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
3616 if (Arg *A = Args.getLastArg(options::OPT_pg))
3617 if (Args.hasArg(options::OPT_fomit_frame_pointer))
3618 D.Diag(diag::err_drv_argument_not_allowed_with)
3619 << "-fomit-frame-pointer" << A->getAsString(Args);
3621 // Claim some arguments which clang supports automatically.
3623 // -fpch-preprocess is used with gcc to add a special marker in the output to
3624 // include the PCH file. Clang's PTH solution is completely transparent, so we
3625 // do not need to deal with it at all.
3626 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
3628 // Claim some arguments which clang doesn't support, but we don't
3629 // care to warn the user about.
3630 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3631 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
3633 // Claim ignored clang-cl options.
3634 Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
3636 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
3637 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
3638 Args.ClaimAllArgs(options::OPT_emit_llvm);
3641 void ClangAs::AddARMTargetArgs(const ArgList &Args,
3642 ArgStringList &CmdArgs) const {
3643 const Driver &D = getToolChain().getDriver();
3644 llvm::Triple Triple = getToolChain().getTriple();
3646 // Set the CPU based on -march= and -mcpu=.
3647 CmdArgs.push_back("-target-cpu");
3648 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
3651 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
3652 addFPUArgs(D, A, Args, CmdArgs);
3655 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
3656 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
3659 void ClangAs::AddX86TargetArgs(const ArgList &Args,
3660 ArgStringList &CmdArgs) const {
3661 // Set the CPU based on -march=.
3662 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3663 CmdArgs.push_back("-target-cpu");
3664 CmdArgs.push_back(CPUName);
3668 /// Add options related to the Objective-C runtime/ABI.
3670 /// Returns true if the runtime is non-fragile.
3671 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3672 ArgStringList &cmdArgs,
3673 RewriteKind rewriteKind) const {
3674 // Look for the controlling runtime option.
3675 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3676 options::OPT_fgnu_runtime,
3677 options::OPT_fobjc_runtime_EQ);
3679 // Just forward -fobjc-runtime= to the frontend. This supercedes
3680 // options about fragility.
3682 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3683 ObjCRuntime runtime;
3684 StringRef value = runtimeArg->getValue();
3685 if (runtime.tryParse(value)) {
3686 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3690 runtimeArg->render(args, cmdArgs);
3694 // Otherwise, we'll need the ABI "version". Version numbers are
3695 // slightly confusing for historical reasons:
3696 // 1 - Traditional "fragile" ABI
3697 // 2 - Non-fragile ABI, version 1
3698 // 3 - Non-fragile ABI, version 2
3699 unsigned objcABIVersion = 1;
3700 // If -fobjc-abi-version= is present, use that to set the version.
3701 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
3702 StringRef value = abiArg->getValue();
3705 else if (value == "2")
3707 else if (value == "3")
3710 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3713 // Otherwise, determine if we are using the non-fragile ABI.
3714 bool nonFragileABIIsDefault =
3715 (rewriteKind == RK_NonFragile ||
3716 (rewriteKind == RK_None &&
3717 getToolChain().IsObjCNonFragileABIDefault()));
3718 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3719 options::OPT_fno_objc_nonfragile_abi,
3720 nonFragileABIIsDefault)) {
3721 // Determine the non-fragile ABI version to use.
3722 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3723 unsigned nonFragileABIVersion = 1;
3725 unsigned nonFragileABIVersion = 2;
3728 if (Arg *abiArg = args.getLastArg(
3729 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3730 StringRef value = abiArg->getValue();
3732 nonFragileABIVersion = 1;
3733 else if (value == "2")
3734 nonFragileABIVersion = 2;
3736 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3740 objcABIVersion = 1 + nonFragileABIVersion;
3746 // We don't actually care about the ABI version other than whether
3747 // it's non-fragile.
3748 bool isNonFragile = objcABIVersion != 1;
3750 // If we have no runtime argument, ask the toolchain for its default runtime.
3751 // However, the rewriter only really supports the Mac runtime, so assume that.
3752 ObjCRuntime runtime;
3754 switch (rewriteKind) {
3756 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3759 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3762 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3767 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3768 // On Darwin, make this use the default behavior for the toolchain.
3769 if (getToolChain().getTriple().isOSDarwin()) {
3770 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3772 // Otherwise, build for a generic macosx port.
3774 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3779 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
3780 // Legacy behaviour is to target the gnustep runtime if we are i
3781 // non-fragile mode or the GCC runtime in fragile mode.
3783 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
3785 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
3788 cmdArgs.push_back(args.MakeArgString(
3789 "-fobjc-runtime=" + runtime.getAsString()));
3793 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
3794 const InputInfo &Output,
3795 const InputInfoList &Inputs,
3796 const ArgList &Args,
3797 const char *LinkingOutput) const {
3798 ArgStringList CmdArgs;
3800 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3801 const InputInfo &Input = Inputs[0];
3803 // Don't warn about "clang -w -c foo.s"
3804 Args.ClaimAllArgs(options::OPT_w);
3805 // and "clang -emit-llvm -c foo.s"
3806 Args.ClaimAllArgs(options::OPT_emit_llvm);
3807 // and "clang -use-gold-plugin -c foo.s"
3808 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
3810 // Invoke ourselves in -cc1as mode.
3812 // FIXME: Implement custom jobs for internal actions.
3813 CmdArgs.push_back("-cc1as");
3815 // Add the "effective" target triple.
3816 CmdArgs.push_back("-triple");
3817 std::string TripleStr =
3818 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
3819 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3821 // Set the output mode, we currently only expect to be used as a real
3823 CmdArgs.push_back("-filetype");
3824 CmdArgs.push_back("obj");
3826 // Set the main file name, so that debug info works even with
3827 // -save-temps or preprocessed assembly.
3828 CmdArgs.push_back("-main-file-name");
3829 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3831 // Add target specific cpu and features flags.
3832 switch(getToolChain().getArch()) {
3836 case llvm::Triple::arm:
3837 case llvm::Triple::thumb:
3838 AddARMTargetArgs(Args, CmdArgs);
3841 case llvm::Triple::x86:
3842 case llvm::Triple::x86_64:
3843 AddX86TargetArgs(Args, CmdArgs);
3847 // Ignore explicit -force_cpusubtype_ALL option.
3848 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
3850 // Determine the original source input.
3851 const Action *SourceAction = &JA;
3852 while (SourceAction->getKind() != Action::InputClass) {
3853 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3854 SourceAction = SourceAction->getInputs()[0];
3857 // Forward -g and handle debug info related flags, assuming we are dealing
3858 // with an actual assembly file.
3859 if (SourceAction->getType() == types::TY_Asm ||
3860 SourceAction->getType() == types::TY_PP_Asm) {
3861 Args.ClaimAllArgs(options::OPT_g_Group);
3862 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3863 if (!A->getOption().matches(options::OPT_g0))
3864 CmdArgs.push_back("-g");
3866 // Add the -fdebug-compilation-dir flag if needed.
3867 addDebugCompDirArg(Args, CmdArgs);
3869 // Set the AT_producer to the clang version when using the integrated
3870 // assembler on assembly source files.
3871 CmdArgs.push_back("-dwarf-debug-producer");
3872 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
3875 // Optionally embed the -cc1as level arguments into the debug info, for build
3877 if (getToolChain().UseDwarfDebugFlags()) {
3878 ArgStringList OriginalArgs;
3879 for (ArgList::const_iterator it = Args.begin(),
3880 ie = Args.end(); it != ie; ++it)
3881 (*it)->render(Args, OriginalArgs);
3883 SmallString<256> Flags;
3884 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3886 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3888 Flags += OriginalArgs[i];
3890 CmdArgs.push_back("-dwarf-debug-flags");
3891 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3894 // FIXME: Add -static support, once we have it.
3896 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3897 getToolChain().getDriver());
3899 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
3901 assert(Output.isFilename() && "Unexpected lipo output.");
3902 CmdArgs.push_back("-o");
3903 CmdArgs.push_back(Output.getFilename());
3905 assert(Input.isFilename() && "Invalid input.");
3906 CmdArgs.push_back(Input.getFilename());
3908 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3909 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3911 // Handle the debug info splitting at object creation time if we're
3912 // creating an object.
3913 // TODO: Currently only works on linux with newer objcopy.
3914 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3915 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3916 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3917 SplitDebugName(Args, Inputs));
3920 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
3921 const InputInfo &Output,
3922 const InputInfoList &Inputs,
3923 const ArgList &Args,
3924 const char *LinkingOutput) const {
3925 const Driver &D = getToolChain().getDriver();
3926 ArgStringList CmdArgs;
3928 for (ArgList::const_iterator
3929 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3931 if (forwardToGCC(A->getOption())) {
3932 // Don't forward any -g arguments to assembly steps.
3933 if (isa<AssembleJobAction>(JA) &&
3934 A->getOption().matches(options::OPT_g_Group))
3937 // It is unfortunate that we have to claim here, as this means
3938 // we will basically never report anything interesting for
3939 // platforms using a generic gcc, even if we are just using gcc
3940 // to get to the assembler.
3942 A->render(Args, CmdArgs);
3946 RenderExtraToolArgs(JA, CmdArgs);
3948 // If using a driver driver, force the arch.
3949 llvm::Triple::ArchType Arch = getToolChain().getArch();
3950 if (getToolChain().getTriple().isOSDarwin()) {
3951 CmdArgs.push_back("-arch");
3953 // FIXME: Remove these special cases.
3954 if (Arch == llvm::Triple::ppc)
3955 CmdArgs.push_back("ppc");
3956 else if (Arch == llvm::Triple::ppc64)
3957 CmdArgs.push_back("ppc64");
3958 else if (Arch == llvm::Triple::ppc64le)
3959 CmdArgs.push_back("ppc64le");
3961 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
3964 // Try to force gcc to match the tool chain we want, if we recognize
3967 // FIXME: The triple class should directly provide the information we want
3969 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
3970 CmdArgs.push_back("-m32");
3971 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
3972 Arch == llvm::Triple::ppc64le)
3973 CmdArgs.push_back("-m64");
3975 if (Output.isFilename()) {
3976 CmdArgs.push_back("-o");
3977 CmdArgs.push_back(Output.getFilename());
3979 assert(Output.isNothing() && "Unexpected output");
3980 CmdArgs.push_back("-fsyntax-only");
3983 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3984 options::OPT_Xassembler);
3986 // Only pass -x if gcc will understand it; otherwise hope gcc
3987 // understands the suffix correctly. The main use case this would go
3988 // wrong in is for linker inputs if they happened to have an odd
3989 // suffix; really the only way to get this to happen is a command
3990 // like '-x foobar a.c' which will treat a.c like a linker input.
3992 // FIXME: For the linker case specifically, can we safely convert
3993 // inputs into '-Wl,' options?
3994 for (InputInfoList::const_iterator
3995 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3996 const InputInfo &II = *it;
3998 // Don't try to pass LLVM or AST inputs to a generic gcc.
3999 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4000 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4001 D.Diag(diag::err_drv_no_linker_llvm_support)
4002 << getToolChain().getTripleString();
4003 else if (II.getType() == types::TY_AST)
4004 D.Diag(diag::err_drv_no_ast_support)
4005 << getToolChain().getTripleString();
4006 else if (II.getType() == types::TY_ModuleFile)
4007 D.Diag(diag::err_drv_no_module_support)
4008 << getToolChain().getTripleString();
4010 if (types::canTypeBeUserSpecified(II.getType())) {
4011 CmdArgs.push_back("-x");
4012 CmdArgs.push_back(types::getTypeName(II.getType()));
4015 if (II.isFilename())
4016 CmdArgs.push_back(II.getFilename());
4018 const Arg &A = II.getInputArg();
4020 // Reverse translate some rewritten options.
4021 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4022 CmdArgs.push_back("-lstdc++");
4026 // Don't render as input, we need gcc to do the translations.
4027 A.render(Args, CmdArgs);
4031 const std::string customGCCName = D.getCCCGenericGCCName();
4032 const char *GCCName;
4033 if (!customGCCName.empty())
4034 GCCName = customGCCName.c_str();
4035 else if (D.CCCIsCXX()) {
4041 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4045 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4046 ArgStringList &CmdArgs) const {
4047 CmdArgs.push_back("-E");
4050 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4051 ArgStringList &CmdArgs) const {
4052 // The type is good enough.
4055 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4056 ArgStringList &CmdArgs) const {
4057 const Driver &D = getToolChain().getDriver();
4059 // If -flto, etc. are present then make sure not to force assembly output.
4060 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4061 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
4062 CmdArgs.push_back("-c");
4064 if (JA.getType() != types::TY_PP_Asm)
4065 D.Diag(diag::err_drv_invalid_gcc_output_type)
4066 << getTypeName(JA.getType());
4068 CmdArgs.push_back("-S");
4072 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4073 ArgStringList &CmdArgs) const {
4074 CmdArgs.push_back("-c");
4077 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4078 ArgStringList &CmdArgs) const {
4079 // The types are (hopefully) good enough.
4082 // Hexagon tools start.
4083 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4084 ArgStringList &CmdArgs) const {
4087 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4088 const InputInfo &Output,
4089 const InputInfoList &Inputs,
4090 const ArgList &Args,
4091 const char *LinkingOutput) const {
4093 const Driver &D = getToolChain().getDriver();
4094 ArgStringList CmdArgs;
4096 std::string MarchString = "-march=";
4097 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
4098 CmdArgs.push_back(Args.MakeArgString(MarchString));
4100 RenderExtraToolArgs(JA, CmdArgs);
4102 if (Output.isFilename()) {
4103 CmdArgs.push_back("-o");
4104 CmdArgs.push_back(Output.getFilename());
4106 assert(Output.isNothing() && "Unexpected output");
4107 CmdArgs.push_back("-fsyntax-only");
4110 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4111 if (!SmallDataThreshold.empty())
4113 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4115 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4116 options::OPT_Xassembler);
4118 // Only pass -x if gcc will understand it; otherwise hope gcc
4119 // understands the suffix correctly. The main use case this would go
4120 // wrong in is for linker inputs if they happened to have an odd
4121 // suffix; really the only way to get this to happen is a command
4122 // like '-x foobar a.c' which will treat a.c like a linker input.
4124 // FIXME: For the linker case specifically, can we safely convert
4125 // inputs into '-Wl,' options?
4126 for (InputInfoList::const_iterator
4127 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4128 const InputInfo &II = *it;
4130 // Don't try to pass LLVM or AST inputs to a generic gcc.
4131 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4132 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4133 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4134 << getToolChain().getTripleString();
4135 else if (II.getType() == types::TY_AST)
4136 D.Diag(clang::diag::err_drv_no_ast_support)
4137 << getToolChain().getTripleString();
4138 else if (II.getType() == types::TY_ModuleFile)
4139 D.Diag(diag::err_drv_no_module_support)
4140 << getToolChain().getTripleString();
4142 if (II.isFilename())
4143 CmdArgs.push_back(II.getFilename());
4145 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4146 II.getInputArg().render(Args, CmdArgs);
4149 const char *GCCName = "hexagon-as";
4151 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4152 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4155 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4156 ArgStringList &CmdArgs) const {
4157 // The types are (hopefully) good enough.
4160 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4161 const InputInfo &Output,
4162 const InputInfoList &Inputs,
4163 const ArgList &Args,
4164 const char *LinkingOutput) const {
4166 const toolchains::Hexagon_TC& ToolChain =
4167 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4168 const Driver &D = ToolChain.getDriver();
4170 ArgStringList CmdArgs;
4172 //----------------------------------------------------------------------------
4174 //----------------------------------------------------------------------------
4175 bool hasStaticArg = Args.hasArg(options::OPT_static);
4176 bool buildingLib = Args.hasArg(options::OPT_shared);
4177 bool buildPIE = Args.hasArg(options::OPT_pie);
4178 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4179 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4180 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4181 bool useShared = buildingLib && !hasStaticArg;
4183 //----------------------------------------------------------------------------
4184 // Silence warnings for various options
4185 //----------------------------------------------------------------------------
4187 Args.ClaimAllArgs(options::OPT_g_Group);
4188 Args.ClaimAllArgs(options::OPT_emit_llvm);
4189 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4190 // handled somewhere else.
4191 Args.ClaimAllArgs(options::OPT_static_libgcc);
4193 //----------------------------------------------------------------------------
4195 //----------------------------------------------------------------------------
4196 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4197 e = ToolChain.ExtraOpts.end();
4199 CmdArgs.push_back(i->c_str());
4201 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4202 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
4205 CmdArgs.push_back("-shared");
4206 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4211 CmdArgs.push_back("-static");
4213 if (buildPIE && !buildingLib)
4214 CmdArgs.push_back("-pie");
4216 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4217 if (!SmallDataThreshold.empty()) {
4219 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4222 //----------------------------------------------------------------------------
4224 //----------------------------------------------------------------------------
4225 CmdArgs.push_back("-o");
4226 CmdArgs.push_back(Output.getFilename());
4228 const std::string MarchSuffix = "/" + MarchString;
4229 const std::string G0Suffix = "/G0";
4230 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4231 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4233 const std::string StartFilesDir = RootDir
4236 ? MarchG0Suffix : MarchSuffix);
4238 //----------------------------------------------------------------------------
4240 //----------------------------------------------------------------------------
4241 std::vector<std::string> oslibs;
4242 bool hasStandalone= false;
4244 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4245 ie = Args.filtered_end(); it != ie; ++it) {
4247 oslibs.push_back((*it)->getValue());
4248 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
4250 if (oslibs.empty()) {
4251 oslibs.push_back("standalone");
4252 hasStandalone = true;
4255 //----------------------------------------------------------------------------
4257 //----------------------------------------------------------------------------
4258 if (incStdLib && incStartFiles) {
4261 if (hasStandalone) {
4263 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4265 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4267 std::string initObj = useShared ? "/initS.o" : "/init.o";
4268 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4271 //----------------------------------------------------------------------------
4272 // Library Search Paths
4273 //----------------------------------------------------------------------------
4274 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4275 for (ToolChain::path_list::const_iterator
4276 i = LibPaths.begin(),
4280 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4282 //----------------------------------------------------------------------------
4284 //----------------------------------------------------------------------------
4285 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4286 Args.AddAllArgs(CmdArgs, options::OPT_e);
4287 Args.AddAllArgs(CmdArgs, options::OPT_s);
4288 Args.AddAllArgs(CmdArgs, options::OPT_t);
4289 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4291 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4293 //----------------------------------------------------------------------------
4295 //----------------------------------------------------------------------------
4296 if (incStdLib && incDefLibs) {
4298 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4299 CmdArgs.push_back("-lm");
4302 CmdArgs.push_back("--start-group");
4305 for(std::vector<std::string>::iterator i = oslibs.begin(),
4306 e = oslibs.end(); i != e; ++i)
4307 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4308 CmdArgs.push_back("-lc");
4310 CmdArgs.push_back("-lgcc");
4312 CmdArgs.push_back("--end-group");
4315 //----------------------------------------------------------------------------
4317 //----------------------------------------------------------------------------
4318 if (incStdLib && incStartFiles) {
4319 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4320 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4323 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4327 Args.MakeArgString(Linker), CmdArgs));
4329 // Hexagon tools end.
4331 llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4332 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4333 // archs which Darwin doesn't use.
4335 // The matching this routine does is fairly pointless, since it is neither the
4336 // complete architecture list, nor a reasonable subset. The problem is that
4337 // historically the driver driver accepts this and also ties its -march=
4338 // handling to the architecture name, so we need to be careful before removing
4341 // This code must be kept in sync with Clang's Darwin specific argument
4344 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4345 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4346 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4347 .Case("ppc64", llvm::Triple::ppc64)
4348 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4349 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4351 .Case("x86_64", llvm::Triple::x86_64)
4352 // This is derived from the driver driver.
4353 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4354 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4355 .Cases("armv7s", "xscale", llvm::Triple::arm)
4356 .Case("r600", llvm::Triple::r600)
4357 .Case("nvptx", llvm::Triple::nvptx)
4358 .Case("nvptx64", llvm::Triple::nvptx64)
4359 .Case("amdil", llvm::Triple::amdil)
4360 .Case("spir", llvm::Triple::spir)
4361 .Default(llvm::Triple::UnknownArch);
4364 const char *Clang::getBaseInputName(const ArgList &Args,
4365 const InputInfoList &Inputs) {
4366 return Args.MakeArgString(
4367 llvm::sys::path::filename(Inputs[0].getBaseInput()));
4370 const char *Clang::getBaseInputStem(const ArgList &Args,
4371 const InputInfoList &Inputs) {
4372 const char *Str = getBaseInputName(Args, Inputs);
4374 if (const char *End = strrchr(Str, '.'))
4375 return Args.MakeArgString(std::string(Str, End));
4380 const char *Clang::getDependencyFileName(const ArgList &Args,
4381 const InputInfoList &Inputs) {
4382 // FIXME: Think about this more.
4385 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
4386 std::string Str(OutputOpt->getValue());
4387 Res = Str.substr(0, Str.rfind('.'));
4389 Res = getBaseInputStem(Args, Inputs);
4391 return Args.MakeArgString(Res + ".d");
4394 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4395 const InputInfo &Output,
4396 const InputInfoList &Inputs,
4397 const ArgList &Args,
4398 const char *LinkingOutput) const {
4399 ArgStringList CmdArgs;
4401 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4402 const InputInfo &Input = Inputs[0];
4404 // Determine the original source input.
4405 const Action *SourceAction = &JA;
4406 while (SourceAction->getKind() != Action::InputClass) {
4407 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4408 SourceAction = SourceAction->getInputs()[0];
4411 // Forward -g, assuming we are dealing with an actual assembly file.
4412 if (SourceAction->getType() == types::TY_Asm ||
4413 SourceAction->getType() == types::TY_PP_Asm) {
4414 if (Args.hasArg(options::OPT_gstabs))
4415 CmdArgs.push_back("--gstabs");
4416 else if (Args.hasArg(options::OPT_g_Group))
4417 CmdArgs.push_back("-g");
4420 // Derived from asm spec.
4421 AddDarwinArch(Args, CmdArgs);
4423 // Use -force_cpusubtype_ALL on x86 by default.
4424 if (getToolChain().getArch() == llvm::Triple::x86 ||
4425 getToolChain().getArch() == llvm::Triple::x86_64 ||
4426 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4427 CmdArgs.push_back("-force_cpusubtype_ALL");
4429 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
4430 (((Args.hasArg(options::OPT_mkernel) ||
4431 Args.hasArg(options::OPT_fapple_kext)) &&
4432 (!getDarwinToolChain().isTargetIPhoneOS() ||
4433 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4434 Args.hasArg(options::OPT_static)))
4435 CmdArgs.push_back("-static");
4437 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4438 options::OPT_Xassembler);
4440 assert(Output.isFilename() && "Unexpected lipo output.");
4441 CmdArgs.push_back("-o");
4442 CmdArgs.push_back(Output.getFilename());
4444 assert(Input.isFilename() && "Invalid input.");
4445 CmdArgs.push_back(Input.getFilename());
4447 // asm_final spec is empty.
4450 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4451 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4454 void darwin::DarwinTool::anchor() {}
4456 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4457 ArgStringList &CmdArgs) const {
4458 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
4460 // Derived from darwin_arch spec.
4461 CmdArgs.push_back("-arch");
4462 CmdArgs.push_back(Args.MakeArgString(ArchName));
4464 // FIXME: Is this needed anymore?
4465 if (ArchName == "arm")
4466 CmdArgs.push_back("-force_cpusubtype_ALL");
4469 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4470 // We only need to generate a temp path for LTO if we aren't compiling object
4471 // files. When compiling source files, we run 'dsymutil' after linking. We
4472 // don't run 'dsymutil' when compiling object files.
4473 for (InputInfoList::const_iterator
4474 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4475 if (it->getType() != types::TY_Object)
4481 void darwin::Link::AddLinkArgs(Compilation &C,
4482 const ArgList &Args,
4483 ArgStringList &CmdArgs,
4484 const InputInfoList &Inputs) const {
4485 const Driver &D = getToolChain().getDriver();
4486 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
4488 unsigned Version[3] = { 0, 0, 0 };
4489 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4491 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
4492 Version[1], Version[2], HadExtra) ||
4494 D.Diag(diag::err_drv_invalid_version_number)
4495 << A->getAsString(Args);
4498 // Newer linkers support -demangle, pass it if supported and not disabled by
4500 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
4501 // Don't pass -demangle to ld_classic.
4503 // FIXME: This is a temporary workaround, ld should be handling this.
4504 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4505 Args.hasArg(options::OPT_static));
4506 if (getToolChain().getArch() == llvm::Triple::x86) {
4507 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4508 options::OPT_Wl_COMMA),
4509 ie = Args.filtered_end(); it != ie; ++it) {
4511 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
4512 if (StringRef(A->getValue(i)) == "-kext")
4513 UsesLdClassic = true;
4517 CmdArgs.push_back("-demangle");
4520 // If we are using LTO, then automatically create a temporary file path for
4521 // the linker to use, so that it's lifetime will extend past a possible
4523 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4524 const char *TmpPath = C.getArgs().MakeArgString(
4525 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4526 C.addTempFile(TmpPath);
4527 CmdArgs.push_back("-object_path_lto");
4528 CmdArgs.push_back(TmpPath);
4531 // Derived from the "link" spec.
4532 Args.AddAllArgs(CmdArgs, options::OPT_static);
4533 if (!Args.hasArg(options::OPT_static))
4534 CmdArgs.push_back("-dynamic");
4535 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4536 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4537 // here. How do we wish to handle such things?
4540 if (!Args.hasArg(options::OPT_dynamiclib)) {
4541 AddDarwinArch(Args, CmdArgs);
4542 // FIXME: Why do this only on this path?
4543 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
4545 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4546 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4547 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4550 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4551 (A = Args.getLastArg(options::OPT_current__version)) ||
4552 (A = Args.getLastArg(options::OPT_install__name)))
4553 D.Diag(diag::err_drv_argument_only_allowed_with)
4554 << A->getAsString(Args) << "-dynamiclib";
4556 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4557 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4558 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4560 CmdArgs.push_back("-dylib");
4563 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4564 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4565 (A = Args.getLastArg(options::OPT_client__name)) ||
4566 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4567 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4568 (A = Args.getLastArg(options::OPT_private__bundle)))
4569 D.Diag(diag::err_drv_argument_not_allowed_with)
4570 << A->getAsString(Args) << "-dynamiclib";
4572 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4573 "-dylib_compatibility_version");
4574 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4575 "-dylib_current_version");
4577 AddDarwinArch(Args, CmdArgs);
4579 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4580 "-dylib_install_name");
4583 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4584 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4585 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4586 if (DarwinTC.isTargetIPhoneOS())
4587 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
4588 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4589 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4590 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4591 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4592 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4593 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
4594 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
4595 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4596 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4597 Args.AddAllArgs(CmdArgs, options::OPT_init);
4599 // Add the deployment target.
4600 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4602 // If we had an explicit -mios-simulator-version-min argument, honor that,
4603 // otherwise use the traditional deployment targets. We can't just check the
4604 // is-sim attribute because existing code follows this path, and the linker
4605 // may not handle the argument.
4607 // FIXME: We may be able to remove this, once we can verify no one depends on
4609 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4610 CmdArgs.push_back("-ios_simulator_version_min");
4611 else if (DarwinTC.isTargetIPhoneOS())
4612 CmdArgs.push_back("-iphoneos_version_min");
4614 CmdArgs.push_back("-macosx_version_min");
4615 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4617 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4618 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4619 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4620 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4621 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4623 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4624 options::OPT_fno_pie,
4625 options::OPT_fno_PIE)) {
4626 if (A->getOption().matches(options::OPT_fpie) ||
4627 A->getOption().matches(options::OPT_fPIE))
4628 CmdArgs.push_back("-pie");
4630 CmdArgs.push_back("-no_pie");
4633 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4634 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4635 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4636 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4637 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4638 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4639 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4640 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4641 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4642 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4643 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4644 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4645 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4646 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4647 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4648 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4650 // Give --sysroot= preference, over the Apple specific behavior to also use
4651 // --isysroot as the syslibroot.
4652 StringRef sysroot = C.getSysRoot();
4653 if (sysroot != "") {
4654 CmdArgs.push_back("-syslibroot");
4655 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4656 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4657 CmdArgs.push_back("-syslibroot");
4658 CmdArgs.push_back(A->getValue());
4661 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4662 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4663 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4664 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4665 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4666 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
4667 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4668 Args.AddAllArgs(CmdArgs, options::OPT_y);
4669 Args.AddLastArg(CmdArgs, options::OPT_w);
4670 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4671 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4672 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4673 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4674 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4675 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4676 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4677 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4678 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4679 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4680 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4681 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4684 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
4685 const InputInfo &Output,
4686 const InputInfoList &Inputs,
4687 const ArgList &Args,
4688 const char *LinkingOutput) const {
4689 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4691 // The logic here is derived from gcc's behavior; most of which
4692 // comes from specs (starting with link_command). Consult gcc for
4693 // more information.
4694 ArgStringList CmdArgs;
4696 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4697 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4698 options::OPT_ccc_arcmt_migrate)) {
4699 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4702 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4703 CmdArgs.push_back(Output.getFilename());
4704 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4708 // I'm not sure why this particular decomposition exists in gcc, but
4709 // we follow suite for ease of comparison.
4710 AddLinkArgs(C, Args, CmdArgs, Inputs);
4712 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4713 Args.AddAllArgs(CmdArgs, options::OPT_s);
4714 Args.AddAllArgs(CmdArgs, options::OPT_t);
4715 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4716 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4717 Args.AddLastArg(CmdArgs, options::OPT_e);
4718 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4719 Args.AddAllArgs(CmdArgs, options::OPT_r);
4721 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4722 // members of static archive libraries which implement Objective-C classes or
4724 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4725 CmdArgs.push_back("-ObjC");
4727 if (Args.hasArg(options::OPT_rdynamic))
4728 CmdArgs.push_back("-export_dynamic");
4730 CmdArgs.push_back("-o");
4731 CmdArgs.push_back(Output.getFilename());
4733 if (!Args.hasArg(options::OPT_nostdlib) &&
4734 !Args.hasArg(options::OPT_nostartfiles)) {
4735 // Derived from startfile spec.
4736 if (Args.hasArg(options::OPT_dynamiclib)) {
4737 // Derived from darwin_dylib1 spec.
4738 if (getDarwinToolChain().isTargetIOSSimulator()) {
4739 // The simulator doesn't have a versioned crt1 file.
4740 CmdArgs.push_back("-ldylib1.o");
4741 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4742 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4743 CmdArgs.push_back("-ldylib1.o");
4745 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4746 CmdArgs.push_back("-ldylib1.o");
4747 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4748 CmdArgs.push_back("-ldylib1.10.5.o");
4751 if (Args.hasArg(options::OPT_bundle)) {
4752 if (!Args.hasArg(options::OPT_static)) {
4753 // Derived from darwin_bundle1 spec.
4754 if (getDarwinToolChain().isTargetIOSSimulator()) {
4755 // The simulator doesn't have a versioned crt1 file.
4756 CmdArgs.push_back("-lbundle1.o");
4757 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4758 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4759 CmdArgs.push_back("-lbundle1.o");
4761 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4762 CmdArgs.push_back("-lbundle1.o");
4766 if (Args.hasArg(options::OPT_pg) &&
4767 getToolChain().SupportsProfiling()) {
4768 if (Args.hasArg(options::OPT_static) ||
4769 Args.hasArg(options::OPT_object) ||
4770 Args.hasArg(options::OPT_preload)) {
4771 CmdArgs.push_back("-lgcrt0.o");
4773 CmdArgs.push_back("-lgcrt1.o");
4775 // darwin_crt2 spec is empty.
4777 // By default on OS X 10.8 and later, we don't link with a crt1.o
4778 // file and the linker knows to use _main as the entry point. But,
4779 // when compiling with -pg, we need to link with the gcrt1.o file,
4780 // so pass the -no_new_main option to tell the linker to use the
4781 // "start" symbol as the entry point.
4782 if (getDarwinToolChain().isTargetMacOS() &&
4783 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4784 CmdArgs.push_back("-no_new_main");
4786 if (Args.hasArg(options::OPT_static) ||
4787 Args.hasArg(options::OPT_object) ||
4788 Args.hasArg(options::OPT_preload)) {
4789 CmdArgs.push_back("-lcrt0.o");
4791 // Derived from darwin_crt1 spec.
4792 if (getDarwinToolChain().isTargetIOSSimulator()) {
4793 // The simulator doesn't have a versioned crt1 file.
4794 CmdArgs.push_back("-lcrt1.o");
4795 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4796 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4797 CmdArgs.push_back("-lcrt1.o");
4798 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
4799 CmdArgs.push_back("-lcrt1.3.1.o");
4801 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4802 CmdArgs.push_back("-lcrt1.o");
4803 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4804 CmdArgs.push_back("-lcrt1.10.5.o");
4805 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
4806 CmdArgs.push_back("-lcrt1.10.6.o");
4808 // darwin_crt2 spec is empty.
4815 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4816 Args.hasArg(options::OPT_shared_libgcc) &&
4817 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
4819 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
4820 CmdArgs.push_back(Str);
4824 Args.AddAllArgs(CmdArgs, options::OPT_L);
4826 SanitizerArgs Sanitize(getToolChain(), Args);
4827 // If we're building a dynamic lib with -fsanitize=address,
4828 // unresolved symbols may appear. Mark all
4829 // of them as dynamic_lookup. Linking executables is handled in
4830 // lib/Driver/ToolChains.cpp.
4831 if (Sanitize.needsAsanRt()) {
4832 if (Args.hasArg(options::OPT_dynamiclib) ||
4833 Args.hasArg(options::OPT_bundle)) {
4834 CmdArgs.push_back("-undefined");
4835 CmdArgs.push_back("dynamic_lookup");
4839 if (Args.hasArg(options::OPT_fopenmp))
4840 // This is more complicated in gcc...
4841 CmdArgs.push_back("-lgomp");
4843 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4845 if (isObjCRuntimeLinked(Args) &&
4846 !Args.hasArg(options::OPT_nostdlib) &&
4847 !Args.hasArg(options::OPT_nodefaultlibs)) {
4848 // Avoid linking compatibility stubs on i386 mac.
4849 if (!getDarwinToolChain().isTargetMacOS() ||
4850 getDarwinToolChain().getArch() != llvm::Triple::x86) {
4851 // If we don't have ARC or subscripting runtime support, link in the
4852 // runtime stubs. We have to do this *before* adding any of the normal
4853 // linker inputs so that its initializer gets run first.
4854 ObjCRuntime runtime =
4855 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
4856 // We use arclite library for both ARC and subscripting support.
4857 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
4858 !runtime.hasSubscripting())
4859 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
4861 CmdArgs.push_back("-framework");
4862 CmdArgs.push_back("Foundation");
4864 CmdArgs.push_back("-lobjc");
4867 if (LinkingOutput) {
4868 CmdArgs.push_back("-arch_multiple");
4869 CmdArgs.push_back("-final_output");
4870 CmdArgs.push_back(LinkingOutput);
4873 if (Args.hasArg(options::OPT_fnested_functions))
4874 CmdArgs.push_back("-allow_stack_execute");
4876 if (!Args.hasArg(options::OPT_nostdlib) &&
4877 !Args.hasArg(options::OPT_nodefaultlibs)) {
4878 if (getToolChain().getDriver().CCCIsCXX())
4879 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4881 // link_ssp spec is empty.
4883 // Let the tool chain choose which runtime library to link.
4884 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
4887 if (!Args.hasArg(options::OPT_nostdlib) &&
4888 !Args.hasArg(options::OPT_nostartfiles)) {
4889 // endfile_spec is empty.
4892 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4893 Args.AddAllArgs(CmdArgs, options::OPT_F);
4896 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4897 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4900 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
4901 const InputInfo &Output,
4902 const InputInfoList &Inputs,
4903 const ArgList &Args,
4904 const char *LinkingOutput) const {
4905 ArgStringList CmdArgs;
4907 CmdArgs.push_back("-create");
4908 assert(Output.isFilename() && "Unexpected lipo output.");
4910 CmdArgs.push_back("-output");
4911 CmdArgs.push_back(Output.getFilename());
4913 for (InputInfoList::const_iterator
4914 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4915 const InputInfo &II = *it;
4916 assert(II.isFilename() && "Unexpected lipo input.");
4917 CmdArgs.push_back(II.getFilename());
4920 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
4921 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4924 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
4925 const InputInfo &Output,
4926 const InputInfoList &Inputs,
4927 const ArgList &Args,
4928 const char *LinkingOutput) const {
4929 ArgStringList CmdArgs;
4931 CmdArgs.push_back("-o");
4932 CmdArgs.push_back(Output.getFilename());
4934 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4935 const InputInfo &Input = Inputs[0];
4936 assert(Input.isFilename() && "Unexpected dsymutil input.");
4937 CmdArgs.push_back(Input.getFilename());
4940 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
4941 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4944 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4945 const InputInfo &Output,
4946 const InputInfoList &Inputs,
4947 const ArgList &Args,
4948 const char *LinkingOutput) const {
4949 ArgStringList CmdArgs;
4950 CmdArgs.push_back("--verify");
4951 CmdArgs.push_back("--debug-info");
4952 CmdArgs.push_back("--eh-frame");
4953 CmdArgs.push_back("--quiet");
4955 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4956 const InputInfo &Input = Inputs[0];
4957 assert(Input.isFilename() && "Unexpected verify input");
4959 // Grabbing the output of the earlier dsymutil run.
4960 CmdArgs.push_back(Input.getFilename());
4963 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4964 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4967 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4968 const InputInfo &Output,
4969 const InputInfoList &Inputs,
4970 const ArgList &Args,
4971 const char *LinkingOutput) const {
4972 ArgStringList CmdArgs;
4974 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4975 options::OPT_Xassembler);
4977 CmdArgs.push_back("-o");
4978 CmdArgs.push_back(Output.getFilename());
4980 for (InputInfoList::const_iterator
4981 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4982 const InputInfo &II = *it;
4983 CmdArgs.push_back(II.getFilename());
4987 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4988 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4992 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4993 const InputInfo &Output,
4994 const InputInfoList &Inputs,
4995 const ArgList &Args,
4996 const char *LinkingOutput) const {
4997 // FIXME: Find a real GCC, don't hard-code versions here
4998 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4999 const llvm::Triple &T = getToolChain().getTriple();
5000 std::string LibPath = "/usr/lib/";
5001 llvm::Triple::ArchType Arch = T.getArch();
5003 case llvm::Triple::x86:
5004 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
5005 T.getOSName()).str() + "/4.5.2/";
5007 case llvm::Triple::x86_64:
5008 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
5009 T.getOSName()).str();
5010 GCCLibPath += "/4.5.2/amd64/";
5011 LibPath += "amd64/";
5014 assert(0 && "Unsupported architecture");
5017 ArgStringList CmdArgs;
5019 // Demangle C++ names in errors
5020 CmdArgs.push_back("-C");
5022 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5023 (!Args.hasArg(options::OPT_shared))) {
5024 CmdArgs.push_back("-e");
5025 CmdArgs.push_back("_start");
5028 if (Args.hasArg(options::OPT_static)) {
5029 CmdArgs.push_back("-Bstatic");
5030 CmdArgs.push_back("-dn");
5032 CmdArgs.push_back("-Bdynamic");
5033 if (Args.hasArg(options::OPT_shared)) {
5034 CmdArgs.push_back("-shared");
5036 CmdArgs.push_back("--dynamic-linker");
5037 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5041 if (Output.isFilename()) {
5042 CmdArgs.push_back("-o");
5043 CmdArgs.push_back(Output.getFilename());
5045 assert(Output.isNothing() && "Invalid output.");
5048 if (!Args.hasArg(options::OPT_nostdlib) &&
5049 !Args.hasArg(options::OPT_nostartfiles)) {
5050 if (!Args.hasArg(options::OPT_shared)) {
5051 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5052 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5053 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5054 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5056 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5057 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5058 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5060 if (getToolChain().getDriver().CCCIsCXX())
5061 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
5064 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5066 Args.AddAllArgs(CmdArgs, options::OPT_L);
5067 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5068 Args.AddAllArgs(CmdArgs, options::OPT_e);
5069 Args.AddAllArgs(CmdArgs, options::OPT_r);
5071 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5073 if (!Args.hasArg(options::OPT_nostdlib) &&
5074 !Args.hasArg(options::OPT_nodefaultlibs)) {
5075 if (getToolChain().getDriver().CCCIsCXX())
5076 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5077 CmdArgs.push_back("-lgcc_s");
5078 if (!Args.hasArg(options::OPT_shared)) {
5079 CmdArgs.push_back("-lgcc");
5080 CmdArgs.push_back("-lc");
5081 CmdArgs.push_back("-lm");
5085 if (!Args.hasArg(options::OPT_nostdlib) &&
5086 !Args.hasArg(options::OPT_nostartfiles)) {
5087 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
5089 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
5091 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5094 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5095 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5098 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5099 const InputInfo &Output,
5100 const InputInfoList &Inputs,
5101 const ArgList &Args,
5102 const char *LinkingOutput) const {
5103 ArgStringList CmdArgs;
5105 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5106 options::OPT_Xassembler);
5108 CmdArgs.push_back("-o");
5109 CmdArgs.push_back(Output.getFilename());
5111 for (InputInfoList::const_iterator
5112 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5113 const InputInfo &II = *it;
5114 CmdArgs.push_back(II.getFilename());
5118 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
5119 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5122 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
5123 const InputInfo &Output,
5124 const InputInfoList &Inputs,
5125 const ArgList &Args,
5126 const char *LinkingOutput) const {
5127 ArgStringList CmdArgs;
5129 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5130 (!Args.hasArg(options::OPT_shared))) {
5131 CmdArgs.push_back("-e");
5132 CmdArgs.push_back("_start");
5135 if (Args.hasArg(options::OPT_static)) {
5136 CmdArgs.push_back("-Bstatic");
5137 CmdArgs.push_back("-dn");
5139 // CmdArgs.push_back("--eh-frame-hdr");
5140 CmdArgs.push_back("-Bdynamic");
5141 if (Args.hasArg(options::OPT_shared)) {
5142 CmdArgs.push_back("-shared");
5144 CmdArgs.push_back("--dynamic-linker");
5145 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5149 if (Output.isFilename()) {
5150 CmdArgs.push_back("-o");
5151 CmdArgs.push_back(Output.getFilename());
5153 assert(Output.isNothing() && "Invalid output.");
5156 if (!Args.hasArg(options::OPT_nostdlib) &&
5157 !Args.hasArg(options::OPT_nostartfiles)) {
5158 if (!Args.hasArg(options::OPT_shared)) {
5159 CmdArgs.push_back(Args.MakeArgString(
5160 getToolChain().GetFilePath("crt1.o")));
5161 CmdArgs.push_back(Args.MakeArgString(
5162 getToolChain().GetFilePath("crti.o")));
5163 CmdArgs.push_back(Args.MakeArgString(
5164 getToolChain().GetFilePath("crtbegin.o")));
5166 CmdArgs.push_back(Args.MakeArgString(
5167 getToolChain().GetFilePath("crti.o")));
5169 CmdArgs.push_back(Args.MakeArgString(
5170 getToolChain().GetFilePath("crtn.o")));
5173 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5174 + getToolChain().getTripleString()
5177 Args.AddAllArgs(CmdArgs, options::OPT_L);
5178 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5179 Args.AddAllArgs(CmdArgs, options::OPT_e);
5181 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5183 if (!Args.hasArg(options::OPT_nostdlib) &&
5184 !Args.hasArg(options::OPT_nodefaultlibs)) {
5185 // FIXME: For some reason GCC passes -lgcc before adding
5186 // the default system libraries. Just mimic this for now.
5187 CmdArgs.push_back("-lgcc");
5189 if (Args.hasArg(options::OPT_pthread))
5190 CmdArgs.push_back("-pthread");
5191 if (!Args.hasArg(options::OPT_shared))
5192 CmdArgs.push_back("-lc");
5193 CmdArgs.push_back("-lgcc");
5196 if (!Args.hasArg(options::OPT_nostdlib) &&
5197 !Args.hasArg(options::OPT_nostartfiles)) {
5198 if (!Args.hasArg(options::OPT_shared))
5199 CmdArgs.push_back(Args.MakeArgString(
5200 getToolChain().GetFilePath("crtend.o")));
5203 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5206 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5207 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5210 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5211 const InputInfo &Output,
5212 const InputInfoList &Inputs,
5213 const ArgList &Args,
5214 const char *LinkingOutput) const {
5215 ArgStringList CmdArgs;
5217 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5218 options::OPT_Xassembler);
5220 CmdArgs.push_back("-o");
5221 CmdArgs.push_back(Output.getFilename());
5223 for (InputInfoList::const_iterator
5224 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5225 const InputInfo &II = *it;
5226 CmdArgs.push_back(II.getFilename());
5230 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5231 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5234 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5235 const InputInfo &Output,
5236 const InputInfoList &Inputs,
5237 const ArgList &Args,
5238 const char *LinkingOutput) const {
5239 const Driver &D = getToolChain().getDriver();
5240 ArgStringList CmdArgs;
5242 // Silence warning for "clang -g foo.o -o foo"
5243 Args.ClaimAllArgs(options::OPT_g_Group);
5244 // and "clang -emit-llvm foo.o -o foo"
5245 Args.ClaimAllArgs(options::OPT_emit_llvm);
5246 // and for "clang -w foo.o -o foo". Other warning options are already
5247 // handled somewhere else.
5248 Args.ClaimAllArgs(options::OPT_w);
5250 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5251 (!Args.hasArg(options::OPT_shared))) {
5252 CmdArgs.push_back("-e");
5253 CmdArgs.push_back("__start");
5256 if (Args.hasArg(options::OPT_static)) {
5257 CmdArgs.push_back("-Bstatic");
5259 if (Args.hasArg(options::OPT_rdynamic))
5260 CmdArgs.push_back("-export-dynamic");
5261 CmdArgs.push_back("--eh-frame-hdr");
5262 CmdArgs.push_back("-Bdynamic");
5263 if (Args.hasArg(options::OPT_shared)) {
5264 CmdArgs.push_back("-shared");
5266 CmdArgs.push_back("-dynamic-linker");
5267 CmdArgs.push_back("/usr/libexec/ld.so");
5271 if (Args.hasArg(options::OPT_nopie))
5272 CmdArgs.push_back("-nopie");
5274 if (Output.isFilename()) {
5275 CmdArgs.push_back("-o");
5276 CmdArgs.push_back(Output.getFilename());
5278 assert(Output.isNothing() && "Invalid output.");
5281 if (!Args.hasArg(options::OPT_nostdlib) &&
5282 !Args.hasArg(options::OPT_nostartfiles)) {
5283 if (!Args.hasArg(options::OPT_shared)) {
5284 if (Args.hasArg(options::OPT_pg))
5285 CmdArgs.push_back(Args.MakeArgString(
5286 getToolChain().GetFilePath("gcrt0.o")));
5288 CmdArgs.push_back(Args.MakeArgString(
5289 getToolChain().GetFilePath("crt0.o")));
5290 CmdArgs.push_back(Args.MakeArgString(
5291 getToolChain().GetFilePath("crtbegin.o")));
5293 CmdArgs.push_back(Args.MakeArgString(
5294 getToolChain().GetFilePath("crtbeginS.o")));
5298 std::string Triple = getToolChain().getTripleString();
5299 if (Triple.substr(0, 6) == "x86_64")
5300 Triple.replace(0, 6, "amd64");
5301 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
5304 Args.AddAllArgs(CmdArgs, options::OPT_L);
5305 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5306 Args.AddAllArgs(CmdArgs, options::OPT_e);
5307 Args.AddAllArgs(CmdArgs, options::OPT_s);
5308 Args.AddAllArgs(CmdArgs, options::OPT_t);
5309 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5310 Args.AddAllArgs(CmdArgs, options::OPT_r);
5312 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5314 if (!Args.hasArg(options::OPT_nostdlib) &&
5315 !Args.hasArg(options::OPT_nodefaultlibs)) {
5317 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5318 if (Args.hasArg(options::OPT_pg))
5319 CmdArgs.push_back("-lm_p");
5321 CmdArgs.push_back("-lm");
5324 // FIXME: For some reason GCC passes -lgcc before adding
5325 // the default system libraries. Just mimic this for now.
5326 CmdArgs.push_back("-lgcc");
5328 if (Args.hasArg(options::OPT_pthread)) {
5329 if (!Args.hasArg(options::OPT_shared) &&
5330 Args.hasArg(options::OPT_pg))
5331 CmdArgs.push_back("-lpthread_p");
5333 CmdArgs.push_back("-lpthread");
5336 if (!Args.hasArg(options::OPT_shared)) {
5337 if (Args.hasArg(options::OPT_pg))
5338 CmdArgs.push_back("-lc_p");
5340 CmdArgs.push_back("-lc");
5343 CmdArgs.push_back("-lgcc");
5346 if (!Args.hasArg(options::OPT_nostdlib) &&
5347 !Args.hasArg(options::OPT_nostartfiles)) {
5348 if (!Args.hasArg(options::OPT_shared))
5349 CmdArgs.push_back(Args.MakeArgString(
5350 getToolChain().GetFilePath("crtend.o")));
5352 CmdArgs.push_back(Args.MakeArgString(
5353 getToolChain().GetFilePath("crtendS.o")));
5357 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5358 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5361 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5362 const InputInfo &Output,
5363 const InputInfoList &Inputs,
5364 const ArgList &Args,
5365 const char *LinkingOutput) const {
5366 ArgStringList CmdArgs;
5368 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5369 options::OPT_Xassembler);
5371 CmdArgs.push_back("-o");
5372 CmdArgs.push_back(Output.getFilename());
5374 for (InputInfoList::const_iterator
5375 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5376 const InputInfo &II = *it;
5377 CmdArgs.push_back(II.getFilename());
5381 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5382 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5385 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5386 const InputInfo &Output,
5387 const InputInfoList &Inputs,
5388 const ArgList &Args,
5389 const char *LinkingOutput) const {
5390 const Driver &D = getToolChain().getDriver();
5391 ArgStringList CmdArgs;
5393 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5394 (!Args.hasArg(options::OPT_shared))) {
5395 CmdArgs.push_back("-e");
5396 CmdArgs.push_back("__start");
5399 if (Args.hasArg(options::OPT_static)) {
5400 CmdArgs.push_back("-Bstatic");
5402 if (Args.hasArg(options::OPT_rdynamic))
5403 CmdArgs.push_back("-export-dynamic");
5404 CmdArgs.push_back("--eh-frame-hdr");
5405 CmdArgs.push_back("-Bdynamic");
5406 if (Args.hasArg(options::OPT_shared)) {
5407 CmdArgs.push_back("-shared");
5409 CmdArgs.push_back("-dynamic-linker");
5410 CmdArgs.push_back("/usr/libexec/ld.so");
5414 if (Output.isFilename()) {
5415 CmdArgs.push_back("-o");
5416 CmdArgs.push_back(Output.getFilename());
5418 assert(Output.isNothing() && "Invalid output.");
5421 if (!Args.hasArg(options::OPT_nostdlib) &&
5422 !Args.hasArg(options::OPT_nostartfiles)) {
5423 if (!Args.hasArg(options::OPT_shared)) {
5424 if (Args.hasArg(options::OPT_pg))
5425 CmdArgs.push_back(Args.MakeArgString(
5426 getToolChain().GetFilePath("gcrt0.o")));
5428 CmdArgs.push_back(Args.MakeArgString(
5429 getToolChain().GetFilePath("crt0.o")));
5430 CmdArgs.push_back(Args.MakeArgString(
5431 getToolChain().GetFilePath("crtbegin.o")));
5433 CmdArgs.push_back(Args.MakeArgString(
5434 getToolChain().GetFilePath("crtbeginS.o")));
5438 Args.AddAllArgs(CmdArgs, options::OPT_L);
5439 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5440 Args.AddAllArgs(CmdArgs, options::OPT_e);
5442 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5444 if (!Args.hasArg(options::OPT_nostdlib) &&
5445 !Args.hasArg(options::OPT_nodefaultlibs)) {
5447 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5448 if (Args.hasArg(options::OPT_pg))
5449 CmdArgs.push_back("-lm_p");
5451 CmdArgs.push_back("-lm");
5454 if (Args.hasArg(options::OPT_pthread)) {
5455 if (!Args.hasArg(options::OPT_shared) &&
5456 Args.hasArg(options::OPT_pg))
5457 CmdArgs.push_back("-lpthread_p");
5459 CmdArgs.push_back("-lpthread");
5462 if (!Args.hasArg(options::OPT_shared)) {
5463 if (Args.hasArg(options::OPT_pg))
5464 CmdArgs.push_back("-lc_p");
5466 CmdArgs.push_back("-lc");
5469 std::string myarch = "-lclang_rt.";
5470 const llvm::Triple &T = getToolChain().getTriple();
5471 llvm::Triple::ArchType Arch = T.getArch();
5473 case llvm::Triple::arm:
5476 case llvm::Triple::x86:
5479 case llvm::Triple::x86_64:
5480 myarch += ("amd64");
5483 assert(0 && "Unsupported architecture");
5485 CmdArgs.push_back(Args.MakeArgString(myarch));
5488 if (!Args.hasArg(options::OPT_nostdlib) &&
5489 !Args.hasArg(options::OPT_nostartfiles)) {
5490 if (!Args.hasArg(options::OPT_shared))
5491 CmdArgs.push_back(Args.MakeArgString(
5492 getToolChain().GetFilePath("crtend.o")));
5494 CmdArgs.push_back(Args.MakeArgString(
5495 getToolChain().GetFilePath("crtendS.o")));
5499 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5500 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5503 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5504 const InputInfo &Output,
5505 const InputInfoList &Inputs,
5506 const ArgList &Args,
5507 const char *LinkingOutput) const {
5508 ArgStringList CmdArgs;
5510 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5511 // instruct as in the base system to assemble 32-bit code.
5512 if (getToolChain().getArch() == llvm::Triple::x86)
5513 CmdArgs.push_back("--32");
5514 else if (getToolChain().getArch() == llvm::Triple::ppc)
5515 CmdArgs.push_back("-a32");
5516 else if (getToolChain().getArch() == llvm::Triple::mips ||
5517 getToolChain().getArch() == llvm::Triple::mipsel ||
5518 getToolChain().getArch() == llvm::Triple::mips64 ||
5519 getToolChain().getArch() == llvm::Triple::mips64el) {
5522 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5524 CmdArgs.push_back("-march");
5525 CmdArgs.push_back(CPUName.data());
5527 CmdArgs.push_back("-mabi");
5528 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5530 if (getToolChain().getArch() == llvm::Triple::mips ||
5531 getToolChain().getArch() == llvm::Triple::mips64)
5532 CmdArgs.push_back("-EB");
5534 CmdArgs.push_back("-EL");
5536 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5537 options::OPT_fpic, options::OPT_fno_pic,
5538 options::OPT_fPIE, options::OPT_fno_PIE,
5539 options::OPT_fpie, options::OPT_fno_pie);
5541 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5542 LastPICArg->getOption().matches(options::OPT_fpic) ||
5543 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5544 LastPICArg->getOption().matches(options::OPT_fpie))) {
5545 CmdArgs.push_back("-KPIC");
5547 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5548 getToolChain().getArch() == llvm::Triple::thumb) {
5549 CmdArgs.push_back("-mfpu=softvfp");
5550 switch(getToolChain().getTriple().getEnvironment()) {
5551 case llvm::Triple::GNUEABI:
5552 case llvm::Triple::EABI:
5553 CmdArgs.push_back("-meabi=5");
5557 CmdArgs.push_back("-matpcs");
5561 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5562 options::OPT_Xassembler);
5564 CmdArgs.push_back("-o");
5565 CmdArgs.push_back(Output.getFilename());
5567 for (InputInfoList::const_iterator
5568 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5569 const InputInfo &II = *it;
5570 CmdArgs.push_back(II.getFilename());
5574 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5575 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5578 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5579 const InputInfo &Output,
5580 const InputInfoList &Inputs,
5581 const ArgList &Args,
5582 const char *LinkingOutput) const {
5583 const toolchains::FreeBSD& ToolChain =
5584 static_cast<const toolchains::FreeBSD&>(getToolChain());
5585 const Driver &D = ToolChain.getDriver();
5586 ArgStringList CmdArgs;
5588 // Silence warning for "clang -g foo.o -o foo"
5589 Args.ClaimAllArgs(options::OPT_g_Group);
5590 // and "clang -emit-llvm foo.o -o foo"
5591 Args.ClaimAllArgs(options::OPT_emit_llvm);
5592 // and for "clang -w foo.o -o foo". Other warning options are already
5593 // handled somewhere else.
5594 Args.ClaimAllArgs(options::OPT_w);
5596 if (!D.SysRoot.empty())
5597 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5599 if (Args.hasArg(options::OPT_pie))
5600 CmdArgs.push_back("-pie");
5602 if (Args.hasArg(options::OPT_static)) {
5603 CmdArgs.push_back("-Bstatic");
5605 if (Args.hasArg(options::OPT_rdynamic))
5606 CmdArgs.push_back("-export-dynamic");
5607 CmdArgs.push_back("--eh-frame-hdr");
5608 if (Args.hasArg(options::OPT_shared)) {
5609 CmdArgs.push_back("-Bshareable");
5611 CmdArgs.push_back("-dynamic-linker");
5612 CmdArgs.push_back("/libexec/ld-elf.so.1");
5614 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5615 llvm::Triple::ArchType Arch = ToolChain.getArch();
5616 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5617 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5618 CmdArgs.push_back("--hash-style=both");
5621 CmdArgs.push_back("--enable-new-dtags");
5624 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5625 // instruct ld in the base system to link 32-bit code.
5626 if (ToolChain.getArch() == llvm::Triple::x86) {
5627 CmdArgs.push_back("-m");
5628 CmdArgs.push_back("elf_i386_fbsd");
5631 if (ToolChain.getArch() == llvm::Triple::ppc) {
5632 CmdArgs.push_back("-m");
5633 CmdArgs.push_back("elf32ppc_fbsd");
5636 if (Output.isFilename()) {
5637 CmdArgs.push_back("-o");
5638 CmdArgs.push_back(Output.getFilename());
5640 assert(Output.isNothing() && "Invalid output.");
5643 if (!Args.hasArg(options::OPT_nostdlib) &&
5644 !Args.hasArg(options::OPT_nostartfiles)) {
5645 const char *crt1 = NULL;
5646 if (!Args.hasArg(options::OPT_shared)) {
5647 if (Args.hasArg(options::OPT_pg))
5649 else if (Args.hasArg(options::OPT_pie))
5655 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5657 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5659 const char *crtbegin = NULL;
5660 if (Args.hasArg(options::OPT_static))
5661 crtbegin = "crtbeginT.o";
5662 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5663 crtbegin = "crtbeginS.o";
5665 crtbegin = "crtbegin.o";
5667 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5670 Args.AddAllArgs(CmdArgs, options::OPT_L);
5671 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5672 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5674 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5675 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5676 Args.AddAllArgs(CmdArgs, options::OPT_e);
5677 Args.AddAllArgs(CmdArgs, options::OPT_s);
5678 Args.AddAllArgs(CmdArgs, options::OPT_t);
5679 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5680 Args.AddAllArgs(CmdArgs, options::OPT_r);
5682 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5684 if (!Args.hasArg(options::OPT_nostdlib) &&
5685 !Args.hasArg(options::OPT_nodefaultlibs)) {
5687 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5688 if (Args.hasArg(options::OPT_pg))
5689 CmdArgs.push_back("-lm_p");
5691 CmdArgs.push_back("-lm");
5693 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5694 // the default system libraries. Just mimic this for now.
5695 if (Args.hasArg(options::OPT_pg))
5696 CmdArgs.push_back("-lgcc_p");
5698 CmdArgs.push_back("-lgcc");
5699 if (Args.hasArg(options::OPT_static)) {
5700 CmdArgs.push_back("-lgcc_eh");
5701 } else if (Args.hasArg(options::OPT_pg)) {
5702 CmdArgs.push_back("-lgcc_eh_p");
5704 CmdArgs.push_back("--as-needed");
5705 CmdArgs.push_back("-lgcc_s");
5706 CmdArgs.push_back("--no-as-needed");
5709 if (Args.hasArg(options::OPT_pthread)) {
5710 if (Args.hasArg(options::OPT_pg))
5711 CmdArgs.push_back("-lpthread_p");
5713 CmdArgs.push_back("-lpthread");
5716 if (Args.hasArg(options::OPT_pg)) {
5717 if (Args.hasArg(options::OPT_shared))
5718 CmdArgs.push_back("-lc");
5720 CmdArgs.push_back("-lc_p");
5721 CmdArgs.push_back("-lgcc_p");
5723 CmdArgs.push_back("-lc");
5724 CmdArgs.push_back("-lgcc");
5727 if (Args.hasArg(options::OPT_static)) {
5728 CmdArgs.push_back("-lgcc_eh");
5729 } else if (Args.hasArg(options::OPT_pg)) {
5730 CmdArgs.push_back("-lgcc_eh_p");
5732 CmdArgs.push_back("--as-needed");
5733 CmdArgs.push_back("-lgcc_s");
5734 CmdArgs.push_back("--no-as-needed");
5738 if (!Args.hasArg(options::OPT_nostdlib) &&
5739 !Args.hasArg(options::OPT_nostartfiles)) {
5740 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5741 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
5743 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5744 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
5747 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
5750 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
5751 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5754 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5755 const InputInfo &Output,
5756 const InputInfoList &Inputs,
5757 const ArgList &Args,
5758 const char *LinkingOutput) const {
5759 ArgStringList CmdArgs;
5761 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5762 // instruct as in the base system to assemble 32-bit code.
5763 if (getToolChain().getArch() == llvm::Triple::x86)
5764 CmdArgs.push_back("--32");
5766 // Set byte order explicitly
5767 if (getToolChain().getArch() == llvm::Triple::mips)
5768 CmdArgs.push_back("-EB");
5769 else if (getToolChain().getArch() == llvm::Triple::mipsel)
5770 CmdArgs.push_back("-EL");
5772 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5773 options::OPT_Xassembler);
5775 CmdArgs.push_back("-o");
5776 CmdArgs.push_back(Output.getFilename());
5778 for (InputInfoList::const_iterator
5779 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5780 const InputInfo &II = *it;
5781 CmdArgs.push_back(II.getFilename());
5784 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
5785 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5788 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5789 const InputInfo &Output,
5790 const InputInfoList &Inputs,
5791 const ArgList &Args,
5792 const char *LinkingOutput) const {
5793 const Driver &D = getToolChain().getDriver();
5794 ArgStringList CmdArgs;
5796 if (!D.SysRoot.empty())
5797 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5799 if (Args.hasArg(options::OPT_static)) {
5800 CmdArgs.push_back("-Bstatic");
5802 if (Args.hasArg(options::OPT_rdynamic))
5803 CmdArgs.push_back("-export-dynamic");
5804 CmdArgs.push_back("--eh-frame-hdr");
5805 if (Args.hasArg(options::OPT_shared)) {
5806 CmdArgs.push_back("-Bshareable");
5808 CmdArgs.push_back("-dynamic-linker");
5809 CmdArgs.push_back("/libexec/ld.elf_so");
5813 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5814 // instruct ld in the base system to link 32-bit code.
5815 if (getToolChain().getArch() == llvm::Triple::x86) {
5816 CmdArgs.push_back("-m");
5817 CmdArgs.push_back("elf_i386");
5820 if (Output.isFilename()) {
5821 CmdArgs.push_back("-o");
5822 CmdArgs.push_back(Output.getFilename());
5824 assert(Output.isNothing() && "Invalid output.");
5827 if (!Args.hasArg(options::OPT_nostdlib) &&
5828 !Args.hasArg(options::OPT_nostartfiles)) {
5829 if (!Args.hasArg(options::OPT_shared)) {
5830 CmdArgs.push_back(Args.MakeArgString(
5831 getToolChain().GetFilePath("crt0.o")));
5832 CmdArgs.push_back(Args.MakeArgString(
5833 getToolChain().GetFilePath("crti.o")));
5834 CmdArgs.push_back(Args.MakeArgString(
5835 getToolChain().GetFilePath("crtbegin.o")));
5837 CmdArgs.push_back(Args.MakeArgString(
5838 getToolChain().GetFilePath("crti.o")));
5839 CmdArgs.push_back(Args.MakeArgString(
5840 getToolChain().GetFilePath("crtbeginS.o")));
5844 Args.AddAllArgs(CmdArgs, options::OPT_L);
5845 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5846 Args.AddAllArgs(CmdArgs, options::OPT_e);
5847 Args.AddAllArgs(CmdArgs, options::OPT_s);
5848 Args.AddAllArgs(CmdArgs, options::OPT_t);
5849 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5850 Args.AddAllArgs(CmdArgs, options::OPT_r);
5852 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5854 if (!Args.hasArg(options::OPT_nostdlib) &&
5855 !Args.hasArg(options::OPT_nodefaultlibs)) {
5857 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5858 CmdArgs.push_back("-lm");
5860 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5861 // the default system libraries. Just mimic this for now.
5862 if (Args.hasArg(options::OPT_static)) {
5863 CmdArgs.push_back("-lgcc_eh");
5865 CmdArgs.push_back("--as-needed");
5866 CmdArgs.push_back("-lgcc_s");
5867 CmdArgs.push_back("--no-as-needed");
5869 CmdArgs.push_back("-lgcc");
5871 if (Args.hasArg(options::OPT_pthread))
5872 CmdArgs.push_back("-lpthread");
5873 CmdArgs.push_back("-lc");
5875 CmdArgs.push_back("-lgcc");
5876 if (Args.hasArg(options::OPT_static)) {
5877 CmdArgs.push_back("-lgcc_eh");
5879 CmdArgs.push_back("--as-needed");
5880 CmdArgs.push_back("-lgcc_s");
5881 CmdArgs.push_back("--no-as-needed");
5885 if (!Args.hasArg(options::OPT_nostdlib) &&
5886 !Args.hasArg(options::OPT_nostartfiles)) {
5887 if (!Args.hasArg(options::OPT_shared))
5888 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5891 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5893 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5897 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5899 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5900 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5903 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5904 const InputInfo &Output,
5905 const InputInfoList &Inputs,
5906 const ArgList &Args,
5907 const char *LinkingOutput) const {
5908 ArgStringList CmdArgs;
5910 // Add --32/--64 to make sure we get the format we want.
5911 // This is incomplete
5912 if (getToolChain().getArch() == llvm::Triple::x86) {
5913 CmdArgs.push_back("--32");
5914 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5915 CmdArgs.push_back("--64");
5916 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5917 CmdArgs.push_back("-a32");
5918 CmdArgs.push_back("-mppc");
5919 CmdArgs.push_back("-many");
5920 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5921 CmdArgs.push_back("-a64");
5922 CmdArgs.push_back("-mppc64");
5923 CmdArgs.push_back("-many");
5924 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5925 CmdArgs.push_back("-a64");
5926 CmdArgs.push_back("-mppc64le");
5927 CmdArgs.push_back("-many");
5928 } else if (getToolChain().getArch() == llvm::Triple::arm) {
5929 StringRef MArch = getToolChain().getArchName();
5930 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5931 CmdArgs.push_back("-mfpu=neon");
5933 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5934 getToolChain().getTriple());
5935 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
5937 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5938 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5939 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
5940 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5941 getToolChain().getArch() == llvm::Triple::mipsel ||
5942 getToolChain().getArch() == llvm::Triple::mips64 ||
5943 getToolChain().getArch() == llvm::Triple::mips64el) {
5946 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5948 CmdArgs.push_back("-march");
5949 CmdArgs.push_back(CPUName.data());
5951 CmdArgs.push_back("-mabi");
5952 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5954 if (getToolChain().getArch() == llvm::Triple::mips ||
5955 getToolChain().getArch() == llvm::Triple::mips64)
5956 CmdArgs.push_back("-EB");
5958 CmdArgs.push_back("-EL");
5960 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5961 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5962 options::OPT_mno_micromips);
5963 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5964 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5966 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5967 options::OPT_fpic, options::OPT_fno_pic,
5968 options::OPT_fPIE, options::OPT_fno_PIE,
5969 options::OPT_fpie, options::OPT_fno_pie);
5971 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5972 LastPICArg->getOption().matches(options::OPT_fpic) ||
5973 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5974 LastPICArg->getOption().matches(options::OPT_fpie))) {
5975 CmdArgs.push_back("-KPIC");
5977 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
5978 // Always pass an -march option, since our default of z10 is later
5979 // than the GNU assembler's default.
5980 StringRef CPUName = getSystemZTargetCPU(Args);
5981 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
5984 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5985 options::OPT_Xassembler);
5987 CmdArgs.push_back("-o");
5988 CmdArgs.push_back(Output.getFilename());
5990 for (InputInfoList::const_iterator
5991 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5992 const InputInfo &II = *it;
5993 CmdArgs.push_back(II.getFilename());
5997 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5998 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6000 // Handle the debug info splitting at object creation time if we're
6001 // creating an object.
6002 // TODO: Currently only works on linux with newer objcopy.
6003 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
6004 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
6005 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6006 SplitDebugName(Args, Inputs));
6009 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6010 ArgStringList &CmdArgs, const ArgList &Args) {
6011 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
6012 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6013 Args.hasArg(options::OPT_static);
6015 CmdArgs.push_back("-lgcc");
6017 if (StaticLibgcc || isAndroid) {
6019 CmdArgs.push_back("-lgcc");
6022 CmdArgs.push_back("--as-needed");
6023 CmdArgs.push_back("-lgcc_s");
6025 CmdArgs.push_back("--no-as-needed");
6028 if (StaticLibgcc && !isAndroid)
6029 CmdArgs.push_back("-lgcc_eh");
6030 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
6031 CmdArgs.push_back("-lgcc");
6033 // According to Android ABI, we have to link with libdl if we are
6034 // linking with non-static libgcc.
6036 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6037 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6038 if (isAndroid && !StaticLibgcc)
6039 CmdArgs.push_back("-ldl");
6042 static bool hasMipsN32ABIArg(const ArgList &Args) {
6043 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6044 return A && (A->getValue() == StringRef("n32"));
6047 static StringRef getLinuxDynamicLinker(const ArgList &Args,
6048 const toolchains::Linux &ToolChain) {
6049 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6050 return "/system/bin/linker";
6051 else if (ToolChain.getArch() == llvm::Triple::x86)
6052 return "/lib/ld-linux.so.2";
6053 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6054 return "/lib/ld-linux-aarch64.so.1";
6055 else if (ToolChain.getArch() == llvm::Triple::arm ||
6056 ToolChain.getArch() == llvm::Triple::thumb) {
6057 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6058 return "/lib/ld-linux-armhf.so.3";
6060 return "/lib/ld-linux.so.3";
6061 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6062 ToolChain.getArch() == llvm::Triple::mipsel)
6063 return "/lib/ld.so.1";
6064 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6065 ToolChain.getArch() == llvm::Triple::mips64el) {
6066 if (hasMipsN32ABIArg(Args))
6067 return "/lib32/ld.so.1";
6069 return "/lib64/ld.so.1";
6070 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6071 return "/lib/ld.so.1";
6072 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6073 ToolChain.getArch() == llvm::Triple::ppc64le ||
6074 ToolChain.getArch() == llvm::Triple::systemz)
6075 return "/lib64/ld64.so.1";
6077 return "/lib64/ld-linux-x86-64.so.2";
6080 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6081 const InputInfo &Output,
6082 const InputInfoList &Inputs,
6083 const ArgList &Args,
6084 const char *LinkingOutput) const {
6085 const toolchains::Linux& ToolChain =
6086 static_cast<const toolchains::Linux&>(getToolChain());
6087 const Driver &D = ToolChain.getDriver();
6088 const bool isAndroid =
6089 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
6090 SanitizerArgs Sanitize(getToolChain(), Args);
6092 !Args.hasArg(options::OPT_shared) &&
6093 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
6095 ArgStringList CmdArgs;
6097 // Silence warning for "clang -g foo.o -o foo"
6098 Args.ClaimAllArgs(options::OPT_g_Group);
6099 // and "clang -emit-llvm foo.o -o foo"
6100 Args.ClaimAllArgs(options::OPT_emit_llvm);
6101 // and for "clang -w foo.o -o foo". Other warning options are already
6102 // handled somewhere else.
6103 Args.ClaimAllArgs(options::OPT_w);
6105 if (!D.SysRoot.empty())
6106 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6109 CmdArgs.push_back("-pie");
6111 if (Args.hasArg(options::OPT_rdynamic))
6112 CmdArgs.push_back("-export-dynamic");
6114 if (Args.hasArg(options::OPT_s))
6115 CmdArgs.push_back("-s");
6117 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6118 e = ToolChain.ExtraOpts.end();
6120 CmdArgs.push_back(i->c_str());
6122 if (!Args.hasArg(options::OPT_static)) {
6123 CmdArgs.push_back("--eh-frame-hdr");
6126 CmdArgs.push_back("-m");
6127 if (ToolChain.getArch() == llvm::Triple::x86)
6128 CmdArgs.push_back("elf_i386");
6129 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6130 CmdArgs.push_back("aarch64linux");
6131 else if (ToolChain.getArch() == llvm::Triple::arm
6132 || ToolChain.getArch() == llvm::Triple::thumb)
6133 CmdArgs.push_back("armelf_linux_eabi");
6134 else if (ToolChain.getArch() == llvm::Triple::ppc)
6135 CmdArgs.push_back("elf32ppclinux");
6136 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6137 CmdArgs.push_back("elf64ppc");
6138 else if (ToolChain.getArch() == llvm::Triple::mips)
6139 CmdArgs.push_back("elf32btsmip");
6140 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6141 CmdArgs.push_back("elf32ltsmip");
6142 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6143 if (hasMipsN32ABIArg(Args))
6144 CmdArgs.push_back("elf32btsmipn32");
6146 CmdArgs.push_back("elf64btsmip");
6148 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6149 if (hasMipsN32ABIArg(Args))
6150 CmdArgs.push_back("elf32ltsmipn32");
6152 CmdArgs.push_back("elf64ltsmip");
6154 else if (ToolChain.getArch() == llvm::Triple::systemz)
6155 CmdArgs.push_back("elf64_s390");
6157 CmdArgs.push_back("elf_x86_64");
6159 if (Args.hasArg(options::OPT_static)) {
6160 if (ToolChain.getArch() == llvm::Triple::arm
6161 || ToolChain.getArch() == llvm::Triple::thumb)
6162 CmdArgs.push_back("-Bstatic");
6164 CmdArgs.push_back("-static");
6165 } else if (Args.hasArg(options::OPT_shared)) {
6166 CmdArgs.push_back("-shared");
6168 CmdArgs.push_back("-Bsymbolic");
6172 if (ToolChain.getArch() == llvm::Triple::arm ||
6173 ToolChain.getArch() == llvm::Triple::thumb ||
6174 (!Args.hasArg(options::OPT_static) &&
6175 !Args.hasArg(options::OPT_shared))) {
6176 CmdArgs.push_back("-dynamic-linker");
6177 CmdArgs.push_back(Args.MakeArgString(
6178 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
6181 CmdArgs.push_back("-o");
6182 CmdArgs.push_back(Output.getFilename());
6184 if (!Args.hasArg(options::OPT_nostdlib) &&
6185 !Args.hasArg(options::OPT_nostartfiles)) {
6187 const char *crt1 = NULL;
6188 if (!Args.hasArg(options::OPT_shared)){
6189 if (Args.hasArg(options::OPT_pg))
6197 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6199 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6202 const char *crtbegin;
6203 if (Args.hasArg(options::OPT_static))
6204 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
6205 else if (Args.hasArg(options::OPT_shared))
6206 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
6208 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
6210 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
6211 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
6213 // Add crtfastmath.o if available and fast math is enabled.
6214 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
6217 Args.AddAllArgs(CmdArgs, options::OPT_L);
6219 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6221 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6223 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
6225 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6226 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6228 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6229 CmdArgs.push_back("-plugin");
6230 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6231 CmdArgs.push_back(Args.MakeArgString(Plugin));
6233 // Try to pass driver level flags relevant to LTO code generation down to
6236 // Handle architecture-specific flags for selecting CPU variants.
6237 if (ToolChain.getArch() == llvm::Triple::x86 ||
6238 ToolChain.getArch() == llvm::Triple::x86_64)
6240 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6241 getX86TargetCPU(Args, ToolChain.getTriple())));
6242 else if (ToolChain.getArch() == llvm::Triple::arm ||
6243 ToolChain.getArch() == llvm::Triple::thumb)
6245 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6246 getARMTargetCPU(Args, ToolChain.getTriple())));
6248 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6253 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6254 CmdArgs.push_back("--no-demangle");
6256 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6258 // Call these before we add the C++ ABI library.
6259 if (Sanitize.needsUbsanRt())
6260 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
6261 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6262 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
6263 if (Sanitize.needsAsanRt())
6264 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6265 if (Sanitize.needsTsanRt())
6266 addTsanRTLinux(getToolChain(), Args, CmdArgs);
6267 if (Sanitize.needsMsanRt())
6268 addMsanRTLinux(getToolChain(), Args, CmdArgs);
6269 if (Sanitize.needsLsanRt())
6270 addLsanRTLinux(getToolChain(), Args, CmdArgs);
6272 // The profile runtime also needs access to system libraries.
6273 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6276 !Args.hasArg(options::OPT_nostdlib) &&
6277 !Args.hasArg(options::OPT_nodefaultlibs)) {
6278 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6279 !Args.hasArg(options::OPT_static);
6280 if (OnlyLibstdcxxStatic)
6281 CmdArgs.push_back("-Bstatic");
6282 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6283 if (OnlyLibstdcxxStatic)
6284 CmdArgs.push_back("-Bdynamic");
6285 CmdArgs.push_back("-lm");
6288 if (!Args.hasArg(options::OPT_nostdlib)) {
6289 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6290 if (Args.hasArg(options::OPT_static))
6291 CmdArgs.push_back("--start-group");
6293 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6295 CmdArgs.push_back("-lgomp");
6297 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6298 // librt. Most modern Linux platfroms require it, but some may not.
6299 CmdArgs.push_back("-lrt");
6302 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6304 if (Args.hasArg(options::OPT_pthread) ||
6305 Args.hasArg(options::OPT_pthreads) || OpenMP)
6306 CmdArgs.push_back("-lpthread");
6308 CmdArgs.push_back("-lc");
6310 if (Args.hasArg(options::OPT_static))
6311 CmdArgs.push_back("--end-group");
6313 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6316 if (!Args.hasArg(options::OPT_nostartfiles)) {
6318 if (Args.hasArg(options::OPT_shared))
6319 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
6321 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
6323 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
6325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
6327 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6331 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6334 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6335 const InputInfo &Output,
6336 const InputInfoList &Inputs,
6337 const ArgList &Args,
6338 const char *LinkingOutput) const {
6339 ArgStringList CmdArgs;
6341 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6342 options::OPT_Xassembler);
6344 CmdArgs.push_back("-o");
6345 CmdArgs.push_back(Output.getFilename());
6347 for (InputInfoList::const_iterator
6348 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6349 const InputInfo &II = *it;
6350 CmdArgs.push_back(II.getFilename());
6354 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6355 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6358 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
6359 const InputInfo &Output,
6360 const InputInfoList &Inputs,
6361 const ArgList &Args,
6362 const char *LinkingOutput) const {
6363 const Driver &D = getToolChain().getDriver();
6364 ArgStringList CmdArgs;
6366 if (Output.isFilename()) {
6367 CmdArgs.push_back("-o");
6368 CmdArgs.push_back(Output.getFilename());
6370 assert(Output.isNothing() && "Invalid output.");
6373 if (!Args.hasArg(options::OPT_nostdlib) &&
6374 !Args.hasArg(options::OPT_nostartfiles)) {
6375 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6376 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6377 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6378 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6381 Args.AddAllArgs(CmdArgs, options::OPT_L);
6382 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6383 Args.AddAllArgs(CmdArgs, options::OPT_e);
6385 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6387 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6389 if (!Args.hasArg(options::OPT_nostdlib) &&
6390 !Args.hasArg(options::OPT_nodefaultlibs)) {
6392 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6393 CmdArgs.push_back("-lm");
6397 if (!Args.hasArg(options::OPT_nostdlib) &&
6398 !Args.hasArg(options::OPT_nostartfiles)) {
6399 if (Args.hasArg(options::OPT_pthread))
6400 CmdArgs.push_back("-lpthread");
6401 CmdArgs.push_back("-lc");
6402 CmdArgs.push_back("-lCompilerRT-Generic");
6403 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6405 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
6408 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6409 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6414 // For now, DragonFly Assemble does just about the same as for
6415 // FreeBSD, but this may change soon.
6416 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6417 const InputInfo &Output,
6418 const InputInfoList &Inputs,
6419 const ArgList &Args,
6420 const char *LinkingOutput) const {
6421 ArgStringList CmdArgs;
6423 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6424 // instruct as in the base system to assemble 32-bit code.
6425 if (getToolChain().getArch() == llvm::Triple::x86)
6426 CmdArgs.push_back("--32");
6428 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6429 options::OPT_Xassembler);
6431 CmdArgs.push_back("-o");
6432 CmdArgs.push_back(Output.getFilename());
6434 for (InputInfoList::const_iterator
6435 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6436 const InputInfo &II = *it;
6437 CmdArgs.push_back(II.getFilename());
6441 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6442 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6445 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
6446 const InputInfo &Output,
6447 const InputInfoList &Inputs,
6448 const ArgList &Args,
6449 const char *LinkingOutput) const {
6450 bool UseGCC47 = false;
6451 const Driver &D = getToolChain().getDriver();
6452 ArgStringList CmdArgs;
6454 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6457 if (!D.SysRoot.empty())
6458 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6460 CmdArgs.push_back("--eh-frame-hdr");
6461 if (Args.hasArg(options::OPT_static)) {
6462 CmdArgs.push_back("-Bstatic");
6464 if (Args.hasArg(options::OPT_rdynamic))
6465 CmdArgs.push_back("-export-dynamic");
6466 if (Args.hasArg(options::OPT_shared))
6467 CmdArgs.push_back("-Bshareable");
6469 CmdArgs.push_back("-dynamic-linker");
6470 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6472 CmdArgs.push_back("--hash-style=both");
6475 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6476 // instruct ld in the base system to link 32-bit code.
6477 if (getToolChain().getArch() == llvm::Triple::x86) {
6478 CmdArgs.push_back("-m");
6479 CmdArgs.push_back("elf_i386");
6482 if (Output.isFilename()) {
6483 CmdArgs.push_back("-o");
6484 CmdArgs.push_back(Output.getFilename());
6486 assert(Output.isNothing() && "Invalid output.");
6489 if (!Args.hasArg(options::OPT_nostdlib) &&
6490 !Args.hasArg(options::OPT_nostartfiles)) {
6491 if (!Args.hasArg(options::OPT_shared)) {
6492 if (Args.hasArg(options::OPT_pg))
6493 CmdArgs.push_back(Args.MakeArgString(
6494 getToolChain().GetFilePath("gcrt1.o")));
6496 if (Args.hasArg(options::OPT_pie))
6497 CmdArgs.push_back(Args.MakeArgString(
6498 getToolChain().GetFilePath("Scrt1.o")));
6500 CmdArgs.push_back(Args.MakeArgString(
6501 getToolChain().GetFilePath("crt1.o")));
6504 CmdArgs.push_back(Args.MakeArgString(
6505 getToolChain().GetFilePath("crti.o")));
6506 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6507 CmdArgs.push_back(Args.MakeArgString(
6508 getToolChain().GetFilePath("crtbeginS.o")));
6510 CmdArgs.push_back(Args.MakeArgString(
6511 getToolChain().GetFilePath("crtbegin.o")));
6514 Args.AddAllArgs(CmdArgs, options::OPT_L);
6515 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6516 Args.AddAllArgs(CmdArgs, options::OPT_e);
6518 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6520 if (!Args.hasArg(options::OPT_nostdlib) &&
6521 !Args.hasArg(options::OPT_nodefaultlibs)) {
6522 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6525 CmdArgs.push_back("-L/usr/lib/gcc47");
6527 CmdArgs.push_back("-L/usr/lib/gcc44");
6529 if (!Args.hasArg(options::OPT_static)) {
6531 CmdArgs.push_back("-rpath");
6532 CmdArgs.push_back("/usr/lib/gcc47");
6534 CmdArgs.push_back("-rpath");
6535 CmdArgs.push_back("/usr/lib/gcc44");
6540 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6541 CmdArgs.push_back("-lm");
6544 if (Args.hasArg(options::OPT_pthread))
6545 CmdArgs.push_back("-lpthread");
6547 if (!Args.hasArg(options::OPT_nolibc)) {
6548 CmdArgs.push_back("-lc");
6552 if (Args.hasArg(options::OPT_static) ||
6553 Args.hasArg(options::OPT_static_libgcc)) {
6554 CmdArgs.push_back("-lgcc");
6555 CmdArgs.push_back("-lgcc_eh");
6557 if (Args.hasArg(options::OPT_shared_libgcc)) {
6558 CmdArgs.push_back("-lgcc_pic");
6559 if (!Args.hasArg(options::OPT_shared))
6560 CmdArgs.push_back("-lgcc");
6562 CmdArgs.push_back("-lgcc");
6563 CmdArgs.push_back("--as-needed");
6564 CmdArgs.push_back("-lgcc_pic");
6565 CmdArgs.push_back("--no-as-needed");
6569 if (Args.hasArg(options::OPT_shared)) {
6570 CmdArgs.push_back("-lgcc_pic");
6572 CmdArgs.push_back("-lgcc");
6577 if (!Args.hasArg(options::OPT_nostdlib) &&
6578 !Args.hasArg(options::OPT_nostartfiles)) {
6579 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6580 CmdArgs.push_back(Args.MakeArgString(
6581 getToolChain().GetFilePath("crtendS.o")));
6583 CmdArgs.push_back(Args.MakeArgString(
6584 getToolChain().GetFilePath("crtend.o")));
6585 CmdArgs.push_back(Args.MakeArgString(
6586 getToolChain().GetFilePath("crtn.o")));
6589 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6592 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6593 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6596 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6597 const InputInfo &Output,
6598 const InputInfoList &Inputs,
6599 const ArgList &Args,
6600 const char *LinkingOutput) const {
6601 ArgStringList CmdArgs;
6603 if (Output.isFilename()) {
6604 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6605 Output.getFilename()));
6607 assert(Output.isNothing() && "Invalid output.");
6610 if (!Args.hasArg(options::OPT_nostdlib) &&
6611 !Args.hasArg(options::OPT_nostartfiles)) {
6612 CmdArgs.push_back("-defaultlib:libcmt");
6615 CmdArgs.push_back("-nologo");
6617 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6619 // Add filenames immediately.
6620 for (InputInfoList::const_iterator
6621 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6622 if (it->isFilename())
6623 CmdArgs.push_back(it->getFilename());
6627 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
6628 C.addCommand(new Command(JA, *this, Exec, CmdArgs));