1 //===--- Tools.cpp - Tools Implementations --------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "Tools.h"
11 #include "InputInfo.h"
12 #include "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"
37 #include <sys/stat.h>
38
39 using namespace clang::driver;
40 using namespace clang::driver::tools;
41 using namespace clang;
42 using namespace llvm::opt;
43
44 /// CheckPreprocessingOptions - Perform some validation of preprocessing
45 /// arguments that is shared with gcc.
CheckPreprocessingOptions(const Driver & D,const ArgList & Args)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";
51 }
52
53 /// CheckCodeGenerationOptions - Perform some validation of code generation
54 /// arguments that is shared with gcc.
CheckCodeGenerationOptions(const Driver & D,const ArgList & Args)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";
62 }
63
64 // Quote target names for inclusion in GNU Make dependency files.
65 // Only the characters '$', '#', ' ', '\t' are quoted.
QuoteTarget(StringRef Target,SmallVectorImpl<char> & Res)66 static void QuoteTarget(StringRef Target,
67 SmallVectorImpl<char> &Res) {
68 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
69 switch (Target[i]) {
70 case ' ':
71 case '\t':
72 // Escape the preceding backslashes
73 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
74 Res.push_back('\\');
75
76 // Escape the space/tab
77 Res.push_back('\\');
78 break;
79 case '$':
80 Res.push_back('$');
81 break;
82 case '#':
83 Res.push_back('\\');
84 break;
85 default:
86 break;
87 }
88
89 Res.push_back(Target[i]);
90 }
91 }
92
addDirectoryList(const ArgList & Args,ArgStringList & CmdArgs,const char * ArgName,const char * EnvVar)93 static void addDirectoryList(const ArgList &Args,
94 ArgStringList &CmdArgs,
95 const char *ArgName,
96 const char *EnvVar) {
97 const char *DirList = ::getenv(EnvVar);
98 bool CombinedArg = false;
99
100 if (!DirList)
101 return; // Nothing to do.
102
103 StringRef Name(ArgName);
104 if (Name.equals("-I") || Name.equals("-L"))
105 CombinedArg = true;
106
107 StringRef Dirs(DirList);
108 if (Dirs.empty()) // Empty string should not add '.'.
109 return;
110
111 StringRef::size_type Delim;
112 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
113 if (Delim == 0) { // Leading colon.
114 if (CombinedArg) {
115 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
116 } else {
117 CmdArgs.push_back(ArgName);
118 CmdArgs.push_back(".");
119 }
120 } else {
121 if (CombinedArg) {
122 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
123 } else {
124 CmdArgs.push_back(ArgName);
125 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
126 }
127 }
128 Dirs = Dirs.substr(Delim + 1);
129 }
130
131 if (Dirs.empty()) { // Trailing colon.
132 if (CombinedArg) {
133 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
134 } else {
135 CmdArgs.push_back(ArgName);
136 CmdArgs.push_back(".");
137 }
138 } else { // Add the last path.
139 if (CombinedArg) {
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
141 } else {
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(Args.MakeArgString(Dirs));
144 }
145 }
146 }
147
AddLinkerInputs(const ToolChain & TC,const InputInfoList & Inputs,const ArgList & Args,ArgStringList & CmdArgs)148 static void AddLinkerInputs(const ToolChain &TC,
149 const InputInfoList &Inputs, const ArgList &Args,
150 ArgStringList &CmdArgs) {
151 const Driver &D = TC.getDriver();
152
153 // Add extra linker input arguments which are not treated as inputs
154 // (constructed via -Xarch_).
155 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
156
157 for (InputInfoList::const_iterator
158 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
159 const InputInfo &II = *it;
160
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();
169 }
170
171 // Add filenames immediately.
172 if (II.isFilename()) {
173 CmdArgs.push_back(II.getFilename());
174 continue;
175 }
176
177 // Otherwise, this is a linker input argument.
178 const Arg &A = II.getInputArg();
179
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);
185 } else
186 A.renderAsInput(Args, CmdArgs);
187 }
188
189 // LIBRARY_PATH - included following the user specified library paths.
190 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
191 }
192
193 /// \brief Determine whether Objective-C automated reference counting is
194 /// enabled.
isObjCAutoRefCount(const ArgList & Args)195 static bool isObjCAutoRefCount(const ArgList &Args) {
196 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
197 }
198
199 /// \brief Determine whether we are linking the ObjC runtime.
isObjCRuntimeLinked(const ArgList & Args)200 static bool isObjCRuntimeLinked(const ArgList &Args) {
201 if (isObjCAutoRefCount(Args)) {
202 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
203 return true;
204 }
205 return Args.hasArg(options::OPT_fobjc_link_runtime);
206 }
207
addProfileRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,llvm::Triple Triple)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)))
215 return;
216
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";
223
224 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
225 }
226
forwardToGCC(const Option & O)227 static bool forwardToGCC(const Option &O) {
228 // Don't forward inputs from the original command line. They are added from
229 // InputInfoList.
230 return O.getKind() != Option::InputClass &&
231 !O.hasFlag(options::DriverOption) &&
232 !O.hasFlag(options::LinkerInput);
233 }
234
AddPreprocessingOptions(Compilation & C,const JobAction & JA,const Driver & D,const ArgList & Args,ArgStringList & CmdArgs,const InputInfo & Output,const InputInfoList & Inputs) const235 void Clang::AddPreprocessingOptions(Compilation &C,
236 const JobAction &JA,
237 const Driver &D,
238 const ArgList &Args,
239 ArgStringList &CmdArgs,
240 const InputInfo &Output,
241 const InputInfoList &Inputs) const {
242 Arg *A;
243
244 CheckPreprocessingOptions(D, Args);
245
246 Args.AddLastArg(CmdArgs, options::OPT_C);
247 Args.AddLastArg(CmdArgs, options::OPT_CC);
248
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.
254 const char *DepFile;
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)) {
262 DepFile = "-";
263 } else {
264 DepFile = getDependencyFileName(Args, Inputs);
265 C.addFailureResultFile(DepFile, &JA);
266 }
267 CmdArgs.push_back("-dependency-file");
268 CmdArgs.push_back(DepFile);
269
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;
273
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();
279 } else {
280 // Otherwise derive from the base input.
281 //
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));
286 }
287
288 CmdArgs.push_back("-MT");
289 SmallString<128> Quoted;
290 QuoteTarget(DepTarget, Quoted);
291 CmdArgs.push_back(Args.MakeArgString(Quoted));
292 }
293
294 if (A->getOption().matches(options::OPT_M) ||
295 A->getOption().matches(options::OPT_MD))
296 CmdArgs.push_back("-sys-header-deps");
297 }
298
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");
304 }
305
306 Args.AddLastArg(CmdArgs, options::OPT_MP);
307
308 // Convert all -MQ <target> args to -MT <quoted target>
309 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
310 options::OPT_MQ),
311 ie = Args.filtered_end(); it != ie; ++it) {
312 const Arg *A = *it;
313 A->claim();
314
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));
320
321 // -MT flag - no change
322 } else {
323 A->render(Args, CmdArgs);
324 }
325 }
326
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
331 // .gch files.
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) {
335 const Arg *A = it;
336
337 if (A->getOption().matches(options::OPT_include)) {
338 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
339 RenderedImplicitInclude = true;
340
341 // Use PCH if the user requested it.
342 bool UsePCH = D.CCCUsePCH;
343
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.
349 P += ".dummy";
350 if (UsePCH) {
351 llvm::sys::path::replace_extension(P, "pch");
352 if (llvm::sys::fs::exists(P.str()))
353 FoundPCH = true;
354 }
355
356 if (!FoundPCH) {
357 llvm::sys::path::replace_extension(P, "pth");
358 if (llvm::sys::fs::exists(P.str()))
359 FoundPTH = true;
360 }
361
362 if (!FoundPCH && !FoundPTH) {
363 llvm::sys::path::replace_extension(P, "gch");
364 if (llvm::sys::fs::exists(P.str())) {
365 FoundPCH = UsePCH;
366 FoundPTH = !UsePCH;
367 }
368 }
369
370 if (FoundPCH || FoundPTH) {
371 if (IsFirstImplicitInclude) {
372 A->claim();
373 if (UsePCH)
374 CmdArgs.push_back("-include-pch");
375 else
376 CmdArgs.push_back("-include-pth");
377 CmdArgs.push_back(Args.MakeArgString(P.str()));
378 continue;
379 } else {
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);
383 }
384 }
385 }
386
387 // Not translated, render as usual.
388 A->claim();
389 A->render(Args, CmdArgs);
390 }
391
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);
395
396 // Add -Wp, and -Xassembler if using the preprocessor.
397
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
401 // those options. :(
402 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
403 options::OPT_Xpreprocessor);
404
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);
408
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();
412 if (sysroot != "") {
413 if (!Args.hasArg(options::OPT_isysroot)) {
414 CmdArgs.push_back("-isysroot");
415 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
416 }
417 }
418
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");
433
434 // Add C++ include arguments, if needed.
435 if (types::isCXX(Inputs[0].getType()))
436 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
437
438 // Add system include arguments.
439 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
440 }
441
442 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
443 /// CPU.
444 //
445 // FIXME: This is redundant with -mcpu, why does LLVM use this.
446 // FIXME: tblgen this, or kill it!
getLLVMArchSuffixForARM(StringRef CPU)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")
469 .Default("");
470 }
471
472 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
473 //
474 // FIXME: tblgen this.
getARMTargetCPU(const ArgList & Args,const llvm::Triple & Triple)475 static std::string getARMTargetCPU(const ArgList &Args,
476 const llvm::Triple &Triple) {
477 // FIXME: Warn on inconsistent use of -mcpu and -march.
478
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();
485 else
486 return MCPU;
487 }
488
489 StringRef MArch;
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();
493 } else {
494 // Otherwise, use the Arch from the triple.
495 MArch = Triple.getArchName();
496 }
497
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);
506 MArch = NativeMArch;
507 }
508 }
509
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");
537 }
538
539 // FIXME: Move to target hook.
isSignedCharDefault(const llvm::Triple & Triple)540 static bool isSignedCharDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return true;
544
545 case llvm::Triple::aarch64:
546 case llvm::Triple::arm:
547 case llvm::Triple::ppc:
548 case llvm::Triple::ppc64:
549 if (Triple.isOSDarwin())
550 return true;
551 return false;
552
553 case llvm::Triple::ppc64le:
554 case llvm::Triple::systemz:
555 return false;
556 }
557 }
558
559 // Handle -mfpu=.
560 //
561 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
562 // frontend target.
addFPUArgs(const Driver & D,const Arg * A,const ArgList & Args,ArgStringList & CmdArgs)563 static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
564 ArgStringList &CmdArgs) {
565 StringRef FPU = A->getValue();
566
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");
604 } else
605 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
606 }
607
608 // Handle -mfpmath=.
addFPMathArgs(const Driver & D,const Arg * A,const ArgList & Args,ArgStringList & CmdArgs,StringRef CPU)609 static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
610 ArgStringList &CmdArgs, StringRef CPU) {
611 StringRef FPMath = A->getValue();
612
613 // Set the target features based on the FPMath.
614 if (FPMath == "neon") {
615 CmdArgs.push_back("-target-feature");
616 CmdArgs.push_back("+neonfp");
617
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;
622
623 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
624 FPMath == "vfp4") {
625 CmdArgs.push_back("-target-feature");
626 CmdArgs.push_back("-neonfp");
627
628 // FIXME: Add warnings when disabling a feature not present for a given CPU.
629 } else
630 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
631 }
632
633 // Select the float ABI as determined by -msoft-float, -mhard-float, and
634 // -mfloat-abi=.
getARMFloatABI(const Driver & D,const ArgList & Args,const llvm::Triple & Triple)635 static StringRef getARMFloatABI(const Driver &D,
636 const ArgList &Args,
637 const llvm::Triple &Triple) {
638 StringRef FloatABI;
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))
643 FloatABI = "soft";
644 else if (A->getOption().matches(options::OPT_mhard_float))
645 FloatABI = "hard";
646 else {
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);
651 FloatABI = "soft";
652 }
653 }
654 }
655
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.
663 //
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"))
669 FloatABI = "softfp";
670 else
671 FloatABI = "soft";
672 break;
673 }
674
675 case llvm::Triple::FreeBSD:
676 // FreeBSD defaults to soft float
677 FloatABI = "soft";
678 break;
679
680 default:
681 switch(Triple.getEnvironment()) {
682 case llvm::Triple::GNUEABIHF:
683 FloatABI = "hard";
684 break;
685 case llvm::Triple::GNUEABI:
686 FloatABI = "softfp";
687 break;
688 case llvm::Triple::EABI:
689 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
690 FloatABI = "softfp";
691 break;
692 case llvm::Triple::Android: {
693 std::string ArchName =
694 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
695 if (StringRef(ArchName).startswith("v7"))
696 FloatABI = "softfp";
697 else
698 FloatABI = "soft";
699 break;
700 }
701 default:
702 // Assume "soft", but warn the user we are guessing.
703 FloatABI = "soft";
704 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
705 break;
706 }
707 }
708 }
709
710 return FloatABI;
711 }
712
713
AddARMTargetArgs(const ArgList & Args,ArgStringList & CmdArgs,bool KernelOrKext) const714 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);
722
723 // Select the ABI to use.
724 //
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")) {
733 ABIName = "aapcs";
734 } else {
735 ABIName = "apcs-gnu";
736 }
737 } else {
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";
744 break;
745 case llvm::Triple::EABI:
746 ABIName = "aapcs";
747 break;
748 default:
749 ABIName = "apcs-gnu";
750 }
751 }
752 CmdArgs.push_back("-target-abi");
753 CmdArgs.push_back(ABIName);
754
755 // Set the CPU based on -march= and -mcpu=.
756 CmdArgs.push_back("-target-cpu");
757 CmdArgs.push_back(Args.MakeArgString(CPUName));
758
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.
763 //
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");
772 } else {
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");
777 }
778
779 // Set appropriate target features for floating point mode.
780 //
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.
784
785 // Use software floating point operations?
786 if (FloatABI == "soft") {
787 CmdArgs.push_back("-target-feature");
788 CmdArgs.push_back("+soft-float");
789 }
790
791 // Use software floating point argument passing?
792 if (FloatABI != "hard") {
793 CmdArgs.push_back("-target-feature");
794 CmdArgs.push_back("+soft-float-abi");
795 }
796
797 // Honor -mfpu=.
798 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
799 addFPUArgs(D, A, Args, CmdArgs);
800
801 // Honor -mfpmath=.
802 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
803 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
804
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");
810 }
811
812 // Kernel code has more strict alignment requirements.
813 if (KernelOrKext) {
814 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
815 CmdArgs.push_back("-backend-option");
816 CmdArgs.push_back("-arm-long-calls");
817 }
818
819 CmdArgs.push_back("-backend-option");
820 CmdArgs.push_back("-arm-strict-align");
821
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");
825 }
826
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");
833 }
834
835 if (!Args.hasFlag(options::OPT_mimplicit_float,
836 options::OPT_mno_implicit_float,
837 true))
838 CmdArgs.push_back("-no-implicit-float");
839 }
840
841 // Translate MIPS CPU name alias option to CPU name.
getMipsCPUFromAlias(const Arg & A)842 static StringRef getMipsCPUFromAlias(const Arg &A) {
843 if (A.getOption().matches(options::OPT_mips32))
844 return "mips32";
845 if (A.getOption().matches(options::OPT_mips32r2))
846 return "mips32r2";
847 if (A.getOption().matches(options::OPT_mips64))
848 return "mips64";
849 if (A.getOption().matches(options::OPT_mips64r2))
850 return "mips64r2";
851 llvm_unreachable("Unexpected option");
852 return "";
853 }
854
855 // Get CPU and ABI names. They are not independent
856 // so we have to calculate them together.
getMipsCPUAndABI(const ArgList & Args,const ToolChain & TC,StringRef & CPUName,StringRef & ABIName)857 static void getMipsCPUAndABI(const ArgList &Args,
858 const ToolChain &TC,
859 StringRef &CPUName,
860 StringRef &ABIName) {
861 const char *DefMips32CPU = "mips32";
862 const char *DefMips64CPU = "mips64";
863
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);
869 else
870 CPUName = A->getValue();
871 }
872
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)
878 .Case("32", "o32")
879 .Case("64", "n64")
880 .Default(ABIName);
881 }
882
883 // Setup default CPU and ABI names.
884 if (CPUName.empty() && ABIName.empty()) {
885 switch (TC.getArch()) {
886 default:
887 llvm_unreachable("Unexpected triple arch name");
888 case llvm::Triple::mips:
889 case llvm::Triple::mipsel:
890 CPUName = DefMips32CPU;
891 break;
892 case llvm::Triple::mips64:
893 case llvm::Triple::mips64el:
894 CPUName = DefMips64CPU;
895 break;
896 }
897 }
898
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)
904 .Default("");
905 }
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")
911 .Default("");
912 }
913
914 // FIXME: Warn on inconsistent cpu and abi usage.
915 }
916
917 // Convert ABI name to the GNU tools acceptable variant.
getGnuCompatibleMipsABIName(StringRef ABI)918 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
919 return llvm::StringSwitch<llvm::StringRef>(ABI)
920 .Case("o32", "32")
921 .Case("n64", "64")
922 .Default(ABI);
923 }
924
925 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
926 // and -mfloat-abi=.
getMipsFloatABI(const Driver & D,const ArgList & Args)927 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
928 StringRef FloatABI;
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))
933 FloatABI = "soft";
934 else if (A->getOption().matches(options::OPT_mhard_float))
935 FloatABI = "hard";
936 else {
937 FloatABI = A->getValue();
938 if (FloatABI != "soft" && FloatABI != "hard") {
939 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
940 FloatABI = "hard";
941 }
942 }
943 }
944
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.
950 FloatABI = "hard";
951 }
952
953 return FloatABI;
954 }
955
AddTargetFeature(const ArgList & Args,ArgStringList & CmdArgs,OptSpecifier OnOpt,OptSpecifier OffOpt,StringRef FeatureName)956 static void AddTargetFeature(const ArgList &Args,
957 ArgStringList &CmdArgs,
958 OptSpecifier OnOpt,
959 OptSpecifier OffOpt,
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));
965 else
966 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
967 }
968 }
969
AddMIPSTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const970 void Clang::AddMIPSTargetArgs(const ArgList &Args,
971 ArgStringList &CmdArgs) const {
972 const Driver &D = getToolChain().getDriver();
973 StringRef CPUName;
974 StringRef ABIName;
975 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
976
977 CmdArgs.push_back("-target-cpu");
978 CmdArgs.push_back(CPUName.data());
979
980 CmdArgs.push_back("-target-abi");
981 CmdArgs.push_back(ABIName.data());
982
983 StringRef FloatABI = getMipsFloatABI(D, Args);
984
985 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
986
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");
992
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");
998
999 if (FloatABI == "hard" && IsMips16) {
1000 CmdArgs.push_back("-mllvm");
1001 CmdArgs.push_back("-mips16-hard-float");
1002 }
1003 }
1004 else {
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");
1009 }
1010
1011 AddTargetFeature(Args, CmdArgs,
1012 options::OPT_msingle_float, options::OPT_mdouble_float,
1013 "single-float");
1014 AddTargetFeature(Args, CmdArgs,
1015 options::OPT_mips16, options::OPT_mno_mips16,
1016 "mips16");
1017 AddTargetFeature(Args, CmdArgs,
1018 options::OPT_mmicromips, options::OPT_mno_micromips,
1019 "micromips");
1020 AddTargetFeature(Args, CmdArgs,
1021 options::OPT_mdsp, options::OPT_mno_dsp,
1022 "dsp");
1023 AddTargetFeature(Args, CmdArgs,
1024 options::OPT_mdspr2, options::OPT_mno_dspr2,
1025 "dspr2");
1026
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");
1031 }
1032 }
1033
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");
1039 }
1040 }
1041
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");
1047 }
1048 }
1049
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));
1054 A->claim();
1055 }
1056 }
1057
1058 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
getPPCTargetCPU(const ArgList & Args)1059 static std::string getPPCTargetCPU(const ArgList &Args) {
1060 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1061 StringRef CPUName = A->getValue();
1062
1063 if (CPUName == "native") {
1064 std::string CPU = llvm::sys::getHostCPUName();
1065 if (!CPU.empty() && CPU != "generic")
1066 return CPU;
1067 else
1068 return "";
1069 }
1070
1071 return llvm::StringSwitch<const char *>(CPUName)
1072 .Case("common", "generic")
1073 .Case("440", "440")
1074 .Case("440fp", "440")
1075 .Case("450", "450")
1076 .Case("601", "601")
1077 .Case("602", "602")
1078 .Case("603", "603")
1079 .Case("603e", "603e")
1080 .Case("603ev", "603ev")
1081 .Case("604", "604")
1082 .Case("604e", "604e")
1083 .Case("620", "620")
1084 .Case("630", "pwr3")
1085 .Case("G3", "g3")
1086 .Case("7400", "7400")
1087 .Case("G4", "g4")
1088 .Case("7450", "7450")
1089 .Case("G4+", "g4+")
1090 .Case("750", "750")
1091 .Case("970", "970")
1092 .Case("G5", "g5")
1093 .Case("a2", "a2")
1094 .Case("a2q", "a2q")
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")
1114 .Default("");
1115 }
1116
1117 return "";
1118 }
1119
AddPPCTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1120 void Clang::AddPPCTargetArgs(const ArgList &Args,
1121 ArgStringList &CmdArgs) const {
1122 std::string TargetCPUName = getPPCTargetCPU(Args);
1123
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";
1133 else
1134 TargetCPUName = "ppc";
1135 }
1136
1137 if (!TargetCPUName.empty()) {
1138 CmdArgs.push_back("-target-cpu");
1139 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1140 }
1141
1142 // Allow override of the Altivec feature.
1143 AddTargetFeature(Args, CmdArgs,
1144 options::OPT_faltivec, options::OPT_fno_altivec,
1145 "altivec");
1146
1147 AddTargetFeature(Args, CmdArgs,
1148 options::OPT_mfprnd, options::OPT_mno_fprnd,
1149 "fprnd");
1150
1151 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1152 AddTargetFeature(Args, CmdArgs,
1153 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1154 "mfocrf");
1155
1156 AddTargetFeature(Args, CmdArgs,
1157 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1158 "popcntd");
1159
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");
1165 }
1166 }
1167
1168 /// Get the (LLVM) name of the R600 gpu we are targeting.
getR600TargetGPU(const ArgList & Args)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());
1181 }
1182 return "";
1183 }
1184
AddR600TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1185 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()));
1190 }
1191
AddSparcTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1192 void Clang::AddSparcTargetArgs(const ArgList &Args,
1193 ArgStringList &CmdArgs) const {
1194 const Driver &D = getToolChain().getDriver();
1195
1196 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1197 CmdArgs.push_back("-target-cpu");
1198 CmdArgs.push_back(A->getValue());
1199 }
1200
1201 // Select the float ABI as determined by -msoft-float, -mhard-float, and
1202 StringRef FloatABI;
1203 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1204 options::OPT_mhard_float)) {
1205 if (A->getOption().matches(options::OPT_msoft_float))
1206 FloatABI = "soft";
1207 else if (A->getOption().matches(options::OPT_mhard_float))
1208 FloatABI = "hard";
1209 }
1210
1211 // If unspecified, choose the default based on the platform.
1212 if (FloatABI.empty()) {
1213 // Assume "soft", but warn the user we are guessing.
1214 FloatABI = "soft";
1215 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
1216 }
1217
1218 if (FloatABI == "soft") {
1219 // Floating point operations and argument passing are soft.
1220 //
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");
1225 } else {
1226 assert(FloatABI == "hard" && "Invalid float abi!");
1227 CmdArgs.push_back("-mhard-float");
1228 }
1229 }
1230
getSystemZTargetCPU(const ArgList & Args)1231 static const char *getSystemZTargetCPU(const ArgList &Args) {
1232 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1233 return A->getValue();
1234 return "z10";
1235 }
1236
AddSystemZTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1237 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);
1242 }
1243
getX86TargetCPU(const ArgList & Args,const llvm::Triple & Triple)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();
1249
1250 // FIXME: Reject attempts to use -march=native unless the target matches
1251 // the host.
1252 //
1253 // FIXME: We should also incorporate the detected target features for use
1254 // with -native.
1255 std::string CPU = llvm::sys::getHostCPUName();
1256 if (!CPU.empty() && CPU != "generic")
1257 return Args.MakeArgString(CPU);
1258 }
1259
1260 // Select the default CPU if none was given (or detection failed).
1261
1262 if (Triple.getArch() != llvm::Triple::x86_64 &&
1263 Triple.getArch() != llvm::Triple::x86)
1264 return 0; // This routine is only handling x86 targets.
1265
1266 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1267
1268 // FIXME: Need target hooks.
1269 if (Triple.isOSDarwin())
1270 return Is64Bit ? "core2" : "yonah";
1271
1272 // Everything else goes to x86-64 in 64-bit mode.
1273 if (Is64Bit)
1274 return "x86-64";
1275
1276 if (Triple.getOSName().startswith("haiku"))
1277 return "i586";
1278 if (Triple.getOSName().startswith("openbsd"))
1279 return "i486";
1280 if (Triple.getOSName().startswith("bitrig"))
1281 return "i686";
1282 if (Triple.getOSName().startswith("freebsd"))
1283 return "i486";
1284 if (Triple.getOSName().startswith("netbsd"))
1285 return "i486";
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)
1289 return "core2";
1290
1291 // Fallback to p4.
1292 return "pentium4";
1293 }
1294
AddX86TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1295 void Clang::AddX86TargetArgs(const ArgList &Args,
1296 ArgStringList &CmdArgs) const {
1297 if (!Args.hasFlag(options::OPT_mred_zone,
1298 options::OPT_mno_red_zone,
1299 true) ||
1300 Args.hasArg(options::OPT_mkernel) ||
1301 Args.hasArg(options::OPT_fapple_kext))
1302 CmdArgs.push_back("-disable-red-zone");
1303
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));
1315 }
1316 if (NoImplicitFloat)
1317 CmdArgs.push_back("-no-implicit-float");
1318
1319 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
1320 CmdArgs.push_back("-target-cpu");
1321 CmdArgs.push_back(CPUName);
1322 }
1323
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
1329 // attributes here.
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();
1335 (*it)->claim();
1336
1337 // Skip over "-m".
1338 assert(Name.startswith("m") && "Invalid feature name.");
1339 Name = Name.substr(1);
1340
1341 bool IsNegative = Name.startswith("no-");
1342 if (IsNegative)
1343 Name = Name.substr(3);
1344
1345 unsigned& Prev = PrevFeature[Name];
1346 if (Prev)
1347 Features[Prev - 1] = 0;
1348 Prev = Features.size() + 1;
1349 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1350 }
1351 for (unsigned i = 0; i < Features.size(); i++) {
1352 if (Features[i]) {
1353 CmdArgs.push_back("-target-feature");
1354 CmdArgs.push_back(Features[i]);
1355 }
1356 }
1357 }
1358
HasPICArg(const ArgList & Args)1359 static inline bool HasPICArg(const ArgList &Args) {
1360 return Args.hasArg(options::OPT_fPIC)
1361 || Args.hasArg(options::OPT_fpic);
1362 }
1363
GetLastSmallDataThresholdArg(const ArgList & Args)1364 static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1365 return Args.getLastArg(options::OPT_G,
1366 options::OPT_G_EQ,
1367 options::OPT_msmall_data_threshold_EQ);
1368 }
1369
GetHexagonSmallDataThresholdValue(const ArgList & Args)1370 static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1371 std::string value;
1372 if (HasPICArg(Args))
1373 value = "0";
1374 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1375 value = A->getValue();
1376 A->claim();
1377 }
1378 return value;
1379 }
1380
AddHexagonTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1381 void Clang::AddHexagonTargetArgs(const ArgList &Args,
1382 ArgStringList &CmdArgs) const {
1383 llvm::Triple Triple = getToolChain().getTriple();
1384
1385 CmdArgs.push_back("-target-cpu");
1386 CmdArgs.push_back(Args.MakeArgString(
1387 "hexagon"
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");
1392
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));
1398 }
1399
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");
1405 }
1406 CmdArgs.push_back ("-mllvm");
1407 CmdArgs.push_back ("-machine-sink-split=0");
1408 }
1409
AddAArch64TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1410 void Clang::AddAArch64TargetArgs(const ArgList &Args,
1411 ArgStringList &CmdArgs) const {
1412 const Driver &D = getToolChain().getDriver();
1413 // Honor -mfpu=.
1414 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
1415 addFPUArgs(D, A, Args, CmdArgs);
1416 }
1417
1418 static bool
shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime & runtime,const llvm::Triple & Triple)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
1423 // later.
1424 if (runtime.isNonFragile())
1425 return true;
1426
1427 if (!Triple.isOSDarwin())
1428 return false;
1429
1430 return (!Triple.isMacOSXVersionLT(10,5) &&
1431 (Triple.getArch() == llvm::Triple::x86_64 ||
1432 Triple.getArch() == llvm::Triple::arm));
1433 }
1434
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.
addExceptionArgs(const ArgList & Args,types::ID InputType,const llvm::Triple & Triple,bool KernelOrKext,const ObjCRuntime & objcRuntime,ArgStringList & CmdArgs)1440 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1441 const llvm::Triple &Triple,
1442 bool KernelOrKext,
1443 const ObjCRuntime &objcRuntime,
1444 ArgStringList &CmdArgs) {
1445 if (KernelOrKext) {
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);
1454 return;
1455 }
1456
1457 // Exceptions are enabled by default.
1458 bool ExceptionsEnabled = true;
1459
1460 // This keeps track of whether exceptions were explicitly turned on or off.
1461 bool DidHaveExplicitExceptionFlag = false;
1462
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;
1467 else
1468 ExceptionsEnabled = false;
1469
1470 DidHaveExplicitExceptionFlag = true;
1471 }
1472
1473 bool ShouldUseExceptionTables = false;
1474
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;
1479
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,
1485 true)) {
1486 CmdArgs.push_back("-fobjc-exceptions");
1487
1488 ShouldUseExceptionTables |=
1489 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
1490 }
1491
1492 if (types::isCXX(InputType)) {
1493 bool CXXExceptionsEnabled = ExceptionsEnabled;
1494
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;
1503 }
1504
1505 if (CXXExceptionsEnabled) {
1506 CmdArgs.push_back("-fcxx-exceptions");
1507
1508 ShouldUseExceptionTables = true;
1509 }
1510 }
1511
1512 if (ShouldUseExceptionTables)
1513 CmdArgs.push_back("-fexceptions");
1514 }
1515
ShouldDisableAutolink(const ArgList & Args,const ToolChain & TC)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();
1523 }
1524 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1525 Default);
1526 }
1527
ShouldDisableCFI(const ArgList & Args,const ToolChain & TC)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();
1535 }
1536 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1537 options::OPT_fno_dwarf2_cfi_asm,
1538 Default);
1539 }
1540
ShouldDisableDwarfDirectory(const ArgList & Args,const ToolChain & TC)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;
1547 }
1548
1549 /// \brief Check whether the given input tree contains any compilation actions.
ContainsCompileAction(const Action * A)1550 static bool ContainsCompileAction(const Action *A) {
1551 if (isa<CompileJobAction>(A))
1552 return true;
1553
1554 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1555 if (ContainsCompileAction(*it))
1556 return true;
1557
1558 return false;
1559 }
1560
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.
UseRelaxAll(Compilation & C,const ArgList & Args)1563 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1564 bool RelaxDefault = true;
1565
1566 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1567 RelaxDefault = A->getOption().matches(options::OPT_O0);
1568
1569 if (RelaxDefault) {
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;
1575 break;
1576 }
1577 }
1578 }
1579
1580 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1581 RelaxDefault);
1582 }
1583
CollectArgsForIntegratedAssembler(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs,const Driver & D)1584 static void CollectArgsForIntegratedAssembler(Compilation &C,
1585 const ArgList &Args,
1586 ArgStringList &CmdArgs,
1587 const Driver &D) {
1588 if (UseRelaxAll(C, Args))
1589 CmdArgs.push_back("-mrelax-all");
1590
1591 // When using an integrated assembler, translate -Wa, and -Xassembler
1592 // options.
1593 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1594 options::OPT_Xassembler),
1595 ie = Args.filtered_end(); it != ie; ++it) {
1596 const Arg *A = *it;
1597 A->claim();
1598
1599 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1600 StringRef Value = A->getValue(i);
1601
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");
1611 } else {
1612 D.Diag(diag::err_drv_unsupported_option_argument)
1613 << A->getOption().getName() << Value;
1614 }
1615 }
1616 }
1617 }
1618
SanitizerArgs(const ToolChain & TC,const ArgList & Args)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))
1628 continue;
1629 (*I)->claim();
1630 Kind |= Add;
1631 Kind &= ~Remove;
1632 AllKinds |= Add;
1633 }
1634
1635 UbsanTrapOnError =
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);
1639
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";
1646 }
1647
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,
1656 false))
1657 D.Diag(diag::err_drv_argument_not_allowed_with)
1658 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1659 << "-fsanitize-undefined-trap-on-error";
1660 }
1661
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
1690 // default in ASan?
1691
1692 // If -fsanitize contains extra features of ASan, it should also
1693 // explicitly contain -fsanitize=address (probably, turned off later in the
1694 // command line).
1695 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1696 D.Diag(diag::warn_drv_unused_sanitizer)
1697 << lastArgumentForKind(D, Args, AddressFull)
1698 << "-fsanitize=address";
1699
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;
1707 else
1708 D.Diag(diag::err_drv_no_such_file) << BLPath;
1709 }
1710 } else {
1711 // If no -fsanitize-blacklist option is specified, try to look up for
1712 // blacklist in the resource directory.
1713 std::string BLPath;
1714 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1715 llvm::sys::fs::exists(BLPath))
1716 BlacklistFile = BLPath;
1717 }
1718
1719 // Parse -f(no-)sanitize-memory-track-origins options.
1720 if (NeedsMsan)
1721 MsanTrackOrigins =
1722 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1723 options::OPT_fno_sanitize_memory_track_origins,
1724 /* Default */false);
1725
1726 // Parse -f(no-)sanitize-address-zero-base-shadow options.
1727 if (NeedsAsan) {
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);
1739 }
1740 }
1741 }
1742
addProfileRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)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)))
1749 return;
1750
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");
1757
1758 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1759 }
1760
addSanitizerRTLinkFlagsLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,const StringRef Sanitizer,bool BeforeLibStdCXX,bool ExportSymbols=true)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"));
1771
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
1777 // whole-archive.
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");
1782
1783 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1784 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1785
1786 CmdArgs.push_back("-lpthread");
1787 CmdArgs.push_back("-lrt");
1788 CmdArgs.push_back("-ldl");
1789
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"))
1795 CmdArgs.push_back(
1796 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1797 else
1798 CmdArgs.push_back("-export-dynamic");
1799 }
1800 }
1801
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).
addAsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)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));
1812 } else {
1813 if (!Args.hasArg(options::OPT_shared))
1814 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
1815 }
1816 }
1817
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).
addTsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)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);
1824 }
1825
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).
addMsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)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);
1832 }
1833
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).
addLsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)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);
1840 }
1841
1842 /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1843 /// (Linux).
addUbsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,bool IsCXX,bool HasOtherSanitizerRt)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))
1848 return;
1849
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);
1854
1855 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
1856
1857 // Only include the bits of the runtime which need a C++ ABI library if
1858 // we're linking in C++ mode.
1859 if (IsCXX)
1860 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
1861 }
1862
shouldUseFramePointer(const ArgList & Args,const llvm::Triple & Triple)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);
1868
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))
1876 return false;
1877 }
1878
1879 return true;
1880 }
1881
shouldUseLeafFramePointer(const ArgList & Args,const llvm::Triple & Triple)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);
1887
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))
1895 return false;
1896 }
1897
1898 return true;
1899 }
1900
1901 /// If the PWD environment variable is set, add a CC1 option to specify the
1902 /// debug compilation directory.
addDebugCompDirArg(const ArgList & Args,ArgStringList & CmdArgs)1903 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1904 const char *pwd = ::getenv("PWD");
1905 if (!pwd)
1906 return;
1907
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));
1915 return;
1916 }
1917
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));
1923 }
1924 }
1925
SplitDebugName(const ArgList & Args,const InputInfoList & Inputs)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);
1933 } else {
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");
1938 T += F;
1939 return Args.MakeArgString(F);
1940 }
1941 }
1942
SplitDebugInfo(const ToolChain & TC,Compilation & C,const Tool & T,const JobAction & JA,const ArgList & Args,const InputInfo & Output,const char * OutFile)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");
1949
1950 ArgStringList StripArgs;
1951 StripArgs.push_back("--strip-dwo");
1952
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);
1957
1958 const char *Exec =
1959 Args.MakeArgString(TC.GetProgramPath("objcopy"));
1960
1961 // First extract the dwo sections.
1962 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
1963
1964 // Then remove them from the original .o file.
1965 C.addCommand(new Command(JA, T, Exec, StripArgs));
1966 }
1967
isOptimizationLevelFast(const ArgList & Args)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))
1971 return true;
1972 return false;
1973 }
1974
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const1975 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;
1984
1985 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1986
1987 // Invoke ourselves in -cc1 mode.
1988 //
1989 // FIXME: Implement custom jobs for internal actions.
1990 CmdArgs.push_back("-cc1");
1991
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));
1996
1997 // Select the appropriate action.
1998 RewriteKind rewriteKind = RK_None;
1999
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");
2008 else {
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");
2013 }
2014 } else if (isa<AssembleJobAction>(JA)) {
2015 CmdArgs.push_back("-emit-obj");
2016
2017 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
2018
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;
2024
2025 if (JA.getType() == types::TY_Nothing)
2026 CmdArgs.push_back("-fsyntax-only");
2027 else if (UsePCH)
2028 CmdArgs.push_back("-emit-pch");
2029 else
2030 CmdArgs.push_back("-emit-pth");
2031 } else {
2032 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
2033
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;
2054 } else {
2055 assert(JA.getType() == types::TY_PP_Asm &&
2056 "Unexpected output type!");
2057 }
2058 }
2059
2060 // The make clang go fast button.
2061 CmdArgs.push_back("-disable-free");
2062
2063 // Disable the verification pass in -asserts builds.
2064 #ifdef NDEBUG
2065 CmdArgs.push_back("-disable-llvm-verifier");
2066 #endif
2067
2068 // Set the main file name, so that debug info works even with
2069 // -save-temps.
2070 CmdArgs.push_back("-main-file-name");
2071 CmdArgs.push_back(getBaseInputName(Args, Inputs));
2072
2073 // Some flags which affect the language (via preprocessor
2074 // defines).
2075 if (Args.hasArg(options::OPT_static))
2076 CmdArgs.push_back("-static-define");
2077
2078 if (isa<AnalyzeJobAction>(JA)) {
2079 // Enable region store model by default.
2080 CmdArgs.push_back("-analyzer-store=region");
2081
2082 // Treat blocks as analysis entry points.
2083 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2084
2085 CmdArgs.push_back("-analyzer-eagerly-assume");
2086
2087 // Add default argument set.
2088 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
2089 CmdArgs.push_back("-analyzer-checker=core");
2090
2091 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2092 CmdArgs.push_back("-analyzer-checker=unix");
2093
2094 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
2095 CmdArgs.push_back("-analyzer-checker=osx");
2096
2097 CmdArgs.push_back("-analyzer-checker=deadcode");
2098
2099 if (types::isCXX(Inputs[0].getType()))
2100 CmdArgs.push_back("-analyzer-checker=cplusplus");
2101
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");
2109 }
2110
2111 // Set the output format. The default is plist, for (lame) historical
2112 // reasons.
2113 CmdArgs.push_back("-analyzer-output");
2114 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
2115 CmdArgs.push_back(A->getValue());
2116 else
2117 CmdArgs.push_back("plist");
2118
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");
2123
2124 // Add -Xanalyzer arguments when running as analyzer.
2125 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
2126 }
2127
2128 CheckCodeGenerationOptions(D, Args);
2129
2130 bool PIE = getToolChain().isPIEDefault();
2131 bool PIC = PIE || getToolChain().isPICDefault();
2132 bool IsPICLevelTwo = PIC;
2133
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()) {
2149 if (LastPICArg) {
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);
2158 } else {
2159 PIE = PIC = false;
2160 }
2161 }
2162 }
2163
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();
2170
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);
2174 if (KernelOrKext &&
2175 (Triple.getOS() != llvm::Triple::IOS ||
2176 Triple.isOSVersionLT(6)))
2177 PIC = PIE = false;
2178 if (Args.hasArg(options::OPT_static))
2179 PIC = PIE = false;
2180
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();
2187
2188 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2189
2190 CmdArgs.push_back("-mrelocation-model");
2191 CmdArgs.push_back("dynamic-no-pic");
2192
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");
2199 }
2200 } else {
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");
2205
2206 if (PIC) {
2207 CmdArgs.push_back("-pic-level");
2208 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2209 if (PIE) {
2210 CmdArgs.push_back("-pie-level");
2211 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2212 }
2213 }
2214 }
2215
2216 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2217 options::OPT_fno_merge_all_constants))
2218 CmdArgs.push_back("-fno-merge-all-constants");
2219
2220 // LLVM Code Generator Options.
2221
2222 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2223 CmdArgs.push_back("-mregparm");
2224 CmdArgs.push_back(A->getValue());
2225 }
2226
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");
2234 } else {
2235 assert(A->getOption().matches(options::OPT_freg_struct_return));
2236 CmdArgs.push_back("-freg-struct-return");
2237 }
2238 }
2239
2240 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2241 CmdArgs.push_back("-mrtd");
2242
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");
2248
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,
2261 false))
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");
2266
2267 // Handle segmented stacks.
2268 if (Args.hasArg(options::OPT_fsplit_stack))
2269 CmdArgs.push_back("-split-stacks");
2270
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;
2275
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");
2301
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)
2314 MathErrno = false;
2315 else if (A->getOption().getID() == options::OPT_fmath_errno)
2316 MathErrno = true;
2317 }
2318 if (MathErrno)
2319 CmdArgs.push_back("-fmath-errno");
2320
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
2324 // madness.
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 &&
2370 !TrappingMath)
2371 CmdArgs.push_back("-menable-unsafe-fp-math");
2372
2373
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));
2382 } else {
2383 D.Diag(diag::err_drv_unsupported_option_argument)
2384 << A->getOption().getName() << Val;
2385 }
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"));
2390 }
2391 }
2392
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");
2405
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");
2413
2414 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2415 CmdArgs.push_back("-mdebug-pass");
2416 CmdArgs.push_back("Structure");
2417 }
2418 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2419 CmdArgs.push_back("-mdebug-pass");
2420 CmdArgs.push_back("Arguments");
2421 }
2422
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");
2427
2428 // Darwin's kernel doesn't support guard variables; just die if we
2429 // try to use them.
2430 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
2431 CmdArgs.push_back("-fforbid-guard-variables");
2432
2433 if (Args.hasArg(options::OPT_mms_bitfields)) {
2434 CmdArgs.push_back("-mms-bitfields");
2435 }
2436
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() &&
2444 !KernelOrKext);
2445 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2446 AsynchronousUnwindTables))
2447 CmdArgs.push_back("-munwind-tables");
2448
2449 getToolChain().addClangTargetOptions(Args, CmdArgs);
2450
2451 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2452 CmdArgs.push_back("-mlimit-float-precision");
2453 CmdArgs.push_back(A->getValue());
2454 }
2455
2456 // FIXME: Handle -mtune=.
2457 (void) Args.hasArg(options::OPT_mtune_EQ);
2458
2459 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2460 CmdArgs.push_back("-mcode-model");
2461 CmdArgs.push_back(A->getValue());
2462 }
2463
2464 // Add target specific cpu and features flags.
2465 switch(getToolChain().getArch()) {
2466 default:
2467 break;
2468
2469 case llvm::Triple::arm:
2470 case llvm::Triple::thumb:
2471 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2472 break;
2473
2474 case llvm::Triple::mips:
2475 case llvm::Triple::mipsel:
2476 case llvm::Triple::mips64:
2477 case llvm::Triple::mips64el:
2478 AddMIPSTargetArgs(Args, CmdArgs);
2479 break;
2480
2481 case llvm::Triple::ppc:
2482 case llvm::Triple::ppc64:
2483 case llvm::Triple::ppc64le:
2484 AddPPCTargetArgs(Args, CmdArgs);
2485 break;
2486
2487 case llvm::Triple::r600:
2488 AddR600TargetArgs(Args, CmdArgs);
2489 break;
2490
2491 case llvm::Triple::sparc:
2492 AddSparcTargetArgs(Args, CmdArgs);
2493 break;
2494
2495 case llvm::Triple::systemz:
2496 AddSystemZTargetArgs(Args, CmdArgs);
2497 break;
2498
2499 case llvm::Triple::x86:
2500 case llvm::Triple::x86_64:
2501 AddX86TargetArgs(Args, CmdArgs);
2502 break;
2503
2504 case llvm::Triple::hexagon:
2505 AddHexagonTargetArgs(Args, CmdArgs);
2506 break;
2507
2508 case llvm::Triple::aarch64:
2509 AddAArch64TargetArgs(Args, CmdArgs);
2510 break;
2511 }
2512
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());
2517 }
2518
2519 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
2520 CmdArgs.push_back("-momit-leaf-frame-pointer");
2521
2522 // Explicitly error on some things we know we don't support and can't just
2523 // ignore.
2524 types::ID InputType = Inputs[0].getType();
2525 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2526 Arg *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();
2534 }
2535 }
2536
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 : "-");
2543 }
2544 Args.AddLastArg(CmdArgs, options::OPT_P);
2545 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
2546
2547 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2548 CmdArgs.push_back("-diagnostic-log-file");
2549 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2550 D.CCLogDiagnosticsFilename : "-");
2551 }
2552
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");
2570 else
2571 CmdArgs.push_back("-g");
2572 }
2573 }
2574
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");
2579
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");
2588 }
2589
2590
2591 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2592
2593 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2594 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2595
2596 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2597
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");
2604
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);
2616 }
2617 }
2618 }
2619 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2620 }
2621 }
2622
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");
2627 } else {
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);
2632 }
2633
2634 // Pass the path to compiler resource files.
2635 CmdArgs.push_back("-resource-dir");
2636 CmdArgs.push_back(D.ResourceDir.c_str());
2637
2638 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2639
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()) {
2647 default:
2648 llvm_unreachable("missed a case");
2649 case options::OPT_ccc_arcmt_check:
2650 CmdArgs.push_back("-arcmt-check");
2651 break;
2652 case options::OPT_ccc_arcmt_modify:
2653 CmdArgs.push_back("-arcmt-modify");
2654 break;
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());
2659
2660 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2661 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
2662 break;
2663 }
2664 }
2665 } else {
2666 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2667 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2668 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
2669 }
2670
2671 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2672 if (ARCMTEnabled) {
2673 D.Diag(diag::err_drv_argument_not_allowed_with)
2674 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2675 }
2676 CmdArgs.push_back("-mt-migrate-directory");
2677 CmdArgs.push_back(A->getValue());
2678
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");
2686 } else {
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);
2690 }
2691 }
2692
2693 // Add preprocessing options like -I, -D, etc. if we are using the
2694 // preprocessor.
2695 //
2696 // FIXME: Support -fpreprocessed
2697 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
2698 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
2699
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);
2705
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");
2710 else
2711 A->render(Args, CmdArgs);
2712 }
2713
2714 // Don't warn about unused -flto. This can happen when we're preprocessing or
2715 // precompiling.
2716 Args.ClaimAllArgs(options::OPT_flto);
2717
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);
2723
2724 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2725 // (-ansi is equivalent to -std=c89 or -std=c++98).
2726 //
2727 // If a std is supplied, only add -trigraphs if it follows the
2728 // option.
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");
2733 else
2734 CmdArgs.push_back("-std=c89");
2735 else
2736 Std->render(Args, CmdArgs);
2737
2738 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2739 options::OPT_trigraphs))
2740 if (A != Std)
2741 A->render(Args, CmdArgs);
2742 } else {
2743 // Honor -std-default.
2744 //
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");
2754
2755 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
2756 }
2757
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,
2761 false)) {
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");
2765 }
2766
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,
2772 true)) {
2773 CmdArgs.push_back("-fdeprecated-macro");
2774 }
2775
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");
2780 else
2781 CmdArgs.push_back("-fno-gnu-keywords");
2782 }
2783
2784 if (ShouldDisableCFI(Args, getToolChain()))
2785 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2786
2787 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2788 CmdArgs.push_back("-fno-dwarf-directory-asm");
2789
2790 if (ShouldDisableAutolink(Args, getToolChain()))
2791 CmdArgs.push_back("-fno-autolink");
2792
2793 // Add in -fdebug-compilation-dir if necessary.
2794 addDebugCompDirArg(Args, CmdArgs);
2795
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());
2800 }
2801
2802 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2803 CmdArgs.push_back("-fconstexpr-depth");
2804 CmdArgs.push_back(A->getValue());
2805 }
2806
2807 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2808 CmdArgs.push_back("-fconstexpr-steps");
2809 CmdArgs.push_back(A->getValue());
2810 }
2811
2812 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2813 CmdArgs.push_back("-fbracket-depth");
2814 CmdArgs.push_back(A->getValue());
2815 }
2816
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));
2822 } else
2823 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
2824 }
2825
2826
2827 if (Args.hasArg(options::OPT_relocatable_pch))
2828 CmdArgs.push_back("-relocatable-pch");
2829
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());
2833 }
2834
2835 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2836 CmdArgs.push_back("-ftabstop");
2837 CmdArgs.push_back(A->getValue());
2838 }
2839
2840 CmdArgs.push_back("-ferror-limit");
2841 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2842 CmdArgs.push_back(A->getValue());
2843 else
2844 CmdArgs.push_back("19");
2845
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());
2849 }
2850
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());
2854 }
2855
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());
2859 }
2860
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());
2865 } else {
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)));
2870 }
2871
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());
2878 } else {
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");
2884 }
2885 }
2886
2887 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
2888
2889 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2890
2891 // -fhosted is default.
2892 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2893 KernelOrKext)
2894 CmdArgs.push_back("-ffreestanding");
2895
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);
2908
2909 SanitizerArgs Sanitize(getToolChain(), Args);
2910 Sanitize.addArgs(Args, CmdArgs);
2911
2912 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2913 options::OPT_fno_sanitize_recover,
2914 true))
2915 CmdArgs.push_back("-fno-sanitize-recover");
2916
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");
2921
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";
2929
2930 if (getToolChain().SupportsProfiling())
2931 Args.AddLastArg(CmdArgs, options::OPT_pg);
2932
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");
2937
2938 if (Args.getLastArg(options::OPT_fapple_kext))
2939 CmdArgs.push_back("-fapple-kext");
2940
2941 if (Args.hasFlag(options::OPT_frewrite_includes,
2942 options::OPT_fno_rewrite_includes, false))
2943 CmdArgs.push_back("-frewrite-includes");
2944
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);
2950
2951 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2952 CmdArgs.push_back("-ftrapv-handler");
2953 CmdArgs.push_back(A->getValue());
2954 }
2955
2956 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
2957
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");
2968 }
2969 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
2970 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
2971
2972 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2973
2974
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;
2984 } else {
2985 StackProtectorLevel =
2986 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2987 }
2988 if (StackProtectorLevel) {
2989 CmdArgs.push_back("-stack-protector");
2990 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
2991 }
2992
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)));
3002 }
3003 (*it)->claim();
3004 }
3005 }
3006
3007 // Translate -mstackrealign
3008 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3009 false)) {
3010 CmdArgs.push_back("-backend-option");
3011 CmdArgs.push_back("-force-align-stack");
3012 }
3013 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3014 false)) {
3015 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3016 }
3017
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));
3021 }
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");
3026 }
3027
3028 // Forward -f options with positive and negative forms; we translate
3029 // these by hand.
3030
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);
3037 }
3038 // -fbuiltin is default.
3039 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
3040 CmdArgs.push_back("-fno-builtin");
3041
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");
3045
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");
3053
3054 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3055 !getToolChain().hasBlocksRuntime())
3056 CmdArgs.push_back("-fblocks-runtime-optional");
3057 }
3058
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,
3066 false);
3067 if (AllowedInCXX || !types::isCXX(InputType)) {
3068 CmdArgs.push_back("-fmodules");
3069 HaveModules = true;
3070 }
3071 }
3072
3073 // -fmodule-maps enables module map processing (off by default) for header
3074 // checking. It is implied by -fmodules.
3075 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3076 false)) {
3077 CmdArgs.push_back("-fmodule-maps");
3078 }
3079
3080 // If a module path was provided, pass it along. Otherwise, use a temporary
3081 // directory.
3082 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3083 A->claim();
3084 if (HaveModules) {
3085 A->render(Args, CmdArgs);
3086 }
3087 } else if (HaveModules) {
3088 SmallString<128> DefaultModuleCache;
3089 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3090 DefaultModuleCache);
3091 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3092 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
3093 const char Arg[] = "-fmodules-cache-path=";
3094 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3095 Arg, Arg + strlen(Arg));
3096 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3097 }
3098
3099 // Pass through all -fmodules-ignore-macro arguments.
3100 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
3101 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3102 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
3103
3104 // -faccess-control is default.
3105 if (Args.hasFlag(options::OPT_fno_access_control,
3106 options::OPT_faccess_control,
3107 false))
3108 CmdArgs.push_back("-fno-access-control");
3109
3110 // -felide-constructors is the default.
3111 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3112 options::OPT_felide_constructors,
3113 false))
3114 CmdArgs.push_back("-fno-elide-constructors");
3115
3116 // -frtti is default.
3117 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
3118 KernelOrKext) {
3119 CmdArgs.push_back("-fno-rtti");
3120
3121 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
3122 if (Sanitize.sanitizesVptr()) {
3123 std::string NoRttiArg =
3124 Args.getLastArg(options::OPT_mkernel,
3125 options::OPT_fapple_kext,
3126 options::OPT_fno_rtti)->getAsString(Args);
3127 D.Diag(diag::err_drv_argument_not_allowed_with)
3128 << "-fsanitize=vptr" << NoRttiArg;
3129 }
3130 }
3131
3132 // -fshort-enums=0 is default for all architectures except Hexagon.
3133 if (Args.hasFlag(options::OPT_fshort_enums,
3134 options::OPT_fno_short_enums,
3135 getToolChain().getArch() ==
3136 llvm::Triple::hexagon))
3137 CmdArgs.push_back("-fshort-enums");
3138
3139 // -fsigned-char is default.
3140 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
3141 isSignedCharDefault(getToolChain().getTriple())))
3142 CmdArgs.push_back("-fno-signed-char");
3143
3144 // -fthreadsafe-static is default.
3145 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
3146 options::OPT_fno_threadsafe_statics))
3147 CmdArgs.push_back("-fno-threadsafe-statics");
3148
3149 // -fuse-cxa-atexit is default.
3150 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3151 options::OPT_fno_use_cxa_atexit,
3152 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
3153 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
3154 getToolChain().getArch() != llvm::Triple::hexagon) ||
3155 KernelOrKext)
3156 CmdArgs.push_back("-fno-use-cxa-atexit");
3157
3158 // -fms-extensions=0 is default.
3159 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3160 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3161 CmdArgs.push_back("-fms-extensions");
3162
3163 // -fms-compatibility=0 is default.
3164 if (Args.hasFlag(options::OPT_fms_compatibility,
3165 options::OPT_fno_ms_compatibility,
3166 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3167 Args.hasFlag(options::OPT_fms_extensions,
3168 options::OPT_fno_ms_extensions,
3169 true))))
3170 CmdArgs.push_back("-fms-compatibility");
3171
3172 // -fmsc-version=1300 is default.
3173 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3174 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3175 Args.hasArg(options::OPT_fmsc_version)) {
3176 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
3177 if (msc_ver.empty())
3178 CmdArgs.push_back("-fmsc-version=1300");
3179 else
3180 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3181 }
3182
3183
3184 // -fno-borland-extensions is default.
3185 if (Args.hasFlag(options::OPT_fborland_extensions,
3186 options::OPT_fno_borland_extensions, false))
3187 CmdArgs.push_back("-fborland-extensions");
3188
3189 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3190 // needs it.
3191 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3192 options::OPT_fno_delayed_template_parsing,
3193 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3194 CmdArgs.push_back("-fdelayed-template-parsing");
3195
3196 // -fgnu-keywords default varies depending on language; only pass if
3197 // specified.
3198 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
3199 options::OPT_fno_gnu_keywords))
3200 A->render(Args, CmdArgs);
3201
3202 if (Args.hasFlag(options::OPT_fgnu89_inline,
3203 options::OPT_fno_gnu89_inline,
3204 false))
3205 CmdArgs.push_back("-fgnu89-inline");
3206
3207 if (Args.hasArg(options::OPT_fno_inline))
3208 CmdArgs.push_back("-fno-inline");
3209
3210 if (Args.hasArg(options::OPT_fno_inline_functions))
3211 CmdArgs.push_back("-fno-inline-functions");
3212
3213 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
3214
3215 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3216 // legacy is the default.
3217 if (objcRuntime.isNonFragile()) {
3218 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3219 options::OPT_fno_objc_legacy_dispatch,
3220 objcRuntime.isLegacyDispatchDefaultForArch(
3221 getToolChain().getArch()))) {
3222 if (getToolChain().UseObjCMixedDispatch())
3223 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3224 else
3225 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3226 }
3227 }
3228
3229 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3230 // if the nonfragile objc abi is used.
3231 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
3232 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3233 }
3234
3235 // -fencode-extended-block-signature=1 is default.
3236 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3237 CmdArgs.push_back("-fencode-extended-block-signature");
3238 }
3239
3240 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3241 // NOTE: This logic is duplicated in ToolChains.cpp.
3242 bool ARC = isObjCAutoRefCount(Args);
3243 if (ARC) {
3244 getToolChain().CheckObjCARC();
3245
3246 CmdArgs.push_back("-fobjc-arc");
3247
3248 // FIXME: It seems like this entire block, and several around it should be
3249 // wrapped in isObjC, but for now we just use it here as this is where it
3250 // was being used previously.
3251 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3252 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3253 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3254 else
3255 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3256 }
3257
3258 // Allow the user to enable full exceptions code emission.
3259 // We define off for Objective-CC, on for Objective-C++.
3260 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3261 options::OPT_fno_objc_arc_exceptions,
3262 /*default*/ types::isCXX(InputType)))
3263 CmdArgs.push_back("-fobjc-arc-exceptions");
3264 }
3265
3266 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3267 // rewriter.
3268 if (rewriteKind != RK_None)
3269 CmdArgs.push_back("-fno-objc-infer-related-result-type");
3270
3271 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3272 // takes precedence.
3273 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3274 if (!GCArg)
3275 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3276 if (GCArg) {
3277 if (ARC) {
3278 D.Diag(diag::err_drv_objc_gc_arr)
3279 << GCArg->getAsString(Args);
3280 } else if (getToolChain().SupportsObjCGC()) {
3281 GCArg->render(Args, CmdArgs);
3282 } else {
3283 // FIXME: We should move this to a hard error.
3284 D.Diag(diag::warn_drv_objc_gc_unsupported)
3285 << GCArg->getAsString(Args);
3286 }
3287 }
3288
3289 // Add exception args.
3290 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
3291 KernelOrKext, objcRuntime, CmdArgs);
3292
3293 if (getToolChain().UseSjLjExceptions())
3294 CmdArgs.push_back("-fsjlj-exceptions");
3295
3296 // C++ "sane" operator new.
3297 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3298 options::OPT_fno_assume_sane_operator_new))
3299 CmdArgs.push_back("-fno-assume-sane-operator-new");
3300
3301 // -fconstant-cfstrings is default, and may be subject to argument translation
3302 // on Darwin.
3303 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3304 options::OPT_fno_constant_cfstrings) ||
3305 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3306 options::OPT_mno_constant_cfstrings))
3307 CmdArgs.push_back("-fno-constant-cfstrings");
3308
3309 // -fshort-wchar default varies depending on platform; only
3310 // pass if specified.
3311 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3312 A->render(Args, CmdArgs);
3313
3314 // -fno-pascal-strings is default, only pass non-default.
3315 if (Args.hasFlag(options::OPT_fpascal_strings,
3316 options::OPT_fno_pascal_strings,
3317 false))
3318 CmdArgs.push_back("-fpascal-strings");
3319
3320 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3321 // -fno-pack-struct doesn't apply to -fpack-struct=.
3322 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
3323 std::string PackStructStr = "-fpack-struct=";
3324 PackStructStr += A->getValue();
3325 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
3326 } else if (Args.hasFlag(options::OPT_fpack_struct,
3327 options::OPT_fno_pack_struct, false)) {
3328 CmdArgs.push_back("-fpack-struct=1");
3329 }
3330
3331 if (KernelOrKext) {
3332 if (!Args.hasArg(options::OPT_fcommon))
3333 CmdArgs.push_back("-fno-common");
3334 Args.ClaimAllArgs(options::OPT_fno_common);
3335 }
3336
3337 // -fcommon is default, only pass non-default.
3338 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
3339 CmdArgs.push_back("-fno-common");
3340
3341 // -fsigned-bitfields is default, and clang doesn't yet support
3342 // -funsigned-bitfields.
3343 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
3344 options::OPT_funsigned_bitfields))
3345 D.Diag(diag::warn_drv_clang_unsupported)
3346 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3347
3348 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3349 if (!Args.hasFlag(options::OPT_ffor_scope,
3350 options::OPT_fno_for_scope))
3351 D.Diag(diag::err_drv_clang_unsupported)
3352 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3353
3354 // -fcaret-diagnostics is default.
3355 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3356 options::OPT_fno_caret_diagnostics, true))
3357 CmdArgs.push_back("-fno-caret-diagnostics");
3358
3359 // -fdiagnostics-fixit-info is default, only pass non-default.
3360 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
3361 options::OPT_fno_diagnostics_fixit_info))
3362 CmdArgs.push_back("-fno-diagnostics-fixit-info");
3363
3364 // Enable -fdiagnostics-show-option by default.
3365 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
3366 options::OPT_fno_diagnostics_show_option))
3367 CmdArgs.push_back("-fdiagnostics-show-option");
3368
3369 if (const Arg *A =
3370 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3371 CmdArgs.push_back("-fdiagnostics-show-category");
3372 CmdArgs.push_back(A->getValue());
3373 }
3374
3375 if (const Arg *A =
3376 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3377 CmdArgs.push_back("-fdiagnostics-format");
3378 CmdArgs.push_back(A->getValue());
3379 }
3380
3381 if (Arg *A = Args.getLastArg(
3382 options::OPT_fdiagnostics_show_note_include_stack,
3383 options::OPT_fno_diagnostics_show_note_include_stack)) {
3384 if (A->getOption().matches(
3385 options::OPT_fdiagnostics_show_note_include_stack))
3386 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3387 else
3388 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3389 }
3390
3391 // Color diagnostics are the default, unless the terminal doesn't support
3392 // them.
3393 // Support both clang's -f[no-]color-diagnostics and gcc's
3394 // -f[no-]diagnostics-colors[=never|always|auto].
3395 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3396 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3397 it != ie; ++it) {
3398 const Option &O = (*it)->getOption();
3399 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3400 !O.matches(options::OPT_fdiagnostics_color) &&
3401 !O.matches(options::OPT_fno_color_diagnostics) &&
3402 !O.matches(options::OPT_fno_diagnostics_color) &&
3403 !O.matches(options::OPT_fdiagnostics_color_EQ))
3404 continue;
3405
3406 (*it)->claim();
3407 if (O.matches(options::OPT_fcolor_diagnostics) ||
3408 O.matches(options::OPT_fdiagnostics_color)) {
3409 ShowColors = Colors_On;
3410 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3411 O.matches(options::OPT_fno_diagnostics_color)) {
3412 ShowColors = Colors_Off;
3413 } else {
3414 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3415 StringRef value((*it)->getValue());
3416 if (value == "always")
3417 ShowColors = Colors_On;
3418 else if (value == "never")
3419 ShowColors = Colors_Off;
3420 else if (value == "auto")
3421 ShowColors = Colors_Auto;
3422 else
3423 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3424 << ("-fdiagnostics-color=" + value).str();
3425 }
3426 }
3427 if (ShowColors == Colors_On ||
3428 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
3429 CmdArgs.push_back("-fcolor-diagnostics");
3430
3431 if (!Args.hasFlag(options::OPT_fshow_source_location,
3432 options::OPT_fno_show_source_location))
3433 CmdArgs.push_back("-fno-show-source-location");
3434
3435 if (!Args.hasFlag(options::OPT_fshow_column,
3436 options::OPT_fno_show_column,
3437 true))
3438 CmdArgs.push_back("-fno-show-column");
3439
3440 if (!Args.hasFlag(options::OPT_fspell_checking,
3441 options::OPT_fno_spell_checking))
3442 CmdArgs.push_back("-fno-spell-checking");
3443
3444
3445 // -fno-asm-blocks is default.
3446 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3447 false))
3448 CmdArgs.push_back("-fasm-blocks");
3449
3450 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3451 // This alias option is being used to simplify the hasFlag logic.
3452 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3453 options::OPT_fvectorize;
3454
3455 // -fvectorize is default.
3456 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
3457 options::OPT_fno_vectorize, true))
3458 CmdArgs.push_back("-vectorize-loops");
3459
3460 // -fslp-vectorize is default.
3461 if (Args.hasFlag(options::OPT_fslp_vectorize,
3462 options::OPT_fno_slp_vectorize, true))
3463 CmdArgs.push_back("-vectorize-slp");
3464
3465 // -fno-slp-vectorize-aggressive is default.
3466 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3467 options::OPT_fno_slp_vectorize_aggressive, false))
3468 CmdArgs.push_back("-vectorize-slp-aggressive");
3469
3470 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3471 A->render(Args, CmdArgs);
3472
3473 // -fdollars-in-identifiers default varies depending on platform and
3474 // language; only pass if specified.
3475 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
3476 options::OPT_fno_dollars_in_identifiers)) {
3477 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
3478 CmdArgs.push_back("-fdollars-in-identifiers");
3479 else
3480 CmdArgs.push_back("-fno-dollars-in-identifiers");
3481 }
3482
3483 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3484 // practical purposes.
3485 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
3486 options::OPT_fno_unit_at_a_time)) {
3487 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
3488 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
3489 }
3490
3491 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3492 options::OPT_fno_apple_pragma_pack, false))
3493 CmdArgs.push_back("-fapple-pragma-pack");
3494
3495 // le32-specific flags:
3496 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3497 // by default.
3498 if (getToolChain().getArch() == llvm::Triple::le32) {
3499 CmdArgs.push_back("-fno-math-builtin");
3500 }
3501
3502 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
3503 //
3504 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
3505 #if 0
3506 if (getToolChain().getTriple().isOSDarwin() &&
3507 (getToolChain().getArch() == llvm::Triple::arm ||
3508 getToolChain().getArch() == llvm::Triple::thumb)) {
3509 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3510 CmdArgs.push_back("-fno-builtin-strcat");
3511 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3512 CmdArgs.push_back("-fno-builtin-strcpy");
3513 }
3514 #endif
3515
3516 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
3517 if (Arg *A = Args.getLastArg(options::OPT_traditional,
3518 options::OPT_traditional_cpp)) {
3519 if (isa<PreprocessJobAction>(JA))
3520 CmdArgs.push_back("-traditional-cpp");
3521 else
3522 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
3523 }
3524
3525 Args.AddLastArg(CmdArgs, options::OPT_dM);
3526 Args.AddLastArg(CmdArgs, options::OPT_dD);
3527
3528 // Handle serialized diagnostics.
3529 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3530 CmdArgs.push_back("-serialize-diagnostic-file");
3531 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
3532 }
3533
3534 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3535 CmdArgs.push_back("-fretain-comments-from-system-headers");
3536
3537 // Forward -fcomment-block-commands to -cc1.
3538 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
3539 // Forward -fparse-all-comments to -cc1.
3540 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
3541
3542 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3543 // parser.
3544 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
3545 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3546 ie = Args.filtered_end(); it != ie; ++it) {
3547 (*it)->claim();
3548
3549 // We translate this by hand to the -cc1 argument, since nightly test uses
3550 // it and developers have been trained to spell it with -mllvm.
3551 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
3552 CmdArgs.push_back("-disable-llvm-optzns");
3553 else
3554 (*it)->render(Args, CmdArgs);
3555 }
3556
3557 if (Output.getType() == types::TY_Dependencies) {
3558 // Handled with other dependency code.
3559 } else if (Output.isFilename()) {
3560 CmdArgs.push_back("-o");
3561 CmdArgs.push_back(Output.getFilename());
3562 } else {
3563 assert(Output.isNothing() && "Invalid output.");
3564 }
3565
3566 for (InputInfoList::const_iterator
3567 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3568 const InputInfo &II = *it;
3569 CmdArgs.push_back("-x");
3570 if (Args.hasArg(options::OPT_rewrite_objc))
3571 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3572 else
3573 CmdArgs.push_back(types::getTypeName(II.getType()));
3574 if (II.isFilename())
3575 CmdArgs.push_back(II.getFilename());
3576 else
3577 II.getInputArg().renderAsInput(Args, CmdArgs);
3578 }
3579
3580 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3581
3582 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3583
3584 // Optionally embed the -cc1 level arguments into the debug info, for build
3585 // analysis.
3586 if (getToolChain().UseDwarfDebugFlags()) {
3587 ArgStringList OriginalArgs;
3588 for (ArgList::const_iterator it = Args.begin(),
3589 ie = Args.end(); it != ie; ++it)
3590 (*it)->render(Args, OriginalArgs);
3591
3592 SmallString<256> Flags;
3593 Flags += Exec;
3594 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3595 Flags += " ";
3596 Flags += OriginalArgs[i];
3597 }
3598 CmdArgs.push_back("-dwarf-debug-flags");
3599 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3600 }
3601
3602 // Add the split debug info name to the command lines here so we
3603 // can propagate it to the backend.
3604 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3605 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
3606 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
3607 const char *SplitDwarfOut;
3608 if (SplitDwarf) {
3609 CmdArgs.push_back("-split-dwarf-file");
3610 SplitDwarfOut = SplitDebugName(Args, Inputs);
3611 CmdArgs.push_back(SplitDwarfOut);
3612 }
3613
3614 // Finally add the compile command to the compilation.
3615 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3616
3617 // Handle the debug info splitting at object creation time if we're
3618 // creating an object.
3619 // TODO: Currently only works on linux with newer objcopy.
3620 if (SplitDwarf && !isa<CompileJobAction>(JA))
3621 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
3622
3623 if (Arg *A = Args.getLastArg(options::OPT_pg))
3624 if (Args.hasArg(options::OPT_fomit_frame_pointer))
3625 D.Diag(diag::err_drv_argument_not_allowed_with)
3626 << "-fomit-frame-pointer" << A->getAsString(Args);
3627
3628 // Claim some arguments which clang supports automatically.
3629
3630 // -fpch-preprocess is used with gcc to add a special marker in the output to
3631 // include the PCH file. Clang's PTH solution is completely transparent, so we
3632 // do not need to deal with it at all.
3633 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
3634
3635 // Claim some arguments which clang doesn't support, but we don't
3636 // care to warn the user about.
3637 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3638 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
3639
3640 // Claim ignored clang-cl options.
3641 Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
3642
3643 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
3644 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
3645 Args.ClaimAllArgs(options::OPT_emit_llvm);
3646 }
3647
AddARMTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const3648 void ClangAs::AddARMTargetArgs(const ArgList &Args,
3649 ArgStringList &CmdArgs) const {
3650 const Driver &D = getToolChain().getDriver();
3651 llvm::Triple Triple = getToolChain().getTriple();
3652
3653 // Set the CPU based on -march= and -mcpu=.
3654 CmdArgs.push_back("-target-cpu");
3655 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
3656
3657 // Honor -mfpu=.
3658 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
3659 addFPUArgs(D, A, Args, CmdArgs);
3660
3661 // Honor -mfpmath=.
3662 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
3663 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
3664 }
3665
AddX86TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const3666 void ClangAs::AddX86TargetArgs(const ArgList &Args,
3667 ArgStringList &CmdArgs) const {
3668 // Set the CPU based on -march=.
3669 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3670 CmdArgs.push_back("-target-cpu");
3671 CmdArgs.push_back(CPUName);
3672 }
3673 }
3674
3675 /// Add options related to the Objective-C runtime/ABI.
3676 ///
3677 /// Returns true if the runtime is non-fragile.
AddObjCRuntimeArgs(const ArgList & args,ArgStringList & cmdArgs,RewriteKind rewriteKind) const3678 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3679 ArgStringList &cmdArgs,
3680 RewriteKind rewriteKind) const {
3681 // Look for the controlling runtime option.
3682 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3683 options::OPT_fgnu_runtime,
3684 options::OPT_fobjc_runtime_EQ);
3685
3686 // Just forward -fobjc-runtime= to the frontend. This supercedes
3687 // options about fragility.
3688 if (runtimeArg &&
3689 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3690 ObjCRuntime runtime;
3691 StringRef value = runtimeArg->getValue();
3692 if (runtime.tryParse(value)) {
3693 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3694 << value;
3695 }
3696
3697 runtimeArg->render(args, cmdArgs);
3698 return runtime;
3699 }
3700
3701 // Otherwise, we'll need the ABI "version". Version numbers are
3702 // slightly confusing for historical reasons:
3703 // 1 - Traditional "fragile" ABI
3704 // 2 - Non-fragile ABI, version 1
3705 // 3 - Non-fragile ABI, version 2
3706 unsigned objcABIVersion = 1;
3707 // If -fobjc-abi-version= is present, use that to set the version.
3708 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
3709 StringRef value = abiArg->getValue();
3710 if (value == "1")
3711 objcABIVersion = 1;
3712 else if (value == "2")
3713 objcABIVersion = 2;
3714 else if (value == "3")
3715 objcABIVersion = 3;
3716 else
3717 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3718 << value;
3719 } else {
3720 // Otherwise, determine if we are using the non-fragile ABI.
3721 bool nonFragileABIIsDefault =
3722 (rewriteKind == RK_NonFragile ||
3723 (rewriteKind == RK_None &&
3724 getToolChain().IsObjCNonFragileABIDefault()));
3725 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3726 options::OPT_fno_objc_nonfragile_abi,
3727 nonFragileABIIsDefault)) {
3728 // Determine the non-fragile ABI version to use.
3729 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3730 unsigned nonFragileABIVersion = 1;
3731 #else
3732 unsigned nonFragileABIVersion = 2;
3733 #endif
3734
3735 if (Arg *abiArg = args.getLastArg(
3736 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3737 StringRef value = abiArg->getValue();
3738 if (value == "1")
3739 nonFragileABIVersion = 1;
3740 else if (value == "2")
3741 nonFragileABIVersion = 2;
3742 else
3743 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3744 << value;
3745 }
3746
3747 objcABIVersion = 1 + nonFragileABIVersion;
3748 } else {
3749 objcABIVersion = 1;
3750 }
3751 }
3752
3753 // We don't actually care about the ABI version other than whether
3754 // it's non-fragile.
3755 bool isNonFragile = objcABIVersion != 1;
3756
3757 // If we have no runtime argument, ask the toolchain for its default runtime.
3758 // However, the rewriter only really supports the Mac runtime, so assume that.
3759 ObjCRuntime runtime;
3760 if (!runtimeArg) {
3761 switch (rewriteKind) {
3762 case RK_None:
3763 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3764 break;
3765 case RK_Fragile:
3766 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3767 break;
3768 case RK_NonFragile:
3769 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3770 break;
3771 }
3772
3773 // -fnext-runtime
3774 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3775 // On Darwin, make this use the default behavior for the toolchain.
3776 if (getToolChain().getTriple().isOSDarwin()) {
3777 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3778
3779 // Otherwise, build for a generic macosx port.
3780 } else {
3781 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3782 }
3783
3784 // -fgnu-runtime
3785 } else {
3786 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
3787 // Legacy behaviour is to target the gnustep runtime if we are i
3788 // non-fragile mode or the GCC runtime in fragile mode.
3789 if (isNonFragile)
3790 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
3791 else
3792 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
3793 }
3794
3795 cmdArgs.push_back(args.MakeArgString(
3796 "-fobjc-runtime=" + runtime.getAsString()));
3797 return runtime;
3798 }
3799
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3800 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
3801 const InputInfo &Output,
3802 const InputInfoList &Inputs,
3803 const ArgList &Args,
3804 const char *LinkingOutput) const {
3805 ArgStringList CmdArgs;
3806
3807 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3808 const InputInfo &Input = Inputs[0];
3809
3810 // Don't warn about "clang -w -c foo.s"
3811 Args.ClaimAllArgs(options::OPT_w);
3812 // and "clang -emit-llvm -c foo.s"
3813 Args.ClaimAllArgs(options::OPT_emit_llvm);
3814 // and "clang -use-gold-plugin -c foo.s"
3815 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
3816
3817 // Invoke ourselves in -cc1as mode.
3818 //
3819 // FIXME: Implement custom jobs for internal actions.
3820 CmdArgs.push_back("-cc1as");
3821
3822 // Add the "effective" target triple.
3823 CmdArgs.push_back("-triple");
3824 std::string TripleStr =
3825 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
3826 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3827
3828 // Set the output mode, we currently only expect to be used as a real
3829 // assembler.
3830 CmdArgs.push_back("-filetype");
3831 CmdArgs.push_back("obj");
3832
3833 // Set the main file name, so that debug info works even with
3834 // -save-temps or preprocessed assembly.
3835 CmdArgs.push_back("-main-file-name");
3836 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3837
3838 // Add target specific cpu and features flags.
3839 switch(getToolChain().getArch()) {
3840 default:
3841 break;
3842
3843 case llvm::Triple::arm:
3844 case llvm::Triple::thumb:
3845 AddARMTargetArgs(Args, CmdArgs);
3846 break;
3847
3848 case llvm::Triple::x86:
3849 case llvm::Triple::x86_64:
3850 AddX86TargetArgs(Args, CmdArgs);
3851 break;
3852 }
3853
3854 // Ignore explicit -force_cpusubtype_ALL option.
3855 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
3856
3857 // Determine the original source input.
3858 const Action *SourceAction = &JA;
3859 while (SourceAction->getKind() != Action::InputClass) {
3860 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3861 SourceAction = SourceAction->getInputs()[0];
3862 }
3863
3864 // Forward -g and handle debug info related flags, assuming we are dealing
3865 // with an actual assembly file.
3866 if (SourceAction->getType() == types::TY_Asm ||
3867 SourceAction->getType() == types::TY_PP_Asm) {
3868 Args.ClaimAllArgs(options::OPT_g_Group);
3869 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3870 if (!A->getOption().matches(options::OPT_g0))
3871 CmdArgs.push_back("-g");
3872
3873 // Add the -fdebug-compilation-dir flag if needed.
3874 addDebugCompDirArg(Args, CmdArgs);
3875
3876 // Set the AT_producer to the clang version when using the integrated
3877 // assembler on assembly source files.
3878 CmdArgs.push_back("-dwarf-debug-producer");
3879 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
3880 }
3881
3882 // Optionally embed the -cc1as level arguments into the debug info, for build
3883 // analysis.
3884 if (getToolChain().UseDwarfDebugFlags()) {
3885 ArgStringList OriginalArgs;
3886 for (ArgList::const_iterator it = Args.begin(),
3887 ie = Args.end(); it != ie; ++it)
3888 (*it)->render(Args, OriginalArgs);
3889
3890 SmallString<256> Flags;
3891 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3892 Flags += Exec;
3893 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3894 Flags += " ";
3895 Flags += OriginalArgs[i];
3896 }
3897 CmdArgs.push_back("-dwarf-debug-flags");
3898 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3899 }
3900
3901 // FIXME: Add -static support, once we have it.
3902
3903 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
3904 getToolChain().getDriver());
3905
3906 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
3907
3908 assert(Output.isFilename() && "Unexpected lipo output.");
3909 CmdArgs.push_back("-o");
3910 CmdArgs.push_back(Output.getFilename());
3911
3912 assert(Input.isFilename() && "Invalid input.");
3913 CmdArgs.push_back(Input.getFilename());
3914
3915 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3916 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3917
3918 // Handle the debug info splitting at object creation time if we're
3919 // creating an object.
3920 // TODO: Currently only works on linux with newer objcopy.
3921 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3922 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3923 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3924 SplitDebugName(Args, Inputs));
3925 }
3926
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3927 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
3928 const InputInfo &Output,
3929 const InputInfoList &Inputs,
3930 const ArgList &Args,
3931 const char *LinkingOutput) const {
3932 const Driver &D = getToolChain().getDriver();
3933 ArgStringList CmdArgs;
3934
3935 for (ArgList::const_iterator
3936 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3937 Arg *A = *it;
3938 if (forwardToGCC(A->getOption())) {
3939 // Don't forward any -g arguments to assembly steps.
3940 if (isa<AssembleJobAction>(JA) &&
3941 A->getOption().matches(options::OPT_g_Group))
3942 continue;
3943
3944 // It is unfortunate that we have to claim here, as this means
3945 // we will basically never report anything interesting for
3946 // platforms using a generic gcc, even if we are just using gcc
3947 // to get to the assembler.
3948 A->claim();
3949 A->render(Args, CmdArgs);
3950 }
3951 }
3952
3953 RenderExtraToolArgs(JA, CmdArgs);
3954
3955 // If using a driver driver, force the arch.
3956 llvm::Triple::ArchType Arch = getToolChain().getArch();
3957 if (getToolChain().getTriple().isOSDarwin()) {
3958 CmdArgs.push_back("-arch");
3959
3960 // FIXME: Remove these special cases.
3961 if (Arch == llvm::Triple::ppc)
3962 CmdArgs.push_back("ppc");
3963 else if (Arch == llvm::Triple::ppc64)
3964 CmdArgs.push_back("ppc64");
3965 else if (Arch == llvm::Triple::ppc64le)
3966 CmdArgs.push_back("ppc64le");
3967 else
3968 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
3969 }
3970
3971 // Try to force gcc to match the tool chain we want, if we recognize
3972 // the arch.
3973 //
3974 // FIXME: The triple class should directly provide the information we want
3975 // here.
3976 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
3977 CmdArgs.push_back("-m32");
3978 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
3979 Arch == llvm::Triple::ppc64le)
3980 CmdArgs.push_back("-m64");
3981
3982 if (Output.isFilename()) {
3983 CmdArgs.push_back("-o");
3984 CmdArgs.push_back(Output.getFilename());
3985 } else {
3986 assert(Output.isNothing() && "Unexpected output");
3987 CmdArgs.push_back("-fsyntax-only");
3988 }
3989
3990 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3991 options::OPT_Xassembler);
3992
3993 // Only pass -x if gcc will understand it; otherwise hope gcc
3994 // understands the suffix correctly. The main use case this would go
3995 // wrong in is for linker inputs if they happened to have an odd
3996 // suffix; really the only way to get this to happen is a command
3997 // like '-x foobar a.c' which will treat a.c like a linker input.
3998 //
3999 // FIXME: For the linker case specifically, can we safely convert
4000 // inputs into '-Wl,' options?
4001 for (InputInfoList::const_iterator
4002 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4003 const InputInfo &II = *it;
4004
4005 // Don't try to pass LLVM or AST inputs to a generic gcc.
4006 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4007 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4008 D.Diag(diag::err_drv_no_linker_llvm_support)
4009 << getToolChain().getTripleString();
4010 else if (II.getType() == types::TY_AST)
4011 D.Diag(diag::err_drv_no_ast_support)
4012 << getToolChain().getTripleString();
4013 else if (II.getType() == types::TY_ModuleFile)
4014 D.Diag(diag::err_drv_no_module_support)
4015 << getToolChain().getTripleString();
4016
4017 if (types::canTypeBeUserSpecified(II.getType())) {
4018 CmdArgs.push_back("-x");
4019 CmdArgs.push_back(types::getTypeName(II.getType()));
4020 }
4021
4022 if (II.isFilename())
4023 CmdArgs.push_back(II.getFilename());
4024 else {
4025 const Arg &A = II.getInputArg();
4026
4027 // Reverse translate some rewritten options.
4028 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4029 CmdArgs.push_back("-lstdc++");
4030 continue;
4031 }
4032
4033 // Don't render as input, we need gcc to do the translations.
4034 A.render(Args, CmdArgs);
4035 }
4036 }
4037
4038 const std::string customGCCName = D.getCCCGenericGCCName();
4039 const char *GCCName;
4040 if (!customGCCName.empty())
4041 GCCName = customGCCName.c_str();
4042 else if (D.CCCIsCXX()) {
4043 GCCName = "g++";
4044 } else
4045 GCCName = "gcc";
4046
4047 const char *Exec =
4048 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4049 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4050 }
4051
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4052 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4053 ArgStringList &CmdArgs) const {
4054 CmdArgs.push_back("-E");
4055 }
4056
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4057 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4058 ArgStringList &CmdArgs) const {
4059 // The type is good enough.
4060 }
4061
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4062 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4063 ArgStringList &CmdArgs) const {
4064 const Driver &D = getToolChain().getDriver();
4065
4066 // If -flto, etc. are present then make sure not to force assembly output.
4067 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4068 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
4069 CmdArgs.push_back("-c");
4070 else {
4071 if (JA.getType() != types::TY_PP_Asm)
4072 D.Diag(diag::err_drv_invalid_gcc_output_type)
4073 << getTypeName(JA.getType());
4074
4075 CmdArgs.push_back("-S");
4076 }
4077 }
4078
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4079 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4080 ArgStringList &CmdArgs) const {
4081 CmdArgs.push_back("-c");
4082 }
4083
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4084 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4085 ArgStringList &CmdArgs) const {
4086 // The types are (hopefully) good enough.
4087 }
4088
4089 // Hexagon tools start.
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4090 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4091 ArgStringList &CmdArgs) const {
4092
4093 }
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4094 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4095 const InputInfo &Output,
4096 const InputInfoList &Inputs,
4097 const ArgList &Args,
4098 const char *LinkingOutput) const {
4099
4100 const Driver &D = getToolChain().getDriver();
4101 ArgStringList CmdArgs;
4102
4103 std::string MarchString = "-march=";
4104 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
4105 CmdArgs.push_back(Args.MakeArgString(MarchString));
4106
4107 RenderExtraToolArgs(JA, CmdArgs);
4108
4109 if (Output.isFilename()) {
4110 CmdArgs.push_back("-o");
4111 CmdArgs.push_back(Output.getFilename());
4112 } else {
4113 assert(Output.isNothing() && "Unexpected output");
4114 CmdArgs.push_back("-fsyntax-only");
4115 }
4116
4117 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4118 if (!SmallDataThreshold.empty())
4119 CmdArgs.push_back(
4120 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4121
4122 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4123 options::OPT_Xassembler);
4124
4125 // Only pass -x if gcc will understand it; otherwise hope gcc
4126 // understands the suffix correctly. The main use case this would go
4127 // wrong in is for linker inputs if they happened to have an odd
4128 // suffix; really the only way to get this to happen is a command
4129 // like '-x foobar a.c' which will treat a.c like a linker input.
4130 //
4131 // FIXME: For the linker case specifically, can we safely convert
4132 // inputs into '-Wl,' options?
4133 for (InputInfoList::const_iterator
4134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4135 const InputInfo &II = *it;
4136
4137 // Don't try to pass LLVM or AST inputs to a generic gcc.
4138 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4139 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4140 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4141 << getToolChain().getTripleString();
4142 else if (II.getType() == types::TY_AST)
4143 D.Diag(clang::diag::err_drv_no_ast_support)
4144 << getToolChain().getTripleString();
4145 else if (II.getType() == types::TY_ModuleFile)
4146 D.Diag(diag::err_drv_no_module_support)
4147 << getToolChain().getTripleString();
4148
4149 if (II.isFilename())
4150 CmdArgs.push_back(II.getFilename());
4151 else
4152 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4153 II.getInputArg().render(Args, CmdArgs);
4154 }
4155
4156 const char *GCCName = "hexagon-as";
4157 const char *Exec =
4158 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4159 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4160
4161 }
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4162 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4163 ArgStringList &CmdArgs) const {
4164 // The types are (hopefully) good enough.
4165 }
4166
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4167 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4168 const InputInfo &Output,
4169 const InputInfoList &Inputs,
4170 const ArgList &Args,
4171 const char *LinkingOutput) const {
4172
4173 const toolchains::Hexagon_TC& ToolChain =
4174 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4175 const Driver &D = ToolChain.getDriver();
4176
4177 ArgStringList CmdArgs;
4178
4179 //----------------------------------------------------------------------------
4180 //
4181 //----------------------------------------------------------------------------
4182 bool hasStaticArg = Args.hasArg(options::OPT_static);
4183 bool buildingLib = Args.hasArg(options::OPT_shared);
4184 bool buildPIE = Args.hasArg(options::OPT_pie);
4185 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4186 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4187 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4188 bool useShared = buildingLib && !hasStaticArg;
4189
4190 //----------------------------------------------------------------------------
4191 // Silence warnings for various options
4192 //----------------------------------------------------------------------------
4193
4194 Args.ClaimAllArgs(options::OPT_g_Group);
4195 Args.ClaimAllArgs(options::OPT_emit_llvm);
4196 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4197 // handled somewhere else.
4198 Args.ClaimAllArgs(options::OPT_static_libgcc);
4199
4200 //----------------------------------------------------------------------------
4201 //
4202 //----------------------------------------------------------------------------
4203 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4204 e = ToolChain.ExtraOpts.end();
4205 i != e; ++i)
4206 CmdArgs.push_back(i->c_str());
4207
4208 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4209 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
4210
4211 if (buildingLib) {
4212 CmdArgs.push_back("-shared");
4213 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4214 // hexagon-gcc does
4215 }
4216
4217 if (hasStaticArg)
4218 CmdArgs.push_back("-static");
4219
4220 if (buildPIE && !buildingLib)
4221 CmdArgs.push_back("-pie");
4222
4223 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4224 if (!SmallDataThreshold.empty()) {
4225 CmdArgs.push_back(
4226 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4227 }
4228
4229 //----------------------------------------------------------------------------
4230 //
4231 //----------------------------------------------------------------------------
4232 CmdArgs.push_back("-o");
4233 CmdArgs.push_back(Output.getFilename());
4234
4235 const std::string MarchSuffix = "/" + MarchString;
4236 const std::string G0Suffix = "/G0";
4237 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4238 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4239 + "/";
4240 const std::string StartFilesDir = RootDir
4241 + "hexagon/lib"
4242 + (buildingLib
4243 ? MarchG0Suffix : MarchSuffix);
4244
4245 //----------------------------------------------------------------------------
4246 // moslib
4247 //----------------------------------------------------------------------------
4248 std::vector<std::string> oslibs;
4249 bool hasStandalone= false;
4250
4251 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4252 ie = Args.filtered_end(); it != ie; ++it) {
4253 (*it)->claim();
4254 oslibs.push_back((*it)->getValue());
4255 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
4256 }
4257 if (oslibs.empty()) {
4258 oslibs.push_back("standalone");
4259 hasStandalone = true;
4260 }
4261
4262 //----------------------------------------------------------------------------
4263 // Start Files
4264 //----------------------------------------------------------------------------
4265 if (incStdLib && incStartFiles) {
4266
4267 if (!buildingLib) {
4268 if (hasStandalone) {
4269 CmdArgs.push_back(
4270 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4271 }
4272 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4273 }
4274 std::string initObj = useShared ? "/initS.o" : "/init.o";
4275 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4276 }
4277
4278 //----------------------------------------------------------------------------
4279 // Library Search Paths
4280 //----------------------------------------------------------------------------
4281 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4282 for (ToolChain::path_list::const_iterator
4283 i = LibPaths.begin(),
4284 e = LibPaths.end();
4285 i != e;
4286 ++i)
4287 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4288
4289 //----------------------------------------------------------------------------
4290 //
4291 //----------------------------------------------------------------------------
4292 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4293 Args.AddAllArgs(CmdArgs, options::OPT_e);
4294 Args.AddAllArgs(CmdArgs, options::OPT_s);
4295 Args.AddAllArgs(CmdArgs, options::OPT_t);
4296 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4297
4298 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4299
4300 //----------------------------------------------------------------------------
4301 // Libraries
4302 //----------------------------------------------------------------------------
4303 if (incStdLib && incDefLibs) {
4304 if (D.CCCIsCXX()) {
4305 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4306 CmdArgs.push_back("-lm");
4307 }
4308
4309 CmdArgs.push_back("--start-group");
4310
4311 if (!buildingLib) {
4312 for(std::vector<std::string>::iterator i = oslibs.begin(),
4313 e = oslibs.end(); i != e; ++i)
4314 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4315 CmdArgs.push_back("-lc");
4316 }
4317 CmdArgs.push_back("-lgcc");
4318
4319 CmdArgs.push_back("--end-group");
4320 }
4321
4322 //----------------------------------------------------------------------------
4323 // End files
4324 //----------------------------------------------------------------------------
4325 if (incStdLib && incStartFiles) {
4326 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4327 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4328 }
4329
4330 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4331 C.addCommand(
4332 new Command(
4333 JA, *this,
4334 Args.MakeArgString(Linker), CmdArgs));
4335 }
4336 // Hexagon tools end.
4337
getArchTypeForDarwinArchName(StringRef Str)4338 llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4339 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4340 // archs which Darwin doesn't use.
4341
4342 // The matching this routine does is fairly pointless, since it is neither the
4343 // complete architecture list, nor a reasonable subset. The problem is that
4344 // historically the driver driver accepts this and also ties its -march=
4345 // handling to the architecture name, so we need to be careful before removing
4346 // support for it.
4347
4348 // This code must be kept in sync with Clang's Darwin specific argument
4349 // translation.
4350
4351 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4352 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4353 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4354 .Case("ppc64", llvm::Triple::ppc64)
4355 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4356 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4357 llvm::Triple::x86)
4358 .Case("x86_64", llvm::Triple::x86_64)
4359 // This is derived from the driver driver.
4360 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4361 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4362 .Cases("armv7s", "xscale", llvm::Triple::arm)
4363 .Case("r600", llvm::Triple::r600)
4364 .Case("nvptx", llvm::Triple::nvptx)
4365 .Case("nvptx64", llvm::Triple::nvptx64)
4366 .Case("amdil", llvm::Triple::amdil)
4367 .Case("spir", llvm::Triple::spir)
4368 .Default(llvm::Triple::UnknownArch);
4369 }
4370
getBaseInputName(const ArgList & Args,const InputInfoList & Inputs)4371 const char *Clang::getBaseInputName(const ArgList &Args,
4372 const InputInfoList &Inputs) {
4373 return Args.MakeArgString(
4374 llvm::sys::path::filename(Inputs[0].getBaseInput()));
4375 }
4376
getBaseInputStem(const ArgList & Args,const InputInfoList & Inputs)4377 const char *Clang::getBaseInputStem(const ArgList &Args,
4378 const InputInfoList &Inputs) {
4379 const char *Str = getBaseInputName(Args, Inputs);
4380
4381 if (const char *End = strrchr(Str, '.'))
4382 return Args.MakeArgString(std::string(Str, End));
4383
4384 return Str;
4385 }
4386
getDependencyFileName(const ArgList & Args,const InputInfoList & Inputs)4387 const char *Clang::getDependencyFileName(const ArgList &Args,
4388 const InputInfoList &Inputs) {
4389 // FIXME: Think about this more.
4390 std::string Res;
4391
4392 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
4393 std::string Str(OutputOpt->getValue());
4394 Res = Str.substr(0, Str.rfind('.'));
4395 } else {
4396 Res = getBaseInputStem(Args, Inputs);
4397 }
4398 return Args.MakeArgString(Res + ".d");
4399 }
4400
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4401 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4402 const InputInfo &Output,
4403 const InputInfoList &Inputs,
4404 const ArgList &Args,
4405 const char *LinkingOutput) const {
4406 ArgStringList CmdArgs;
4407
4408 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4409 const InputInfo &Input = Inputs[0];
4410
4411 // Determine the original source input.
4412 const Action *SourceAction = &JA;
4413 while (SourceAction->getKind() != Action::InputClass) {
4414 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4415 SourceAction = SourceAction->getInputs()[0];
4416 }
4417
4418 // Forward -g, assuming we are dealing with an actual assembly file.
4419 if (SourceAction->getType() == types::TY_Asm ||
4420 SourceAction->getType() == types::TY_PP_Asm) {
4421 if (Args.hasArg(options::OPT_gstabs))
4422 CmdArgs.push_back("--gstabs");
4423 else if (Args.hasArg(options::OPT_g_Group))
4424 CmdArgs.push_back("-g");
4425 }
4426
4427 // Derived from asm spec.
4428 AddDarwinArch(Args, CmdArgs);
4429
4430 // Use -force_cpusubtype_ALL on x86 by default.
4431 if (getToolChain().getArch() == llvm::Triple::x86 ||
4432 getToolChain().getArch() == llvm::Triple::x86_64 ||
4433 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4434 CmdArgs.push_back("-force_cpusubtype_ALL");
4435
4436 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
4437 (((Args.hasArg(options::OPT_mkernel) ||
4438 Args.hasArg(options::OPT_fapple_kext)) &&
4439 (!getDarwinToolChain().isTargetIPhoneOS() ||
4440 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4441 Args.hasArg(options::OPT_static)))
4442 CmdArgs.push_back("-static");
4443
4444 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4445 options::OPT_Xassembler);
4446
4447 assert(Output.isFilename() && "Unexpected lipo output.");
4448 CmdArgs.push_back("-o");
4449 CmdArgs.push_back(Output.getFilename());
4450
4451 assert(Input.isFilename() && "Invalid input.");
4452 CmdArgs.push_back(Input.getFilename());
4453
4454 // asm_final spec is empty.
4455
4456 const char *Exec =
4457 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4458 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4459 }
4460
anchor()4461 void darwin::DarwinTool::anchor() {}
4462
AddDarwinArch(const ArgList & Args,ArgStringList & CmdArgs) const4463 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4464 ArgStringList &CmdArgs) const {
4465 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
4466
4467 // Derived from darwin_arch spec.
4468 CmdArgs.push_back("-arch");
4469 CmdArgs.push_back(Args.MakeArgString(ArchName));
4470
4471 // FIXME: Is this needed anymore?
4472 if (ArchName == "arm")
4473 CmdArgs.push_back("-force_cpusubtype_ALL");
4474 }
4475
NeedsTempPath(const InputInfoList & Inputs) const4476 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4477 // We only need to generate a temp path for LTO if we aren't compiling object
4478 // files. When compiling source files, we run 'dsymutil' after linking. We
4479 // don't run 'dsymutil' when compiling object files.
4480 for (InputInfoList::const_iterator
4481 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4482 if (it->getType() != types::TY_Object)
4483 return true;
4484
4485 return false;
4486 }
4487
AddLinkArgs(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs,const InputInfoList & Inputs) const4488 void darwin::Link::AddLinkArgs(Compilation &C,
4489 const ArgList &Args,
4490 ArgStringList &CmdArgs,
4491 const InputInfoList &Inputs) const {
4492 const Driver &D = getToolChain().getDriver();
4493 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
4494
4495 unsigned Version[3] = { 0, 0, 0 };
4496 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4497 bool HadExtra;
4498 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
4499 Version[1], Version[2], HadExtra) ||
4500 HadExtra)
4501 D.Diag(diag::err_drv_invalid_version_number)
4502 << A->getAsString(Args);
4503 }
4504
4505 // Newer linkers support -demangle, pass it if supported and not disabled by
4506 // the user.
4507 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
4508 // Don't pass -demangle to ld_classic.
4509 //
4510 // FIXME: This is a temporary workaround, ld should be handling this.
4511 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4512 Args.hasArg(options::OPT_static));
4513 if (getToolChain().getArch() == llvm::Triple::x86) {
4514 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4515 options::OPT_Wl_COMMA),
4516 ie = Args.filtered_end(); it != ie; ++it) {
4517 const Arg *A = *it;
4518 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
4519 if (StringRef(A->getValue(i)) == "-kext")
4520 UsesLdClassic = true;
4521 }
4522 }
4523 if (!UsesLdClassic)
4524 CmdArgs.push_back("-demangle");
4525 }
4526
4527 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
4528 CmdArgs.push_back("-export_dynamic");
4529
4530 // If we are using LTO, then automatically create a temporary file path for
4531 // the linker to use, so that it's lifetime will extend past a possible
4532 // dsymutil step.
4533 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4534 const char *TmpPath = C.getArgs().MakeArgString(
4535 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4536 C.addTempFile(TmpPath);
4537 CmdArgs.push_back("-object_path_lto");
4538 CmdArgs.push_back(TmpPath);
4539 }
4540
4541 // Derived from the "link" spec.
4542 Args.AddAllArgs(CmdArgs, options::OPT_static);
4543 if (!Args.hasArg(options::OPT_static))
4544 CmdArgs.push_back("-dynamic");
4545 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4546 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4547 // here. How do we wish to handle such things?
4548 }
4549
4550 if (!Args.hasArg(options::OPT_dynamiclib)) {
4551 AddDarwinArch(Args, CmdArgs);
4552 // FIXME: Why do this only on this path?
4553 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
4554
4555 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4556 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4557 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4558
4559 Arg *A;
4560 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4561 (A = Args.getLastArg(options::OPT_current__version)) ||
4562 (A = Args.getLastArg(options::OPT_install__name)))
4563 D.Diag(diag::err_drv_argument_only_allowed_with)
4564 << A->getAsString(Args) << "-dynamiclib";
4565
4566 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4567 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4568 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4569 } else {
4570 CmdArgs.push_back("-dylib");
4571
4572 Arg *A;
4573 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4574 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4575 (A = Args.getLastArg(options::OPT_client__name)) ||
4576 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4577 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4578 (A = Args.getLastArg(options::OPT_private__bundle)))
4579 D.Diag(diag::err_drv_argument_not_allowed_with)
4580 << A->getAsString(Args) << "-dynamiclib";
4581
4582 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4583 "-dylib_compatibility_version");
4584 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4585 "-dylib_current_version");
4586
4587 AddDarwinArch(Args, CmdArgs);
4588
4589 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4590 "-dylib_install_name");
4591 }
4592
4593 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4594 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4595 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4596 if (DarwinTC.isTargetIPhoneOS())
4597 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
4598 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4599 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4600 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4601 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4602 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4603 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
4604 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
4605 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4606 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4607 Args.AddAllArgs(CmdArgs, options::OPT_init);
4608
4609 // Add the deployment target.
4610 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4611
4612 // If we had an explicit -mios-simulator-version-min argument, honor that,
4613 // otherwise use the traditional deployment targets. We can't just check the
4614 // is-sim attribute because existing code follows this path, and the linker
4615 // may not handle the argument.
4616 //
4617 // FIXME: We may be able to remove this, once we can verify no one depends on
4618 // it.
4619 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4620 CmdArgs.push_back("-ios_simulator_version_min");
4621 else if (DarwinTC.isTargetIPhoneOS())
4622 CmdArgs.push_back("-iphoneos_version_min");
4623 else
4624 CmdArgs.push_back("-macosx_version_min");
4625 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4626
4627 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4628 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4629 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4630 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4631 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4632
4633 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4634 options::OPT_fno_pie,
4635 options::OPT_fno_PIE)) {
4636 if (A->getOption().matches(options::OPT_fpie) ||
4637 A->getOption().matches(options::OPT_fPIE))
4638 CmdArgs.push_back("-pie");
4639 else
4640 CmdArgs.push_back("-no_pie");
4641 }
4642
4643 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4644 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4645 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4646 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4647 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4648 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4649 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4650 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4651 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4652 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4653 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4654 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4655 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4656 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4657 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4658 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4659
4660 // Give --sysroot= preference, over the Apple specific behavior to also use
4661 // --isysroot as the syslibroot.
4662 StringRef sysroot = C.getSysRoot();
4663 if (sysroot != "") {
4664 CmdArgs.push_back("-syslibroot");
4665 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4666 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4667 CmdArgs.push_back("-syslibroot");
4668 CmdArgs.push_back(A->getValue());
4669 }
4670
4671 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4672 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4673 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4674 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4675 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4676 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
4677 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4678 Args.AddAllArgs(CmdArgs, options::OPT_y);
4679 Args.AddLastArg(CmdArgs, options::OPT_w);
4680 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4681 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4682 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4683 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4684 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4685 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4686 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4687 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4688 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4689 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4690 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4691 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4692 }
4693
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4694 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
4695 const InputInfo &Output,
4696 const InputInfoList &Inputs,
4697 const ArgList &Args,
4698 const char *LinkingOutput) const {
4699 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4700
4701 // The logic here is derived from gcc's behavior; most of which
4702 // comes from specs (starting with link_command). Consult gcc for
4703 // more information.
4704 ArgStringList CmdArgs;
4705
4706 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4707 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4708 options::OPT_ccc_arcmt_migrate)) {
4709 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4710 (*I)->claim();
4711 const char *Exec =
4712 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4713 CmdArgs.push_back(Output.getFilename());
4714 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4715 return;
4716 }
4717
4718 // I'm not sure why this particular decomposition exists in gcc, but
4719 // we follow suite for ease of comparison.
4720 AddLinkArgs(C, Args, CmdArgs, Inputs);
4721
4722 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4723 Args.AddAllArgs(CmdArgs, options::OPT_s);
4724 Args.AddAllArgs(CmdArgs, options::OPT_t);
4725 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4726 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4727 Args.AddLastArg(CmdArgs, options::OPT_e);
4728 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4729 Args.AddAllArgs(CmdArgs, options::OPT_r);
4730
4731 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4732 // members of static archive libraries which implement Objective-C classes or
4733 // categories.
4734 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4735 CmdArgs.push_back("-ObjC");
4736
4737 CmdArgs.push_back("-o");
4738 CmdArgs.push_back(Output.getFilename());
4739
4740 if (!Args.hasArg(options::OPT_nostdlib) &&
4741 !Args.hasArg(options::OPT_nostartfiles)) {
4742 // Derived from startfile spec.
4743 if (Args.hasArg(options::OPT_dynamiclib)) {
4744 // Derived from darwin_dylib1 spec.
4745 if (getDarwinToolChain().isTargetIOSSimulator()) {
4746 // The simulator doesn't have a versioned crt1 file.
4747 CmdArgs.push_back("-ldylib1.o");
4748 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4749 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4750 CmdArgs.push_back("-ldylib1.o");
4751 } else {
4752 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4753 CmdArgs.push_back("-ldylib1.o");
4754 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4755 CmdArgs.push_back("-ldylib1.10.5.o");
4756 }
4757 } else {
4758 if (Args.hasArg(options::OPT_bundle)) {
4759 if (!Args.hasArg(options::OPT_static)) {
4760 // Derived from darwin_bundle1 spec.
4761 if (getDarwinToolChain().isTargetIOSSimulator()) {
4762 // The simulator doesn't have a versioned crt1 file.
4763 CmdArgs.push_back("-lbundle1.o");
4764 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4765 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4766 CmdArgs.push_back("-lbundle1.o");
4767 } else {
4768 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4769 CmdArgs.push_back("-lbundle1.o");
4770 }
4771 }
4772 } else {
4773 if (Args.hasArg(options::OPT_pg) &&
4774 getToolChain().SupportsProfiling()) {
4775 if (Args.hasArg(options::OPT_static) ||
4776 Args.hasArg(options::OPT_object) ||
4777 Args.hasArg(options::OPT_preload)) {
4778 CmdArgs.push_back("-lgcrt0.o");
4779 } else {
4780 CmdArgs.push_back("-lgcrt1.o");
4781
4782 // darwin_crt2 spec is empty.
4783 }
4784 // By default on OS X 10.8 and later, we don't link with a crt1.o
4785 // file and the linker knows to use _main as the entry point. But,
4786 // when compiling with -pg, we need to link with the gcrt1.o file,
4787 // so pass the -no_new_main option to tell the linker to use the
4788 // "start" symbol as the entry point.
4789 if (getDarwinToolChain().isTargetMacOS() &&
4790 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4791 CmdArgs.push_back("-no_new_main");
4792 } else {
4793 if (Args.hasArg(options::OPT_static) ||
4794 Args.hasArg(options::OPT_object) ||
4795 Args.hasArg(options::OPT_preload)) {
4796 CmdArgs.push_back("-lcrt0.o");
4797 } else {
4798 // Derived from darwin_crt1 spec.
4799 if (getDarwinToolChain().isTargetIOSSimulator()) {
4800 // The simulator doesn't have a versioned crt1 file.
4801 CmdArgs.push_back("-lcrt1.o");
4802 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4803 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4804 CmdArgs.push_back("-lcrt1.o");
4805 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
4806 CmdArgs.push_back("-lcrt1.3.1.o");
4807 } else {
4808 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4809 CmdArgs.push_back("-lcrt1.o");
4810 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4811 CmdArgs.push_back("-lcrt1.10.5.o");
4812 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
4813 CmdArgs.push_back("-lcrt1.10.6.o");
4814
4815 // darwin_crt2 spec is empty.
4816 }
4817 }
4818 }
4819 }
4820 }
4821
4822 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4823 Args.hasArg(options::OPT_shared_libgcc) &&
4824 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
4825 const char *Str =
4826 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
4827 CmdArgs.push_back(Str);
4828 }
4829 }
4830
4831 Args.AddAllArgs(CmdArgs, options::OPT_L);
4832
4833 SanitizerArgs Sanitize(getToolChain(), Args);
4834 // If we're building a dynamic lib with -fsanitize=address,
4835 // unresolved symbols may appear. Mark all
4836 // of them as dynamic_lookup. Linking executables is handled in
4837 // lib/Driver/ToolChains.cpp.
4838 if (Sanitize.needsAsanRt()) {
4839 if (Args.hasArg(options::OPT_dynamiclib) ||
4840 Args.hasArg(options::OPT_bundle)) {
4841 CmdArgs.push_back("-undefined");
4842 CmdArgs.push_back("dynamic_lookup");
4843 }
4844 }
4845
4846 if (Args.hasArg(options::OPT_fopenmp))
4847 // This is more complicated in gcc...
4848 CmdArgs.push_back("-lgomp");
4849
4850 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4851
4852 if (isObjCRuntimeLinked(Args) &&
4853 !Args.hasArg(options::OPT_nostdlib) &&
4854 !Args.hasArg(options::OPT_nodefaultlibs)) {
4855 // Avoid linking compatibility stubs on i386 mac.
4856 if (!getDarwinToolChain().isTargetMacOS() ||
4857 getDarwinToolChain().getArch() != llvm::Triple::x86) {
4858 // If we don't have ARC or subscripting runtime support, link in the
4859 // runtime stubs. We have to do this *before* adding any of the normal
4860 // linker inputs so that its initializer gets run first.
4861 ObjCRuntime runtime =
4862 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
4863 // We use arclite library for both ARC and subscripting support.
4864 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
4865 !runtime.hasSubscripting())
4866 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
4867 }
4868 CmdArgs.push_back("-framework");
4869 CmdArgs.push_back("Foundation");
4870 // Link libobj.
4871 CmdArgs.push_back("-lobjc");
4872 }
4873
4874 if (LinkingOutput) {
4875 CmdArgs.push_back("-arch_multiple");
4876 CmdArgs.push_back("-final_output");
4877 CmdArgs.push_back(LinkingOutput);
4878 }
4879
4880 if (Args.hasArg(options::OPT_fnested_functions))
4881 CmdArgs.push_back("-allow_stack_execute");
4882
4883 if (!Args.hasArg(options::OPT_nostdlib) &&
4884 !Args.hasArg(options::OPT_nodefaultlibs)) {
4885 if (getToolChain().getDriver().CCCIsCXX())
4886 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4887
4888 // link_ssp spec is empty.
4889
4890 // Let the tool chain choose which runtime library to link.
4891 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
4892 }
4893
4894 if (!Args.hasArg(options::OPT_nostdlib) &&
4895 !Args.hasArg(options::OPT_nostartfiles)) {
4896 // endfile_spec is empty.
4897 }
4898
4899 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4900 Args.AddAllArgs(CmdArgs, options::OPT_F);
4901
4902 const char *Exec =
4903 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4904 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4905 }
4906
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4907 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
4908 const InputInfo &Output,
4909 const InputInfoList &Inputs,
4910 const ArgList &Args,
4911 const char *LinkingOutput) const {
4912 ArgStringList CmdArgs;
4913
4914 CmdArgs.push_back("-create");
4915 assert(Output.isFilename() && "Unexpected lipo output.");
4916
4917 CmdArgs.push_back("-output");
4918 CmdArgs.push_back(Output.getFilename());
4919
4920 for (InputInfoList::const_iterator
4921 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4922 const InputInfo &II = *it;
4923 assert(II.isFilename() && "Unexpected lipo input.");
4924 CmdArgs.push_back(II.getFilename());
4925 }
4926 const char *Exec =
4927 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
4928 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4929 }
4930
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4931 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
4932 const InputInfo &Output,
4933 const InputInfoList &Inputs,
4934 const ArgList &Args,
4935 const char *LinkingOutput) const {
4936 ArgStringList CmdArgs;
4937
4938 CmdArgs.push_back("-o");
4939 CmdArgs.push_back(Output.getFilename());
4940
4941 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4942 const InputInfo &Input = Inputs[0];
4943 assert(Input.isFilename() && "Unexpected dsymutil input.");
4944 CmdArgs.push_back(Input.getFilename());
4945
4946 const char *Exec =
4947 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
4948 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4949 }
4950
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4951 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4952 const InputInfo &Output,
4953 const InputInfoList &Inputs,
4954 const ArgList &Args,
4955 const char *LinkingOutput) const {
4956 ArgStringList CmdArgs;
4957 CmdArgs.push_back("--verify");
4958 CmdArgs.push_back("--debug-info");
4959 CmdArgs.push_back("--eh-frame");
4960 CmdArgs.push_back("--quiet");
4961
4962 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4963 const InputInfo &Input = Inputs[0];
4964 assert(Input.isFilename() && "Unexpected verify input");
4965
4966 // Grabbing the output of the earlier dsymutil run.
4967 CmdArgs.push_back(Input.getFilename());
4968
4969 const char *Exec =
4970 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4971 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4972 }
4973
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4974 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4975 const InputInfo &Output,
4976 const InputInfoList &Inputs,
4977 const ArgList &Args,
4978 const char *LinkingOutput) const {
4979 ArgStringList CmdArgs;
4980
4981 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4982 options::OPT_Xassembler);
4983
4984 CmdArgs.push_back("-o");
4985 CmdArgs.push_back(Output.getFilename());
4986
4987 for (InputInfoList::const_iterator
4988 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4989 const InputInfo &II = *it;
4990 CmdArgs.push_back(II.getFilename());
4991 }
4992
4993 const char *Exec =
4994 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4995 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4996 }
4997
4998
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4999 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5000 const InputInfo &Output,
5001 const InputInfoList &Inputs,
5002 const ArgList &Args,
5003 const char *LinkingOutput) const {
5004 // FIXME: Find a real GCC, don't hard-code versions here
5005 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5006 const llvm::Triple &T = getToolChain().getTriple();
5007 std::string LibPath = "/usr/lib/";
5008 llvm::Triple::ArchType Arch = T.getArch();
5009 switch (Arch) {
5010 case llvm::Triple::x86:
5011 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
5012 T.getOSName()).str() + "/4.5.2/";
5013 break;
5014 case llvm::Triple::x86_64:
5015 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
5016 T.getOSName()).str();
5017 GCCLibPath += "/4.5.2/amd64/";
5018 LibPath += "amd64/";
5019 break;
5020 default:
5021 assert(0 && "Unsupported architecture");
5022 }
5023
5024 ArgStringList CmdArgs;
5025
5026 // Demangle C++ names in errors
5027 CmdArgs.push_back("-C");
5028
5029 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5030 (!Args.hasArg(options::OPT_shared))) {
5031 CmdArgs.push_back("-e");
5032 CmdArgs.push_back("_start");
5033 }
5034
5035 if (Args.hasArg(options::OPT_static)) {
5036 CmdArgs.push_back("-Bstatic");
5037 CmdArgs.push_back("-dn");
5038 } else {
5039 CmdArgs.push_back("-Bdynamic");
5040 if (Args.hasArg(options::OPT_shared)) {
5041 CmdArgs.push_back("-shared");
5042 } else {
5043 CmdArgs.push_back("--dynamic-linker");
5044 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5045 }
5046 }
5047
5048 if (Output.isFilename()) {
5049 CmdArgs.push_back("-o");
5050 CmdArgs.push_back(Output.getFilename());
5051 } else {
5052 assert(Output.isNothing() && "Invalid output.");
5053 }
5054
5055 if (!Args.hasArg(options::OPT_nostdlib) &&
5056 !Args.hasArg(options::OPT_nostartfiles)) {
5057 if (!Args.hasArg(options::OPT_shared)) {
5058 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5059 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5060 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5061 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5062 } else {
5063 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5064 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5065 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5066 }
5067 if (getToolChain().getDriver().CCCIsCXX())
5068 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
5069 }
5070
5071 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5072
5073 Args.AddAllArgs(CmdArgs, options::OPT_L);
5074 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5075 Args.AddAllArgs(CmdArgs, options::OPT_e);
5076 Args.AddAllArgs(CmdArgs, options::OPT_r);
5077
5078 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5079
5080 if (!Args.hasArg(options::OPT_nostdlib) &&
5081 !Args.hasArg(options::OPT_nodefaultlibs)) {
5082 if (getToolChain().getDriver().CCCIsCXX())
5083 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5084 CmdArgs.push_back("-lgcc_s");
5085 if (!Args.hasArg(options::OPT_shared)) {
5086 CmdArgs.push_back("-lgcc");
5087 CmdArgs.push_back("-lc");
5088 CmdArgs.push_back("-lm");
5089 }
5090 }
5091
5092 if (!Args.hasArg(options::OPT_nostdlib) &&
5093 !Args.hasArg(options::OPT_nostartfiles)) {
5094 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
5095 }
5096 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
5097
5098 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5099
5100 const char *Exec =
5101 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5102 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5103 }
5104
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5105 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5106 const InputInfo &Output,
5107 const InputInfoList &Inputs,
5108 const ArgList &Args,
5109 const char *LinkingOutput) const {
5110 ArgStringList CmdArgs;
5111
5112 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5113 options::OPT_Xassembler);
5114
5115 CmdArgs.push_back("-o");
5116 CmdArgs.push_back(Output.getFilename());
5117
5118 for (InputInfoList::const_iterator
5119 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5120 const InputInfo &II = *it;
5121 CmdArgs.push_back(II.getFilename());
5122 }
5123
5124 const char *Exec =
5125 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
5126 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5127 }
5128
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5129 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
5130 const InputInfo &Output,
5131 const InputInfoList &Inputs,
5132 const ArgList &Args,
5133 const char *LinkingOutput) const {
5134 ArgStringList CmdArgs;
5135
5136 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5137 (!Args.hasArg(options::OPT_shared))) {
5138 CmdArgs.push_back("-e");
5139 CmdArgs.push_back("_start");
5140 }
5141
5142 if (Args.hasArg(options::OPT_static)) {
5143 CmdArgs.push_back("-Bstatic");
5144 CmdArgs.push_back("-dn");
5145 } else {
5146 // CmdArgs.push_back("--eh-frame-hdr");
5147 CmdArgs.push_back("-Bdynamic");
5148 if (Args.hasArg(options::OPT_shared)) {
5149 CmdArgs.push_back("-shared");
5150 } else {
5151 CmdArgs.push_back("--dynamic-linker");
5152 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5153 }
5154 }
5155
5156 if (Output.isFilename()) {
5157 CmdArgs.push_back("-o");
5158 CmdArgs.push_back(Output.getFilename());
5159 } else {
5160 assert(Output.isNothing() && "Invalid output.");
5161 }
5162
5163 if (!Args.hasArg(options::OPT_nostdlib) &&
5164 !Args.hasArg(options::OPT_nostartfiles)) {
5165 if (!Args.hasArg(options::OPT_shared)) {
5166 CmdArgs.push_back(Args.MakeArgString(
5167 getToolChain().GetFilePath("crt1.o")));
5168 CmdArgs.push_back(Args.MakeArgString(
5169 getToolChain().GetFilePath("crti.o")));
5170 CmdArgs.push_back(Args.MakeArgString(
5171 getToolChain().GetFilePath("crtbegin.o")));
5172 } else {
5173 CmdArgs.push_back(Args.MakeArgString(
5174 getToolChain().GetFilePath("crti.o")));
5175 }
5176 CmdArgs.push_back(Args.MakeArgString(
5177 getToolChain().GetFilePath("crtn.o")));
5178 }
5179
5180 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5181 + getToolChain().getTripleString()
5182 + "/4.2.4"));
5183
5184 Args.AddAllArgs(CmdArgs, options::OPT_L);
5185 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5186 Args.AddAllArgs(CmdArgs, options::OPT_e);
5187
5188 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5189
5190 if (!Args.hasArg(options::OPT_nostdlib) &&
5191 !Args.hasArg(options::OPT_nodefaultlibs)) {
5192 // FIXME: For some reason GCC passes -lgcc before adding
5193 // the default system libraries. Just mimic this for now.
5194 CmdArgs.push_back("-lgcc");
5195
5196 if (Args.hasArg(options::OPT_pthread))
5197 CmdArgs.push_back("-pthread");
5198 if (!Args.hasArg(options::OPT_shared))
5199 CmdArgs.push_back("-lc");
5200 CmdArgs.push_back("-lgcc");
5201 }
5202
5203 if (!Args.hasArg(options::OPT_nostdlib) &&
5204 !Args.hasArg(options::OPT_nostartfiles)) {
5205 if (!Args.hasArg(options::OPT_shared))
5206 CmdArgs.push_back(Args.MakeArgString(
5207 getToolChain().GetFilePath("crtend.o")));
5208 }
5209
5210 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5211
5212 const char *Exec =
5213 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5214 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5215 }
5216
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5217 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5218 const InputInfo &Output,
5219 const InputInfoList &Inputs,
5220 const ArgList &Args,
5221 const char *LinkingOutput) const {
5222 ArgStringList CmdArgs;
5223
5224 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5225 options::OPT_Xassembler);
5226
5227 CmdArgs.push_back("-o");
5228 CmdArgs.push_back(Output.getFilename());
5229
5230 for (InputInfoList::const_iterator
5231 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5232 const InputInfo &II = *it;
5233 CmdArgs.push_back(II.getFilename());
5234 }
5235
5236 const char *Exec =
5237 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5238 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5239 }
5240
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5241 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5242 const InputInfo &Output,
5243 const InputInfoList &Inputs,
5244 const ArgList &Args,
5245 const char *LinkingOutput) const {
5246 const Driver &D = getToolChain().getDriver();
5247 ArgStringList CmdArgs;
5248
5249 // Silence warning for "clang -g foo.o -o foo"
5250 Args.ClaimAllArgs(options::OPT_g_Group);
5251 // and "clang -emit-llvm foo.o -o foo"
5252 Args.ClaimAllArgs(options::OPT_emit_llvm);
5253 // and for "clang -w foo.o -o foo". Other warning options are already
5254 // handled somewhere else.
5255 Args.ClaimAllArgs(options::OPT_w);
5256
5257 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5258 (!Args.hasArg(options::OPT_shared))) {
5259 CmdArgs.push_back("-e");
5260 CmdArgs.push_back("__start");
5261 }
5262
5263 if (Args.hasArg(options::OPT_static)) {
5264 CmdArgs.push_back("-Bstatic");
5265 } else {
5266 if (Args.hasArg(options::OPT_rdynamic))
5267 CmdArgs.push_back("-export-dynamic");
5268 CmdArgs.push_back("--eh-frame-hdr");
5269 CmdArgs.push_back("-Bdynamic");
5270 if (Args.hasArg(options::OPT_shared)) {
5271 CmdArgs.push_back("-shared");
5272 } else {
5273 CmdArgs.push_back("-dynamic-linker");
5274 CmdArgs.push_back("/usr/libexec/ld.so");
5275 }
5276 }
5277
5278 if (Args.hasArg(options::OPT_nopie))
5279 CmdArgs.push_back("-nopie");
5280
5281 if (Output.isFilename()) {
5282 CmdArgs.push_back("-o");
5283 CmdArgs.push_back(Output.getFilename());
5284 } else {
5285 assert(Output.isNothing() && "Invalid output.");
5286 }
5287
5288 if (!Args.hasArg(options::OPT_nostdlib) &&
5289 !Args.hasArg(options::OPT_nostartfiles)) {
5290 if (!Args.hasArg(options::OPT_shared)) {
5291 if (Args.hasArg(options::OPT_pg))
5292 CmdArgs.push_back(Args.MakeArgString(
5293 getToolChain().GetFilePath("gcrt0.o")));
5294 else
5295 CmdArgs.push_back(Args.MakeArgString(
5296 getToolChain().GetFilePath("crt0.o")));
5297 CmdArgs.push_back(Args.MakeArgString(
5298 getToolChain().GetFilePath("crtbegin.o")));
5299 } else {
5300 CmdArgs.push_back(Args.MakeArgString(
5301 getToolChain().GetFilePath("crtbeginS.o")));
5302 }
5303 }
5304
5305 std::string Triple = getToolChain().getTripleString();
5306 if (Triple.substr(0, 6) == "x86_64")
5307 Triple.replace(0, 6, "amd64");
5308 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
5309 "/4.2.1"));
5310
5311 Args.AddAllArgs(CmdArgs, options::OPT_L);
5312 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5313 Args.AddAllArgs(CmdArgs, options::OPT_e);
5314 Args.AddAllArgs(CmdArgs, options::OPT_s);
5315 Args.AddAllArgs(CmdArgs, options::OPT_t);
5316 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5317 Args.AddAllArgs(CmdArgs, options::OPT_r);
5318
5319 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5320
5321 if (!Args.hasArg(options::OPT_nostdlib) &&
5322 !Args.hasArg(options::OPT_nodefaultlibs)) {
5323 if (D.CCCIsCXX()) {
5324 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5325 if (Args.hasArg(options::OPT_pg))
5326 CmdArgs.push_back("-lm_p");
5327 else
5328 CmdArgs.push_back("-lm");
5329 }
5330
5331 // FIXME: For some reason GCC passes -lgcc before adding
5332 // the default system libraries. Just mimic this for now.
5333 CmdArgs.push_back("-lgcc");
5334
5335 if (Args.hasArg(options::OPT_pthread)) {
5336 if (!Args.hasArg(options::OPT_shared) &&
5337 Args.hasArg(options::OPT_pg))
5338 CmdArgs.push_back("-lpthread_p");
5339 else
5340 CmdArgs.push_back("-lpthread");
5341 }
5342
5343 if (!Args.hasArg(options::OPT_shared)) {
5344 if (Args.hasArg(options::OPT_pg))
5345 CmdArgs.push_back("-lc_p");
5346 else
5347 CmdArgs.push_back("-lc");
5348 }
5349
5350 CmdArgs.push_back("-lgcc");
5351 }
5352
5353 if (!Args.hasArg(options::OPT_nostdlib) &&
5354 !Args.hasArg(options::OPT_nostartfiles)) {
5355 if (!Args.hasArg(options::OPT_shared))
5356 CmdArgs.push_back(Args.MakeArgString(
5357 getToolChain().GetFilePath("crtend.o")));
5358 else
5359 CmdArgs.push_back(Args.MakeArgString(
5360 getToolChain().GetFilePath("crtendS.o")));
5361 }
5362
5363 const char *Exec =
5364 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5365 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5366 }
5367
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5368 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5369 const InputInfo &Output,
5370 const InputInfoList &Inputs,
5371 const ArgList &Args,
5372 const char *LinkingOutput) const {
5373 ArgStringList CmdArgs;
5374
5375 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5376 options::OPT_Xassembler);
5377
5378 CmdArgs.push_back("-o");
5379 CmdArgs.push_back(Output.getFilename());
5380
5381 for (InputInfoList::const_iterator
5382 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5383 const InputInfo &II = *it;
5384 CmdArgs.push_back(II.getFilename());
5385 }
5386
5387 const char *Exec =
5388 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5389 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5390 }
5391
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5392 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5393 const InputInfo &Output,
5394 const InputInfoList &Inputs,
5395 const ArgList &Args,
5396 const char *LinkingOutput) const {
5397 const Driver &D = getToolChain().getDriver();
5398 ArgStringList CmdArgs;
5399
5400 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5401 (!Args.hasArg(options::OPT_shared))) {
5402 CmdArgs.push_back("-e");
5403 CmdArgs.push_back("__start");
5404 }
5405
5406 if (Args.hasArg(options::OPT_static)) {
5407 CmdArgs.push_back("-Bstatic");
5408 } else {
5409 if (Args.hasArg(options::OPT_rdynamic))
5410 CmdArgs.push_back("-export-dynamic");
5411 CmdArgs.push_back("--eh-frame-hdr");
5412 CmdArgs.push_back("-Bdynamic");
5413 if (Args.hasArg(options::OPT_shared)) {
5414 CmdArgs.push_back("-shared");
5415 } else {
5416 CmdArgs.push_back("-dynamic-linker");
5417 CmdArgs.push_back("/usr/libexec/ld.so");
5418 }
5419 }
5420
5421 if (Output.isFilename()) {
5422 CmdArgs.push_back("-o");
5423 CmdArgs.push_back(Output.getFilename());
5424 } else {
5425 assert(Output.isNothing() && "Invalid output.");
5426 }
5427
5428 if (!Args.hasArg(options::OPT_nostdlib) &&
5429 !Args.hasArg(options::OPT_nostartfiles)) {
5430 if (!Args.hasArg(options::OPT_shared)) {
5431 if (Args.hasArg(options::OPT_pg))
5432 CmdArgs.push_back(Args.MakeArgString(
5433 getToolChain().GetFilePath("gcrt0.o")));
5434 else
5435 CmdArgs.push_back(Args.MakeArgString(
5436 getToolChain().GetFilePath("crt0.o")));
5437 CmdArgs.push_back(Args.MakeArgString(
5438 getToolChain().GetFilePath("crtbegin.o")));
5439 } else {
5440 CmdArgs.push_back(Args.MakeArgString(
5441 getToolChain().GetFilePath("crtbeginS.o")));
5442 }
5443 }
5444
5445 Args.AddAllArgs(CmdArgs, options::OPT_L);
5446 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5447 Args.AddAllArgs(CmdArgs, options::OPT_e);
5448
5449 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5450
5451 if (!Args.hasArg(options::OPT_nostdlib) &&
5452 !Args.hasArg(options::OPT_nodefaultlibs)) {
5453 if (D.CCCIsCXX()) {
5454 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5455 if (Args.hasArg(options::OPT_pg))
5456 CmdArgs.push_back("-lm_p");
5457 else
5458 CmdArgs.push_back("-lm");
5459 }
5460
5461 if (Args.hasArg(options::OPT_pthread)) {
5462 if (!Args.hasArg(options::OPT_shared) &&
5463 Args.hasArg(options::OPT_pg))
5464 CmdArgs.push_back("-lpthread_p");
5465 else
5466 CmdArgs.push_back("-lpthread");
5467 }
5468
5469 if (!Args.hasArg(options::OPT_shared)) {
5470 if (Args.hasArg(options::OPT_pg))
5471 CmdArgs.push_back("-lc_p");
5472 else
5473 CmdArgs.push_back("-lc");
5474 }
5475
5476 std::string myarch = "-lclang_rt.";
5477 const llvm::Triple &T = getToolChain().getTriple();
5478 llvm::Triple::ArchType Arch = T.getArch();
5479 switch (Arch) {
5480 case llvm::Triple::arm:
5481 myarch += ("arm");
5482 break;
5483 case llvm::Triple::x86:
5484 myarch += ("i386");
5485 break;
5486 case llvm::Triple::x86_64:
5487 myarch += ("amd64");
5488 break;
5489 default:
5490 assert(0 && "Unsupported architecture");
5491 }
5492 CmdArgs.push_back(Args.MakeArgString(myarch));
5493 }
5494
5495 if (!Args.hasArg(options::OPT_nostdlib) &&
5496 !Args.hasArg(options::OPT_nostartfiles)) {
5497 if (!Args.hasArg(options::OPT_shared))
5498 CmdArgs.push_back(Args.MakeArgString(
5499 getToolChain().GetFilePath("crtend.o")));
5500 else
5501 CmdArgs.push_back(Args.MakeArgString(
5502 getToolChain().GetFilePath("crtendS.o")));
5503 }
5504
5505 const char *Exec =
5506 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5507 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5508 }
5509
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5510 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5511 const InputInfo &Output,
5512 const InputInfoList &Inputs,
5513 const ArgList &Args,
5514 const char *LinkingOutput) const {
5515 ArgStringList CmdArgs;
5516
5517 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5518 // instruct as in the base system to assemble 32-bit code.
5519 if (getToolChain().getArch() == llvm::Triple::x86)
5520 CmdArgs.push_back("--32");
5521 else if (getToolChain().getArch() == llvm::Triple::ppc)
5522 CmdArgs.push_back("-a32");
5523 else if (getToolChain().getArch() == llvm::Triple::mips ||
5524 getToolChain().getArch() == llvm::Triple::mipsel ||
5525 getToolChain().getArch() == llvm::Triple::mips64 ||
5526 getToolChain().getArch() == llvm::Triple::mips64el) {
5527 StringRef CPUName;
5528 StringRef ABIName;
5529 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5530
5531 CmdArgs.push_back("-march");
5532 CmdArgs.push_back(CPUName.data());
5533
5534 CmdArgs.push_back("-mabi");
5535 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5536
5537 if (getToolChain().getArch() == llvm::Triple::mips ||
5538 getToolChain().getArch() == llvm::Triple::mips64)
5539 CmdArgs.push_back("-EB");
5540 else
5541 CmdArgs.push_back("-EL");
5542
5543 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5544 options::OPT_fpic, options::OPT_fno_pic,
5545 options::OPT_fPIE, options::OPT_fno_PIE,
5546 options::OPT_fpie, options::OPT_fno_pie);
5547 if (LastPICArg &&
5548 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5549 LastPICArg->getOption().matches(options::OPT_fpic) ||
5550 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5551 LastPICArg->getOption().matches(options::OPT_fpie))) {
5552 CmdArgs.push_back("-KPIC");
5553 }
5554 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5555 getToolChain().getArch() == llvm::Triple::thumb) {
5556 CmdArgs.push_back("-mfpu=softvfp");
5557 switch(getToolChain().getTriple().getEnvironment()) {
5558 case llvm::Triple::GNUEABI:
5559 case llvm::Triple::EABI:
5560 CmdArgs.push_back("-meabi=5");
5561 break;
5562
5563 default:
5564 CmdArgs.push_back("-matpcs");
5565 }
5566 }
5567
5568 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5569 options::OPT_Xassembler);
5570
5571 CmdArgs.push_back("-o");
5572 CmdArgs.push_back(Output.getFilename());
5573
5574 for (InputInfoList::const_iterator
5575 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5576 const InputInfo &II = *it;
5577 CmdArgs.push_back(II.getFilename());
5578 }
5579
5580 const char *Exec =
5581 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5582 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5583 }
5584
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5585 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5586 const InputInfo &Output,
5587 const InputInfoList &Inputs,
5588 const ArgList &Args,
5589 const char *LinkingOutput) const {
5590 const toolchains::FreeBSD& ToolChain =
5591 static_cast<const toolchains::FreeBSD&>(getToolChain());
5592 const Driver &D = ToolChain.getDriver();
5593 ArgStringList CmdArgs;
5594
5595 // Silence warning for "clang -g foo.o -o foo"
5596 Args.ClaimAllArgs(options::OPT_g_Group);
5597 // and "clang -emit-llvm foo.o -o foo"
5598 Args.ClaimAllArgs(options::OPT_emit_llvm);
5599 // and for "clang -w foo.o -o foo". Other warning options are already
5600 // handled somewhere else.
5601 Args.ClaimAllArgs(options::OPT_w);
5602
5603 if (!D.SysRoot.empty())
5604 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5605
5606 if (Args.hasArg(options::OPT_pie))
5607 CmdArgs.push_back("-pie");
5608
5609 if (Args.hasArg(options::OPT_static)) {
5610 CmdArgs.push_back("-Bstatic");
5611 } else {
5612 if (Args.hasArg(options::OPT_rdynamic))
5613 CmdArgs.push_back("-export-dynamic");
5614 CmdArgs.push_back("--eh-frame-hdr");
5615 if (Args.hasArg(options::OPT_shared)) {
5616 CmdArgs.push_back("-Bshareable");
5617 } else {
5618 CmdArgs.push_back("-dynamic-linker");
5619 CmdArgs.push_back("/libexec/ld-elf.so.1");
5620 }
5621 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5622 llvm::Triple::ArchType Arch = ToolChain.getArch();
5623 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5624 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5625 CmdArgs.push_back("--hash-style=both");
5626 }
5627 }
5628 CmdArgs.push_back("--enable-new-dtags");
5629 }
5630
5631 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5632 // instruct ld in the base system to link 32-bit code.
5633 if (ToolChain.getArch() == llvm::Triple::x86) {
5634 CmdArgs.push_back("-m");
5635 CmdArgs.push_back("elf_i386_fbsd");
5636 }
5637
5638 if (ToolChain.getArch() == llvm::Triple::ppc) {
5639 CmdArgs.push_back("-m");
5640 CmdArgs.push_back("elf32ppc_fbsd");
5641 }
5642
5643 if (Output.isFilename()) {
5644 CmdArgs.push_back("-o");
5645 CmdArgs.push_back(Output.getFilename());
5646 } else {
5647 assert(Output.isNothing() && "Invalid output.");
5648 }
5649
5650 if (!Args.hasArg(options::OPT_nostdlib) &&
5651 !Args.hasArg(options::OPT_nostartfiles)) {
5652 const char *crt1 = NULL;
5653 if (!Args.hasArg(options::OPT_shared)) {
5654 if (Args.hasArg(options::OPT_pg))
5655 crt1 = "gcrt1.o";
5656 else if (Args.hasArg(options::OPT_pie))
5657 crt1 = "Scrt1.o";
5658 else
5659 crt1 = "crt1.o";
5660 }
5661 if (crt1)
5662 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5663
5664 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5665
5666 const char *crtbegin = NULL;
5667 if (Args.hasArg(options::OPT_static))
5668 crtbegin = "crtbeginT.o";
5669 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5670 crtbegin = "crtbeginS.o";
5671 else
5672 crtbegin = "crtbegin.o";
5673
5674 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5675 }
5676
5677 Args.AddAllArgs(CmdArgs, options::OPT_L);
5678 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5679 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5680 i != e; ++i)
5681 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5682 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5683 Args.AddAllArgs(CmdArgs, options::OPT_e);
5684 Args.AddAllArgs(CmdArgs, options::OPT_s);
5685 Args.AddAllArgs(CmdArgs, options::OPT_t);
5686 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5687 Args.AddAllArgs(CmdArgs, options::OPT_r);
5688
5689 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5690
5691 if (!Args.hasArg(options::OPT_nostdlib) &&
5692 !Args.hasArg(options::OPT_nodefaultlibs)) {
5693 if (D.CCCIsCXX()) {
5694 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5695 if (Args.hasArg(options::OPT_pg))
5696 CmdArgs.push_back("-lm_p");
5697 else
5698 CmdArgs.push_back("-lm");
5699 }
5700 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5701 // the default system libraries. Just mimic this for now.
5702 if (Args.hasArg(options::OPT_pg))
5703 CmdArgs.push_back("-lgcc_p");
5704 else
5705 CmdArgs.push_back("-lgcc");
5706 if (Args.hasArg(options::OPT_static)) {
5707 CmdArgs.push_back("-lgcc_eh");
5708 } else if (Args.hasArg(options::OPT_pg)) {
5709 CmdArgs.push_back("-lgcc_eh_p");
5710 } else {
5711 CmdArgs.push_back("--as-needed");
5712 CmdArgs.push_back("-lgcc_s");
5713 CmdArgs.push_back("--no-as-needed");
5714 }
5715
5716 if (Args.hasArg(options::OPT_pthread)) {
5717 if (Args.hasArg(options::OPT_pg))
5718 CmdArgs.push_back("-lpthread_p");
5719 else
5720 CmdArgs.push_back("-lpthread");
5721 }
5722
5723 if (Args.hasArg(options::OPT_pg)) {
5724 if (Args.hasArg(options::OPT_shared))
5725 CmdArgs.push_back("-lc");
5726 else
5727 CmdArgs.push_back("-lc_p");
5728 CmdArgs.push_back("-lgcc_p");
5729 } else {
5730 CmdArgs.push_back("-lc");
5731 CmdArgs.push_back("-lgcc");
5732 }
5733
5734 if (Args.hasArg(options::OPT_static)) {
5735 CmdArgs.push_back("-lgcc_eh");
5736 } else if (Args.hasArg(options::OPT_pg)) {
5737 CmdArgs.push_back("-lgcc_eh_p");
5738 } else {
5739 CmdArgs.push_back("--as-needed");
5740 CmdArgs.push_back("-lgcc_s");
5741 CmdArgs.push_back("--no-as-needed");
5742 }
5743 }
5744
5745 if (!Args.hasArg(options::OPT_nostdlib) &&
5746 !Args.hasArg(options::OPT_nostartfiles)) {
5747 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5748 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
5749 else
5750 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5751 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
5752 }
5753
5754 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
5755
5756 const char *Exec =
5757 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
5758 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5759 }
5760
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5761 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5762 const InputInfo &Output,
5763 const InputInfoList &Inputs,
5764 const ArgList &Args,
5765 const char *LinkingOutput) const {
5766 ArgStringList CmdArgs;
5767
5768 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5769 // instruct as in the base system to assemble 32-bit code.
5770 if (getToolChain().getArch() == llvm::Triple::x86)
5771 CmdArgs.push_back("--32");
5772
5773 // Set byte order explicitly
5774 if (getToolChain().getArch() == llvm::Triple::mips)
5775 CmdArgs.push_back("-EB");
5776 else if (getToolChain().getArch() == llvm::Triple::mipsel)
5777 CmdArgs.push_back("-EL");
5778
5779 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5780 options::OPT_Xassembler);
5781
5782 CmdArgs.push_back("-o");
5783 CmdArgs.push_back(Output.getFilename());
5784
5785 for (InputInfoList::const_iterator
5786 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5787 const InputInfo &II = *it;
5788 CmdArgs.push_back(II.getFilename());
5789 }
5790
5791 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
5792 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5793 }
5794
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5795 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5796 const InputInfo &Output,
5797 const InputInfoList &Inputs,
5798 const ArgList &Args,
5799 const char *LinkingOutput) const {
5800 const Driver &D = getToolChain().getDriver();
5801 ArgStringList CmdArgs;
5802
5803 if (!D.SysRoot.empty())
5804 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5805
5806 if (Args.hasArg(options::OPT_static)) {
5807 CmdArgs.push_back("-Bstatic");
5808 } else {
5809 if (Args.hasArg(options::OPT_rdynamic))
5810 CmdArgs.push_back("-export-dynamic");
5811 CmdArgs.push_back("--eh-frame-hdr");
5812 if (Args.hasArg(options::OPT_shared)) {
5813 CmdArgs.push_back("-Bshareable");
5814 } else {
5815 CmdArgs.push_back("-dynamic-linker");
5816 CmdArgs.push_back("/libexec/ld.elf_so");
5817 }
5818 }
5819
5820 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5821 // instruct ld in the base system to link 32-bit code.
5822 if (getToolChain().getArch() == llvm::Triple::x86) {
5823 CmdArgs.push_back("-m");
5824 CmdArgs.push_back("elf_i386");
5825 }
5826
5827 if (Output.isFilename()) {
5828 CmdArgs.push_back("-o");
5829 CmdArgs.push_back(Output.getFilename());
5830 } else {
5831 assert(Output.isNothing() && "Invalid output.");
5832 }
5833
5834 if (!Args.hasArg(options::OPT_nostdlib) &&
5835 !Args.hasArg(options::OPT_nostartfiles)) {
5836 if (!Args.hasArg(options::OPT_shared)) {
5837 CmdArgs.push_back(Args.MakeArgString(
5838 getToolChain().GetFilePath("crt0.o")));
5839 CmdArgs.push_back(Args.MakeArgString(
5840 getToolChain().GetFilePath("crti.o")));
5841 CmdArgs.push_back(Args.MakeArgString(
5842 getToolChain().GetFilePath("crtbegin.o")));
5843 } else {
5844 CmdArgs.push_back(Args.MakeArgString(
5845 getToolChain().GetFilePath("crti.o")));
5846 CmdArgs.push_back(Args.MakeArgString(
5847 getToolChain().GetFilePath("crtbeginS.o")));
5848 }
5849 }
5850
5851 Args.AddAllArgs(CmdArgs, options::OPT_L);
5852 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5853 Args.AddAllArgs(CmdArgs, options::OPT_e);
5854 Args.AddAllArgs(CmdArgs, options::OPT_s);
5855 Args.AddAllArgs(CmdArgs, options::OPT_t);
5856 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5857 Args.AddAllArgs(CmdArgs, options::OPT_r);
5858
5859 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5860
5861 if (!Args.hasArg(options::OPT_nostdlib) &&
5862 !Args.hasArg(options::OPT_nodefaultlibs)) {
5863 if (D.CCCIsCXX()) {
5864 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5865 CmdArgs.push_back("-lm");
5866 }
5867 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5868 // the default system libraries. Just mimic this for now.
5869 if (Args.hasArg(options::OPT_static)) {
5870 CmdArgs.push_back("-lgcc_eh");
5871 } else {
5872 CmdArgs.push_back("--as-needed");
5873 CmdArgs.push_back("-lgcc_s");
5874 CmdArgs.push_back("--no-as-needed");
5875 }
5876 CmdArgs.push_back("-lgcc");
5877
5878 if (Args.hasArg(options::OPT_pthread))
5879 CmdArgs.push_back("-lpthread");
5880 CmdArgs.push_back("-lc");
5881
5882 CmdArgs.push_back("-lgcc");
5883 if (Args.hasArg(options::OPT_static)) {
5884 CmdArgs.push_back("-lgcc_eh");
5885 } else {
5886 CmdArgs.push_back("--as-needed");
5887 CmdArgs.push_back("-lgcc_s");
5888 CmdArgs.push_back("--no-as-needed");
5889 }
5890 }
5891
5892 if (!Args.hasArg(options::OPT_nostdlib) &&
5893 !Args.hasArg(options::OPT_nostartfiles)) {
5894 if (!Args.hasArg(options::OPT_shared))
5895 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5896 "crtend.o")));
5897 else
5898 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5899 "crtendS.o")));
5900 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5901 "crtn.o")));
5902 }
5903
5904 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5905
5906 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5907 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5908 }
5909
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5910 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5911 const InputInfo &Output,
5912 const InputInfoList &Inputs,
5913 const ArgList &Args,
5914 const char *LinkingOutput) const {
5915 ArgStringList CmdArgs;
5916
5917 // Add --32/--64 to make sure we get the format we want.
5918 // This is incomplete
5919 if (getToolChain().getArch() == llvm::Triple::x86) {
5920 CmdArgs.push_back("--32");
5921 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5922 CmdArgs.push_back("--64");
5923 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5924 CmdArgs.push_back("-a32");
5925 CmdArgs.push_back("-mppc");
5926 CmdArgs.push_back("-many");
5927 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5928 CmdArgs.push_back("-a64");
5929 CmdArgs.push_back("-mppc64");
5930 CmdArgs.push_back("-many");
5931 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
5932 CmdArgs.push_back("-a64");
5933 CmdArgs.push_back("-mppc64le");
5934 CmdArgs.push_back("-many");
5935 } else if (getToolChain().getArch() == llvm::Triple::arm) {
5936 StringRef MArch = getToolChain().getArchName();
5937 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5938 CmdArgs.push_back("-mfpu=neon");
5939
5940 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5941 getToolChain().getTriple());
5942 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
5943
5944 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5945 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5946 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
5947 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5948 getToolChain().getArch() == llvm::Triple::mipsel ||
5949 getToolChain().getArch() == llvm::Triple::mips64 ||
5950 getToolChain().getArch() == llvm::Triple::mips64el) {
5951 StringRef CPUName;
5952 StringRef ABIName;
5953 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5954
5955 CmdArgs.push_back("-march");
5956 CmdArgs.push_back(CPUName.data());
5957
5958 CmdArgs.push_back("-mabi");
5959 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5960
5961 if (getToolChain().getArch() == llvm::Triple::mips ||
5962 getToolChain().getArch() == llvm::Triple::mips64)
5963 CmdArgs.push_back("-EB");
5964 else
5965 CmdArgs.push_back("-EL");
5966
5967 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5968 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5969 options::OPT_mno_micromips);
5970 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5971 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5972
5973 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5974 options::OPT_fpic, options::OPT_fno_pic,
5975 options::OPT_fPIE, options::OPT_fno_PIE,
5976 options::OPT_fpie, options::OPT_fno_pie);
5977 if (LastPICArg &&
5978 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5979 LastPICArg->getOption().matches(options::OPT_fpic) ||
5980 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5981 LastPICArg->getOption().matches(options::OPT_fpie))) {
5982 CmdArgs.push_back("-KPIC");
5983 }
5984 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
5985 // Always pass an -march option, since our default of z10 is later
5986 // than the GNU assembler's default.
5987 StringRef CPUName = getSystemZTargetCPU(Args);
5988 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
5989 }
5990
5991 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5992 options::OPT_Xassembler);
5993
5994 CmdArgs.push_back("-o");
5995 CmdArgs.push_back(Output.getFilename());
5996
5997 for (InputInfoList::const_iterator
5998 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5999 const InputInfo &II = *it;
6000 CmdArgs.push_back(II.getFilename());
6001 }
6002
6003 const char *Exec =
6004 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6005 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6006
6007 // Handle the debug info splitting at object creation time if we're
6008 // creating an object.
6009 // TODO: Currently only works on linux with newer objcopy.
6010 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
6011 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
6012 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6013 SplitDebugName(Args, Inputs));
6014 }
6015
AddLibgcc(llvm::Triple Triple,const Driver & D,ArgStringList & CmdArgs,const ArgList & Args)6016 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
6017 ArgStringList &CmdArgs, const ArgList &Args) {
6018 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
6019 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6020 Args.hasArg(options::OPT_static);
6021 if (!D.CCCIsCXX())
6022 CmdArgs.push_back("-lgcc");
6023
6024 if (StaticLibgcc || isAndroid) {
6025 if (D.CCCIsCXX())
6026 CmdArgs.push_back("-lgcc");
6027 } else {
6028 if (!D.CCCIsCXX())
6029 CmdArgs.push_back("--as-needed");
6030 CmdArgs.push_back("-lgcc_s");
6031 if (!D.CCCIsCXX())
6032 CmdArgs.push_back("--no-as-needed");
6033 }
6034
6035 if (StaticLibgcc && !isAndroid)
6036 CmdArgs.push_back("-lgcc_eh");
6037 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
6038 CmdArgs.push_back("-lgcc");
6039
6040 // According to Android ABI, we have to link with libdl if we are
6041 // linking with non-static libgcc.
6042 //
6043 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6044 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6045 if (isAndroid && !StaticLibgcc)
6046 CmdArgs.push_back("-ldl");
6047 }
6048
hasMipsN32ABIArg(const ArgList & Args)6049 static bool hasMipsN32ABIArg(const ArgList &Args) {
6050 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6051 return A && (A->getValue() == StringRef("n32"));
6052 }
6053
getLinuxDynamicLinker(const ArgList & Args,const toolchains::Linux & ToolChain)6054 static StringRef getLinuxDynamicLinker(const ArgList &Args,
6055 const toolchains::Linux &ToolChain) {
6056 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
6057 return "/system/bin/linker";
6058 else if (ToolChain.getArch() == llvm::Triple::x86)
6059 return "/lib/ld-linux.so.2";
6060 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6061 return "/lib/ld-linux-aarch64.so.1";
6062 else if (ToolChain.getArch() == llvm::Triple::arm ||
6063 ToolChain.getArch() == llvm::Triple::thumb) {
6064 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6065 return "/lib/ld-linux-armhf.so.3";
6066 else
6067 return "/lib/ld-linux.so.3";
6068 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6069 ToolChain.getArch() == llvm::Triple::mipsel)
6070 return "/lib/ld.so.1";
6071 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6072 ToolChain.getArch() == llvm::Triple::mips64el) {
6073 if (hasMipsN32ABIArg(Args))
6074 return "/lib32/ld.so.1";
6075 else
6076 return "/lib64/ld.so.1";
6077 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6078 return "/lib/ld.so.1";
6079 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6080 ToolChain.getArch() == llvm::Triple::ppc64le ||
6081 ToolChain.getArch() == llvm::Triple::systemz)
6082 return "/lib64/ld64.so.1";
6083 else
6084 return "/lib64/ld-linux-x86-64.so.2";
6085 }
6086
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6087 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6088 const InputInfo &Output,
6089 const InputInfoList &Inputs,
6090 const ArgList &Args,
6091 const char *LinkingOutput) const {
6092 const toolchains::Linux& ToolChain =
6093 static_cast<const toolchains::Linux&>(getToolChain());
6094 const Driver &D = ToolChain.getDriver();
6095 const bool isAndroid =
6096 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
6097 SanitizerArgs Sanitize(getToolChain(), Args);
6098 const bool IsPIE =
6099 !Args.hasArg(options::OPT_shared) &&
6100 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
6101
6102 ArgStringList CmdArgs;
6103
6104 // Silence warning for "clang -g foo.o -o foo"
6105 Args.ClaimAllArgs(options::OPT_g_Group);
6106 // and "clang -emit-llvm foo.o -o foo"
6107 Args.ClaimAllArgs(options::OPT_emit_llvm);
6108 // and for "clang -w foo.o -o foo". Other warning options are already
6109 // handled somewhere else.
6110 Args.ClaimAllArgs(options::OPT_w);
6111
6112 if (!D.SysRoot.empty())
6113 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6114
6115 if (IsPIE)
6116 CmdArgs.push_back("-pie");
6117
6118 if (Args.hasArg(options::OPT_rdynamic))
6119 CmdArgs.push_back("-export-dynamic");
6120
6121 if (Args.hasArg(options::OPT_s))
6122 CmdArgs.push_back("-s");
6123
6124 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6125 e = ToolChain.ExtraOpts.end();
6126 i != e; ++i)
6127 CmdArgs.push_back(i->c_str());
6128
6129 if (!Args.hasArg(options::OPT_static)) {
6130 CmdArgs.push_back("--eh-frame-hdr");
6131 }
6132
6133 CmdArgs.push_back("-m");
6134 if (ToolChain.getArch() == llvm::Triple::x86)
6135 CmdArgs.push_back("elf_i386");
6136 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6137 CmdArgs.push_back("aarch64linux");
6138 else if (ToolChain.getArch() == llvm::Triple::arm
6139 || ToolChain.getArch() == llvm::Triple::thumb)
6140 CmdArgs.push_back("armelf_linux_eabi");
6141 else if (ToolChain.getArch() == llvm::Triple::ppc)
6142 CmdArgs.push_back("elf32ppclinux");
6143 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6144 CmdArgs.push_back("elf64ppc");
6145 else if (ToolChain.getArch() == llvm::Triple::mips)
6146 CmdArgs.push_back("elf32btsmip");
6147 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6148 CmdArgs.push_back("elf32ltsmip");
6149 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6150 if (hasMipsN32ABIArg(Args))
6151 CmdArgs.push_back("elf32btsmipn32");
6152 else
6153 CmdArgs.push_back("elf64btsmip");
6154 }
6155 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6156 if (hasMipsN32ABIArg(Args))
6157 CmdArgs.push_back("elf32ltsmipn32");
6158 else
6159 CmdArgs.push_back("elf64ltsmip");
6160 }
6161 else if (ToolChain.getArch() == llvm::Triple::systemz)
6162 CmdArgs.push_back("elf64_s390");
6163 else
6164 CmdArgs.push_back("elf_x86_64");
6165
6166 if (Args.hasArg(options::OPT_static)) {
6167 if (ToolChain.getArch() == llvm::Triple::arm
6168 || ToolChain.getArch() == llvm::Triple::thumb)
6169 CmdArgs.push_back("-Bstatic");
6170 else
6171 CmdArgs.push_back("-static");
6172 } else if (Args.hasArg(options::OPT_shared)) {
6173 CmdArgs.push_back("-shared");
6174 if (isAndroid) {
6175 CmdArgs.push_back("-Bsymbolic");
6176 }
6177 }
6178
6179 if (ToolChain.getArch() == llvm::Triple::arm ||
6180 ToolChain.getArch() == llvm::Triple::thumb ||
6181 (!Args.hasArg(options::OPT_static) &&
6182 !Args.hasArg(options::OPT_shared))) {
6183 CmdArgs.push_back("-dynamic-linker");
6184 CmdArgs.push_back(Args.MakeArgString(
6185 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
6186 }
6187
6188 CmdArgs.push_back("-o");
6189 CmdArgs.push_back(Output.getFilename());
6190
6191 if (!Args.hasArg(options::OPT_nostdlib) &&
6192 !Args.hasArg(options::OPT_nostartfiles)) {
6193 if (!isAndroid) {
6194 const char *crt1 = NULL;
6195 if (!Args.hasArg(options::OPT_shared)){
6196 if (Args.hasArg(options::OPT_pg))
6197 crt1 = "gcrt1.o";
6198 else if (IsPIE)
6199 crt1 = "Scrt1.o";
6200 else
6201 crt1 = "crt1.o";
6202 }
6203 if (crt1)
6204 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6205
6206 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6207 }
6208
6209 const char *crtbegin;
6210 if (Args.hasArg(options::OPT_static))
6211 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
6212 else if (Args.hasArg(options::OPT_shared))
6213 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
6214 else if (IsPIE)
6215 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
6216 else
6217 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
6218 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
6219
6220 // Add crtfastmath.o if available and fast math is enabled.
6221 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
6222 }
6223
6224 Args.AddAllArgs(CmdArgs, options::OPT_L);
6225
6226 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6227
6228 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6229 i != e; ++i)
6230 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
6231
6232 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6233 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6234 // forward.
6235 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6236 CmdArgs.push_back("-plugin");
6237 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6238 CmdArgs.push_back(Args.MakeArgString(Plugin));
6239
6240 // Try to pass driver level flags relevant to LTO code generation down to
6241 // the plugin.
6242
6243 // Handle architecture-specific flags for selecting CPU variants.
6244 if (ToolChain.getArch() == llvm::Triple::x86 ||
6245 ToolChain.getArch() == llvm::Triple::x86_64)
6246 CmdArgs.push_back(
6247 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6248 getX86TargetCPU(Args, ToolChain.getTriple())));
6249 else if (ToolChain.getArch() == llvm::Triple::arm ||
6250 ToolChain.getArch() == llvm::Triple::thumb)
6251 CmdArgs.push_back(
6252 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6253 getARMTargetCPU(Args, ToolChain.getTriple())));
6254
6255 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6256 // as well.
6257 }
6258
6259
6260 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6261 CmdArgs.push_back("--no-demangle");
6262
6263 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6264
6265 // Call these before we add the C++ ABI library.
6266 if (Sanitize.needsUbsanRt())
6267 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
6268 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6269 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
6270 if (Sanitize.needsAsanRt())
6271 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6272 if (Sanitize.needsTsanRt())
6273 addTsanRTLinux(getToolChain(), Args, CmdArgs);
6274 if (Sanitize.needsMsanRt())
6275 addMsanRTLinux(getToolChain(), Args, CmdArgs);
6276 if (Sanitize.needsLsanRt())
6277 addLsanRTLinux(getToolChain(), Args, CmdArgs);
6278
6279 // The profile runtime also needs access to system libraries.
6280 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6281
6282 if (D.CCCIsCXX() &&
6283 !Args.hasArg(options::OPT_nostdlib) &&
6284 !Args.hasArg(options::OPT_nodefaultlibs)) {
6285 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6286 !Args.hasArg(options::OPT_static);
6287 if (OnlyLibstdcxxStatic)
6288 CmdArgs.push_back("-Bstatic");
6289 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6290 if (OnlyLibstdcxxStatic)
6291 CmdArgs.push_back("-Bdynamic");
6292 CmdArgs.push_back("-lm");
6293 }
6294
6295 if (!Args.hasArg(options::OPT_nostdlib)) {
6296 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6297 if (Args.hasArg(options::OPT_static))
6298 CmdArgs.push_back("--start-group");
6299
6300 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6301 if (OpenMP) {
6302 CmdArgs.push_back("-lgomp");
6303
6304 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6305 // librt. Most modern Linux platfroms require it, but some may not.
6306 CmdArgs.push_back("-lrt");
6307 }
6308
6309 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6310
6311 if (Args.hasArg(options::OPT_pthread) ||
6312 Args.hasArg(options::OPT_pthreads) || OpenMP)
6313 CmdArgs.push_back("-lpthread");
6314
6315 CmdArgs.push_back("-lc");
6316
6317 if (Args.hasArg(options::OPT_static))
6318 CmdArgs.push_back("--end-group");
6319 else
6320 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6321 }
6322
6323 if (!Args.hasArg(options::OPT_nostartfiles)) {
6324 const char *crtend;
6325 if (Args.hasArg(options::OPT_shared))
6326 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
6327 else if (IsPIE)
6328 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
6329 else
6330 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
6331
6332 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
6333 if (!isAndroid)
6334 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6335 }
6336 }
6337
6338 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6339 }
6340
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6341 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6342 const InputInfo &Output,
6343 const InputInfoList &Inputs,
6344 const ArgList &Args,
6345 const char *LinkingOutput) const {
6346 ArgStringList CmdArgs;
6347
6348 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6349 options::OPT_Xassembler);
6350
6351 CmdArgs.push_back("-o");
6352 CmdArgs.push_back(Output.getFilename());
6353
6354 for (InputInfoList::const_iterator
6355 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6356 const InputInfo &II = *it;
6357 CmdArgs.push_back(II.getFilename());
6358 }
6359
6360 const char *Exec =
6361 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6362 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6363 }
6364
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6365 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
6366 const InputInfo &Output,
6367 const InputInfoList &Inputs,
6368 const ArgList &Args,
6369 const char *LinkingOutput) const {
6370 const Driver &D = getToolChain().getDriver();
6371 ArgStringList CmdArgs;
6372
6373 if (Output.isFilename()) {
6374 CmdArgs.push_back("-o");
6375 CmdArgs.push_back(Output.getFilename());
6376 } else {
6377 assert(Output.isNothing() && "Invalid output.");
6378 }
6379
6380 if (!Args.hasArg(options::OPT_nostdlib) &&
6381 !Args.hasArg(options::OPT_nostartfiles)) {
6382 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6383 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6384 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6385 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6386 }
6387
6388 Args.AddAllArgs(CmdArgs, options::OPT_L);
6389 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6390 Args.AddAllArgs(CmdArgs, options::OPT_e);
6391
6392 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6393
6394 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6395
6396 if (!Args.hasArg(options::OPT_nostdlib) &&
6397 !Args.hasArg(options::OPT_nodefaultlibs)) {
6398 if (D.CCCIsCXX()) {
6399 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6400 CmdArgs.push_back("-lm");
6401 }
6402 }
6403
6404 if (!Args.hasArg(options::OPT_nostdlib) &&
6405 !Args.hasArg(options::OPT_nostartfiles)) {
6406 if (Args.hasArg(options::OPT_pthread))
6407 CmdArgs.push_back("-lpthread");
6408 CmdArgs.push_back("-lc");
6409 CmdArgs.push_back("-lCompilerRT-Generic");
6410 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6411 CmdArgs.push_back(
6412 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
6413 }
6414
6415 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6416 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6417 }
6418
6419 /// DragonFly Tools
6420
6421 // For now, DragonFly Assemble does just about the same as for
6422 // FreeBSD, but this may change soon.
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6423 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6424 const InputInfo &Output,
6425 const InputInfoList &Inputs,
6426 const ArgList &Args,
6427 const char *LinkingOutput) const {
6428 ArgStringList CmdArgs;
6429
6430 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6431 // instruct as in the base system to assemble 32-bit code.
6432 if (getToolChain().getArch() == llvm::Triple::x86)
6433 CmdArgs.push_back("--32");
6434
6435 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6436 options::OPT_Xassembler);
6437
6438 CmdArgs.push_back("-o");
6439 CmdArgs.push_back(Output.getFilename());
6440
6441 for (InputInfoList::const_iterator
6442 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6443 const InputInfo &II = *it;
6444 CmdArgs.push_back(II.getFilename());
6445 }
6446
6447 const char *Exec =
6448 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6449 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6450 }
6451
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6452 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
6453 const InputInfo &Output,
6454 const InputInfoList &Inputs,
6455 const ArgList &Args,
6456 const char *LinkingOutput) const {
6457 bool UseGCC47 = false;
6458 const Driver &D = getToolChain().getDriver();
6459 ArgStringList CmdArgs;
6460
6461 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6462 UseGCC47 = false;
6463
6464 if (!D.SysRoot.empty())
6465 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6466
6467 CmdArgs.push_back("--eh-frame-hdr");
6468 if (Args.hasArg(options::OPT_static)) {
6469 CmdArgs.push_back("-Bstatic");
6470 } else {
6471 if (Args.hasArg(options::OPT_rdynamic))
6472 CmdArgs.push_back("-export-dynamic");
6473 if (Args.hasArg(options::OPT_shared))
6474 CmdArgs.push_back("-Bshareable");
6475 else {
6476 CmdArgs.push_back("-dynamic-linker");
6477 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6478 }
6479 CmdArgs.push_back("--hash-style=both");
6480 }
6481
6482 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6483 // instruct ld in the base system to link 32-bit code.
6484 if (getToolChain().getArch() == llvm::Triple::x86) {
6485 CmdArgs.push_back("-m");
6486 CmdArgs.push_back("elf_i386");
6487 }
6488
6489 if (Output.isFilename()) {
6490 CmdArgs.push_back("-o");
6491 CmdArgs.push_back(Output.getFilename());
6492 } else {
6493 assert(Output.isNothing() && "Invalid output.");
6494 }
6495
6496 if (!Args.hasArg(options::OPT_nostdlib) &&
6497 !Args.hasArg(options::OPT_nostartfiles)) {
6498 if (!Args.hasArg(options::OPT_shared)) {
6499 if (Args.hasArg(options::OPT_pg))
6500 CmdArgs.push_back(Args.MakeArgString(
6501 getToolChain().GetFilePath("gcrt1.o")));
6502 else {
6503 if (Args.hasArg(options::OPT_pie))
6504 CmdArgs.push_back(Args.MakeArgString(
6505 getToolChain().GetFilePath("Scrt1.o")));
6506 else
6507 CmdArgs.push_back(Args.MakeArgString(
6508 getToolChain().GetFilePath("crt1.o")));
6509 }
6510 }
6511 CmdArgs.push_back(Args.MakeArgString(
6512 getToolChain().GetFilePath("crti.o")));
6513 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6514 CmdArgs.push_back(Args.MakeArgString(
6515 getToolChain().GetFilePath("crtbeginS.o")));
6516 else
6517 CmdArgs.push_back(Args.MakeArgString(
6518 getToolChain().GetFilePath("crtbegin.o")));
6519 }
6520
6521 Args.AddAllArgs(CmdArgs, options::OPT_L);
6522 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6523 Args.AddAllArgs(CmdArgs, options::OPT_e);
6524
6525 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6526
6527 if (!Args.hasArg(options::OPT_nostdlib) &&
6528 !Args.hasArg(options::OPT_nodefaultlibs)) {
6529 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6530 // rpaths
6531 if (UseGCC47)
6532 CmdArgs.push_back("-L/usr/lib/gcc47");
6533 else
6534 CmdArgs.push_back("-L/usr/lib/gcc44");
6535
6536 if (!Args.hasArg(options::OPT_static)) {
6537 if (UseGCC47) {
6538 CmdArgs.push_back("-rpath");
6539 CmdArgs.push_back("/usr/lib/gcc47");
6540 } else {
6541 CmdArgs.push_back("-rpath");
6542 CmdArgs.push_back("/usr/lib/gcc44");
6543 }
6544 }
6545
6546 if (D.CCCIsCXX()) {
6547 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6548 CmdArgs.push_back("-lm");
6549 }
6550
6551 if (Args.hasArg(options::OPT_pthread))
6552 CmdArgs.push_back("-lpthread");
6553
6554 if (!Args.hasArg(options::OPT_nolibc)) {
6555 CmdArgs.push_back("-lc");
6556 }
6557
6558 if (UseGCC47) {
6559 if (Args.hasArg(options::OPT_static) ||
6560 Args.hasArg(options::OPT_static_libgcc)) {
6561 CmdArgs.push_back("-lgcc");
6562 CmdArgs.push_back("-lgcc_eh");
6563 } else {
6564 if (Args.hasArg(options::OPT_shared_libgcc)) {
6565 CmdArgs.push_back("-lgcc_pic");
6566 if (!Args.hasArg(options::OPT_shared))
6567 CmdArgs.push_back("-lgcc");
6568 } else {
6569 CmdArgs.push_back("-lgcc");
6570 CmdArgs.push_back("--as-needed");
6571 CmdArgs.push_back("-lgcc_pic");
6572 CmdArgs.push_back("--no-as-needed");
6573 }
6574 }
6575 } else {
6576 if (Args.hasArg(options::OPT_shared)) {
6577 CmdArgs.push_back("-lgcc_pic");
6578 } else {
6579 CmdArgs.push_back("-lgcc");
6580 }
6581 }
6582 }
6583
6584 if (!Args.hasArg(options::OPT_nostdlib) &&
6585 !Args.hasArg(options::OPT_nostartfiles)) {
6586 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6587 CmdArgs.push_back(Args.MakeArgString(
6588 getToolChain().GetFilePath("crtendS.o")));
6589 else
6590 CmdArgs.push_back(Args.MakeArgString(
6591 getToolChain().GetFilePath("crtend.o")));
6592 CmdArgs.push_back(Args.MakeArgString(
6593 getToolChain().GetFilePath("crtn.o")));
6594 }
6595
6596 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6597
6598 const char *Exec =
6599 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6600 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6601 }
6602
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6603 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6604 const InputInfo &Output,
6605 const InputInfoList &Inputs,
6606 const ArgList &Args,
6607 const char *LinkingOutput) const {
6608 ArgStringList CmdArgs;
6609
6610 if (Output.isFilename()) {
6611 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6612 Output.getFilename()));
6613 } else {
6614 assert(Output.isNothing() && "Invalid output.");
6615 }
6616
6617 if (!Args.hasArg(options::OPT_nostdlib) &&
6618 !Args.hasArg(options::OPT_nostartfiles)) {
6619 CmdArgs.push_back("-defaultlib:libcmt");
6620 }
6621
6622 CmdArgs.push_back("-nologo");
6623
6624 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6625
6626 // Add filenames immediately.
6627 for (InputInfoList::const_iterator
6628 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6629 if (it->isFilename())
6630 CmdArgs.push_back(it->getFilename());
6631 }
6632
6633 const char *Exec =
6634 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
6635 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6636 }
6637