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
12 #include "clang/Driver/Action.h"
13 #include "clang/Driver/Arg.h"
14 #include "clang/Driver/ArgList.h"
15 #include "clang/Driver/Driver.h"
16 #include "clang/Driver/DriverDiagnostic.h"
17 #include "clang/Driver/Compilation.h"
18 #include "clang/Driver/Job.h"
19 #include "clang/Driver/Option.h"
20 #include "clang/Driver/Options.h"
21 #include "clang/Driver/ToolChain.h"
22 #include "clang/Driver/Util.h"
23 #include "clang/Basic/ObjCRuntime.h"
24
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/StringSwitch.h"
27 #include "llvm/ADT/Twine.h"
28 #include "llvm/Support/FileSystem.h"
29 #include "llvm/Support/Format.h"
30 #include "llvm/Support/raw_ostream.h"
31 #include "llvm/Support/Host.h"
32 #include "llvm/Support/Process.h"
33 #include "llvm/Support/ErrorHandling.h"
34
35 #include "InputInfo.h"
36 #include "ToolChains.h"
37
38 using namespace clang::driver;
39 using namespace clang::driver::tools;
40 using namespace clang;
41
42 /// CheckPreprocessingOptions - Perform some validation of preprocessing
43 /// arguments that is shared with gcc.
CheckPreprocessingOptions(const Driver & D,const ArgList & Args)44 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
46 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
47 D.Diag(diag::err_drv_argument_only_allowed_with)
48 << A->getAsString(Args) << "-E";
49 }
50
51 /// CheckCodeGenerationOptions - Perform some validation of code generation
52 /// arguments that is shared with gcc.
CheckCodeGenerationOptions(const Driver & D,const ArgList & Args)53 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
58 D.Diag(diag::err_drv_argument_not_allowed_with)
59 << A->getAsString(Args) << "-static";
60 }
61
62 // Quote target names for inclusion in GNU Make dependency files.
63 // Only the characters '$', '#', ' ', '\t' are quoted.
QuoteTarget(StringRef Target,SmallVectorImpl<char> & Res)64 static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
66 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89 }
90
addDirectoryList(const ArgList & Args,ArgStringList & CmdArgs,const char * ArgName,const char * EnvVar)91 static void addDirectoryList(const ArgList &Args,
92 ArgStringList &CmdArgs,
93 const char *ArgName,
94 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
96 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
111 }
112 Dirs = Dirs.substr(Delim + 1);
113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122 }
123
AddLinkerInputs(const ToolChain & TC,const InputInfoList & Inputs,const ArgList & Args,ArgStringList & CmdArgs)124 static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
143 D.Diag(diag::err_drv_no_linker_llvm_support)
144 << TC.getTripleString();
145 }
146
147 // Add filenames immediately.
148 if (II.isFilename()) {
149 CmdArgs.push_back(II.getFilename());
150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
161 } else
162 A.renderAsInput(Args, CmdArgs);
163 }
164
165 // LIBRARY_PATH - included following the user specified library paths.
166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
167 }
168
169 /// \brief Determine whether Objective-C automated reference counting is
170 /// enabled.
isObjCAutoRefCount(const ArgList & Args)171 static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173 }
174
175 /// \brief Determine whether we are linking the ObjC runtime.
isObjCRuntimeLinked(const ArgList & Args)176 static bool isObjCRuntimeLinked(const ArgList &Args) {
177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
179 return true;
180 }
181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182 }
183
addProfileRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,llvm::Triple Triple)184 static void addProfileRT(const ToolChain &TC, const ArgList &Args,
185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
199
200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
201 }
202
AddPreprocessingOptions(Compilation & C,const Driver & D,const ArgList & Args,ArgStringList & CmdArgs,const InputInfo & Output,const InputInfoList & Inputs) const203 void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
205 const ArgList &Args,
206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
209 Arg *A;
210
211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
215
216 // Handle dependency file generation.
217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
222 if (Output.getType() == types::TY_Dependencies) {
223 DepFile = Output.getFilename();
224 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
225 DepFile = MF->getValue(Args);
226 C.addFailureResultFile(DepFile);
227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
232 C.addFailureResultFile(DepFile);
233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
237 // Add a default target if one wasn't specified.
238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
250 SmallString<128> P(Inputs[0].getBaseInput());
251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
253 }
254
255 CmdArgs.push_back("-MT");
256 SmallString<128> Quoted;
257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
259 }
260
261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
263 CmdArgs.push_back("-sys-header-deps");
264 }
265
266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
270 CmdArgs.push_back("-MG");
271 }
272
273 Args.AddLastArg(CmdArgs, options::OPT_MP);
274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
279 const Arg *A = *it;
280 A->claim();
281
282 if (A->getOption().matches(options::OPT_MQ)) {
283 CmdArgs.push_back("-MT");
284 SmallString<128> Quoted;
285 QuoteTarget(A->getValue(Args), Quoted);
286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
290 A->render(Args, CmdArgs);
291 }
292 }
293
294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
299 bool RenderedImplicitInclude = false;
300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
303
304 if (A->getOption().matches(options::OPT_include)) {
305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
308 // Use PCH if the user requested it.
309 bool UsePCH = D.CCCUsePCH;
310
311 bool FoundPTH = false;
312 bool FoundPCH = false;
313 llvm::sys::Path P(A->getValue(Args));
314 bool Exists;
315 if (UsePCH) {
316 P.appendSuffix("pch");
317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
318 FoundPCH = true;
319 else
320 P.eraseSuffix();
321 }
322
323 if (!FoundPCH) {
324 P.appendSuffix("pth");
325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
326 FoundPTH = true;
327 else
328 P.eraseSuffix();
329 }
330
331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
336 }
337 else
338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
352 D.Diag(diag::warn_drv_pch_not_first_include)
353 << P.str() << A->getAsString(Args);
354 }
355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
387 }
388 }
389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
396 SmallString<128> DefaultModuleCache;
397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
403
404 // Parse additional include paths from environment variables.
405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
410 // C_INCLUDE_PATH - system includes enabled when compiling C.
411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
418
419 // Add C++ include arguments, if needed.
420 if (types::isCXX(Inputs[0].getType()))
421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
425 }
426
427 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
428 /// CPU.
429 //
430 // FIXME: This is redundant with -mcpu, why does LLVM use this.
431 // FIXME: tblgen this, or kill it!
getLLVMArchSuffixForARM(StringRef CPU)432 static const char *getLLVMArchSuffixForARM(StringRef CPU) {
433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
445 .Cases("cortex-a8", "cortex-a9", "v7")
446 .Case("cortex-m3", "v7m")
447 .Case("cortex-m4", "v7m")
448 .Case("cortex-m0", "v6m")
449 .Default("");
450 }
451
452 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453 //
454 // FIXME: tblgen this.
getARMTargetCPU(const ArgList & Args,const llvm::Triple & Triple)455 static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511 }
512
513 // FIXME: Move to target hook.
isSignedCharDefault(const llvm::Triple & Triple)514 static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
519 case llvm::Triple::arm:
520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
522 if (Triple.isOSDarwin())
523 return true;
524 return false;
525 }
526 }
527
528 // Handle -mfpu=.
529 //
530 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
531 // frontend target.
addFPUArgs(const Driver & D,const Arg * A,const ArgList & Args,ArgStringList & CmdArgs)532 static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567 }
568
569 // Handle -mfpmath=.
addFPMathArgs(const Driver & D,const Arg * A,const ArgList & Args,ArgStringList & CmdArgs,StringRef CPU)570 static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
571 ArgStringList &CmdArgs, StringRef CPU) {
572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
578
579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
580 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
581
582 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
583 FPMath == "vfp4") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neonfp");
586
587 // FIXME: Add warnings when disabling a feature not present for a given CPU.
588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590 }
591
592 // Select the float ABI as determined by -msoft-float, -mhard-float, and
593 // -mfloat-abi=.
getARMFloatABI(const Driver & D,const ArgList & Args,const llvm::Triple & Triple)594 static StringRef getARMFloatABI(const Driver &D,
595 const ArgList &Args,
596 const llvm::Triple &Triple) {
597 StringRef FloatABI;
598 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ)) {
601 if (A->getOption().matches(options::OPT_msoft_float))
602 FloatABI = "soft";
603 else if (A->getOption().matches(options::OPT_mhard_float))
604 FloatABI = "hard";
605 else {
606 FloatABI = A->getValue(Args);
607 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
608 D.Diag(diag::err_drv_invalid_mfloat_abi)
609 << A->getAsString(Args);
610 FloatABI = "soft";
611 }
612 }
613 }
614
615 // If unspecified, choose the default based on the platform.
616 if (FloatABI.empty()) {
617 switch (Triple.getOS()) {
618 case llvm::Triple::Darwin:
619 case llvm::Triple::MacOSX:
620 case llvm::Triple::IOS: {
621 // Darwin defaults to "softfp" for v6 and v7.
622 //
623 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
624 std::string ArchName =
625 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
626 if (StringRef(ArchName).startswith("v6") ||
627 StringRef(ArchName).startswith("v7"))
628 FloatABI = "softfp";
629 else
630 FloatABI = "soft";
631 break;
632 }
633
634 default:
635 switch(Triple.getEnvironment()) {
636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
642 case llvm::Triple::EABI:
643 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
644 FloatABI = "softfp";
645 break;
646 case llvm::Triple::Android: {
647 std::string ArchName =
648 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
649 if (StringRef(ArchName).startswith("v7"))
650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
655 default:
656 // Assume "soft", but warn the user we are guessing.
657 FloatABI = "soft";
658 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
659 break;
660 }
661 }
662 }
663
664 return FloatABI;
665 }
666
667
AddARMTargetArgs(const ArgList & Args,ArgStringList & CmdArgs,bool KernelOrKext) const668 void Clang::AddARMTargetArgs(const ArgList &Args,
669 ArgStringList &CmdArgs,
670 bool KernelOrKext) const {
671 const Driver &D = getToolChain().getDriver();
672 llvm::Triple Triple = getToolChain().getTriple();
673
674 // Select the ABI to use.
675 //
676 // FIXME: Support -meabi.
677 const char *ABIName = 0;
678 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
679 ABIName = A->getValue(Args);
680 } else {
681 // Select the default based on the platform.
682 switch(Triple.getEnvironment()) {
683 case llvm::Triple::Android:
684 case llvm::Triple::GNUEABI:
685 case llvm::Triple::GNUEABIHF:
686 ABIName = "aapcs-linux";
687 break;
688 case llvm::Triple::EABI:
689 ABIName = "aapcs";
690 break;
691 default:
692 ABIName = "apcs-gnu";
693 }
694 }
695 CmdArgs.push_back("-target-abi");
696 CmdArgs.push_back(ABIName);
697
698 // Set the CPU based on -march= and -mcpu=.
699 CmdArgs.push_back("-target-cpu");
700 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
701
702 // Determine floating point ABI from the options & target defaults.
703 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
704 if (FloatABI == "soft") {
705 // Floating point operations and argument passing are soft.
706 //
707 // FIXME: This changes CPP defines, we need -target-soft-float.
708 CmdArgs.push_back("-msoft-float");
709 CmdArgs.push_back("-mfloat-abi");
710 CmdArgs.push_back("soft");
711 } else if (FloatABI == "softfp") {
712 // Floating point operations are hard, but argument passing is soft.
713 CmdArgs.push_back("-mfloat-abi");
714 CmdArgs.push_back("soft");
715 } else {
716 // Floating point operations and argument passing are hard.
717 assert(FloatABI == "hard" && "Invalid float abi!");
718 CmdArgs.push_back("-mfloat-abi");
719 CmdArgs.push_back("hard");
720 }
721
722 // Set appropriate target features for floating point mode.
723 //
724 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
725 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
726 // stripped out by the ARM target.
727
728 // Use software floating point operations?
729 if (FloatABI == "soft") {
730 CmdArgs.push_back("-target-feature");
731 CmdArgs.push_back("+soft-float");
732 }
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard") {
736 CmdArgs.push_back("-target-feature");
737 CmdArgs.push_back("+soft-float-abi");
738 }
739
740 // Honor -mfpu=.
741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
742 addFPUArgs(D, A, Args, CmdArgs);
743
744 // Honor -mfpmath=.
745 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
746 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
747
748 // Setting -msoft-float effectively disables NEON because of the GCC
749 // implementation, although the same isn't true of VFP or VFP3.
750 if (FloatABI == "soft") {
751 CmdArgs.push_back("-target-feature");
752 CmdArgs.push_back("-neon");
753 }
754
755 // Kernel code has more strict alignment requirements.
756 if (KernelOrKext) {
757 CmdArgs.push_back("-backend-option");
758 CmdArgs.push_back("-arm-long-calls");
759
760 CmdArgs.push_back("-backend-option");
761 CmdArgs.push_back("-arm-strict-align");
762
763 // The kext linker doesn't know how to deal with movw/movt.
764 CmdArgs.push_back("-backend-option");
765 CmdArgs.push_back("-arm-darwin-use-movt=0");
766 }
767
768 // Setting -mno-global-merge disables the codegen global merge pass. Setting
769 // -mglobal-merge has no effect as the pass is enabled by default.
770 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
771 options::OPT_mno_global_merge)) {
772 if (A->getOption().matches(options::OPT_mno_global_merge))
773 CmdArgs.push_back("-mno-global-merge");
774 }
775
776 if (Args.hasArg(options::OPT_mno_implicit_float))
777 CmdArgs.push_back("-no-implicit-float");
778 }
779
780 // Get CPU and ABI names. They are not independent
781 // so we have to calculate them together.
getMipsCPUAndABI(const ArgList & Args,const ToolChain & TC,StringRef & CPUName,StringRef & ABIName)782 static void getMipsCPUAndABI(const ArgList &Args,
783 const ToolChain &TC,
784 StringRef &CPUName,
785 StringRef &ABIName) {
786 const char *DefMips32CPU = "mips32";
787 const char *DefMips64CPU = "mips64";
788
789 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
790 options::OPT_mcpu_EQ))
791 CPUName = A->getValue(Args);
792
793 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
794 ABIName = A->getValue(Args);
795
796 // Setup default CPU and ABI names.
797 if (CPUName.empty() && ABIName.empty()) {
798 switch (TC.getTriple().getArch()) {
799 default:
800 llvm_unreachable("Unexpected triple arch name");
801 case llvm::Triple::mips:
802 case llvm::Triple::mipsel:
803 CPUName = DefMips32CPU;
804 break;
805 case llvm::Triple::mips64:
806 case llvm::Triple::mips64el:
807 CPUName = DefMips64CPU;
808 break;
809 }
810 }
811
812 if (!ABIName.empty()) {
813 // Deduce CPU name from ABI name.
814 CPUName = llvm::StringSwitch<const char *>(ABIName)
815 .Cases("o32", "eabi", DefMips32CPU)
816 .Cases("n32", "n64", DefMips64CPU)
817 .Default("");
818 }
819 else if (!CPUName.empty()) {
820 // Deduce ABI name from CPU name.
821 ABIName = llvm::StringSwitch<const char *>(CPUName)
822 .Cases("mips32", "mips32r2", "o32")
823 .Cases("mips64", "mips64r2", "n64")
824 .Default("");
825 }
826
827 // FIXME: Warn on inconsistent cpu and abi usage.
828 }
829
830 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
831 // and -mfloat-abi=.
getMipsFloatABI(const Driver & D,const ArgList & Args)832 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
833 // Select the float ABI as determined by -msoft-float, -mhard-float,
834 // and -mfloat-abi=.
835 StringRef FloatABI;
836 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
837 options::OPT_mhard_float,
838 options::OPT_mfloat_abi_EQ)) {
839 if (A->getOption().matches(options::OPT_msoft_float))
840 FloatABI = "soft";
841 else if (A->getOption().matches(options::OPT_mhard_float))
842 FloatABI = "hard";
843 else {
844 FloatABI = A->getValue(Args);
845 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
846 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
847 FloatABI = "hard";
848 }
849 }
850 }
851
852 // If unspecified, choose the default based on the platform.
853 if (FloatABI.empty()) {
854 // Assume "hard", because it's a default value used by gcc.
855 // When we start to recognize specific target MIPS processors,
856 // we will be able to select the default more correctly.
857 FloatABI = "hard";
858 }
859
860 return FloatABI;
861 }
862
AddTargetFeature(const ArgList & Args,ArgStringList & CmdArgs,OptSpecifier OnOpt,OptSpecifier OffOpt,StringRef FeatureName)863 static void AddTargetFeature(const ArgList &Args,
864 ArgStringList &CmdArgs,
865 OptSpecifier OnOpt,
866 OptSpecifier OffOpt,
867 StringRef FeatureName) {
868 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
869 CmdArgs.push_back("-target-feature");
870 if (A->getOption().matches(OnOpt))
871 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
872 else
873 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
874 }
875 }
876
AddMIPSTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const877 void Clang::AddMIPSTargetArgs(const ArgList &Args,
878 ArgStringList &CmdArgs) const {
879 const Driver &D = getToolChain().getDriver();
880 StringRef CPUName;
881 StringRef ABIName;
882 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
883
884 CmdArgs.push_back("-target-cpu");
885 CmdArgs.push_back(CPUName.data());
886
887 CmdArgs.push_back("-target-abi");
888 CmdArgs.push_back(ABIName.data());
889
890 StringRef FloatABI = getMipsFloatABI(D, Args);
891
892 if (FloatABI == "soft") {
893 // Floating point operations and argument passing are soft.
894 CmdArgs.push_back("-msoft-float");
895 CmdArgs.push_back("-mfloat-abi");
896 CmdArgs.push_back("soft");
897
898 // FIXME: Note, this is a hack. We need to pass the selected float
899 // mode to the MipsTargetInfoBase to define appropriate macros there.
900 // Now it is the only method.
901 CmdArgs.push_back("-target-feature");
902 CmdArgs.push_back("+soft-float");
903 }
904 else if (FloatABI == "single") {
905 // Restrict the use of hardware floating-point
906 // instructions to 32-bit operations.
907 CmdArgs.push_back("-target-feature");
908 CmdArgs.push_back("+single-float");
909 }
910 else {
911 // Floating point operations and argument passing are hard.
912 assert(FloatABI == "hard" && "Invalid float abi!");
913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("hard");
915 }
916
917 AddTargetFeature(Args, CmdArgs,
918 options::OPT_mips16, options::OPT_mno_mips16,
919 "mips16");
920 AddTargetFeature(Args, CmdArgs,
921 options::OPT_mdsp, options::OPT_mno_dsp,
922 "dsp");
923 AddTargetFeature(Args, CmdArgs,
924 options::OPT_mdspr2, options::OPT_mno_dspr2,
925 "dspr2");
926
927 if (Arg *A = Args.getLastArg(options::OPT_G)) {
928 StringRef v = A->getValue(Args);
929 CmdArgs.push_back("-mllvm");
930 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
931 A->claim();
932 }
933 }
934
935 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
getPPCTargetCPU(const ArgList & Args)936 static std::string getPPCTargetCPU(const ArgList &Args) {
937 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
938 StringRef CPUName = A->getValue(Args);
939
940 if (CPUName == "native") {
941 std::string CPU = llvm::sys::getHostCPUName();
942 if (!CPU.empty() && CPU != "generic")
943 return CPU;
944 else
945 return "";
946 }
947
948 return llvm::StringSwitch<const char *>(CPUName)
949 .Case("common", "generic")
950 .Case("440", "440")
951 .Case("440fp", "440")
952 .Case("450", "450")
953 .Case("601", "601")
954 .Case("602", "602")
955 .Case("603", "603")
956 .Case("603e", "603e")
957 .Case("603ev", "603ev")
958 .Case("604", "604")
959 .Case("604e", "604e")
960 .Case("620", "620")
961 .Case("G3", "g3")
962 .Case("7400", "7400")
963 .Case("G4", "g4")
964 .Case("7450", "7450")
965 .Case("G4+", "g4+")
966 .Case("750", "750")
967 .Case("970", "970")
968 .Case("G5", "g5")
969 .Case("a2", "a2")
970 .Case("power6", "pwr6")
971 .Case("power7", "pwr7")
972 .Case("powerpc", "ppc")
973 .Case("powerpc64", "ppc64")
974 .Default("");
975 }
976
977 return "";
978 }
979
AddPPCTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const980 void Clang::AddPPCTargetArgs(const ArgList &Args,
981 ArgStringList &CmdArgs) const {
982 std::string TargetCPUName = getPPCTargetCPU(Args);
983
984 // LLVM may default to generating code for the native CPU,
985 // but, like gcc, we default to a more generic option for
986 // each architecture. (except on Darwin)
987 llvm::Triple Triple = getToolChain().getTriple();
988 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
989 if (Triple.getArch() == llvm::Triple::ppc64)
990 TargetCPUName = "ppc64";
991 else
992 TargetCPUName = "ppc";
993 }
994
995 if (!TargetCPUName.empty()) {
996 CmdArgs.push_back("-target-cpu");
997 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
998 }
999 }
1000
AddSparcTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1001 void Clang::AddSparcTargetArgs(const ArgList &Args,
1002 ArgStringList &CmdArgs) const {
1003 const Driver &D = getToolChain().getDriver();
1004
1005 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1006 CmdArgs.push_back("-target-cpu");
1007 CmdArgs.push_back(A->getValue(Args));
1008 }
1009
1010 // Select the float ABI as determined by -msoft-float, -mhard-float, and
1011 StringRef FloatABI;
1012 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1013 options::OPT_mhard_float)) {
1014 if (A->getOption().matches(options::OPT_msoft_float))
1015 FloatABI = "soft";
1016 else if (A->getOption().matches(options::OPT_mhard_float))
1017 FloatABI = "hard";
1018 }
1019
1020 // If unspecified, choose the default based on the platform.
1021 if (FloatABI.empty()) {
1022 switch (getToolChain().getTriple().getOS()) {
1023 default:
1024 // Assume "soft", but warn the user we are guessing.
1025 FloatABI = "soft";
1026 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
1027 break;
1028 }
1029 }
1030
1031 if (FloatABI == "soft") {
1032 // Floating point operations and argument passing are soft.
1033 //
1034 // FIXME: This changes CPP defines, we need -target-soft-float.
1035 CmdArgs.push_back("-msoft-float");
1036 CmdArgs.push_back("-target-feature");
1037 CmdArgs.push_back("+soft-float");
1038 } else {
1039 assert(FloatABI == "hard" && "Invalid float abi!");
1040 CmdArgs.push_back("-mhard-float");
1041 }
1042 }
1043
AddX86TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1044 void Clang::AddX86TargetArgs(const ArgList &Args,
1045 ArgStringList &CmdArgs) const {
1046 if (!Args.hasFlag(options::OPT_mred_zone,
1047 options::OPT_mno_red_zone,
1048 true) ||
1049 Args.hasArg(options::OPT_mkernel) ||
1050 Args.hasArg(options::OPT_fapple_kext))
1051 CmdArgs.push_back("-disable-red-zone");
1052
1053 if (Args.hasFlag(options::OPT_msoft_float,
1054 options::OPT_mno_soft_float,
1055 false))
1056 CmdArgs.push_back("-no-implicit-float");
1057
1058 const char *CPUName = 0;
1059 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1060 if (StringRef(A->getValue(Args)) == "native") {
1061 // FIXME: Reject attempts to use -march=native unless the target matches
1062 // the host.
1063 //
1064 // FIXME: We should also incorporate the detected target features for use
1065 // with -native.
1066 std::string CPU = llvm::sys::getHostCPUName();
1067 if (!CPU.empty() && CPU != "generic")
1068 CPUName = Args.MakeArgString(CPU);
1069 } else
1070 CPUName = A->getValue(Args);
1071 }
1072
1073 // Select the default CPU if none was given (or detection failed).
1074 if (!CPUName) {
1075 // FIXME: Need target hooks.
1076 if (getToolChain().getTriple().isOSDarwin()) {
1077 if (getToolChain().getArch() == llvm::Triple::x86_64)
1078 CPUName = "core2";
1079 else if (getToolChain().getArch() == llvm::Triple::x86)
1080 CPUName = "yonah";
1081 } else if (getToolChain().getOS().startswith("haiku")) {
1082 if (getToolChain().getArch() == llvm::Triple::x86_64)
1083 CPUName = "x86-64";
1084 else if (getToolChain().getArch() == llvm::Triple::x86)
1085 CPUName = "i586";
1086 } else if (getToolChain().getOS().startswith("openbsd")) {
1087 if (getToolChain().getArch() == llvm::Triple::x86_64)
1088 CPUName = "x86-64";
1089 else if (getToolChain().getArch() == llvm::Triple::x86)
1090 CPUName = "i486";
1091 } else if (getToolChain().getOS().startswith("bitrig")) {
1092 if (getToolChain().getArch() == llvm::Triple::x86_64)
1093 CPUName = "x86-64";
1094 else if (getToolChain().getArch() == llvm::Triple::x86)
1095 CPUName = "i686";
1096 } else if (getToolChain().getOS().startswith("freebsd")) {
1097 if (getToolChain().getArch() == llvm::Triple::x86_64)
1098 CPUName = "x86-64";
1099 else if (getToolChain().getArch() == llvm::Triple::x86)
1100 CPUName = "i486";
1101 } else if (getToolChain().getOS().startswith("netbsd")) {
1102 if (getToolChain().getArch() == llvm::Triple::x86_64)
1103 CPUName = "x86-64";
1104 else if (getToolChain().getArch() == llvm::Triple::x86)
1105 CPUName = "i486";
1106 } else {
1107 if (getToolChain().getArch() == llvm::Triple::x86_64)
1108 CPUName = "x86-64";
1109 else if (getToolChain().getArch() == llvm::Triple::x86)
1110 CPUName = "pentium4";
1111 }
1112 }
1113
1114 if (CPUName) {
1115 CmdArgs.push_back("-target-cpu");
1116 CmdArgs.push_back(CPUName);
1117 }
1118
1119 // The required algorithm here is slightly strange: the options are applied
1120 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1121 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1122 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1123 // former correctly, but not the latter; handle directly-overridden
1124 // attributes here.
1125 llvm::StringMap<unsigned> PrevFeature;
1126 std::vector<const char*> Features;
1127 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1128 ie = Args.filtered_end(); it != ie; ++it) {
1129 StringRef Name = (*it)->getOption().getName();
1130 (*it)->claim();
1131
1132 // Skip over "-m".
1133 assert(Name.startswith("-m") && "Invalid feature name.");
1134 Name = Name.substr(2);
1135
1136 bool IsNegative = Name.startswith("no-");
1137 if (IsNegative)
1138 Name = Name.substr(3);
1139
1140 unsigned& Prev = PrevFeature[Name];
1141 if (Prev)
1142 Features[Prev - 1] = 0;
1143 Prev = Features.size() + 1;
1144 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1145 }
1146 for (unsigned i = 0; i < Features.size(); i++) {
1147 if (Features[i]) {
1148 CmdArgs.push_back("-target-feature");
1149 CmdArgs.push_back(Features[i]);
1150 }
1151 }
1152 }
1153
getLastHexagonArchArg(const ArgList & Args)1154 static Arg* getLastHexagonArchArg (const ArgList &Args)
1155 {
1156 Arg * A = NULL;
1157
1158 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1159 it != ie; ++it) {
1160 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
1161 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1162 A = *it;
1163 A->claim();
1164 }
1165 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1166 StringRef Value = (*it)->getValue(Args,0);
1167 if (Value.startswith("v")) {
1168 A = *it;
1169 A->claim();
1170 }
1171 }
1172 }
1173 return A;
1174 }
1175
getHexagonTargetCPU(const ArgList & Args)1176 static StringRef getHexagonTargetCPU(const ArgList &Args)
1177 {
1178 Arg *A;
1179 llvm::StringRef WhichHexagon;
1180
1181 // Select the default CPU (v4) if none was given or detection failed.
1182 if ((A = getLastHexagonArchArg (Args))) {
1183 WhichHexagon = A->getValue(Args);
1184 if (WhichHexagon == "")
1185 return "v4";
1186 else
1187 return WhichHexagon;
1188 }
1189 else
1190 return "v4";
1191 }
1192
AddHexagonTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1193 void Clang::AddHexagonTargetArgs(const ArgList &Args,
1194 ArgStringList &CmdArgs) const {
1195 llvm::Triple Triple = getToolChain().getTriple();
1196
1197 CmdArgs.push_back("-target-cpu");
1198 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
1199 CmdArgs.push_back("-fno-signed-char");
1200 CmdArgs.push_back("-nobuiltininc");
1201
1202 if (Args.hasArg(options::OPT_mqdsp6_compat))
1203 CmdArgs.push_back("-mqdsp6-compat");
1204
1205 if (Arg *A = Args.getLastArg(options::OPT_G,
1206 options::OPT_msmall_data_threshold_EQ)) {
1207 std::string SmallDataThreshold="-small-data-threshold=";
1208 SmallDataThreshold += A->getValue(Args);
1209 CmdArgs.push_back ("-mllvm");
1210 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1211 A->claim();
1212 }
1213
1214 if (!Args.hasArg(options::OPT_fno_short_enums))
1215 CmdArgs.push_back("-fshort-enums");
1216 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1217 CmdArgs.push_back ("-mllvm");
1218 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1219 }
1220 CmdArgs.push_back ("-mllvm");
1221 CmdArgs.push_back ("-machine-sink-split=0");
1222 }
1223
1224 static bool
shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime & runtime,const llvm::Triple & Triple)1225 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1226 const llvm::Triple &Triple) {
1227 // We use the zero-cost exception tables for Objective-C if the non-fragile
1228 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1229 // later.
1230 if (runtime.isNonFragile())
1231 return true;
1232
1233 if (!Triple.isOSDarwin())
1234 return false;
1235
1236 return (!Triple.isMacOSXVersionLT(10,5) &&
1237 (Triple.getArch() == llvm::Triple::x86_64 ||
1238 Triple.getArch() == llvm::Triple::arm));
1239 }
1240
1241 /// addExceptionArgs - Adds exception related arguments to the driver command
1242 /// arguments. There's a master flag, -fexceptions and also language specific
1243 /// flags to enable/disable C++ and Objective-C exceptions.
1244 /// This makes it possible to for example disable C++ exceptions but enable
1245 /// Objective-C exceptions.
addExceptionArgs(const ArgList & Args,types::ID InputType,const llvm::Triple & Triple,bool KernelOrKext,const ObjCRuntime & objcRuntime,ArgStringList & CmdArgs)1246 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1247 const llvm::Triple &Triple,
1248 bool KernelOrKext,
1249 const ObjCRuntime &objcRuntime,
1250 ArgStringList &CmdArgs) {
1251 if (KernelOrKext) {
1252 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1253 // arguments now to avoid warnings about unused arguments.
1254 Args.ClaimAllArgs(options::OPT_fexceptions);
1255 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1256 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1257 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1258 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1259 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
1260 return;
1261 }
1262
1263 // Exceptions are enabled by default.
1264 bool ExceptionsEnabled = true;
1265
1266 // This keeps track of whether exceptions were explicitly turned on or off.
1267 bool DidHaveExplicitExceptionFlag = false;
1268
1269 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1270 options::OPT_fno_exceptions)) {
1271 if (A->getOption().matches(options::OPT_fexceptions))
1272 ExceptionsEnabled = true;
1273 else
1274 ExceptionsEnabled = false;
1275
1276 DidHaveExplicitExceptionFlag = true;
1277 }
1278
1279 bool ShouldUseExceptionTables = false;
1280
1281 // Exception tables and cleanups can be enabled with -fexceptions even if the
1282 // language itself doesn't support exceptions.
1283 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1284 ShouldUseExceptionTables = true;
1285
1286 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1287 // is not necessarily sensible, but follows GCC.
1288 if (types::isObjC(InputType) &&
1289 Args.hasFlag(options::OPT_fobjc_exceptions,
1290 options::OPT_fno_objc_exceptions,
1291 true)) {
1292 CmdArgs.push_back("-fobjc-exceptions");
1293
1294 ShouldUseExceptionTables |=
1295 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
1296 }
1297
1298 if (types::isCXX(InputType)) {
1299 bool CXXExceptionsEnabled = ExceptionsEnabled;
1300
1301 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1302 options::OPT_fno_cxx_exceptions,
1303 options::OPT_fexceptions,
1304 options::OPT_fno_exceptions)) {
1305 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1306 CXXExceptionsEnabled = true;
1307 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
1308 CXXExceptionsEnabled = false;
1309 }
1310
1311 if (CXXExceptionsEnabled) {
1312 CmdArgs.push_back("-fcxx-exceptions");
1313
1314 ShouldUseExceptionTables = true;
1315 }
1316 }
1317
1318 if (ShouldUseExceptionTables)
1319 CmdArgs.push_back("-fexceptions");
1320 }
1321
ShouldDisableCFI(const ArgList & Args,const ToolChain & TC)1322 static bool ShouldDisableCFI(const ArgList &Args,
1323 const ToolChain &TC) {
1324 bool Default = true;
1325 if (TC.getTriple().isOSDarwin()) {
1326 // The native darwin assembler doesn't support cfi directives, so
1327 // we disable them if we think the .s file will be passed to it.
1328 Default = Args.hasFlag(options::OPT_integrated_as,
1329 options::OPT_no_integrated_as,
1330 TC.IsIntegratedAssemblerDefault());
1331 }
1332 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1333 options::OPT_fno_dwarf2_cfi_asm,
1334 Default);
1335 }
1336
ShouldDisableDwarfDirectory(const ArgList & Args,const ToolChain & TC)1337 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1338 const ToolChain &TC) {
1339 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1340 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1341 options::OPT_no_integrated_as,
1342 IsIADefault);
1343 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1344 options::OPT_fno_dwarf_directory_asm,
1345 UseIntegratedAs);
1346 return !UseDwarfDirectory;
1347 }
1348
1349 /// \brief Check whether the given input tree contains any compilation actions.
ContainsCompileAction(const Action * A)1350 static bool ContainsCompileAction(const Action *A) {
1351 if (isa<CompileJobAction>(A))
1352 return true;
1353
1354 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1355 if (ContainsCompileAction(*it))
1356 return true;
1357
1358 return false;
1359 }
1360
1361 /// \brief Check if -relax-all should be passed to the internal assembler.
1362 /// This is done by default when compiling non-assembler source with -O0.
UseRelaxAll(Compilation & C,const ArgList & Args)1363 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1364 bool RelaxDefault = true;
1365
1366 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1367 RelaxDefault = A->getOption().matches(options::OPT_O0);
1368
1369 if (RelaxDefault) {
1370 RelaxDefault = false;
1371 for (ActionList::const_iterator it = C.getActions().begin(),
1372 ie = C.getActions().end(); it != ie; ++it) {
1373 if (ContainsCompileAction(*it)) {
1374 RelaxDefault = true;
1375 break;
1376 }
1377 }
1378 }
1379
1380 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1381 RelaxDefault);
1382 }
1383
1384 /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1385 /// This needs to be called before we add the C run-time (malloc, etc).
addAsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)1386 static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
1387 ArgStringList &CmdArgs) {
1388 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
1389 options::OPT_fno_address_sanitizer, false))
1390 return;
1391 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
1392 if (!Args.hasArg(options::OPT_shared)) {
1393 if (!Args.hasArg(options::OPT_pie))
1394 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
1395 // For an executable, we add a .preinit_array stub.
1396 CmdArgs.push_back("-u");
1397 CmdArgs.push_back("__asan_preinit");
1398 CmdArgs.push_back("-lasan");
1399 }
1400
1401 CmdArgs.push_back("-lasan_preload");
1402 CmdArgs.push_back("-ldl");
1403 } else {
1404 if (!Args.hasArg(options::OPT_shared)) {
1405 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1406 // resource directory.
1407 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1408 llvm::sys::path::append(LibAsan, "lib", "linux",
1409 (Twine("libclang_rt.asan-") +
1410 TC.getArchName() + ".a"));
1411 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1412 CmdArgs.push_back("-lpthread");
1413 CmdArgs.push_back("-ldl");
1414 CmdArgs.push_back("-export-dynamic");
1415 }
1416 }
1417 }
1418
1419 /// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1420 /// This needs to be called before we add the C run-time (malloc, etc).
addTsanRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)1421 static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1422 ArgStringList &CmdArgs) {
1423 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1424 options::OPT_fno_thread_sanitizer, false))
1425 return;
1426 if (!Args.hasArg(options::OPT_shared)) {
1427 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1428 // resource directory.
1429 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1430 llvm::sys::path::append(LibTsan, "lib", "linux",
1431 (Twine("libclang_rt.tsan-") +
1432 TC.getArchName() + ".a"));
1433 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1434 CmdArgs.push_back("-lpthread");
1435 CmdArgs.push_back("-ldl");
1436 CmdArgs.push_back("-export-dynamic");
1437 }
1438 }
1439
shouldUseFramePointer(const ArgList & Args,const llvm::Triple & Triple)1440 static bool shouldUseFramePointer(const ArgList &Args,
1441 const llvm::Triple &Triple) {
1442 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1443 options::OPT_fomit_frame_pointer))
1444 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1445
1446 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
1447 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1448 Triple.getArch() == llvm::Triple::x86) &&
1449 Triple.getOS() == llvm::Triple::Linux) {
1450 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1451 if (!A->getOption().matches(options::OPT_O0))
1452 return false;
1453 }
1454
1455 return true;
1456 }
1457
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const1458 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
1459 const InputInfo &Output,
1460 const InputInfoList &Inputs,
1461 const ArgList &Args,
1462 const char *LinkingOutput) const {
1463 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1464 options::OPT_fapple_kext);
1465 const Driver &D = getToolChain().getDriver();
1466 ArgStringList CmdArgs;
1467
1468 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1469
1470 // Invoke ourselves in -cc1 mode.
1471 //
1472 // FIXME: Implement custom jobs for internal actions.
1473 CmdArgs.push_back("-cc1");
1474
1475 // Add the "effective" target triple.
1476 CmdArgs.push_back("-triple");
1477 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1478 CmdArgs.push_back(Args.MakeArgString(TripleStr));
1479
1480 // Select the appropriate action.
1481 RewriteKind rewriteKind = RK_None;
1482
1483 if (isa<AnalyzeJobAction>(JA)) {
1484 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1485 CmdArgs.push_back("-analyze");
1486 } else if (isa<MigrateJobAction>(JA)) {
1487 CmdArgs.push_back("-migrate");
1488 } else if (isa<PreprocessJobAction>(JA)) {
1489 if (Output.getType() == types::TY_Dependencies)
1490 CmdArgs.push_back("-Eonly");
1491 else
1492 CmdArgs.push_back("-E");
1493 } else if (isa<AssembleJobAction>(JA)) {
1494 CmdArgs.push_back("-emit-obj");
1495
1496 if (UseRelaxAll(C, Args))
1497 CmdArgs.push_back("-mrelax-all");
1498
1499 // When using an integrated assembler, translate -Wa, and -Xassembler
1500 // options.
1501 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1502 options::OPT_Xassembler),
1503 ie = Args.filtered_end(); it != ie; ++it) {
1504 const Arg *A = *it;
1505 A->claim();
1506
1507 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1508 StringRef Value = A->getValue(Args, i);
1509
1510 if (Value == "-force_cpusubtype_ALL") {
1511 // Do nothing, this is the default and we don't support anything else.
1512 } else if (Value == "-L") {
1513 CmdArgs.push_back("-msave-temp-labels");
1514 } else if (Value == "--fatal-warnings") {
1515 CmdArgs.push_back("-mllvm");
1516 CmdArgs.push_back("-fatal-assembler-warnings");
1517 } else if (Value == "--noexecstack") {
1518 CmdArgs.push_back("-mnoexecstack");
1519 } else {
1520 D.Diag(diag::err_drv_unsupported_option_argument)
1521 << A->getOption().getName() << Value;
1522 }
1523 }
1524 }
1525
1526 // Also ignore explicit -force_cpusubtype_ALL option.
1527 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
1528 } else if (isa<PrecompileJobAction>(JA)) {
1529 // Use PCH if the user requested it.
1530 bool UsePCH = D.CCCUsePCH;
1531
1532 if (JA.getType() == types::TY_Nothing)
1533 CmdArgs.push_back("-fsyntax-only");
1534 else if (UsePCH)
1535 CmdArgs.push_back("-emit-pch");
1536 else
1537 CmdArgs.push_back("-emit-pth");
1538 } else {
1539 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
1540
1541 if (JA.getType() == types::TY_Nothing) {
1542 CmdArgs.push_back("-fsyntax-only");
1543 } else if (JA.getType() == types::TY_LLVM_IR ||
1544 JA.getType() == types::TY_LTO_IR) {
1545 CmdArgs.push_back("-emit-llvm");
1546 } else if (JA.getType() == types::TY_LLVM_BC ||
1547 JA.getType() == types::TY_LTO_BC) {
1548 CmdArgs.push_back("-emit-llvm-bc");
1549 } else if (JA.getType() == types::TY_PP_Asm) {
1550 CmdArgs.push_back("-S");
1551 } else if (JA.getType() == types::TY_AST) {
1552 CmdArgs.push_back("-emit-pch");
1553 } else if (JA.getType() == types::TY_RewrittenObjC) {
1554 CmdArgs.push_back("-rewrite-objc");
1555 rewriteKind = RK_NonFragile;
1556 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1557 CmdArgs.push_back("-rewrite-objc");
1558 rewriteKind = RK_Fragile;
1559 } else {
1560 assert(JA.getType() == types::TY_PP_Asm &&
1561 "Unexpected output type!");
1562 }
1563 }
1564
1565 // The make clang go fast button.
1566 CmdArgs.push_back("-disable-free");
1567
1568 // Disable the verification pass in -asserts builds.
1569 #ifdef NDEBUG
1570 CmdArgs.push_back("-disable-llvm-verifier");
1571 #endif
1572
1573 // Set the main file name, so that debug info works even with
1574 // -save-temps.
1575 CmdArgs.push_back("-main-file-name");
1576 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1577
1578 // Some flags which affect the language (via preprocessor
1579 // defines). See darwin::CC1::AddCPPArgs.
1580 if (Args.hasArg(options::OPT_static))
1581 CmdArgs.push_back("-static-define");
1582
1583 if (isa<AnalyzeJobAction>(JA)) {
1584 // Enable region store model by default.
1585 CmdArgs.push_back("-analyzer-store=region");
1586
1587 // Treat blocks as analysis entry points.
1588 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1589
1590 CmdArgs.push_back("-analyzer-eagerly-assume");
1591
1592 CmdArgs.push_back("-analyzer-ipa=inlining");
1593
1594 // Add default argument set.
1595 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
1596 CmdArgs.push_back("-analyzer-checker=core");
1597
1598 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1599 CmdArgs.push_back("-analyzer-checker=unix");
1600
1601 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
1602 CmdArgs.push_back("-analyzer-checker=osx");
1603
1604 CmdArgs.push_back("-analyzer-checker=deadcode");
1605
1606 // Enable the following experimental checkers for testing.
1607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
1613 }
1614
1615 // Set the output format. The default is plist, for (lame) historical
1616 // reasons.
1617 CmdArgs.push_back("-analyzer-output");
1618 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1619 CmdArgs.push_back(A->getValue(Args));
1620 else
1621 CmdArgs.push_back("plist");
1622
1623 // Disable the presentation of standard compiler warnings when
1624 // using --analyze. We only want to show static analyzer diagnostics
1625 // or frontend errors.
1626 CmdArgs.push_back("-w");
1627
1628 // Add -Xanalyzer arguments when running as analyzer.
1629 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
1630 }
1631
1632 CheckCodeGenerationOptions(D, Args);
1633
1634 // Perform argument translation for LLVM backend. This
1635 // takes some care in reconciling with llvm-gcc. The
1636 // issue is that llvm-gcc translates these options based on
1637 // the values in cc1, whereas we are processing based on
1638 // the driver arguments.
1639
1640 // This comes from the default translation the driver + cc1
1641 // would do to enable flag_pic.
1642
1643 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1644 options::OPT_fpic, options::OPT_fno_pic,
1645 options::OPT_fPIE, options::OPT_fno_PIE,
1646 options::OPT_fpie, options::OPT_fno_pie);
1647 bool PICDisabled = false;
1648 bool PICEnabled = false;
1649 bool PICForPIE = false;
1650 if (LastPICArg) {
1651 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1652 LastPICArg->getOption().matches(options::OPT_fpie));
1653 PICEnabled = (PICForPIE ||
1654 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1655 LastPICArg->getOption().matches(options::OPT_fpic));
1656 PICDisabled = !PICEnabled;
1657 }
1658 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1659 // PIC or PIE options above, if these show up, PIC is disabled.
1660 if (Args.hasArg(options::OPT_mkernel))
1661 PICDisabled = true;
1662 if (Args.hasArg(options::OPT_static))
1663 PICDisabled = true;
1664 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1665
1666 // Select the relocation model.
1667 const char *Model = getToolChain().GetForcedPicModel();
1668 if (!Model) {
1669 if (DynamicNoPIC)
1670 Model = "dynamic-no-pic";
1671 else if (PICDisabled)
1672 Model = "static";
1673 else if (PICEnabled)
1674 Model = "pic";
1675 else
1676 Model = getToolChain().GetDefaultRelocationModel();
1677 }
1678 StringRef ModelStr = Model ? Model : "";
1679 if (Model && ModelStr != "pic") {
1680 CmdArgs.push_back("-mrelocation-model");
1681 CmdArgs.push_back(Model);
1682 }
1683
1684 // Infer the __PIC__ and __PIE__ values.
1685 if (ModelStr == "pic" && PICForPIE) {
1686 CmdArgs.push_back("-pie-level");
1687 CmdArgs.push_back((LastPICArg &&
1688 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1689 "2" : "1");
1690 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
1691 CmdArgs.push_back("-pic-level");
1692 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1693 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1694 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
1695 }
1696
1697 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1698 options::OPT_fno_merge_all_constants))
1699 CmdArgs.push_back("-fno-merge-all-constants");
1700
1701 // LLVM Code Generator Options.
1702
1703 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1704 CmdArgs.push_back("-mregparm");
1705 CmdArgs.push_back(A->getValue(Args));
1706 }
1707
1708 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1709 CmdArgs.push_back("-mrtd");
1710
1711 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
1712 CmdArgs.push_back("-mdisable-fp-elim");
1713 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1714 options::OPT_fno_zero_initialized_in_bss))
1715 CmdArgs.push_back("-mno-zero-initialized-in-bss");
1716 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1717 options::OPT_fno_strict_aliasing,
1718 getToolChain().IsStrictAliasingDefault()))
1719 CmdArgs.push_back("-relaxed-aliasing");
1720 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1721 false))
1722 CmdArgs.push_back("-fstrict-enums");
1723 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1724 options::OPT_fno_optimize_sibling_calls))
1725 CmdArgs.push_back("-mdisable-tail-calls");
1726
1727 // Handle various floating point optimization flags, mapping them to the
1728 // appropriate LLVM code generation flags. The pattern for all of these is to
1729 // default off the codegen optimizations, and if any flag enables them and no
1730 // flag disables them after the flag enabling them, enable the codegen
1731 // optimization. This is complicated by several "umbrella" flags.
1732 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1733 options::OPT_ffinite_math_only,
1734 options::OPT_fno_finite_math_only,
1735 options::OPT_fhonor_infinities,
1736 options::OPT_fno_honor_infinities))
1737 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1738 A->getOption().getID() != options::OPT_fhonor_infinities)
1739 CmdArgs.push_back("-menable-no-infs");
1740 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1741 options::OPT_ffinite_math_only,
1742 options::OPT_fno_finite_math_only,
1743 options::OPT_fhonor_nans,
1744 options::OPT_fno_honor_nans))
1745 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1746 A->getOption().getID() != options::OPT_fhonor_nans)
1747 CmdArgs.push_back("-menable-no-nans");
1748
1749 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1750 bool MathErrno = getToolChain().IsMathErrnoDefault();
1751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1752 options::OPT_fmath_errno,
1753 options::OPT_fno_math_errno))
1754 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1755 if (MathErrno)
1756 CmdArgs.push_back("-fmath-errno");
1757
1758 // There are several flags which require disabling very specific
1759 // optimizations. Any of these being disabled forces us to turn off the
1760 // entire set of LLVM optimizations, so collect them through all the flag
1761 // madness.
1762 bool AssociativeMath = false;
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1764 options::OPT_funsafe_math_optimizations,
1765 options::OPT_fno_unsafe_math_optimizations,
1766 options::OPT_fassociative_math,
1767 options::OPT_fno_associative_math))
1768 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1769 A->getOption().getID() != options::OPT_fno_associative_math)
1770 AssociativeMath = true;
1771 bool ReciprocalMath = false;
1772 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1773 options::OPT_funsafe_math_optimizations,
1774 options::OPT_fno_unsafe_math_optimizations,
1775 options::OPT_freciprocal_math,
1776 options::OPT_fno_reciprocal_math))
1777 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1778 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1779 ReciprocalMath = true;
1780 bool SignedZeros = true;
1781 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1782 options::OPT_funsafe_math_optimizations,
1783 options::OPT_fno_unsafe_math_optimizations,
1784 options::OPT_fsigned_zeros,
1785 options::OPT_fno_signed_zeros))
1786 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1787 A->getOption().getID() != options::OPT_fsigned_zeros)
1788 SignedZeros = false;
1789 bool TrappingMath = true;
1790 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1791 options::OPT_funsafe_math_optimizations,
1792 options::OPT_fno_unsafe_math_optimizations,
1793 options::OPT_ftrapping_math,
1794 options::OPT_fno_trapping_math))
1795 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1796 A->getOption().getID() != options::OPT_ftrapping_math)
1797 TrappingMath = false;
1798 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1799 !TrappingMath)
1800 CmdArgs.push_back("-menable-unsafe-fp-math");
1801
1802
1803 // Validate and pass through -fp-contract option.
1804 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1805 options::OPT_ffp_contract)) {
1806 if (A->getOption().getID() == options::OPT_ffp_contract) {
1807 StringRef Val = A->getValue(Args);
1808 if (Val == "fast" || Val == "on" || Val == "off") {
1809 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1810 } else {
1811 D.Diag(diag::err_drv_unsupported_option_argument)
1812 << A->getOption().getName() << Val;
1813 }
1814 } else { // A is OPT_ffast_math
1815 // If fast-math is set then set the fp-contract mode to fast.
1816 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1817 }
1818 }
1819
1820 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1821 // and if we find them, tell the frontend to provide the appropriate
1822 // preprocessor macros. This is distinct from enabling any optimizations as
1823 // these options induce language changes which must survive serialization
1824 // and deserialization, etc.
1825 if (Args.hasArg(options::OPT_ffast_math))
1826 CmdArgs.push_back("-ffast-math");
1827 if (Args.hasArg(options::OPT_ffinite_math_only))
1828 CmdArgs.push_back("-ffinite-math-only");
1829
1830 // Decide whether to use verbose asm. Verbose assembly is the default on
1831 // toolchains which have the integrated assembler on by default.
1832 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1833 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
1834 IsVerboseAsmDefault) ||
1835 Args.hasArg(options::OPT_dA))
1836 CmdArgs.push_back("-masm-verbose");
1837
1838 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1839 CmdArgs.push_back("-mdebug-pass");
1840 CmdArgs.push_back("Structure");
1841 }
1842 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1843 CmdArgs.push_back("-mdebug-pass");
1844 CmdArgs.push_back("Arguments");
1845 }
1846
1847 // Enable -mconstructor-aliases except on darwin, where we have to
1848 // work around a linker bug; see <rdar://problem/7651567>.
1849 if (!getToolChain().getTriple().isOSDarwin())
1850 CmdArgs.push_back("-mconstructor-aliases");
1851
1852 // Darwin's kernel doesn't support guard variables; just die if we
1853 // try to use them.
1854 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
1855 CmdArgs.push_back("-fforbid-guard-variables");
1856
1857 if (Args.hasArg(options::OPT_mms_bitfields)) {
1858 CmdArgs.push_back("-mms-bitfields");
1859 }
1860
1861 // This is a coarse approximation of what llvm-gcc actually does, both
1862 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1863 // complicated ways.
1864 bool AsynchronousUnwindTables =
1865 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1866 options::OPT_fno_asynchronous_unwind_tables,
1867 getToolChain().IsUnwindTablesDefault() &&
1868 !KernelOrKext);
1869 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1870 AsynchronousUnwindTables))
1871 CmdArgs.push_back("-munwind-tables");
1872
1873 getToolChain().addClangTargetOptions(CmdArgs);
1874
1875 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1876 CmdArgs.push_back("-mlimit-float-precision");
1877 CmdArgs.push_back(A->getValue(Args));
1878 }
1879
1880 // FIXME: Handle -mtune=.
1881 (void) Args.hasArg(options::OPT_mtune_EQ);
1882
1883 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
1884 CmdArgs.push_back("-mcode-model");
1885 CmdArgs.push_back(A->getValue(Args));
1886 }
1887
1888 // Add target specific cpu and features flags.
1889 switch(getToolChain().getTriple().getArch()) {
1890 default:
1891 break;
1892
1893 case llvm::Triple::arm:
1894 case llvm::Triple::thumb:
1895 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
1896 break;
1897
1898 case llvm::Triple::mips:
1899 case llvm::Triple::mipsel:
1900 case llvm::Triple::mips64:
1901 case llvm::Triple::mips64el:
1902 AddMIPSTargetArgs(Args, CmdArgs);
1903 break;
1904
1905 case llvm::Triple::ppc:
1906 case llvm::Triple::ppc64:
1907 AddPPCTargetArgs(Args, CmdArgs);
1908 break;
1909
1910 case llvm::Triple::sparc:
1911 AddSparcTargetArgs(Args, CmdArgs);
1912 break;
1913
1914 case llvm::Triple::x86:
1915 case llvm::Triple::x86_64:
1916 AddX86TargetArgs(Args, CmdArgs);
1917 break;
1918
1919 case llvm::Triple::hexagon:
1920 AddHexagonTargetArgs(Args, CmdArgs);
1921 break;
1922 }
1923
1924
1925
1926 // Pass the linker version in use.
1927 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1928 CmdArgs.push_back("-target-linker-version");
1929 CmdArgs.push_back(A->getValue(Args));
1930 }
1931
1932 // -mno-omit-leaf-frame-pointer is the default on Darwin.
1933 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1934 options::OPT_mno_omit_leaf_frame_pointer,
1935 !getToolChain().getTriple().isOSDarwin()))
1936 CmdArgs.push_back("-momit-leaf-frame-pointer");
1937
1938 // Explicitly error on some things we know we don't support and can't just
1939 // ignore.
1940 types::ID InputType = Inputs[0].getType();
1941 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1942 Arg *Unsupported;
1943 if (types::isCXX(InputType) &&
1944 getToolChain().getTriple().isOSDarwin() &&
1945 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
1946 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1947 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
1948 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
1949 << Unsupported->getOption().getName();
1950 }
1951 }
1952
1953 Args.AddAllArgs(CmdArgs, options::OPT_v);
1954 Args.AddLastArg(CmdArgs, options::OPT_H);
1955 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
1956 CmdArgs.push_back("-header-include-file");
1957 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1958 D.CCPrintHeadersFilename : "-");
1959 }
1960 Args.AddLastArg(CmdArgs, options::OPT_P);
1961 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
1962
1963 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
1964 CmdArgs.push_back("-diagnostic-log-file");
1965 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1966 D.CCLogDiagnosticsFilename : "-");
1967 }
1968
1969 // Use the last option from "-g" group. "-gline-tables-only" is
1970 // preserved, all other debug options are substituted with "-g".
1971 Args.ClaimAllArgs(options::OPT_g_Group);
1972 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1973 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1974 CmdArgs.push_back("-gline-tables-only");
1975 } else if (!A->getOption().matches(options::OPT_g0) &&
1976 !A->getOption().matches(options::OPT_ggdb0)) {
1977 CmdArgs.push_back("-g");
1978 }
1979 }
1980
1981 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1982 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1983
1984 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1985 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1986
1987 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1988
1989 if (Args.hasArg(options::OPT_ftest_coverage) ||
1990 Args.hasArg(options::OPT_coverage))
1991 CmdArgs.push_back("-femit-coverage-notes");
1992 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1993 Args.hasArg(options::OPT_coverage))
1994 CmdArgs.push_back("-femit-coverage-data");
1995
1996 if (C.getArgs().hasArg(options::OPT_c) ||
1997 C.getArgs().hasArg(options::OPT_S)) {
1998 if (Output.isFilename()) {
1999 CmdArgs.push_back("-coverage-file");
2000 SmallString<128> absFilename(Output.getFilename());
2001 llvm::sys::fs::make_absolute(absFilename);
2002 CmdArgs.push_back(Args.MakeArgString(absFilename));
2003 }
2004 }
2005
2006 // Pass options for controlling the default header search paths.
2007 if (Args.hasArg(options::OPT_nostdinc)) {
2008 CmdArgs.push_back("-nostdsysteminc");
2009 CmdArgs.push_back("-nobuiltininc");
2010 } else {
2011 if (Args.hasArg(options::OPT_nostdlibinc))
2012 CmdArgs.push_back("-nostdsysteminc");
2013 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2014 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2015 }
2016
2017 // Pass the path to compiler resource files.
2018 CmdArgs.push_back("-resource-dir");
2019 CmdArgs.push_back(D.ResourceDir.c_str());
2020
2021 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2022
2023 bool ARCMTEnabled = false;
2024 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
2025 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
2026 options::OPT_ccc_arcmt_modify,
2027 options::OPT_ccc_arcmt_migrate)) {
2028 ARCMTEnabled = true;
2029 switch (A->getOption().getID()) {
2030 default:
2031 llvm_unreachable("missed a case");
2032 case options::OPT_ccc_arcmt_check:
2033 CmdArgs.push_back("-arcmt-check");
2034 break;
2035 case options::OPT_ccc_arcmt_modify:
2036 CmdArgs.push_back("-arcmt-modify");
2037 break;
2038 case options::OPT_ccc_arcmt_migrate:
2039 CmdArgs.push_back("-arcmt-migrate");
2040 CmdArgs.push_back("-mt-migrate-directory");
2041 CmdArgs.push_back(A->getValue(Args));
2042
2043 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2044 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
2045 break;
2046 }
2047 }
2048 }
2049
2050 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2051 if (ARCMTEnabled) {
2052 D.Diag(diag::err_drv_argument_not_allowed_with)
2053 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2054 }
2055 CmdArgs.push_back("-mt-migrate-directory");
2056 CmdArgs.push_back(A->getValue(Args));
2057
2058 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2059 options::OPT_objcmt_migrate_subscripting)) {
2060 // None specified, means enable them all.
2061 CmdArgs.push_back("-objcmt-migrate-literals");
2062 CmdArgs.push_back("-objcmt-migrate-subscripting");
2063 } else {
2064 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2065 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2066 }
2067 }
2068
2069 // Add preprocessing options like -I, -D, etc. if we are using the
2070 // preprocessor.
2071 //
2072 // FIXME: Support -fpreprocessed
2073 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
2074 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
2075
2076 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2077 // that "The compiler can only warn and ignore the option if not recognized".
2078 // When building with ccache, it will pass -D options to clang even on
2079 // preprocessed inputs and configure concludes that -fPIC is not supported.
2080 Args.ClaimAllArgs(options::OPT_D);
2081
2082 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
2083 // others.
2084 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2085 if (A->getOption().matches(options::OPT_O4))
2086 CmdArgs.push_back("-O3");
2087 else if (A->getOption().matches(options::OPT_O) &&
2088 A->getValue(Args)[0] == '\0')
2089 CmdArgs.push_back("-O2");
2090 else
2091 A->render(Args, CmdArgs);
2092 }
2093
2094 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
2095 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2096 CmdArgs.push_back("-pedantic");
2097 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
2098 Args.AddLastArg(CmdArgs, options::OPT_w);
2099
2100 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2101 // (-ansi is equivalent to -std=c89).
2102 //
2103 // If a std is supplied, only add -trigraphs if it follows the
2104 // option.
2105 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2106 if (Std->getOption().matches(options::OPT_ansi))
2107 if (types::isCXX(InputType))
2108 CmdArgs.push_back("-std=c++98");
2109 else
2110 CmdArgs.push_back("-std=c89");
2111 else
2112 Std->render(Args, CmdArgs);
2113
2114 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2115 options::OPT_trigraphs))
2116 if (A != Std)
2117 A->render(Args, CmdArgs);
2118 } else {
2119 // Honor -std-default.
2120 //
2121 // FIXME: Clang doesn't correctly handle -std= when the input language
2122 // doesn't match. For the time being just ignore this for C++ inputs;
2123 // eventually we want to do all the standard defaulting here instead of
2124 // splitting it between the driver and clang -cc1.
2125 if (!types::isCXX(InputType))
2126 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2127 "-std=", /*Joined=*/true);
2128 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2129 CmdArgs.push_back("-std=c++11");
2130
2131 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
2132 }
2133
2134 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2135 // '-fconst-strings'; this better indicates its actual behavior.
2136 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2137 false)) {
2138 // For perfect compatibility with GCC, we do this even in the presence of
2139 // '-w'. This flag names something other than a warning for GCC.
2140 CmdArgs.push_back("-fconst-strings");
2141 }
2142
2143 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
2144 // during C++ compilation, which it is by default. GCC keeps this define even
2145 // in the presence of '-w', match this behavior bug-for-bug.
2146 if (types::isCXX(InputType) &&
2147 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2148 true)) {
2149 CmdArgs.push_back("-fdeprecated-macro");
2150 }
2151
2152 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2153 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2154 if (Asm->getOption().matches(options::OPT_fasm))
2155 CmdArgs.push_back("-fgnu-keywords");
2156 else
2157 CmdArgs.push_back("-fno-gnu-keywords");
2158 }
2159
2160 if (ShouldDisableCFI(Args, getToolChain()))
2161 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2162
2163 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2164 CmdArgs.push_back("-fno-dwarf-directory-asm");
2165
2166 if (const char *pwd = ::getenv("PWD")) {
2167 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2168 // number. Not doing those because stats are slow, but we could.
2169 if (llvm::sys::path::is_absolute(pwd)) {
2170 std::string CompDir = pwd;
2171 CmdArgs.push_back("-fdebug-compilation-dir");
2172 CmdArgs.push_back(Args.MakeArgString(CompDir));
2173 }
2174 }
2175
2176 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2177 options::OPT_ftemplate_depth_EQ)) {
2178 CmdArgs.push_back("-ftemplate-depth");
2179 CmdArgs.push_back(A->getValue(Args));
2180 }
2181
2182 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2183 CmdArgs.push_back("-fconstexpr-depth");
2184 CmdArgs.push_back(A->getValue(Args));
2185 }
2186
2187 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2188 options::OPT_Wlarge_by_value_copy_def)) {
2189 if (A->getNumValues()) {
2190 StringRef bytes = A->getValue(Args);
2191 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2192 } else
2193 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
2194 }
2195
2196 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2197 options::OPT_fbounds_checking_EQ)) {
2198 if (A->getNumValues()) {
2199 StringRef val = A->getValue(Args);
2200 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2201 } else
2202 CmdArgs.push_back("-fbounds-checking=1");
2203 }
2204
2205 if (Args.hasArg(options::OPT__relocatable_pch))
2206 CmdArgs.push_back("-relocatable-pch");
2207
2208 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2209 CmdArgs.push_back("-fconstant-string-class");
2210 CmdArgs.push_back(A->getValue(Args));
2211 }
2212
2213 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2214 CmdArgs.push_back("-ftabstop");
2215 CmdArgs.push_back(A->getValue(Args));
2216 }
2217
2218 CmdArgs.push_back("-ferror-limit");
2219 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2220 CmdArgs.push_back(A->getValue(Args));
2221 else
2222 CmdArgs.push_back("19");
2223
2224 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2225 CmdArgs.push_back("-fmacro-backtrace-limit");
2226 CmdArgs.push_back(A->getValue(Args));
2227 }
2228
2229 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2230 CmdArgs.push_back("-ftemplate-backtrace-limit");
2231 CmdArgs.push_back(A->getValue(Args));
2232 }
2233
2234 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2235 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2236 CmdArgs.push_back(A->getValue(Args));
2237 }
2238
2239 // Pass -fmessage-length=.
2240 CmdArgs.push_back("-fmessage-length");
2241 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
2242 CmdArgs.push_back(A->getValue(Args));
2243 } else {
2244 // If -fmessage-length=N was not specified, determine whether this is a
2245 // terminal and, if so, implicitly define -fmessage-length appropriately.
2246 unsigned N = llvm::sys::Process::StandardErrColumns();
2247 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
2248 }
2249
2250 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2251 CmdArgs.push_back("-fvisibility");
2252 CmdArgs.push_back(A->getValue(Args));
2253 }
2254
2255 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
2256
2257 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2258
2259 // -fhosted is default.
2260 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2261 KernelOrKext)
2262 CmdArgs.push_back("-ffreestanding");
2263
2264 // Forward -f (flag) options which we can pass directly.
2265 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
2266 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
2267 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
2268 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
2269 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
2270 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
2271 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
2272 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2273 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
2274
2275 // Report and error for -faltivec on anything other then PowerPC.
2276 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2277 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2278 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2279 D.Diag(diag::err_drv_argument_only_allowed_with)
2280 << A->getAsString(Args) << "ppc/ppc64";
2281
2282 if (getToolChain().SupportsProfiling())
2283 Args.AddLastArg(CmdArgs, options::OPT_pg);
2284
2285 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2286 options::OPT_fno_address_sanitizer, false))
2287 CmdArgs.push_back("-faddress-sanitizer");
2288
2289 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2290 options::OPT_fno_thread_sanitizer, false))
2291 CmdArgs.push_back("-fthread-sanitizer");
2292
2293 // -flax-vector-conversions is default.
2294 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2295 options::OPT_fno_lax_vector_conversions))
2296 CmdArgs.push_back("-fno-lax-vector-conversions");
2297
2298 if (Args.getLastArg(options::OPT_fapple_kext))
2299 CmdArgs.push_back("-fapple-kext");
2300
2301 if (Args.hasFlag(options::OPT_frewrite_includes,
2302 options::OPT_fno_rewrite_includes, false))
2303 CmdArgs.push_back("-frewrite-includes");
2304
2305 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
2306 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
2307 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
2308 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2309 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
2310
2311 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2312 CmdArgs.push_back("-ftrapv-handler");
2313 CmdArgs.push_back(A->getValue(Args));
2314 }
2315
2316 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
2317
2318 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2319 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2320 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2321 options::OPT_fno_wrapv)) {
2322 if (A->getOption().matches(options::OPT_fwrapv))
2323 CmdArgs.push_back("-fwrapv");
2324 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2325 options::OPT_fno_strict_overflow)) {
2326 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2327 CmdArgs.push_back("-fwrapv");
2328 }
2329 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
2330 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
2331
2332 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2333
2334 // -stack-protector=0 is default.
2335 unsigned StackProtectorLevel = 0;
2336 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2337 options::OPT_fstack_protector_all,
2338 options::OPT_fstack_protector)) {
2339 if (A->getOption().matches(options::OPT_fstack_protector))
2340 StackProtectorLevel = 1;
2341 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2342 StackProtectorLevel = 2;
2343 } else {
2344 StackProtectorLevel =
2345 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2346 }
2347 if (StackProtectorLevel) {
2348 CmdArgs.push_back("-stack-protector");
2349 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
2350
2351 // --param ssp-buffer-size=
2352 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2353 ie = Args.filtered_end(); it != ie; ++it) {
2354 StringRef Str((*it)->getValue(Args));
2355 if (Str.startswith("ssp-buffer-size=")) {
2356 CmdArgs.push_back("-stack-protector-buffer-size");
2357 // FIXME: Verify the argument is a valid integer.
2358 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
2359 (*it)->claim();
2360 }
2361 }
2362 }
2363
2364 // Translate -mstackrealign
2365 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2366 false)) {
2367 CmdArgs.push_back("-backend-option");
2368 CmdArgs.push_back("-force-align-stack");
2369 }
2370 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2371 false)) {
2372 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2373 }
2374
2375 if (Args.hasArg(options::OPT_mstack_alignment)) {
2376 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2377 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
2378 }
2379
2380 // Forward -f options with positive and negative forms; we translate
2381 // these by hand.
2382
2383 if (Args.hasArg(options::OPT_mkernel)) {
2384 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
2385 CmdArgs.push_back("-fapple-kext");
2386 if (!Args.hasArg(options::OPT_fbuiltin))
2387 CmdArgs.push_back("-fno-builtin");
2388 Args.ClaimAllArgs(options::OPT_fno_builtin);
2389 }
2390 // -fbuiltin is default.
2391 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
2392 CmdArgs.push_back("-fno-builtin");
2393
2394 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2395 options::OPT_fno_assume_sane_operator_new))
2396 CmdArgs.push_back("-fno-assume-sane-operator-new");
2397
2398 // -fblocks=0 is default.
2399 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
2400 getToolChain().IsBlocksDefault()) ||
2401 (Args.hasArg(options::OPT_fgnu_runtime) &&
2402 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2403 !Args.hasArg(options::OPT_fno_blocks))) {
2404 CmdArgs.push_back("-fblocks");
2405
2406 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2407 !getToolChain().hasBlocksRuntime())
2408 CmdArgs.push_back("-fblocks-runtime-optional");
2409 }
2410
2411 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2412 // users must also pass -fcxx-modules. The latter flag will disappear once the
2413 // modules implementation is solid for C++/Objective-C++ programs as well.
2414 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2415 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2416 options::OPT_fno_cxx_modules,
2417 false);
2418 if (AllowedInCXX || !types::isCXX(InputType))
2419 CmdArgs.push_back("-fmodules");
2420 }
2421
2422 // -faccess-control is default.
2423 if (Args.hasFlag(options::OPT_fno_access_control,
2424 options::OPT_faccess_control,
2425 false))
2426 CmdArgs.push_back("-fno-access-control");
2427
2428 // -felide-constructors is the default.
2429 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2430 options::OPT_felide_constructors,
2431 false))
2432 CmdArgs.push_back("-fno-elide-constructors");
2433
2434 // -frtti is default.
2435 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2436 KernelOrKext)
2437 CmdArgs.push_back("-fno-rtti");
2438
2439 // -fshort-enums=0 is default for all architectures except Hexagon.
2440 if (Args.hasFlag(options::OPT_fshort_enums,
2441 options::OPT_fno_short_enums,
2442 getToolChain().getTriple().getArch() ==
2443 llvm::Triple::hexagon))
2444 CmdArgs.push_back("-fshort-enums");
2445
2446 // -fsigned-char is default.
2447 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
2448 isSignedCharDefault(getToolChain().getTriple())))
2449 CmdArgs.push_back("-fno-signed-char");
2450
2451 // -fthreadsafe-static is default.
2452 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
2453 options::OPT_fno_threadsafe_statics))
2454 CmdArgs.push_back("-fno-threadsafe-statics");
2455
2456 // -fuse-cxa-atexit is default.
2457 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2458 options::OPT_fno_use_cxa_atexit,
2459 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
2460 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
2461 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2462 KernelOrKext)
2463 CmdArgs.push_back("-fno-use-cxa-atexit");
2464
2465 // -fms-extensions=0 is default.
2466 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2467 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2468 CmdArgs.push_back("-fms-extensions");
2469
2470 // -fms-inline-asm.
2471 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2472 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
2473
2474 // -fms-compatibility=0 is default.
2475 if (Args.hasFlag(options::OPT_fms_compatibility,
2476 options::OPT_fno_ms_compatibility,
2477 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2478 Args.hasFlag(options::OPT_fms_extensions,
2479 options::OPT_fno_ms_extensions,
2480 true))))
2481 CmdArgs.push_back("-fms-compatibility");
2482
2483 // -fmsc-version=1300 is default.
2484 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2485 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2486 Args.hasArg(options::OPT_fmsc_version)) {
2487 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
2488 if (msc_ver.empty())
2489 CmdArgs.push_back("-fmsc-version=1300");
2490 else
2491 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2492 }
2493
2494
2495 // -fborland-extensions=0 is default.
2496 if (Args.hasFlag(options::OPT_fborland_extensions,
2497 options::OPT_fno_borland_extensions, false))
2498 CmdArgs.push_back("-fborland-extensions");
2499
2500 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2501 // needs it.
2502 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2503 options::OPT_fno_delayed_template_parsing,
2504 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2505 CmdArgs.push_back("-fdelayed-template-parsing");
2506
2507 // -fgnu-keywords default varies depending on language; only pass if
2508 // specified.
2509 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
2510 options::OPT_fno_gnu_keywords))
2511 A->render(Args, CmdArgs);
2512
2513 if (Args.hasFlag(options::OPT_fgnu89_inline,
2514 options::OPT_fno_gnu89_inline,
2515 false))
2516 CmdArgs.push_back("-fgnu89-inline");
2517
2518 if (Args.hasArg(options::OPT_fno_inline))
2519 CmdArgs.push_back("-fno-inline");
2520
2521 if (Args.hasArg(options::OPT_fno_inline_functions))
2522 CmdArgs.push_back("-fno-inline-functions");
2523
2524 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
2525
2526 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2527 // legacy is the default.
2528 if (objcRuntime.isNonFragile()) {
2529 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2530 options::OPT_fno_objc_legacy_dispatch,
2531 objcRuntime.isLegacyDispatchDefaultForArch(
2532 getToolChain().getTriple().getArch()))) {
2533 if (getToolChain().UseObjCMixedDispatch())
2534 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2535 else
2536 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2537 }
2538 }
2539
2540 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2541 // if the nonfragile objc abi is used.
2542 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
2543 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2544 }
2545
2546 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2547 // NOTE: This logic is duplicated in ToolChains.cpp.
2548 bool ARC = isObjCAutoRefCount(Args);
2549 if (ARC) {
2550 getToolChain().CheckObjCARC();
2551
2552 CmdArgs.push_back("-fobjc-arc");
2553
2554 // FIXME: It seems like this entire block, and several around it should be
2555 // wrapped in isObjC, but for now we just use it here as this is where it
2556 // was being used previously.
2557 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2558 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2559 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2560 else
2561 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2562 }
2563
2564 // Allow the user to enable full exceptions code emission.
2565 // We define off for Objective-CC, on for Objective-C++.
2566 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2567 options::OPT_fno_objc_arc_exceptions,
2568 /*default*/ types::isCXX(InputType)))
2569 CmdArgs.push_back("-fobjc-arc-exceptions");
2570 }
2571
2572 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2573 // rewriter.
2574 if (rewriteKind != RK_None)
2575 CmdArgs.push_back("-fno-objc-infer-related-result-type");
2576
2577 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2578 // takes precedence.
2579 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2580 if (!GCArg)
2581 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2582 if (GCArg) {
2583 if (ARC) {
2584 D.Diag(diag::err_drv_objc_gc_arr)
2585 << GCArg->getAsString(Args);
2586 } else if (getToolChain().SupportsObjCGC()) {
2587 GCArg->render(Args, CmdArgs);
2588 } else {
2589 // FIXME: We should move this to a hard error.
2590 D.Diag(diag::warn_drv_objc_gc_unsupported)
2591 << GCArg->getAsString(Args);
2592 }
2593 }
2594
2595 // Add exception args.
2596 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
2597 KernelOrKext, objcRuntime, CmdArgs);
2598
2599 if (getToolChain().UseSjLjExceptions())
2600 CmdArgs.push_back("-fsjlj-exceptions");
2601
2602 // C++ "sane" operator new.
2603 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2604 options::OPT_fno_assume_sane_operator_new))
2605 CmdArgs.push_back("-fno-assume-sane-operator-new");
2606
2607 // -fconstant-cfstrings is default, and may be subject to argument translation
2608 // on Darwin.
2609 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2610 options::OPT_fno_constant_cfstrings) ||
2611 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2612 options::OPT_mno_constant_cfstrings))
2613 CmdArgs.push_back("-fno-constant-cfstrings");
2614
2615 // -fshort-wchar default varies depending on platform; only
2616 // pass if specified.
2617 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2618 A->render(Args, CmdArgs);
2619
2620 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2621 // happened to translate to -mpascal-strings, we want to back translate here.
2622 //
2623 // FIXME: This is gross; that translation should be pulled from the
2624 // tool chain.
2625 if (Args.hasFlag(options::OPT_fpascal_strings,
2626 options::OPT_fno_pascal_strings,
2627 false) ||
2628 Args.hasFlag(options::OPT_mpascal_strings,
2629 options::OPT_mno_pascal_strings,
2630 false))
2631 CmdArgs.push_back("-fpascal-strings");
2632
2633 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2634 // -fno-pack-struct doesn't apply to -fpack-struct=.
2635 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
2636 std::string PackStructStr = "-fpack-struct=";
2637 PackStructStr += A->getValue(Args);
2638 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
2639 } else if (Args.hasFlag(options::OPT_fpack_struct,
2640 options::OPT_fno_pack_struct, false)) {
2641 CmdArgs.push_back("-fpack-struct=1");
2642 }
2643
2644 if (Args.hasArg(options::OPT_mkernel) ||
2645 Args.hasArg(options::OPT_fapple_kext)) {
2646 if (!Args.hasArg(options::OPT_fcommon))
2647 CmdArgs.push_back("-fno-common");
2648 Args.ClaimAllArgs(options::OPT_fno_common);
2649 }
2650
2651 // -fcommon is default, only pass non-default.
2652 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
2653 CmdArgs.push_back("-fno-common");
2654
2655 // -fsigned-bitfields is default, and clang doesn't yet support
2656 // -funsigned-bitfields.
2657 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
2658 options::OPT_funsigned_bitfields))
2659 D.Diag(diag::warn_drv_clang_unsupported)
2660 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2661
2662 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2663 if (!Args.hasFlag(options::OPT_ffor_scope,
2664 options::OPT_fno_for_scope))
2665 D.Diag(diag::err_drv_clang_unsupported)
2666 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2667
2668 // -fcaret-diagnostics is default.
2669 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2670 options::OPT_fno_caret_diagnostics, true))
2671 CmdArgs.push_back("-fno-caret-diagnostics");
2672
2673 // -fdiagnostics-fixit-info is default, only pass non-default.
2674 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
2675 options::OPT_fno_diagnostics_fixit_info))
2676 CmdArgs.push_back("-fno-diagnostics-fixit-info");
2677
2678 // Enable -fdiagnostics-show-option by default.
2679 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
2680 options::OPT_fno_diagnostics_show_option))
2681 CmdArgs.push_back("-fdiagnostics-show-option");
2682
2683 if (const Arg *A =
2684 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2685 CmdArgs.push_back("-fdiagnostics-show-category");
2686 CmdArgs.push_back(A->getValue(Args));
2687 }
2688
2689 if (const Arg *A =
2690 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2691 CmdArgs.push_back("-fdiagnostics-format");
2692 CmdArgs.push_back(A->getValue(Args));
2693 }
2694
2695 if (Arg *A = Args.getLastArg(
2696 options::OPT_fdiagnostics_show_note_include_stack,
2697 options::OPT_fno_diagnostics_show_note_include_stack)) {
2698 if (A->getOption().matches(
2699 options::OPT_fdiagnostics_show_note_include_stack))
2700 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2701 else
2702 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2703 }
2704
2705 // Color diagnostics are the default, unless the terminal doesn't support
2706 // them.
2707 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
2708 options::OPT_fno_color_diagnostics,
2709 llvm::sys::Process::StandardErrHasColors()))
2710 CmdArgs.push_back("-fcolor-diagnostics");
2711
2712 if (!Args.hasFlag(options::OPT_fshow_source_location,
2713 options::OPT_fno_show_source_location))
2714 CmdArgs.push_back("-fno-show-source-location");
2715
2716 if (!Args.hasFlag(options::OPT_fshow_column,
2717 options::OPT_fno_show_column,
2718 true))
2719 CmdArgs.push_back("-fno-show-column");
2720
2721 if (!Args.hasFlag(options::OPT_fspell_checking,
2722 options::OPT_fno_spell_checking))
2723 CmdArgs.push_back("-fno-spell-checking");
2724
2725
2726 // Silently ignore -fasm-blocks for now.
2727 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2728 false);
2729
2730 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2731 A->render(Args, CmdArgs);
2732
2733 // -fdollars-in-identifiers default varies depending on platform and
2734 // language; only pass if specified.
2735 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
2736 options::OPT_fno_dollars_in_identifiers)) {
2737 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
2738 CmdArgs.push_back("-fdollars-in-identifiers");
2739 else
2740 CmdArgs.push_back("-fno-dollars-in-identifiers");
2741 }
2742
2743 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2744 // practical purposes.
2745 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
2746 options::OPT_fno_unit_at_a_time)) {
2747 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
2748 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
2749 }
2750
2751 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2752 options::OPT_fno_apple_pragma_pack, false))
2753 CmdArgs.push_back("-fapple-pragma-pack");
2754
2755 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
2756 //
2757 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
2758 #if 0
2759 if (getToolChain().getTriple().isOSDarwin() &&
2760 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2761 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2762 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2763 CmdArgs.push_back("-fno-builtin-strcat");
2764 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2765 CmdArgs.push_back("-fno-builtin-strcpy");
2766 }
2767 #endif
2768
2769 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
2770 if (Arg *A = Args.getLastArg(options::OPT_traditional,
2771 options::OPT_traditional_cpp)) {
2772 if (isa<PreprocessJobAction>(JA))
2773 CmdArgs.push_back("-traditional-cpp");
2774 else
2775 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
2776 }
2777
2778 Args.AddLastArg(CmdArgs, options::OPT_dM);
2779 Args.AddLastArg(CmdArgs, options::OPT_dD);
2780
2781 // Handle serialized diagnostics.
2782 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2783 CmdArgs.push_back("-serialize-diagnostic-file");
2784 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2785 }
2786
2787 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2788 // parser.
2789 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
2790 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2791 ie = Args.filtered_end(); it != ie; ++it) {
2792 (*it)->claim();
2793
2794 // We translate this by hand to the -cc1 argument, since nightly test uses
2795 // it and developers have been trained to spell it with -mllvm.
2796 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
2797 CmdArgs.push_back("-disable-llvm-optzns");
2798 else
2799 (*it)->render(Args, CmdArgs);
2800 }
2801
2802 if (Output.getType() == types::TY_Dependencies) {
2803 // Handled with other dependency code.
2804 } else if (Output.isFilename()) {
2805 CmdArgs.push_back("-o");
2806 CmdArgs.push_back(Output.getFilename());
2807 } else {
2808 assert(Output.isNothing() && "Invalid output.");
2809 }
2810
2811 for (InputInfoList::const_iterator
2812 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2813 const InputInfo &II = *it;
2814 CmdArgs.push_back("-x");
2815 CmdArgs.push_back(types::getTypeName(II.getType()));
2816 if (II.isFilename())
2817 CmdArgs.push_back(II.getFilename());
2818 else
2819 II.getInputArg().renderAsInput(Args, CmdArgs);
2820 }
2821
2822 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2823
2824 const char *Exec = getToolChain().getDriver().getClangProgramPath();
2825
2826 // Optionally embed the -cc1 level arguments into the debug info, for build
2827 // analysis.
2828 if (getToolChain().UseDwarfDebugFlags()) {
2829 ArgStringList OriginalArgs;
2830 for (ArgList::const_iterator it = Args.begin(),
2831 ie = Args.end(); it != ie; ++it)
2832 (*it)->render(Args, OriginalArgs);
2833
2834 SmallString<256> Flags;
2835 Flags += Exec;
2836 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
2837 Flags += " ";
2838 Flags += OriginalArgs[i];
2839 }
2840 CmdArgs.push_back("-dwarf-debug-flags");
2841 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2842 }
2843
2844 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
2845
2846 if (Arg *A = Args.getLastArg(options::OPT_pg))
2847 if (Args.hasArg(options::OPT_fomit_frame_pointer))
2848 D.Diag(diag::err_drv_argument_not_allowed_with)
2849 << "-fomit-frame-pointer" << A->getAsString(Args);
2850
2851 // Claim some arguments which clang supports automatically.
2852
2853 // -fpch-preprocess is used with gcc to add a special marker in the output to
2854 // include the PCH file. Clang's PTH solution is completely transparent, so we
2855 // do not need to deal with it at all.
2856 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
2857
2858 // Claim some arguments which clang doesn't support, but we don't
2859 // care to warn the user about.
2860 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2861 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
2862
2863 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
2864 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
2865 Args.ClaimAllArgs(options::OPT_emit_llvm);
2866 }
2867
AddARMTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const2868 void ClangAs::AddARMTargetArgs(const ArgList &Args,
2869 ArgStringList &CmdArgs) const {
2870 const Driver &D = getToolChain().getDriver();
2871 llvm::Triple Triple = getToolChain().getTriple();
2872
2873 // Set the CPU based on -march= and -mcpu=.
2874 CmdArgs.push_back("-target-cpu");
2875 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
2876
2877 // Honor -mfpu=.
2878 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
2879 addFPUArgs(D, A, Args, CmdArgs);
2880
2881 // Honor -mfpmath=.
2882 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
2883 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
2884 }
2885
2886 /// Add options related to the Objective-C runtime/ABI.
2887 ///
2888 /// Returns true if the runtime is non-fragile.
AddObjCRuntimeArgs(const ArgList & args,ArgStringList & cmdArgs,RewriteKind rewriteKind) const2889 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2890 ArgStringList &cmdArgs,
2891 RewriteKind rewriteKind) const {
2892 // Look for the controlling runtime option.
2893 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2894 options::OPT_fgnu_runtime,
2895 options::OPT_fobjc_runtime_EQ);
2896
2897 // Just forward -fobjc-runtime= to the frontend. This supercedes
2898 // options about fragility.
2899 if (runtimeArg &&
2900 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2901 ObjCRuntime runtime;
2902 StringRef value = runtimeArg->getValue(args);
2903 if (runtime.tryParse(value)) {
2904 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2905 << value;
2906 }
2907
2908 runtimeArg->render(args, cmdArgs);
2909 return runtime;
2910 }
2911
2912 // Otherwise, we'll need the ABI "version". Version numbers are
2913 // slightly confusing for historical reasons:
2914 // 1 - Traditional "fragile" ABI
2915 // 2 - Non-fragile ABI, version 1
2916 // 3 - Non-fragile ABI, version 2
2917 unsigned objcABIVersion = 1;
2918 // If -fobjc-abi-version= is present, use that to set the version.
2919 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2920 StringRef value = abiArg->getValue(args);
2921 if (value == "1")
2922 objcABIVersion = 1;
2923 else if (value == "2")
2924 objcABIVersion = 2;
2925 else if (value == "3")
2926 objcABIVersion = 3;
2927 else
2928 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2929 << value;
2930 } else {
2931 // Otherwise, determine if we are using the non-fragile ABI.
2932 bool nonFragileABIIsDefault =
2933 (rewriteKind == RK_NonFragile ||
2934 (rewriteKind == RK_None &&
2935 getToolChain().IsObjCNonFragileABIDefault()));
2936 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2937 options::OPT_fno_objc_nonfragile_abi,
2938 nonFragileABIIsDefault)) {
2939 // Determine the non-fragile ABI version to use.
2940 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2941 unsigned nonFragileABIVersion = 1;
2942 #else
2943 unsigned nonFragileABIVersion = 2;
2944 #endif
2945
2946 if (Arg *abiArg = args.getLastArg(
2947 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2948 StringRef value = abiArg->getValue(args);
2949 if (value == "1")
2950 nonFragileABIVersion = 1;
2951 else if (value == "2")
2952 nonFragileABIVersion = 2;
2953 else
2954 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2955 << value;
2956 }
2957
2958 objcABIVersion = 1 + nonFragileABIVersion;
2959 } else {
2960 objcABIVersion = 1;
2961 }
2962 }
2963
2964 // We don't actually care about the ABI version other than whether
2965 // it's non-fragile.
2966 bool isNonFragile = objcABIVersion != 1;
2967
2968 // If we have no runtime argument, ask the toolchain for its default runtime.
2969 // However, the rewriter only really supports the Mac runtime, so assume that.
2970 ObjCRuntime runtime;
2971 if (!runtimeArg) {
2972 switch (rewriteKind) {
2973 case RK_None:
2974 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2975 break;
2976 case RK_Fragile:
2977 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2978 break;
2979 case RK_NonFragile:
2980 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2981 break;
2982 }
2983
2984 // -fnext-runtime
2985 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2986 // On Darwin, make this use the default behavior for the toolchain.
2987 if (getToolChain().getTriple().isOSDarwin()) {
2988 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2989
2990 // Otherwise, build for a generic macosx port.
2991 } else {
2992 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2993 }
2994
2995 // -fgnu-runtime
2996 } else {
2997 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
2998 // Legacy behaviour is to target the gnustep runtime if we are i
2999 // non-fragile mode or the GCC runtime in fragile mode.
3000 if (isNonFragile)
3001 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3002 else
3003 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
3004 }
3005
3006 cmdArgs.push_back(args.MakeArgString(
3007 "-fobjc-runtime=" + runtime.getAsString()));
3008 return runtime;
3009 }
3010
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3011 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
3012 const InputInfo &Output,
3013 const InputInfoList &Inputs,
3014 const ArgList &Args,
3015 const char *LinkingOutput) const {
3016 ArgStringList CmdArgs;
3017
3018 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3019 const InputInfo &Input = Inputs[0];
3020
3021 // Don't warn about "clang -w -c foo.s"
3022 Args.ClaimAllArgs(options::OPT_w);
3023 // and "clang -emit-llvm -c foo.s"
3024 Args.ClaimAllArgs(options::OPT_emit_llvm);
3025 // and "clang -use-gold-plugin -c foo.s"
3026 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
3027
3028 // Invoke ourselves in -cc1as mode.
3029 //
3030 // FIXME: Implement custom jobs for internal actions.
3031 CmdArgs.push_back("-cc1as");
3032
3033 // Add the "effective" target triple.
3034 CmdArgs.push_back("-triple");
3035 std::string TripleStr =
3036 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
3037 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3038
3039 // Set the output mode, we currently only expect to be used as a real
3040 // assembler.
3041 CmdArgs.push_back("-filetype");
3042 CmdArgs.push_back("obj");
3043
3044 if (UseRelaxAll(C, Args))
3045 CmdArgs.push_back("-relax-all");
3046
3047 // Add target specific cpu and features flags.
3048 switch(getToolChain().getTriple().getArch()) {
3049 default:
3050 break;
3051
3052 case llvm::Triple::arm:
3053 case llvm::Triple::thumb:
3054 AddARMTargetArgs(Args, CmdArgs);
3055 break;
3056 }
3057
3058 // Ignore explicit -force_cpusubtype_ALL option.
3059 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
3060
3061 // Determine the original source input.
3062 const Action *SourceAction = &JA;
3063 while (SourceAction->getKind() != Action::InputClass) {
3064 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3065 SourceAction = SourceAction->getInputs()[0];
3066 }
3067
3068 // Forward -g, assuming we are dealing with an actual assembly file.
3069 if (SourceAction->getType() == types::TY_Asm ||
3070 SourceAction->getType() == types::TY_PP_Asm) {
3071 Args.ClaimAllArgs(options::OPT_g_Group);
3072 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3073 if (!A->getOption().matches(options::OPT_g0))
3074 CmdArgs.push_back("-g");
3075 }
3076
3077 // Optionally embed the -cc1as level arguments into the debug info, for build
3078 // analysis.
3079 if (getToolChain().UseDwarfDebugFlags()) {
3080 ArgStringList OriginalArgs;
3081 for (ArgList::const_iterator it = Args.begin(),
3082 ie = Args.end(); it != ie; ++it)
3083 (*it)->render(Args, OriginalArgs);
3084
3085 SmallString<256> Flags;
3086 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3087 Flags += Exec;
3088 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3089 Flags += " ";
3090 Flags += OriginalArgs[i];
3091 }
3092 CmdArgs.push_back("-dwarf-debug-flags");
3093 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3094 }
3095
3096 // FIXME: Add -static support, once we have it.
3097
3098 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3099 options::OPT_Xassembler);
3100 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
3101
3102 assert(Output.isFilename() && "Unexpected lipo output.");
3103 CmdArgs.push_back("-o");
3104 CmdArgs.push_back(Output.getFilename());
3105
3106 assert(Input.isFilename() && "Invalid input.");
3107 CmdArgs.push_back(Input.getFilename());
3108
3109 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3111 }
3112
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3113 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
3114 const InputInfo &Output,
3115 const InputInfoList &Inputs,
3116 const ArgList &Args,
3117 const char *LinkingOutput) const {
3118 const Driver &D = getToolChain().getDriver();
3119 ArgStringList CmdArgs;
3120
3121 for (ArgList::const_iterator
3122 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3123 Arg *A = *it;
3124 if (A->getOption().hasForwardToGCC()) {
3125 // Don't forward any -g arguments to assembly steps.
3126 if (isa<AssembleJobAction>(JA) &&
3127 A->getOption().matches(options::OPT_g_Group))
3128 continue;
3129
3130 // It is unfortunate that we have to claim here, as this means
3131 // we will basically never report anything interesting for
3132 // platforms using a generic gcc, even if we are just using gcc
3133 // to get to the assembler.
3134 A->claim();
3135 A->render(Args, CmdArgs);
3136 }
3137 }
3138
3139 RenderExtraToolArgs(JA, CmdArgs);
3140
3141 // If using a driver driver, force the arch.
3142 const std::string &Arch = getToolChain().getArchName();
3143 if (getToolChain().getTriple().isOSDarwin()) {
3144 CmdArgs.push_back("-arch");
3145
3146 // FIXME: Remove these special cases.
3147 if (Arch == "powerpc")
3148 CmdArgs.push_back("ppc");
3149 else if (Arch == "powerpc64")
3150 CmdArgs.push_back("ppc64");
3151 else
3152 CmdArgs.push_back(Args.MakeArgString(Arch));
3153 }
3154
3155 // Try to force gcc to match the tool chain we want, if we recognize
3156 // the arch.
3157 //
3158 // FIXME: The triple class should directly provide the information we want
3159 // here.
3160 if (Arch == "i386" || Arch == "powerpc")
3161 CmdArgs.push_back("-m32");
3162 else if (Arch == "x86_64" || Arch == "powerpc64")
3163 CmdArgs.push_back("-m64");
3164
3165 if (Output.isFilename()) {
3166 CmdArgs.push_back("-o");
3167 CmdArgs.push_back(Output.getFilename());
3168 } else {
3169 assert(Output.isNothing() && "Unexpected output");
3170 CmdArgs.push_back("-fsyntax-only");
3171 }
3172
3173 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3174 options::OPT_Xassembler);
3175
3176 // Only pass -x if gcc will understand it; otherwise hope gcc
3177 // understands the suffix correctly. The main use case this would go
3178 // wrong in is for linker inputs if they happened to have an odd
3179 // suffix; really the only way to get this to happen is a command
3180 // like '-x foobar a.c' which will treat a.c like a linker input.
3181 //
3182 // FIXME: For the linker case specifically, can we safely convert
3183 // inputs into '-Wl,' options?
3184 for (InputInfoList::const_iterator
3185 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3186 const InputInfo &II = *it;
3187
3188 // Don't try to pass LLVM or AST inputs to a generic gcc.
3189 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3190 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3191 D.Diag(diag::err_drv_no_linker_llvm_support)
3192 << getToolChain().getTripleString();
3193 else if (II.getType() == types::TY_AST)
3194 D.Diag(diag::err_drv_no_ast_support)
3195 << getToolChain().getTripleString();
3196
3197 if (types::canTypeBeUserSpecified(II.getType())) {
3198 CmdArgs.push_back("-x");
3199 CmdArgs.push_back(types::getTypeName(II.getType()));
3200 }
3201
3202 if (II.isFilename())
3203 CmdArgs.push_back(II.getFilename());
3204 else {
3205 const Arg &A = II.getInputArg();
3206
3207 // Reverse translate some rewritten options.
3208 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3209 CmdArgs.push_back("-lstdc++");
3210 continue;
3211 }
3212
3213 // Don't render as input, we need gcc to do the translations.
3214 A.render(Args, CmdArgs);
3215 }
3216 }
3217
3218 const std::string customGCCName = D.getCCCGenericGCCName();
3219 const char *GCCName;
3220 if (!customGCCName.empty())
3221 GCCName = customGCCName.c_str();
3222 else if (D.CCCIsCXX) {
3223 GCCName = "g++";
3224 } else
3225 GCCName = "gcc";
3226
3227 const char *Exec =
3228 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3229 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3230 }
3231
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3232 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3233 ArgStringList &CmdArgs) const {
3234 CmdArgs.push_back("-E");
3235 }
3236
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3237 void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3238 ArgStringList &CmdArgs) const {
3239 // The type is good enough.
3240 }
3241
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3242 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3243 ArgStringList &CmdArgs) const {
3244 const Driver &D = getToolChain().getDriver();
3245
3246 // If -flto, etc. are present then make sure not to force assembly output.
3247 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3248 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
3249 CmdArgs.push_back("-c");
3250 else {
3251 if (JA.getType() != types::TY_PP_Asm)
3252 D.Diag(diag::err_drv_invalid_gcc_output_type)
3253 << getTypeName(JA.getType());
3254
3255 CmdArgs.push_back("-S");
3256 }
3257 }
3258
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3259 void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3260 ArgStringList &CmdArgs) const {
3261 CmdArgs.push_back("-c");
3262 }
3263
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3264 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3265 ArgStringList &CmdArgs) const {
3266 // The types are (hopefully) good enough.
3267 }
3268
3269 // Hexagon tools start.
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3270 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3271 ArgStringList &CmdArgs) const {
3272
3273 }
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3274 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3275 const InputInfo &Output,
3276 const InputInfoList &Inputs,
3277 const ArgList &Args,
3278 const char *LinkingOutput) const {
3279
3280 const Driver &D = getToolChain().getDriver();
3281 ArgStringList CmdArgs;
3282
3283 std::string MarchString = "-march=";
3284 MarchString += getHexagonTargetCPU(Args);
3285 CmdArgs.push_back(Args.MakeArgString(MarchString));
3286
3287 RenderExtraToolArgs(JA, CmdArgs);
3288
3289 if (Output.isFilename()) {
3290 CmdArgs.push_back("-o");
3291 CmdArgs.push_back(Output.getFilename());
3292 } else {
3293 assert(Output.isNothing() && "Unexpected output");
3294 CmdArgs.push_back("-fsyntax-only");
3295 }
3296
3297
3298 // Only pass -x if gcc will understand it; otherwise hope gcc
3299 // understands the suffix correctly. The main use case this would go
3300 // wrong in is for linker inputs if they happened to have an odd
3301 // suffix; really the only way to get this to happen is a command
3302 // like '-x foobar a.c' which will treat a.c like a linker input.
3303 //
3304 // FIXME: For the linker case specifically, can we safely convert
3305 // inputs into '-Wl,' options?
3306 for (InputInfoList::const_iterator
3307 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3308 const InputInfo &II = *it;
3309
3310 // Don't try to pass LLVM or AST inputs to a generic gcc.
3311 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3312 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3313 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3314 << getToolChain().getTripleString();
3315 else if (II.getType() == types::TY_AST)
3316 D.Diag(clang::diag::err_drv_no_ast_support)
3317 << getToolChain().getTripleString();
3318
3319 if (II.isFilename())
3320 CmdArgs.push_back(II.getFilename());
3321 else
3322 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3323 II.getInputArg().render(Args, CmdArgs);
3324 }
3325
3326 const char *GCCName = "hexagon-as";
3327 const char *Exec =
3328 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3329 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3330
3331 }
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const3332 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3333 ArgStringList &CmdArgs) const {
3334 // The types are (hopefully) good enough.
3335 }
3336
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3337 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3338 const InputInfo &Output,
3339 const InputInfoList &Inputs,
3340 const ArgList &Args,
3341 const char *LinkingOutput) const {
3342
3343 const Driver &D = getToolChain().getDriver();
3344 ArgStringList CmdArgs;
3345
3346 for (ArgList::const_iterator
3347 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3348 Arg *A = *it;
3349 if (A->getOption().hasForwardToGCC()) {
3350 // Don't forward any -g arguments to assembly steps.
3351 if (isa<AssembleJobAction>(JA) &&
3352 A->getOption().matches(options::OPT_g_Group))
3353 continue;
3354
3355 // It is unfortunate that we have to claim here, as this means
3356 // we will basically never report anything interesting for
3357 // platforms using a generic gcc, even if we are just using gcc
3358 // to get to the assembler.
3359 A->claim();
3360 A->render(Args, CmdArgs);
3361 }
3362 }
3363
3364 RenderExtraToolArgs(JA, CmdArgs);
3365
3366 // Add Arch Information
3367 Arg *A;
3368 if ((A = getLastHexagonArchArg(Args))) {
3369 if (A->getOption().matches(options::OPT_m_Joined))
3370 A->render(Args, CmdArgs);
3371 else
3372 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3373 }
3374 else {
3375 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3376 }
3377
3378 CmdArgs.push_back("-mqdsp6-compat");
3379
3380 const char *GCCName;
3381 if (C.getDriver().CCCIsCXX)
3382 GCCName = "hexagon-g++";
3383 else
3384 GCCName = "hexagon-gcc";
3385 const char *Exec =
3386 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3387
3388 if (Output.isFilename()) {
3389 CmdArgs.push_back("-o");
3390 CmdArgs.push_back(Output.getFilename());
3391 }
3392
3393 for (InputInfoList::const_iterator
3394 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3395 const InputInfo &II = *it;
3396
3397 // Don't try to pass LLVM or AST inputs to a generic gcc.
3398 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3399 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3400 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3401 << getToolChain().getTripleString();
3402 else if (II.getType() == types::TY_AST)
3403 D.Diag(clang::diag::err_drv_no_ast_support)
3404 << getToolChain().getTripleString();
3405
3406 if (II.isFilename())
3407 CmdArgs.push_back(II.getFilename());
3408 else
3409 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3410 II.getInputArg().render(Args, CmdArgs);
3411 }
3412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3413
3414 }
3415 // Hexagon tools end.
3416
3417
getCC1Name(types::ID Type) const3418 const char *darwin::CC1::getCC1Name(types::ID Type) const {
3419 switch (Type) {
3420 default:
3421 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
3422 case types::TY_Asm:
3423 case types::TY_C: case types::TY_CHeader:
3424 case types::TY_PP_C: case types::TY_PP_CHeader:
3425 return "cc1";
3426 case types::TY_ObjC: case types::TY_ObjCHeader:
3427 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3428 case types::TY_PP_ObjCHeader:
3429 return "cc1obj";
3430 case types::TY_CXX: case types::TY_CXXHeader:
3431 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3432 return "cc1plus";
3433 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
3434 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3435 case types::TY_PP_ObjCXXHeader:
3436 return "cc1objplus";
3437 }
3438 }
3439
anchor()3440 void darwin::CC1::anchor() {}
3441
getBaseInputName(const ArgList & Args,const InputInfoList & Inputs)3442 const char *darwin::CC1::getBaseInputName(const ArgList &Args,
3443 const InputInfoList &Inputs) {
3444 return Args.MakeArgString(
3445 llvm::sys::path::filename(Inputs[0].getBaseInput()));
3446 }
3447
getBaseInputStem(const ArgList & Args,const InputInfoList & Inputs)3448 const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
3449 const InputInfoList &Inputs) {
3450 const char *Str = getBaseInputName(Args, Inputs);
3451
3452 if (const char *End = strrchr(Str, '.'))
3453 return Args.MakeArgString(std::string(Str, End));
3454
3455 return Str;
3456 }
3457
3458 const char *
getDependencyFileName(const ArgList & Args,const InputInfoList & Inputs)3459 darwin::CC1::getDependencyFileName(const ArgList &Args,
3460 const InputInfoList &Inputs) {
3461 // FIXME: Think about this more.
3462 std::string Res;
3463
3464 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3465 std::string Str(OutputOpt->getValue(Args));
3466 Res = Str.substr(0, Str.rfind('.'));
3467 } else {
3468 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
3469 }
3470 return Args.MakeArgString(Res + ".d");
3471 }
3472
RemoveCC1UnsupportedArgs(ArgStringList & CmdArgs) const3473 void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
3474 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
3475 it != ie;) {
3476
3477 StringRef Option = *it;
3478 bool RemoveOption = false;
3479
3480 // Erase both -fmodule-cache-path and its argument.
3481 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3482 it = CmdArgs.erase(it, it+2);
3483 ie = CmdArgs.end();
3484 continue;
3485 }
3486
3487 // Remove unsupported -f options.
3488 if (Option.startswith("-f")) {
3489 // Remove -f/-fno- to reduce the number of cases.
3490 if (Option.startswith("-fno-"))
3491 Option = Option.substr(5);
3492 else
3493 Option = Option.substr(2);
3494 RemoveOption = llvm::StringSwitch<bool>(Option)
3495 .Case("altivec", true)
3496 .Case("modules", true)
3497 .Case("diagnostics-show-note-include-stack", true)
3498 .Default(false);
3499 }
3500
3501 // Handle machine specific options.
3502 if (Option.startswith("-m")) {
3503 RemoveOption = llvm::StringSwitch<bool>(Option)
3504 .Case("-mthumb", true)
3505 .Case("-mno-thumb", true)
3506 .Case("-mno-fused-madd", true)
3507 .Case("-mlong-branch", true)
3508 .Case("-mlongcall", true)
3509 .Case("-mcpu=G4", true)
3510 .Case("-mcpu=G5", true)
3511 .Default(false);
3512 }
3513
3514 // Handle warning options.
3515 if (Option.startswith("-W")) {
3516 // Remove -W/-Wno- to reduce the number of cases.
3517 if (Option.startswith("-Wno-"))
3518 Option = Option.substr(5);
3519 else
3520 Option = Option.substr(2);
3521
3522 RemoveOption = llvm::StringSwitch<bool>(Option)
3523 .Case("address-of-temporary", true)
3524 .Case("ambiguous-member-template", true)
3525 .Case("analyzer-incompatible-plugin", true)
3526 .Case("array-bounds", true)
3527 .Case("array-bounds-pointer-arithmetic", true)
3528 .Case("bind-to-temporary-copy", true)
3529 .Case("bitwise-op-parentheses", true)
3530 .Case("bool-conversions", true)
3531 .Case("builtin-macro-redefined", true)
3532 .Case("c++-hex-floats", true)
3533 .Case("c++0x-compat", true)
3534 .Case("c++0x-extensions", true)
3535 .Case("c++0x-narrowing", true)
3536 .Case("c++11-compat", true)
3537 .Case("c++11-extensions", true)
3538 .Case("c++11-narrowing", true)
3539 .Case("conditional-uninitialized", true)
3540 .Case("constant-conversion", true)
3541 .Case("conversion-null", true)
3542 .Case("CFString-literal", true)
3543 .Case("constant-logical-operand", true)
3544 .Case("custom-atomic-properties", true)
3545 .Case("default-arg-special-member", true)
3546 .Case("delegating-ctor-cycles", true)
3547 .Case("delete-non-virtual-dtor", true)
3548 .Case("deprecated-implementations", true)
3549 .Case("deprecated-writable-strings", true)
3550 .Case("distributed-object-modifiers", true)
3551 .Case("duplicate-method-arg", true)
3552 .Case("dynamic-class-memaccess", true)
3553 .Case("enum-compare", true)
3554 .Case("exit-time-destructors", true)
3555 .Case("gnu", true)
3556 .Case("gnu-designator", true)
3557 .Case("header-hygiene", true)
3558 .Case("idiomatic-parentheses", true)
3559 .Case("ignored-qualifiers", true)
3560 .Case("implicit-atomic-properties", true)
3561 .Case("incompatible-pointer-types", true)
3562 .Case("incomplete-implementation", true)
3563 .Case("initializer-overrides", true)
3564 .Case("invalid-noreturn", true)
3565 .Case("invalid-token-paste", true)
3566 .Case("language-extension-token", true)
3567 .Case("literal-conversion", true)
3568 .Case("literal-range", true)
3569 .Case("local-type-template-args", true)
3570 .Case("logical-op-parentheses", true)
3571 .Case("method-signatures", true)
3572 .Case("microsoft", true)
3573 .Case("mismatched-tags", true)
3574 .Case("missing-method-return-type", true)
3575 .Case("non-pod-varargs", true)
3576 .Case("nonfragile-abi2", true)
3577 .Case("null-arithmetic", true)
3578 .Case("null-dereference", true)
3579 .Case("out-of-line-declaration", true)
3580 .Case("overriding-method-mismatch", true)
3581 .Case("readonly-setter-attrs", true)
3582 .Case("return-stack-address", true)
3583 .Case("self-assign", true)
3584 .Case("semicolon-before-method-body", true)
3585 .Case("sentinel", true)
3586 .Case("shift-overflow", true)
3587 .Case("shift-sign-overflow", true)
3588 .Case("sign-conversion", true)
3589 .Case("sizeof-array-argument", true)
3590 .Case("sizeof-pointer-memaccess", true)
3591 .Case("string-compare", true)
3592 .Case("super-class-method-mismatch", true)
3593 .Case("tautological-compare", true)
3594 .Case("typedef-redefinition", true)
3595 .Case("typename-missing", true)
3596 .Case("undefined-reinterpret-cast", true)
3597 .Case("unknown-warning-option", true)
3598 .Case("unnamed-type-template-args", true)
3599 .Case("unneeded-internal-declaration", true)
3600 .Case("unneeded-member-function", true)
3601 .Case("unused-comparison", true)
3602 .Case("unused-exception-parameter", true)
3603 .Case("unused-member-function", true)
3604 .Case("unused-result", true)
3605 .Case("vector-conversions", true)
3606 .Case("vla", true)
3607 .Case("used-but-marked-unused", true)
3608 .Case("weak-vtables", true)
3609 .Default(false);
3610 } // if (Option.startswith("-W"))
3611 if (RemoveOption) {
3612 it = CmdArgs.erase(it);
3613 ie = CmdArgs.end();
3614 } else {
3615 ++it;
3616 }
3617 }
3618 }
3619
AddCC1Args(const ArgList & Args,ArgStringList & CmdArgs) const3620 void darwin::CC1::AddCC1Args(const ArgList &Args,
3621 ArgStringList &CmdArgs) const {
3622 const Driver &D = getToolChain().getDriver();
3623
3624 CheckCodeGenerationOptions(D, Args);
3625
3626 // Derived from cc1 spec.
3627 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3628 !Args.hasArg(options::OPT_mdynamic_no_pic))
3629 CmdArgs.push_back("-fPIC");
3630
3631 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3632 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3633 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3634 CmdArgs.push_back("-fno-builtin-strcat");
3635 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3636 CmdArgs.push_back("-fno-builtin-strcpy");
3637 }
3638
3639 if (Args.hasArg(options::OPT_g_Flag) &&
3640 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3641 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3642 }
3643
AddCC1OptionsArgs(const ArgList & Args,ArgStringList & CmdArgs,const InputInfoList & Inputs,const ArgStringList & OutputArgs) const3644 void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3645 const InputInfoList &Inputs,
3646 const ArgStringList &OutputArgs) const {
3647 const Driver &D = getToolChain().getDriver();
3648
3649 // Derived from cc1_options spec.
3650 if (Args.hasArg(options::OPT_fast) ||
3651 Args.hasArg(options::OPT_fastf) ||
3652 Args.hasArg(options::OPT_fastcp))
3653 CmdArgs.push_back("-O3");
3654
3655 if (Arg *A = Args.getLastArg(options::OPT_pg))
3656 if (Args.hasArg(options::OPT_fomit_frame_pointer))
3657 D.Diag(diag::err_drv_argument_not_allowed_with)
3658 << A->getAsString(Args) << "-fomit-frame-pointer";
3659
3660 AddCC1Args(Args, CmdArgs);
3661
3662 if (!Args.hasArg(options::OPT_Q))
3663 CmdArgs.push_back("-quiet");
3664
3665 CmdArgs.push_back("-dumpbase");
3666 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
3667
3668 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3669
3670 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3671 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3672
3673 // FIXME: The goal is to use the user provided -o if that is our
3674 // final output, otherwise to drive from the original input
3675 // name. Find a clean way to go about this.
3676 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3677 Args.hasArg(options::OPT_o)) {
3678 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3679 CmdArgs.push_back("-auxbase-strip");
3680 CmdArgs.push_back(OutputOpt->getValue(Args));
3681 } else {
3682 CmdArgs.push_back("-auxbase");
3683 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
3684 }
3685
3686 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3687
3688 Args.AddAllArgs(CmdArgs, options::OPT_O);
3689 // FIXME: -Wall is getting some special treatment. Investigate.
3690 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3691 Args.AddLastArg(CmdArgs, options::OPT_w);
3692 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
3693 options::OPT_trigraphs);
3694 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3695 // Honor -std-default.
3696 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3697 "-std=", /*Joined=*/true);
3698 }
3699
3700 if (Args.hasArg(options::OPT_v))
3701 CmdArgs.push_back("-version");
3702 if (Args.hasArg(options::OPT_pg) &&
3703 getToolChain().SupportsProfiling())
3704 CmdArgs.push_back("-p");
3705 Args.AddLastArg(CmdArgs, options::OPT_p);
3706
3707 // The driver treats -fsyntax-only specially.
3708 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3709 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3710 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3711 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3712 //
3713 // FIXME: Should we grow a better way to deal with "removing" args?
3714 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3715 options::OPT_fsyntax_only),
3716 ie = Args.filtered_end(); it != ie; ++it) {
3717 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3718 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3719 (*it)->claim();
3720 (*it)->render(Args, CmdArgs);
3721 }
3722 }
3723 } else
3724 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3725
3726 // Claim Clang only -f options, they aren't worth warning about.
3727 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3728
3729 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3730 if (Args.hasArg(options::OPT_Qn))
3731 CmdArgs.push_back("-fno-ident");
3732
3733 // FIXME: This isn't correct.
3734 //Args.AddLastArg(CmdArgs, options::OPT__help)
3735 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3736
3737 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3738
3739 // FIXME: Still don't get what is happening here. Investigate.
3740 Args.AddAllArgs(CmdArgs, options::OPT__param);
3741
3742 if (Args.hasArg(options::OPT_fmudflap) ||
3743 Args.hasArg(options::OPT_fmudflapth)) {
3744 CmdArgs.push_back("-fno-builtin");
3745 CmdArgs.push_back("-fno-merge-constants");
3746 }
3747
3748 if (Args.hasArg(options::OPT_coverage)) {
3749 CmdArgs.push_back("-fprofile-arcs");
3750 CmdArgs.push_back("-ftest-coverage");
3751 }
3752
3753 if (types::isCXX(Inputs[0].getType()))
3754 CmdArgs.push_back("-D__private_extern__=extern");
3755 }
3756
AddCPPOptionsArgs(const ArgList & Args,ArgStringList & CmdArgs,const InputInfoList & Inputs,const ArgStringList & OutputArgs) const3757 void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3758 const InputInfoList &Inputs,
3759 const ArgStringList &OutputArgs) const {
3760 // Derived from cpp_options
3761 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
3762
3763 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3764
3765 AddCC1Args(Args, CmdArgs);
3766
3767 // NOTE: The code below has some commonality with cpp_options, but
3768 // in classic gcc style ends up sending things in different
3769 // orders. This may be a good merge candidate once we drop pedantic
3770 // compatibility.
3771
3772 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3773 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
3774 options::OPT_trigraphs);
3775 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3776 // Honor -std-default.
3777 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3778 "-std=", /*Joined=*/true);
3779 }
3780 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3781 Args.AddLastArg(CmdArgs, options::OPT_w);
3782
3783 // The driver treats -fsyntax-only specially.
3784 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3785
3786 // Claim Clang only -f options, they aren't worth warning about.
3787 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3788
3789 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3790 !Args.hasArg(options::OPT_fno_working_directory))
3791 CmdArgs.push_back("-fworking-directory");
3792
3793 Args.AddAllArgs(CmdArgs, options::OPT_O);
3794 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3795 if (Args.hasArg(options::OPT_save_temps))
3796 CmdArgs.push_back("-fpch-preprocess");
3797 }
3798
AddCPPUniqueOptionsArgs(const ArgList & Args,ArgStringList & CmdArgs,const InputInfoList & Inputs) const3799 void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
3800 ArgStringList &CmdArgs,
3801 const InputInfoList &Inputs) const {
3802 const Driver &D = getToolChain().getDriver();
3803
3804 CheckPreprocessingOptions(D, Args);
3805
3806 // Derived from cpp_unique_options.
3807 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3808 Args.AddLastArg(CmdArgs, options::OPT_C);
3809 Args.AddLastArg(CmdArgs, options::OPT_CC);
3810 if (!Args.hasArg(options::OPT_Q))
3811 CmdArgs.push_back("-quiet");
3812 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
3813 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
3814 Args.AddLastArg(CmdArgs, options::OPT_v);
3815 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3816 Args.AddLastArg(CmdArgs, options::OPT_P);
3817
3818 // FIXME: Handle %I properly.
3819 if (getToolChain().getArchName() == "x86_64") {
3820 CmdArgs.push_back("-imultilib");
3821 CmdArgs.push_back("x86_64");
3822 }
3823
3824 if (Args.hasArg(options::OPT_MD)) {
3825 CmdArgs.push_back("-MD");
3826 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
3827 }
3828
3829 if (Args.hasArg(options::OPT_MMD)) {
3830 CmdArgs.push_back("-MMD");
3831 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
3832 }
3833
3834 Args.AddLastArg(CmdArgs, options::OPT_M);
3835 Args.AddLastArg(CmdArgs, options::OPT_MM);
3836 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3837 Args.AddLastArg(CmdArgs, options::OPT_MG);
3838 Args.AddLastArg(CmdArgs, options::OPT_MP);
3839 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3840 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3841 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3842 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3843 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3844 CmdArgs.push_back("-MQ");
3845 CmdArgs.push_back(OutputOpt->getValue(Args));
3846 }
3847 }
3848
3849 Args.AddLastArg(CmdArgs, options::OPT_remap);
3850 if (Args.hasArg(options::OPT_g3))
3851 CmdArgs.push_back("-dD");
3852 Args.AddLastArg(CmdArgs, options::OPT_H);
3853
3854 AddCPPArgs(Args, CmdArgs);
3855
3856 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3857 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3858
3859 for (InputInfoList::const_iterator
3860 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3861 const InputInfo &II = *it;
3862
3863 CmdArgs.push_back(II.getFilename());
3864 }
3865
3866 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3867 options::OPT_Xpreprocessor);
3868
3869 if (Args.hasArg(options::OPT_fmudflap)) {
3870 CmdArgs.push_back("-D_MUDFLAP");
3871 CmdArgs.push_back("-include");
3872 CmdArgs.push_back("mf-runtime.h");
3873 }
3874
3875 if (Args.hasArg(options::OPT_fmudflapth)) {
3876 CmdArgs.push_back("-D_MUDFLAP");
3877 CmdArgs.push_back("-D_MUDFLAPTH");
3878 CmdArgs.push_back("-include");
3879 CmdArgs.push_back("mf-runtime.h");
3880 }
3881 }
3882
AddCPPArgs(const ArgList & Args,ArgStringList & CmdArgs) const3883 void darwin::CC1::AddCPPArgs(const ArgList &Args,
3884 ArgStringList &CmdArgs) const {
3885 // Derived from cpp spec.
3886
3887 if (Args.hasArg(options::OPT_static)) {
3888 // The gcc spec is broken here, it refers to dynamic but
3889 // that has been translated. Start by being bug compatible.
3890
3891 // if (!Args.hasArg(arglist.parser.dynamicOption))
3892 CmdArgs.push_back("-D__STATIC__");
3893 } else
3894 CmdArgs.push_back("-D__DYNAMIC__");
3895
3896 if (Args.hasArg(options::OPT_pthread))
3897 CmdArgs.push_back("-D_REENTRANT");
3898 }
3899
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3900 void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
3901 const InputInfo &Output,
3902 const InputInfoList &Inputs,
3903 const ArgList &Args,
3904 const char *LinkingOutput) const {
3905 ArgStringList CmdArgs;
3906
3907 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3908
3909 CmdArgs.push_back("-E");
3910
3911 if (Args.hasArg(options::OPT_traditional) ||
3912 Args.hasArg(options::OPT_traditional_cpp))
3913 CmdArgs.push_back("-traditional-cpp");
3914
3915 ArgStringList OutputArgs;
3916 assert(Output.isFilename() && "Unexpected CC1 output.");
3917 OutputArgs.push_back("-o");
3918 OutputArgs.push_back(Output.getFilename());
3919
3920 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
3921 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3922 } else {
3923 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3924 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3925 }
3926
3927 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3928
3929 RemoveCC1UnsupportedArgs(CmdArgs);
3930
3931 const char *CC1Name = getCC1Name(Inputs[0].getType());
3932 const char *Exec =
3933 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
3934 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3935 }
3936
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const3937 void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
3938 const InputInfo &Output,
3939 const InputInfoList &Inputs,
3940 const ArgList &Args,
3941 const char *LinkingOutput) const {
3942 const Driver &D = getToolChain().getDriver();
3943 ArgStringList CmdArgs;
3944
3945 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3946
3947 // Silence warning about unused --serialize-diagnostics
3948 Args.ClaimAllArgs(options::OPT__serialize_diags);
3949
3950 types::ID InputType = Inputs[0].getType();
3951 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
3952 D.Diag(diag::err_drv_argument_only_allowed_with)
3953 << A->getAsString(Args) << "-E";
3954
3955 if (JA.getType() == types::TY_LLVM_IR ||
3956 JA.getType() == types::TY_LTO_IR)
3957 CmdArgs.push_back("-emit-llvm");
3958 else if (JA.getType() == types::TY_LLVM_BC ||
3959 JA.getType() == types::TY_LTO_BC)
3960 CmdArgs.push_back("-emit-llvm-bc");
3961 else if (Output.getType() == types::TY_AST)
3962 D.Diag(diag::err_drv_no_ast_support)
3963 << getToolChain().getTripleString();
3964 else if (JA.getType() != types::TY_PP_Asm &&
3965 JA.getType() != types::TY_PCH)
3966 D.Diag(diag::err_drv_invalid_gcc_output_type)
3967 << getTypeName(JA.getType());
3968
3969 ArgStringList OutputArgs;
3970 if (Output.getType() != types::TY_PCH) {
3971 OutputArgs.push_back("-o");
3972 if (Output.isNothing())
3973 OutputArgs.push_back("/dev/null");
3974 else
3975 OutputArgs.push_back(Output.getFilename());
3976 }
3977
3978 // There is no need for this level of compatibility, but it makes
3979 // diffing easier.
3980 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3981 Args.hasArg(options::OPT_S));
3982
3983 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
3984 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
3985 if (OutputArgsEarly) {
3986 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3987 } else {
3988 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3989 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3990 }
3991 } else {
3992 CmdArgs.push_back("-fpreprocessed");
3993
3994 for (InputInfoList::const_iterator
3995 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3996 const InputInfo &II = *it;
3997
3998 // Reject AST inputs.
3999 if (II.getType() == types::TY_AST) {
4000 D.Diag(diag::err_drv_no_ast_support)
4001 << getToolChain().getTripleString();
4002 return;
4003 }
4004
4005 CmdArgs.push_back(II.getFilename());
4006 }
4007
4008 if (OutputArgsEarly) {
4009 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4010 } else {
4011 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4012 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4013 }
4014 }
4015
4016 if (Output.getType() == types::TY_PCH) {
4017 assert(Output.isFilename() && "Invalid PCH output.");
4018
4019 CmdArgs.push_back("-o");
4020 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4021 // to be a good reason.
4022 const char *TmpPath = C.getArgs().MakeArgString(
4023 D.GetTemporaryPath("cc", "s"));
4024 C.addTempFile(TmpPath);
4025 CmdArgs.push_back(TmpPath);
4026
4027 // If we're emitting a pch file with the last 4 characters of ".pth"
4028 // and falling back to llvm-gcc we want to use ".gch" instead.
4029 std::string OutputFile(Output.getFilename());
4030 size_t loc = OutputFile.rfind(".pth");
4031 if (loc != std::string::npos)
4032 OutputFile.replace(loc, 4, ".gch");
4033 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4034 CmdArgs.push_back(Tmp);
4035 }
4036
4037 RemoveCC1UnsupportedArgs(CmdArgs);
4038
4039 const char *CC1Name = getCC1Name(Inputs[0].getType());
4040 const char *Exec =
4041 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
4042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4043 }
4044
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4045 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4046 const InputInfo &Output,
4047 const InputInfoList &Inputs,
4048 const ArgList &Args,
4049 const char *LinkingOutput) const {
4050 ArgStringList CmdArgs;
4051
4052 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4053 const InputInfo &Input = Inputs[0];
4054
4055 // Determine the original source input.
4056 const Action *SourceAction = &JA;
4057 while (SourceAction->getKind() != Action::InputClass) {
4058 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4059 SourceAction = SourceAction->getInputs()[0];
4060 }
4061
4062 // Forward -g, assuming we are dealing with an actual assembly file.
4063 if (SourceAction->getType() == types::TY_Asm ||
4064 SourceAction->getType() == types::TY_PP_Asm) {
4065 if (Args.hasArg(options::OPT_gstabs))
4066 CmdArgs.push_back("--gstabs");
4067 else if (Args.hasArg(options::OPT_g_Group))
4068 CmdArgs.push_back("-g");
4069 }
4070
4071 // Derived from asm spec.
4072 AddDarwinArch(Args, CmdArgs);
4073
4074 // Use -force_cpusubtype_ALL on x86 by default.
4075 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4076 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4077 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4078 CmdArgs.push_back("-force_cpusubtype_ALL");
4079
4080 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4081 (Args.hasArg(options::OPT_mkernel) ||
4082 Args.hasArg(options::OPT_static) ||
4083 Args.hasArg(options::OPT_fapple_kext)))
4084 CmdArgs.push_back("-static");
4085
4086 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4087 options::OPT_Xassembler);
4088
4089 assert(Output.isFilename() && "Unexpected lipo output.");
4090 CmdArgs.push_back("-o");
4091 CmdArgs.push_back(Output.getFilename());
4092
4093 assert(Input.isFilename() && "Invalid input.");
4094 CmdArgs.push_back(Input.getFilename());
4095
4096 // asm_final spec is empty.
4097
4098 const char *Exec =
4099 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4100 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4101 }
4102
anchor()4103 void darwin::DarwinTool::anchor() {}
4104
AddDarwinArch(const ArgList & Args,ArgStringList & CmdArgs) const4105 void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4106 ArgStringList &CmdArgs) const {
4107 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
4108
4109 // Derived from darwin_arch spec.
4110 CmdArgs.push_back("-arch");
4111 CmdArgs.push_back(Args.MakeArgString(ArchName));
4112
4113 // FIXME: Is this needed anymore?
4114 if (ArchName == "arm")
4115 CmdArgs.push_back("-force_cpusubtype_ALL");
4116 }
4117
AddLinkArgs(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs) const4118 void darwin::Link::AddLinkArgs(Compilation &C,
4119 const ArgList &Args,
4120 ArgStringList &CmdArgs) const {
4121 const Driver &D = getToolChain().getDriver();
4122 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
4123
4124 unsigned Version[3] = { 0, 0, 0 };
4125 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4126 bool HadExtra;
4127 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4128 Version[1], Version[2], HadExtra) ||
4129 HadExtra)
4130 D.Diag(diag::err_drv_invalid_version_number)
4131 << A->getAsString(Args);
4132 }
4133
4134 // Newer linkers support -demangle, pass it if supported and not disabled by
4135 // the user.
4136 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
4137 // Don't pass -demangle to ld_classic.
4138 //
4139 // FIXME: This is a temporary workaround, ld should be handling this.
4140 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4141 Args.hasArg(options::OPT_static));
4142 if (getToolChain().getArch() == llvm::Triple::x86) {
4143 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4144 options::OPT_Wl_COMMA),
4145 ie = Args.filtered_end(); it != ie; ++it) {
4146 const Arg *A = *it;
4147 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
4148 if (StringRef(A->getValue(Args, i)) == "-kext")
4149 UsesLdClassic = true;
4150 }
4151 }
4152 if (!UsesLdClassic)
4153 CmdArgs.push_back("-demangle");
4154 }
4155
4156 // If we are using LTO, then automatically create a temporary file path for
4157 // the linker to use, so that it's lifetime will extend past a possible
4158 // dsymutil step.
4159 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
4160 const char *TmpPath = C.getArgs().MakeArgString(
4161 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4162 C.addTempFile(TmpPath);
4163 CmdArgs.push_back("-object_path_lto");
4164 CmdArgs.push_back(TmpPath);
4165 }
4166
4167 // Derived from the "link" spec.
4168 Args.AddAllArgs(CmdArgs, options::OPT_static);
4169 if (!Args.hasArg(options::OPT_static))
4170 CmdArgs.push_back("-dynamic");
4171 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4172 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4173 // here. How do we wish to handle such things?
4174 }
4175
4176 if (!Args.hasArg(options::OPT_dynamiclib)) {
4177 AddDarwinArch(Args, CmdArgs);
4178 // FIXME: Why do this only on this path?
4179 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
4180
4181 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4182 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4183 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4184
4185 Arg *A;
4186 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4187 (A = Args.getLastArg(options::OPT_current__version)) ||
4188 (A = Args.getLastArg(options::OPT_install__name)))
4189 D.Diag(diag::err_drv_argument_only_allowed_with)
4190 << A->getAsString(Args) << "-dynamiclib";
4191
4192 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4193 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4194 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4195 } else {
4196 CmdArgs.push_back("-dylib");
4197
4198 Arg *A;
4199 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4200 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4201 (A = Args.getLastArg(options::OPT_client__name)) ||
4202 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4203 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4204 (A = Args.getLastArg(options::OPT_private__bundle)))
4205 D.Diag(diag::err_drv_argument_not_allowed_with)
4206 << A->getAsString(Args) << "-dynamiclib";
4207
4208 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4209 "-dylib_compatibility_version");
4210 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4211 "-dylib_current_version");
4212
4213 AddDarwinArch(Args, CmdArgs);
4214
4215 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4216 "-dylib_install_name");
4217 }
4218
4219 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4220 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4221 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4222 if (DarwinTC.isTargetIPhoneOS())
4223 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
4224 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4225 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4226 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4227 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4228 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4229 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
4230 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
4231 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4232 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4233 Args.AddAllArgs(CmdArgs, options::OPT_init);
4234
4235 // Add the deployment target.
4236 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4237
4238 // If we had an explicit -mios-simulator-version-min argument, honor that,
4239 // otherwise use the traditional deployment targets. We can't just check the
4240 // is-sim attribute because existing code follows this path, and the linker
4241 // may not handle the argument.
4242 //
4243 // FIXME: We may be able to remove this, once we can verify no one depends on
4244 // it.
4245 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4246 CmdArgs.push_back("-ios_simulator_version_min");
4247 else if (DarwinTC.isTargetIPhoneOS())
4248 CmdArgs.push_back("-iphoneos_version_min");
4249 else
4250 CmdArgs.push_back("-macosx_version_min");
4251 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4252
4253 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4254 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4255 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4256 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4257 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4258
4259 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4260 options::OPT_fno_pie,
4261 options::OPT_fno_PIE)) {
4262 if (A->getOption().matches(options::OPT_fpie) ||
4263 A->getOption().matches(options::OPT_fPIE))
4264 CmdArgs.push_back("-pie");
4265 else
4266 CmdArgs.push_back("-no_pie");
4267 }
4268
4269 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4270 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4271 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4272 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4273 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4274 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4275 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4276 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4277 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4278 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4279 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4280 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4281 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4282 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4283 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4284 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4285
4286 // Give --sysroot= preference, over the Apple specific behavior to also use
4287 // --isysroot as the syslibroot.
4288 StringRef sysroot = C.getSysRoot();
4289 if (sysroot != "") {
4290 CmdArgs.push_back("-syslibroot");
4291 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4292 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4293 CmdArgs.push_back("-syslibroot");
4294 CmdArgs.push_back(A->getValue(Args));
4295 }
4296
4297 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4298 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4299 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4300 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4301 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4302 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
4303 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4304 Args.AddAllArgs(CmdArgs, options::OPT_y);
4305 Args.AddLastArg(CmdArgs, options::OPT_w);
4306 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4307 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4308 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4309 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4310 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4311 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4312 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4313 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4314 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4315 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4316 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4317 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4318 }
4319
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4320 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
4321 const InputInfo &Output,
4322 const InputInfoList &Inputs,
4323 const ArgList &Args,
4324 const char *LinkingOutput) const {
4325 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4326
4327 // The logic here is derived from gcc's behavior; most of which
4328 // comes from specs (starting with link_command). Consult gcc for
4329 // more information.
4330 ArgStringList CmdArgs;
4331
4332 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4333 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4334 options::OPT_ccc_arcmt_migrate)) {
4335 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4336 (*I)->claim();
4337 const char *Exec =
4338 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4339 CmdArgs.push_back(Output.getFilename());
4340 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4341 return;
4342 }
4343
4344 // I'm not sure why this particular decomposition exists in gcc, but
4345 // we follow suite for ease of comparison.
4346 AddLinkArgs(C, Args, CmdArgs);
4347
4348 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4349 Args.AddAllArgs(CmdArgs, options::OPT_s);
4350 Args.AddAllArgs(CmdArgs, options::OPT_t);
4351 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4352 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4353 Args.AddLastArg(CmdArgs, options::OPT_e);
4354 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4355 Args.AddAllArgs(CmdArgs, options::OPT_r);
4356
4357 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4358 // members of static archive libraries which implement Objective-C classes or
4359 // categories.
4360 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4361 CmdArgs.push_back("-ObjC");
4362
4363 CmdArgs.push_back("-o");
4364 CmdArgs.push_back(Output.getFilename());
4365
4366 if (!Args.hasArg(options::OPT_nostdlib) &&
4367 !Args.hasArg(options::OPT_nostartfiles)) {
4368 // Derived from startfile spec.
4369 if (Args.hasArg(options::OPT_dynamiclib)) {
4370 // Derived from darwin_dylib1 spec.
4371 if (getDarwinToolChain().isTargetIOSSimulator()) {
4372 // The simulator doesn't have a versioned crt1 file.
4373 CmdArgs.push_back("-ldylib1.o");
4374 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4375 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4376 CmdArgs.push_back("-ldylib1.o");
4377 } else {
4378 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4379 CmdArgs.push_back("-ldylib1.o");
4380 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4381 CmdArgs.push_back("-ldylib1.10.5.o");
4382 }
4383 } else {
4384 if (Args.hasArg(options::OPT_bundle)) {
4385 if (!Args.hasArg(options::OPT_static)) {
4386 // Derived from darwin_bundle1 spec.
4387 if (getDarwinToolChain().isTargetIOSSimulator()) {
4388 // The simulator doesn't have a versioned crt1 file.
4389 CmdArgs.push_back("-lbundle1.o");
4390 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4391 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4392 CmdArgs.push_back("-lbundle1.o");
4393 } else {
4394 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4395 CmdArgs.push_back("-lbundle1.o");
4396 }
4397 }
4398 } else {
4399 if (Args.hasArg(options::OPT_pg) &&
4400 getToolChain().SupportsProfiling()) {
4401 if (Args.hasArg(options::OPT_static) ||
4402 Args.hasArg(options::OPT_object) ||
4403 Args.hasArg(options::OPT_preload)) {
4404 CmdArgs.push_back("-lgcrt0.o");
4405 } else {
4406 CmdArgs.push_back("-lgcrt1.o");
4407
4408 // darwin_crt2 spec is empty.
4409 }
4410 // By default on OS X 10.8 and later, we don't link with a crt1.o
4411 // file and the linker knows to use _main as the entry point. But,
4412 // when compiling with -pg, we need to link with the gcrt1.o file,
4413 // so pass the -no_new_main option to tell the linker to use the
4414 // "start" symbol as the entry point.
4415 if (getDarwinToolChain().isTargetMacOS() &&
4416 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4417 CmdArgs.push_back("-no_new_main");
4418 } else {
4419 if (Args.hasArg(options::OPT_static) ||
4420 Args.hasArg(options::OPT_object) ||
4421 Args.hasArg(options::OPT_preload)) {
4422 CmdArgs.push_back("-lcrt0.o");
4423 } else {
4424 // Derived from darwin_crt1 spec.
4425 if (getDarwinToolChain().isTargetIOSSimulator()) {
4426 // The simulator doesn't have a versioned crt1 file.
4427 CmdArgs.push_back("-lcrt1.o");
4428 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4429 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4430 CmdArgs.push_back("-lcrt1.o");
4431 else
4432 CmdArgs.push_back("-lcrt1.3.1.o");
4433 } else {
4434 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4435 CmdArgs.push_back("-lcrt1.o");
4436 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4437 CmdArgs.push_back("-lcrt1.10.5.o");
4438 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
4439 CmdArgs.push_back("-lcrt1.10.6.o");
4440
4441 // darwin_crt2 spec is empty.
4442 }
4443 }
4444 }
4445 }
4446 }
4447
4448 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4449 Args.hasArg(options::OPT_shared_libgcc) &&
4450 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
4451 const char *Str =
4452 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
4453 CmdArgs.push_back(Str);
4454 }
4455 }
4456
4457 Args.AddAllArgs(CmdArgs, options::OPT_L);
4458
4459 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4460 // symbols may appear. Mark all of them as dynamic_lookup.
4461 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4462 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4463 options::OPT_fno_address_sanitizer, false)) {
4464 if (Args.hasArg(options::OPT_dynamiclib) ||
4465 Args.hasArg(options::OPT_bundle)) {
4466 CmdArgs.push_back("-undefined");
4467 CmdArgs.push_back("dynamic_lookup");
4468 }
4469 }
4470
4471 if (Args.hasArg(options::OPT_fopenmp))
4472 // This is more complicated in gcc...
4473 CmdArgs.push_back("-lgomp");
4474
4475 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4476
4477 if (isObjCRuntimeLinked(Args) &&
4478 !Args.hasArg(options::OPT_nostdlib) &&
4479 !Args.hasArg(options::OPT_nodefaultlibs)) {
4480 // Avoid linking compatibility stubs on i386 mac.
4481 if (!getDarwinToolChain().isTargetMacOS() ||
4482 getDarwinToolChain().getArchName() != "i386") {
4483 // If we don't have ARC or subscripting runtime support, link in the
4484 // runtime stubs. We have to do this *before* adding any of the normal
4485 // linker inputs so that its initializer gets run first.
4486 ObjCRuntime runtime =
4487 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
4488 // We use arclite library for both ARC and subscripting support.
4489 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
4490 !runtime.hasSubscripting())
4491 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
4492 }
4493 CmdArgs.push_back("-framework");
4494 CmdArgs.push_back("Foundation");
4495 // Link libobj.
4496 CmdArgs.push_back("-lobjc");
4497 }
4498
4499 if (LinkingOutput) {
4500 CmdArgs.push_back("-arch_multiple");
4501 CmdArgs.push_back("-final_output");
4502 CmdArgs.push_back(LinkingOutput);
4503 }
4504
4505 if (Args.hasArg(options::OPT_fnested_functions))
4506 CmdArgs.push_back("-allow_stack_execute");
4507
4508 if (!Args.hasArg(options::OPT_nostdlib) &&
4509 !Args.hasArg(options::OPT_nodefaultlibs)) {
4510 if (getToolChain().getDriver().CCCIsCXX)
4511 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4512
4513 // link_ssp spec is empty.
4514
4515 // Let the tool chain choose which runtime library to link.
4516 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
4517 }
4518
4519 if (!Args.hasArg(options::OPT_nostdlib) &&
4520 !Args.hasArg(options::OPT_nostartfiles)) {
4521 // endfile_spec is empty.
4522 }
4523
4524 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4525 Args.AddAllArgs(CmdArgs, options::OPT_F);
4526
4527 const char *Exec =
4528 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4529 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4530 }
4531
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4532 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
4533 const InputInfo &Output,
4534 const InputInfoList &Inputs,
4535 const ArgList &Args,
4536 const char *LinkingOutput) const {
4537 ArgStringList CmdArgs;
4538
4539 CmdArgs.push_back("-create");
4540 assert(Output.isFilename() && "Unexpected lipo output.");
4541
4542 CmdArgs.push_back("-output");
4543 CmdArgs.push_back(Output.getFilename());
4544
4545 for (InputInfoList::const_iterator
4546 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4547 const InputInfo &II = *it;
4548 assert(II.isFilename() && "Unexpected lipo input.");
4549 CmdArgs.push_back(II.getFilename());
4550 }
4551 const char *Exec =
4552 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
4553 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4554 }
4555
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4556 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
4557 const InputInfo &Output,
4558 const InputInfoList &Inputs,
4559 const ArgList &Args,
4560 const char *LinkingOutput) const {
4561 ArgStringList CmdArgs;
4562
4563 CmdArgs.push_back("-o");
4564 CmdArgs.push_back(Output.getFilename());
4565
4566 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4567 const InputInfo &Input = Inputs[0];
4568 assert(Input.isFilename() && "Unexpected dsymutil input.");
4569 CmdArgs.push_back(Input.getFilename());
4570
4571 const char *Exec =
4572 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
4573 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4574 }
4575
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4576 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4577 const InputInfo &Output,
4578 const InputInfoList &Inputs,
4579 const ArgList &Args,
4580 const char *LinkingOutput) const {
4581 ArgStringList CmdArgs;
4582 CmdArgs.push_back("--verify");
4583 CmdArgs.push_back("--debug-info");
4584 CmdArgs.push_back("--eh-frame");
4585 CmdArgs.push_back("--quiet");
4586
4587 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4588 const InputInfo &Input = Inputs[0];
4589 assert(Input.isFilename() && "Unexpected verify input");
4590
4591 // Grabbing the output of the earlier dsymutil run.
4592 CmdArgs.push_back(Input.getFilename());
4593
4594 const char *Exec =
4595 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4596 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4597 }
4598
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4599 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4600 const InputInfo &Output,
4601 const InputInfoList &Inputs,
4602 const ArgList &Args,
4603 const char *LinkingOutput) const {
4604 ArgStringList CmdArgs;
4605
4606 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4607 options::OPT_Xassembler);
4608
4609 CmdArgs.push_back("-o");
4610 CmdArgs.push_back(Output.getFilename());
4611
4612 for (InputInfoList::const_iterator
4613 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4614 const InputInfo &II = *it;
4615 CmdArgs.push_back(II.getFilename());
4616 }
4617
4618 const char *Exec =
4619 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4620 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4621 }
4622
4623
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4624 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4625 const InputInfo &Output,
4626 const InputInfoList &Inputs,
4627 const ArgList &Args,
4628 const char *LinkingOutput) const {
4629 // FIXME: Find a real GCC, don't hard-code versions here
4630 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4631 const llvm::Triple &T = getToolChain().getTriple();
4632 std::string LibPath = "/usr/lib/";
4633 llvm::Triple::ArchType Arch = T.getArch();
4634 switch (Arch) {
4635 case llvm::Triple::x86:
4636 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4637 T.getOSName()).str() + "/4.5.2/";
4638 break;
4639 case llvm::Triple::x86_64:
4640 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4641 T.getOSName()).str();
4642 GCCLibPath += "/4.5.2/amd64/";
4643 LibPath += "amd64/";
4644 break;
4645 default:
4646 assert(0 && "Unsupported architecture");
4647 }
4648
4649 ArgStringList CmdArgs;
4650
4651 // Demangle C++ names in errors
4652 CmdArgs.push_back("-C");
4653
4654 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4655 (!Args.hasArg(options::OPT_shared))) {
4656 CmdArgs.push_back("-e");
4657 CmdArgs.push_back("_start");
4658 }
4659
4660 if (Args.hasArg(options::OPT_static)) {
4661 CmdArgs.push_back("-Bstatic");
4662 CmdArgs.push_back("-dn");
4663 } else {
4664 CmdArgs.push_back("-Bdynamic");
4665 if (Args.hasArg(options::OPT_shared)) {
4666 CmdArgs.push_back("-shared");
4667 } else {
4668 CmdArgs.push_back("--dynamic-linker");
4669 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4670 }
4671 }
4672
4673 if (Output.isFilename()) {
4674 CmdArgs.push_back("-o");
4675 CmdArgs.push_back(Output.getFilename());
4676 } else {
4677 assert(Output.isNothing() && "Invalid output.");
4678 }
4679
4680 if (!Args.hasArg(options::OPT_nostdlib) &&
4681 !Args.hasArg(options::OPT_nostartfiles)) {
4682 if (!Args.hasArg(options::OPT_shared)) {
4683 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4684 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
4685 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4686 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4687 } else {
4688 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
4689 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4690 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4691 }
4692 if (getToolChain().getDriver().CCCIsCXX)
4693 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
4694 }
4695
4696 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4697
4698 Args.AddAllArgs(CmdArgs, options::OPT_L);
4699 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4700 Args.AddAllArgs(CmdArgs, options::OPT_e);
4701 Args.AddAllArgs(CmdArgs, options::OPT_r);
4702
4703 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4704
4705 if (!Args.hasArg(options::OPT_nostdlib) &&
4706 !Args.hasArg(options::OPT_nodefaultlibs)) {
4707 if (getToolChain().getDriver().CCCIsCXX)
4708 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4709 CmdArgs.push_back("-lgcc_s");
4710 if (!Args.hasArg(options::OPT_shared)) {
4711 CmdArgs.push_back("-lgcc");
4712 CmdArgs.push_back("-lc");
4713 CmdArgs.push_back("-lm");
4714 }
4715 }
4716
4717 if (!Args.hasArg(options::OPT_nostdlib) &&
4718 !Args.hasArg(options::OPT_nostartfiles)) {
4719 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
4720 }
4721 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
4722
4723 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4724
4725 const char *Exec =
4726 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4727 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4728 }
4729
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4730 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4731 const InputInfo &Output,
4732 const InputInfoList &Inputs,
4733 const ArgList &Args,
4734 const char *LinkingOutput) const {
4735 ArgStringList CmdArgs;
4736
4737 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4738 options::OPT_Xassembler);
4739
4740 CmdArgs.push_back("-o");
4741 CmdArgs.push_back(Output.getFilename());
4742
4743 for (InputInfoList::const_iterator
4744 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4745 const InputInfo &II = *it;
4746 CmdArgs.push_back(II.getFilename());
4747 }
4748
4749 const char *Exec =
4750 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
4751 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4752 }
4753
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4754 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
4755 const InputInfo &Output,
4756 const InputInfoList &Inputs,
4757 const ArgList &Args,
4758 const char *LinkingOutput) const {
4759 ArgStringList CmdArgs;
4760
4761 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4762 (!Args.hasArg(options::OPT_shared))) {
4763 CmdArgs.push_back("-e");
4764 CmdArgs.push_back("_start");
4765 }
4766
4767 if (Args.hasArg(options::OPT_static)) {
4768 CmdArgs.push_back("-Bstatic");
4769 CmdArgs.push_back("-dn");
4770 } else {
4771 // CmdArgs.push_back("--eh-frame-hdr");
4772 CmdArgs.push_back("-Bdynamic");
4773 if (Args.hasArg(options::OPT_shared)) {
4774 CmdArgs.push_back("-shared");
4775 } else {
4776 CmdArgs.push_back("--dynamic-linker");
4777 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4778 }
4779 }
4780
4781 if (Output.isFilename()) {
4782 CmdArgs.push_back("-o");
4783 CmdArgs.push_back(Output.getFilename());
4784 } else {
4785 assert(Output.isNothing() && "Invalid output.");
4786 }
4787
4788 if (!Args.hasArg(options::OPT_nostdlib) &&
4789 !Args.hasArg(options::OPT_nostartfiles)) {
4790 if (!Args.hasArg(options::OPT_shared)) {
4791 CmdArgs.push_back(Args.MakeArgString(
4792 getToolChain().GetFilePath("crt1.o")));
4793 CmdArgs.push_back(Args.MakeArgString(
4794 getToolChain().GetFilePath("crti.o")));
4795 CmdArgs.push_back(Args.MakeArgString(
4796 getToolChain().GetFilePath("crtbegin.o")));
4797 } else {
4798 CmdArgs.push_back(Args.MakeArgString(
4799 getToolChain().GetFilePath("crti.o")));
4800 }
4801 CmdArgs.push_back(Args.MakeArgString(
4802 getToolChain().GetFilePath("crtn.o")));
4803 }
4804
4805 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4806 + getToolChain().getTripleString()
4807 + "/4.2.4"));
4808
4809 Args.AddAllArgs(CmdArgs, options::OPT_L);
4810 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4811 Args.AddAllArgs(CmdArgs, options::OPT_e);
4812
4813 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4814
4815 if (!Args.hasArg(options::OPT_nostdlib) &&
4816 !Args.hasArg(options::OPT_nodefaultlibs)) {
4817 // FIXME: For some reason GCC passes -lgcc before adding
4818 // the default system libraries. Just mimic this for now.
4819 CmdArgs.push_back("-lgcc");
4820
4821 if (Args.hasArg(options::OPT_pthread))
4822 CmdArgs.push_back("-pthread");
4823 if (!Args.hasArg(options::OPT_shared))
4824 CmdArgs.push_back("-lc");
4825 CmdArgs.push_back("-lgcc");
4826 }
4827
4828 if (!Args.hasArg(options::OPT_nostdlib) &&
4829 !Args.hasArg(options::OPT_nostartfiles)) {
4830 if (!Args.hasArg(options::OPT_shared))
4831 CmdArgs.push_back(Args.MakeArgString(
4832 getToolChain().GetFilePath("crtend.o")));
4833 }
4834
4835 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4836
4837 const char *Exec =
4838 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4839 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4840 }
4841
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4842 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4843 const InputInfo &Output,
4844 const InputInfoList &Inputs,
4845 const ArgList &Args,
4846 const char *LinkingOutput) const {
4847 ArgStringList CmdArgs;
4848
4849 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4850 options::OPT_Xassembler);
4851
4852 CmdArgs.push_back("-o");
4853 CmdArgs.push_back(Output.getFilename());
4854
4855 for (InputInfoList::const_iterator
4856 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4857 const InputInfo &II = *it;
4858 CmdArgs.push_back(II.getFilename());
4859 }
4860
4861 const char *Exec =
4862 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4863 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4864 }
4865
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4866 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
4867 const InputInfo &Output,
4868 const InputInfoList &Inputs,
4869 const ArgList &Args,
4870 const char *LinkingOutput) const {
4871 const Driver &D = getToolChain().getDriver();
4872 ArgStringList CmdArgs;
4873
4874 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4875 (!Args.hasArg(options::OPT_shared))) {
4876 CmdArgs.push_back("-e");
4877 CmdArgs.push_back("__start");
4878 }
4879
4880 if (Args.hasArg(options::OPT_static)) {
4881 CmdArgs.push_back("-Bstatic");
4882 } else {
4883 if (Args.hasArg(options::OPT_rdynamic))
4884 CmdArgs.push_back("-export-dynamic");
4885 CmdArgs.push_back("--eh-frame-hdr");
4886 CmdArgs.push_back("-Bdynamic");
4887 if (Args.hasArg(options::OPT_shared)) {
4888 CmdArgs.push_back("-shared");
4889 } else {
4890 CmdArgs.push_back("-dynamic-linker");
4891 CmdArgs.push_back("/usr/libexec/ld.so");
4892 }
4893 }
4894
4895 if (Output.isFilename()) {
4896 CmdArgs.push_back("-o");
4897 CmdArgs.push_back(Output.getFilename());
4898 } else {
4899 assert(Output.isNothing() && "Invalid output.");
4900 }
4901
4902 if (!Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nostartfiles)) {
4904 if (!Args.hasArg(options::OPT_shared)) {
4905 if (Args.hasArg(options::OPT_pg))
4906 CmdArgs.push_back(Args.MakeArgString(
4907 getToolChain().GetFilePath("gcrt0.o")));
4908 else
4909 CmdArgs.push_back(Args.MakeArgString(
4910 getToolChain().GetFilePath("crt0.o")));
4911 CmdArgs.push_back(Args.MakeArgString(
4912 getToolChain().GetFilePath("crtbegin.o")));
4913 } else {
4914 CmdArgs.push_back(Args.MakeArgString(
4915 getToolChain().GetFilePath("crtbeginS.o")));
4916 }
4917 }
4918
4919 std::string Triple = getToolChain().getTripleString();
4920 if (Triple.substr(0, 6) == "x86_64")
4921 Triple.replace(0, 6, "amd64");
4922 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
4923 "/4.2.1"));
4924
4925 Args.AddAllArgs(CmdArgs, options::OPT_L);
4926 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4927 Args.AddAllArgs(CmdArgs, options::OPT_e);
4928
4929 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4930
4931 if (!Args.hasArg(options::OPT_nostdlib) &&
4932 !Args.hasArg(options::OPT_nodefaultlibs)) {
4933 if (D.CCCIsCXX) {
4934 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4935 if (Args.hasArg(options::OPT_pg))
4936 CmdArgs.push_back("-lm_p");
4937 else
4938 CmdArgs.push_back("-lm");
4939 }
4940
4941 // FIXME: For some reason GCC passes -lgcc before adding
4942 // the default system libraries. Just mimic this for now.
4943 CmdArgs.push_back("-lgcc");
4944
4945 if (Args.hasArg(options::OPT_pthread))
4946 CmdArgs.push_back("-lpthread");
4947 if (!Args.hasArg(options::OPT_shared)) {
4948 if (Args.hasArg(options::OPT_pg))
4949 CmdArgs.push_back("-lc_p");
4950 else
4951 CmdArgs.push_back("-lc");
4952 }
4953 CmdArgs.push_back("-lgcc");
4954 }
4955
4956 if (!Args.hasArg(options::OPT_nostdlib) &&
4957 !Args.hasArg(options::OPT_nostartfiles)) {
4958 if (!Args.hasArg(options::OPT_shared))
4959 CmdArgs.push_back(Args.MakeArgString(
4960 getToolChain().GetFilePath("crtend.o")));
4961 else
4962 CmdArgs.push_back(Args.MakeArgString(
4963 getToolChain().GetFilePath("crtendS.o")));
4964 }
4965
4966 const char *Exec =
4967 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4968 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4969 }
4970
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4971 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4972 const InputInfo &Output,
4973 const InputInfoList &Inputs,
4974 const ArgList &Args,
4975 const char *LinkingOutput) const {
4976 ArgStringList CmdArgs;
4977
4978 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4979 options::OPT_Xassembler);
4980
4981 CmdArgs.push_back("-o");
4982 CmdArgs.push_back(Output.getFilename());
4983
4984 for (InputInfoList::const_iterator
4985 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4986 const InputInfo &II = *it;
4987 CmdArgs.push_back(II.getFilename());
4988 }
4989
4990 const char *Exec =
4991 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4992 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4993 }
4994
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4995 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4996 const InputInfo &Output,
4997 const InputInfoList &Inputs,
4998 const ArgList &Args,
4999 const char *LinkingOutput) const {
5000 const Driver &D = getToolChain().getDriver();
5001 ArgStringList CmdArgs;
5002
5003 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5004 (!Args.hasArg(options::OPT_shared))) {
5005 CmdArgs.push_back("-e");
5006 CmdArgs.push_back("__start");
5007 }
5008
5009 if (Args.hasArg(options::OPT_static)) {
5010 CmdArgs.push_back("-Bstatic");
5011 } else {
5012 if (Args.hasArg(options::OPT_rdynamic))
5013 CmdArgs.push_back("-export-dynamic");
5014 CmdArgs.push_back("--eh-frame-hdr");
5015 CmdArgs.push_back("-Bdynamic");
5016 if (Args.hasArg(options::OPT_shared)) {
5017 CmdArgs.push_back("-shared");
5018 } else {
5019 CmdArgs.push_back("-dynamic-linker");
5020 CmdArgs.push_back("/usr/libexec/ld.so");
5021 }
5022 }
5023
5024 if (Output.isFilename()) {
5025 CmdArgs.push_back("-o");
5026 CmdArgs.push_back(Output.getFilename());
5027 } else {
5028 assert(Output.isNothing() && "Invalid output.");
5029 }
5030
5031 if (!Args.hasArg(options::OPT_nostdlib) &&
5032 !Args.hasArg(options::OPT_nostartfiles)) {
5033 if (!Args.hasArg(options::OPT_shared)) {
5034 if (Args.hasArg(options::OPT_pg))
5035 CmdArgs.push_back(Args.MakeArgString(
5036 getToolChain().GetFilePath("gcrt0.o")));
5037 else
5038 CmdArgs.push_back(Args.MakeArgString(
5039 getToolChain().GetFilePath("crt0.o")));
5040 CmdArgs.push_back(Args.MakeArgString(
5041 getToolChain().GetFilePath("crtbegin.o")));
5042 } else {
5043 CmdArgs.push_back(Args.MakeArgString(
5044 getToolChain().GetFilePath("crtbeginS.o")));
5045 }
5046 }
5047
5048 Args.AddAllArgs(CmdArgs, options::OPT_L);
5049 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5050 Args.AddAllArgs(CmdArgs, options::OPT_e);
5051
5052 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5053
5054 if (!Args.hasArg(options::OPT_nostdlib) &&
5055 !Args.hasArg(options::OPT_nodefaultlibs)) {
5056 if (D.CCCIsCXX) {
5057 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5058 if (Args.hasArg(options::OPT_pg))
5059 CmdArgs.push_back("-lm_p");
5060 else
5061 CmdArgs.push_back("-lm");
5062 }
5063
5064 if (Args.hasArg(options::OPT_pthread))
5065 CmdArgs.push_back("-lpthread");
5066 if (!Args.hasArg(options::OPT_shared)) {
5067 if (Args.hasArg(options::OPT_pg))
5068 CmdArgs.push_back("-lc_p");
5069 else
5070 CmdArgs.push_back("-lc");
5071 }
5072
5073 std::string myarch = "-lclang_rt.";
5074 const llvm::Triple &T = getToolChain().getTriple();
5075 llvm::Triple::ArchType Arch = T.getArch();
5076 switch (Arch) {
5077 case llvm::Triple::arm:
5078 myarch += ("arm");
5079 break;
5080 case llvm::Triple::x86:
5081 myarch += ("i386");
5082 break;
5083 case llvm::Triple::x86_64:
5084 myarch += ("amd64");
5085 break;
5086 default:
5087 assert(0 && "Unsupported architecture");
5088 }
5089 CmdArgs.push_back(Args.MakeArgString(myarch));
5090 }
5091
5092 if (!Args.hasArg(options::OPT_nostdlib) &&
5093 !Args.hasArg(options::OPT_nostartfiles)) {
5094 if (!Args.hasArg(options::OPT_shared))
5095 CmdArgs.push_back(Args.MakeArgString(
5096 getToolChain().GetFilePath("crtend.o")));
5097 else
5098 CmdArgs.push_back(Args.MakeArgString(
5099 getToolChain().GetFilePath("crtendS.o")));
5100 }
5101
5102 const char *Exec =
5103 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5104 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5105 }
5106
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5107 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5108 const InputInfo &Output,
5109 const InputInfoList &Inputs,
5110 const ArgList &Args,
5111 const char *LinkingOutput) const {
5112 ArgStringList CmdArgs;
5113
5114 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5115 // instruct as in the base system to assemble 32-bit code.
5116 if (getToolChain().getArch() == llvm::Triple::x86)
5117 CmdArgs.push_back("--32");
5118 else if (getToolChain().getArch() == llvm::Triple::ppc)
5119 CmdArgs.push_back("-a32");
5120 else if (getToolChain().getArch() == llvm::Triple::mips ||
5121 getToolChain().getArch() == llvm::Triple::mipsel ||
5122 getToolChain().getArch() == llvm::Triple::mips64 ||
5123 getToolChain().getArch() == llvm::Triple::mips64el) {
5124 StringRef CPUName;
5125 StringRef ABIName;
5126 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5127
5128 CmdArgs.push_back("-march");
5129 CmdArgs.push_back(CPUName.data());
5130
5131 // Convert ABI name to the GNU tools acceptable variant.
5132 if (ABIName == "o32")
5133 ABIName = "32";
5134 else if (ABIName == "n64")
5135 ABIName = "64";
5136
5137 CmdArgs.push_back("-mabi");
5138 CmdArgs.push_back(ABIName.data());
5139
5140 if (getToolChain().getArch() == llvm::Triple::mips ||
5141 getToolChain().getArch() == llvm::Triple::mips64)
5142 CmdArgs.push_back("-EB");
5143 else
5144 CmdArgs.push_back("-EL");
5145
5146 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5147 options::OPT_fpic, options::OPT_fno_pic,
5148 options::OPT_fPIE, options::OPT_fno_PIE,
5149 options::OPT_fpie, options::OPT_fno_pie);
5150 if (LastPICArg &&
5151 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5152 LastPICArg->getOption().matches(options::OPT_fpic) ||
5153 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5154 LastPICArg->getOption().matches(options::OPT_fpie))) {
5155 CmdArgs.push_back("-KPIC");
5156 }
5157 }
5158
5159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5160 options::OPT_Xassembler);
5161
5162 CmdArgs.push_back("-o");
5163 CmdArgs.push_back(Output.getFilename());
5164
5165 for (InputInfoList::const_iterator
5166 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5167 const InputInfo &II = *it;
5168 CmdArgs.push_back(II.getFilename());
5169 }
5170
5171 const char *Exec =
5172 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5173 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5174 }
5175
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5176 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5177 const InputInfo &Output,
5178 const InputInfoList &Inputs,
5179 const ArgList &Args,
5180 const char *LinkingOutput) const {
5181 const toolchains::FreeBSD& ToolChain =
5182 static_cast<const toolchains::FreeBSD&>(getToolChain());
5183 const Driver &D = ToolChain.getDriver();
5184 ArgStringList CmdArgs;
5185
5186 // Silence warning for "clang -g foo.o -o foo"
5187 Args.ClaimAllArgs(options::OPT_g_Group);
5188 // and "clang -emit-llvm foo.o -o foo"
5189 Args.ClaimAllArgs(options::OPT_emit_llvm);
5190 // and for "clang -w foo.o -o foo". Other warning options are already
5191 // handled somewhere else.
5192 Args.ClaimAllArgs(options::OPT_w);
5193
5194 if (!D.SysRoot.empty())
5195 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5196
5197 if (Args.hasArg(options::OPT_pie))
5198 CmdArgs.push_back("-pie");
5199
5200 if (Args.hasArg(options::OPT_static)) {
5201 CmdArgs.push_back("-Bstatic");
5202 } else {
5203 if (Args.hasArg(options::OPT_rdynamic))
5204 CmdArgs.push_back("-export-dynamic");
5205 CmdArgs.push_back("--eh-frame-hdr");
5206 if (Args.hasArg(options::OPT_shared)) {
5207 CmdArgs.push_back("-Bshareable");
5208 } else {
5209 CmdArgs.push_back("-dynamic-linker");
5210 CmdArgs.push_back("/libexec/ld-elf.so.1");
5211 }
5212 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5213 llvm::Triple::ArchType Arch = ToolChain.getArch();
5214 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5215 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5216 CmdArgs.push_back("--hash-style=both");
5217 }
5218 }
5219 CmdArgs.push_back("--enable-new-dtags");
5220 }
5221
5222 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5223 // instruct ld in the base system to link 32-bit code.
5224 if (ToolChain.getArchName() == "i386") {
5225 CmdArgs.push_back("-m");
5226 CmdArgs.push_back("elf_i386_fbsd");
5227 }
5228
5229 if (ToolChain.getArchName() == "powerpc") {
5230 CmdArgs.push_back("-m");
5231 CmdArgs.push_back("elf32ppc_fbsd");
5232 }
5233
5234 if (Output.isFilename()) {
5235 CmdArgs.push_back("-o");
5236 CmdArgs.push_back(Output.getFilename());
5237 } else {
5238 assert(Output.isNothing() && "Invalid output.");
5239 }
5240
5241 if (!Args.hasArg(options::OPT_nostdlib) &&
5242 !Args.hasArg(options::OPT_nostartfiles)) {
5243 const char *crt1 = NULL;
5244 if (!Args.hasArg(options::OPT_shared)) {
5245 if (Args.hasArg(options::OPT_pg))
5246 crt1 = "gcrt1.o";
5247 else if (Args.hasArg(options::OPT_pie))
5248 crt1 = "Scrt1.o";
5249 else
5250 crt1 = "crt1.o";
5251 }
5252 if (crt1)
5253 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5254
5255 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5256
5257 const char *crtbegin = NULL;
5258 if (Args.hasArg(options::OPT_static))
5259 crtbegin = "crtbeginT.o";
5260 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5261 crtbegin = "crtbeginS.o";
5262 else
5263 crtbegin = "crtbegin.o";
5264
5265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5266 }
5267
5268 Args.AddAllArgs(CmdArgs, options::OPT_L);
5269 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5270 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5271 i != e; ++i)
5272 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5273 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5274 Args.AddAllArgs(CmdArgs, options::OPT_e);
5275 Args.AddAllArgs(CmdArgs, options::OPT_s);
5276 Args.AddAllArgs(CmdArgs, options::OPT_t);
5277 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5278 Args.AddAllArgs(CmdArgs, options::OPT_r);
5279
5280 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5281
5282 if (!Args.hasArg(options::OPT_nostdlib) &&
5283 !Args.hasArg(options::OPT_nodefaultlibs)) {
5284 if (D.CCCIsCXX) {
5285 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5286 if (Args.hasArg(options::OPT_pg))
5287 CmdArgs.push_back("-lm_p");
5288 else
5289 CmdArgs.push_back("-lm");
5290 }
5291 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5292 // the default system libraries. Just mimic this for now.
5293 if (Args.hasArg(options::OPT_pg))
5294 CmdArgs.push_back("-lgcc_p");
5295 else
5296 CmdArgs.push_back("-lgcc");
5297 if (Args.hasArg(options::OPT_static)) {
5298 CmdArgs.push_back("-lgcc_eh");
5299 } else if (Args.hasArg(options::OPT_pg)) {
5300 CmdArgs.push_back("-lgcc_eh_p");
5301 } else {
5302 CmdArgs.push_back("--as-needed");
5303 CmdArgs.push_back("-lgcc_s");
5304 CmdArgs.push_back("--no-as-needed");
5305 }
5306
5307 if (Args.hasArg(options::OPT_pthread)) {
5308 if (Args.hasArg(options::OPT_pg))
5309 CmdArgs.push_back("-lpthread_p");
5310 else
5311 CmdArgs.push_back("-lpthread");
5312 }
5313
5314 if (Args.hasArg(options::OPT_pg)) {
5315 if (Args.hasArg(options::OPT_shared))
5316 CmdArgs.push_back("-lc");
5317 else
5318 CmdArgs.push_back("-lc_p");
5319 CmdArgs.push_back("-lgcc_p");
5320 } else {
5321 CmdArgs.push_back("-lc");
5322 CmdArgs.push_back("-lgcc");
5323 }
5324
5325 if (Args.hasArg(options::OPT_static)) {
5326 CmdArgs.push_back("-lgcc_eh");
5327 } else if (Args.hasArg(options::OPT_pg)) {
5328 CmdArgs.push_back("-lgcc_eh_p");
5329 } else {
5330 CmdArgs.push_back("--as-needed");
5331 CmdArgs.push_back("-lgcc_s");
5332 CmdArgs.push_back("--no-as-needed");
5333 }
5334 }
5335
5336 if (!Args.hasArg(options::OPT_nostdlib) &&
5337 !Args.hasArg(options::OPT_nostartfiles)) {
5338 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5339 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
5340 else
5341 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
5342 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
5343 }
5344
5345 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
5346
5347 const char *Exec =
5348 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
5349 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5350 }
5351
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5352 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5353 const InputInfo &Output,
5354 const InputInfoList &Inputs,
5355 const ArgList &Args,
5356 const char *LinkingOutput) const {
5357 ArgStringList CmdArgs;
5358
5359 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5360 // instruct as in the base system to assemble 32-bit code.
5361 if (getToolChain().getArch() == llvm::Triple::x86)
5362 CmdArgs.push_back("--32");
5363
5364 // Set byte order explicitly
5365 if (getToolChain().getArchName() == "mips")
5366 CmdArgs.push_back("-EB");
5367 else if (getToolChain().getArchName() == "mipsel")
5368 CmdArgs.push_back("-EL");
5369
5370 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5371 options::OPT_Xassembler);
5372
5373 CmdArgs.push_back("-o");
5374 CmdArgs.push_back(Output.getFilename());
5375
5376 for (InputInfoList::const_iterator
5377 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5378 const InputInfo &II = *it;
5379 CmdArgs.push_back(II.getFilename());
5380 }
5381
5382 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
5383 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5384 }
5385
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5386 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5387 const InputInfo &Output,
5388 const InputInfoList &Inputs,
5389 const ArgList &Args,
5390 const char *LinkingOutput) const {
5391 const Driver &D = getToolChain().getDriver();
5392 ArgStringList CmdArgs;
5393
5394 if (!D.SysRoot.empty())
5395 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5396
5397 if (Args.hasArg(options::OPT_static)) {
5398 CmdArgs.push_back("-Bstatic");
5399 } else {
5400 if (Args.hasArg(options::OPT_rdynamic))
5401 CmdArgs.push_back("-export-dynamic");
5402 CmdArgs.push_back("--eh-frame-hdr");
5403 if (Args.hasArg(options::OPT_shared)) {
5404 CmdArgs.push_back("-Bshareable");
5405 } else {
5406 CmdArgs.push_back("-dynamic-linker");
5407 CmdArgs.push_back("/libexec/ld.elf_so");
5408 }
5409 }
5410
5411 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5412 // instruct ld in the base system to link 32-bit code.
5413 if (getToolChain().getArch() == llvm::Triple::x86) {
5414 CmdArgs.push_back("-m");
5415 CmdArgs.push_back("elf_i386");
5416 }
5417
5418 if (Output.isFilename()) {
5419 CmdArgs.push_back("-o");
5420 CmdArgs.push_back(Output.getFilename());
5421 } else {
5422 assert(Output.isNothing() && "Invalid output.");
5423 }
5424
5425 if (!Args.hasArg(options::OPT_nostdlib) &&
5426 !Args.hasArg(options::OPT_nostartfiles)) {
5427 if (!Args.hasArg(options::OPT_shared)) {
5428 CmdArgs.push_back(Args.MakeArgString(
5429 getToolChain().GetFilePath("crt0.o")));
5430 CmdArgs.push_back(Args.MakeArgString(
5431 getToolChain().GetFilePath("crti.o")));
5432 CmdArgs.push_back(Args.MakeArgString(
5433 getToolChain().GetFilePath("crtbegin.o")));
5434 } else {
5435 CmdArgs.push_back(Args.MakeArgString(
5436 getToolChain().GetFilePath("crti.o")));
5437 CmdArgs.push_back(Args.MakeArgString(
5438 getToolChain().GetFilePath("crtbeginS.o")));
5439 }
5440 }
5441
5442 Args.AddAllArgs(CmdArgs, options::OPT_L);
5443 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5444 Args.AddAllArgs(CmdArgs, options::OPT_e);
5445 Args.AddAllArgs(CmdArgs, options::OPT_s);
5446 Args.AddAllArgs(CmdArgs, options::OPT_t);
5447 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5448 Args.AddAllArgs(CmdArgs, options::OPT_r);
5449
5450 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5451
5452 if (!Args.hasArg(options::OPT_nostdlib) &&
5453 !Args.hasArg(options::OPT_nodefaultlibs)) {
5454 if (D.CCCIsCXX) {
5455 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5456 CmdArgs.push_back("-lm");
5457 }
5458 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5459 // the default system libraries. Just mimic this for now.
5460 if (Args.hasArg(options::OPT_static)) {
5461 CmdArgs.push_back("-lgcc_eh");
5462 } else {
5463 CmdArgs.push_back("--as-needed");
5464 CmdArgs.push_back("-lgcc_s");
5465 CmdArgs.push_back("--no-as-needed");
5466 }
5467 CmdArgs.push_back("-lgcc");
5468
5469 if (Args.hasArg(options::OPT_pthread))
5470 CmdArgs.push_back("-lpthread");
5471 CmdArgs.push_back("-lc");
5472
5473 CmdArgs.push_back("-lgcc");
5474 if (Args.hasArg(options::OPT_static)) {
5475 CmdArgs.push_back("-lgcc_eh");
5476 } else {
5477 CmdArgs.push_back("--as-needed");
5478 CmdArgs.push_back("-lgcc_s");
5479 CmdArgs.push_back("--no-as-needed");
5480 }
5481 }
5482
5483 if (!Args.hasArg(options::OPT_nostdlib) &&
5484 !Args.hasArg(options::OPT_nostartfiles)) {
5485 if (!Args.hasArg(options::OPT_shared))
5486 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5487 "crtend.o")));
5488 else
5489 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5490 "crtendS.o")));
5491 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5492 "crtn.o")));
5493 }
5494
5495 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5496
5497 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5498 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5499 }
5500
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5501 void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5502 const InputInfo &Output,
5503 const InputInfoList &Inputs,
5504 const ArgList &Args,
5505 const char *LinkingOutput) const {
5506 ArgStringList CmdArgs;
5507
5508 // Add --32/--64 to make sure we get the format we want.
5509 // This is incomplete
5510 if (getToolChain().getArch() == llvm::Triple::x86) {
5511 CmdArgs.push_back("--32");
5512 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5513 CmdArgs.push_back("--64");
5514 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5515 CmdArgs.push_back("-a32");
5516 CmdArgs.push_back("-mppc");
5517 CmdArgs.push_back("-many");
5518 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5519 CmdArgs.push_back("-a64");
5520 CmdArgs.push_back("-mppc64");
5521 CmdArgs.push_back("-many");
5522 } else if (getToolChain().getArch() == llvm::Triple::arm) {
5523 StringRef MArch = getToolChain().getArchName();
5524 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5525 CmdArgs.push_back("-mfpu=neon");
5526
5527 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5528 getToolChain().getTriple());
5529 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
5530
5531 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5532 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5533 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
5534 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5535 getToolChain().getArch() == llvm::Triple::mipsel ||
5536 getToolChain().getArch() == llvm::Triple::mips64 ||
5537 getToolChain().getArch() == llvm::Triple::mips64el) {
5538 StringRef CPUName;
5539 StringRef ABIName;
5540 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5541
5542 CmdArgs.push_back("-march");
5543 CmdArgs.push_back(CPUName.data());
5544
5545 // Convert ABI name to the GNU tools acceptable variant.
5546 if (ABIName == "o32")
5547 ABIName = "32";
5548 else if (ABIName == "n64")
5549 ABIName = "64";
5550
5551 CmdArgs.push_back("-mabi");
5552 CmdArgs.push_back(ABIName.data());
5553
5554 if (getToolChain().getArch() == llvm::Triple::mips ||
5555 getToolChain().getArch() == llvm::Triple::mips64)
5556 CmdArgs.push_back("-EB");
5557 else
5558 CmdArgs.push_back("-EL");
5559
5560 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5561 options::OPT_fpic, options::OPT_fno_pic,
5562 options::OPT_fPIE, options::OPT_fno_PIE,
5563 options::OPT_fpie, options::OPT_fno_pie);
5564 if (LastPICArg &&
5565 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5566 LastPICArg->getOption().matches(options::OPT_fpic) ||
5567 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5568 LastPICArg->getOption().matches(options::OPT_fpie))) {
5569 CmdArgs.push_back("-KPIC");
5570 }
5571 }
5572
5573 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5574 options::OPT_Xassembler);
5575
5576 CmdArgs.push_back("-o");
5577 CmdArgs.push_back(Output.getFilename());
5578
5579 for (InputInfoList::const_iterator
5580 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5581 const InputInfo &II = *it;
5582 CmdArgs.push_back(II.getFilename());
5583 }
5584
5585 const char *Exec =
5586 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5587 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5588 }
5589
AddLibgcc(llvm::Triple Triple,const Driver & D,ArgStringList & CmdArgs,const ArgList & Args)5590 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5591 ArgStringList &CmdArgs, const ArgList &Args) {
5592 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
5593 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
5594 Args.hasArg(options::OPT_static_libgcc);
5595 if (!D.CCCIsCXX)
5596 CmdArgs.push_back("-lgcc");
5597
5598 if (StaticLibgcc) {
5599 if (D.CCCIsCXX)
5600 CmdArgs.push_back("-lgcc");
5601 } else {
5602 if (!D.CCCIsCXX)
5603 CmdArgs.push_back("--as-needed");
5604 CmdArgs.push_back("-lgcc_s");
5605 if (!D.CCCIsCXX)
5606 CmdArgs.push_back("--no-as-needed");
5607 }
5608
5609 if (StaticLibgcc && !isAndroid)
5610 CmdArgs.push_back("-lgcc_eh");
5611 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5612 CmdArgs.push_back("-lgcc");
5613 }
5614
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5615 void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5616 const InputInfo &Output,
5617 const InputInfoList &Inputs,
5618 const ArgList &Args,
5619 const char *LinkingOutput) const {
5620 const toolchains::Linux& ToolChain =
5621 static_cast<const toolchains::Linux&>(getToolChain());
5622 const Driver &D = ToolChain.getDriver();
5623 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
5624 llvm::Triple::Android;
5625
5626 ArgStringList CmdArgs;
5627
5628 // Silence warning for "clang -g foo.o -o foo"
5629 Args.ClaimAllArgs(options::OPT_g_Group);
5630 // and "clang -emit-llvm foo.o -o foo"
5631 Args.ClaimAllArgs(options::OPT_emit_llvm);
5632 // and for "clang -w foo.o -o foo". Other warning options are already
5633 // handled somewhere else.
5634 Args.ClaimAllArgs(options::OPT_w);
5635
5636 if (!D.SysRoot.empty())
5637 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5638
5639 if (Args.hasArg(options::OPT_pie))
5640 CmdArgs.push_back("-pie");
5641
5642 if (Args.hasArg(options::OPT_rdynamic))
5643 CmdArgs.push_back("-export-dynamic");
5644
5645 if (Args.hasArg(options::OPT_s))
5646 CmdArgs.push_back("-s");
5647
5648 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5649 e = ToolChain.ExtraOpts.end();
5650 i != e; ++i)
5651 CmdArgs.push_back(i->c_str());
5652
5653 if (!Args.hasArg(options::OPT_static)) {
5654 CmdArgs.push_back("--eh-frame-hdr");
5655 }
5656
5657 CmdArgs.push_back("-m");
5658 if (ToolChain.getArch() == llvm::Triple::x86)
5659 CmdArgs.push_back("elf_i386");
5660 else if (ToolChain.getArch() == llvm::Triple::arm
5661 || ToolChain.getArch() == llvm::Triple::thumb)
5662 CmdArgs.push_back("armelf_linux_eabi");
5663 else if (ToolChain.getArch() == llvm::Triple::ppc)
5664 CmdArgs.push_back("elf32ppclinux");
5665 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5666 CmdArgs.push_back("elf64ppc");
5667 else if (ToolChain.getArch() == llvm::Triple::mips)
5668 CmdArgs.push_back("elf32btsmip");
5669 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5670 CmdArgs.push_back("elf32ltsmip");
5671 else if (ToolChain.getArch() == llvm::Triple::mips64)
5672 CmdArgs.push_back("elf64btsmip");
5673 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5674 CmdArgs.push_back("elf64ltsmip");
5675 else
5676 CmdArgs.push_back("elf_x86_64");
5677
5678 if (Args.hasArg(options::OPT_static)) {
5679 if (ToolChain.getArch() == llvm::Triple::arm
5680 || ToolChain.getArch() == llvm::Triple::thumb)
5681 CmdArgs.push_back("-Bstatic");
5682 else
5683 CmdArgs.push_back("-static");
5684 } else if (Args.hasArg(options::OPT_shared)) {
5685 CmdArgs.push_back("-shared");
5686 if ((ToolChain.getArch() == llvm::Triple::arm
5687 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5688 CmdArgs.push_back("-Bsymbolic");
5689 }
5690 }
5691
5692 if (ToolChain.getArch() == llvm::Triple::arm ||
5693 ToolChain.getArch() == llvm::Triple::thumb ||
5694 (!Args.hasArg(options::OPT_static) &&
5695 !Args.hasArg(options::OPT_shared))) {
5696 CmdArgs.push_back("-dynamic-linker");
5697 if (isAndroid)
5698 CmdArgs.push_back("/system/bin/linker");
5699 else if (ToolChain.getArch() == llvm::Triple::x86)
5700 CmdArgs.push_back("/lib/ld-linux.so.2");
5701 else if (ToolChain.getArch() == llvm::Triple::arm ||
5702 ToolChain.getArch() == llvm::Triple::thumb) {
5703 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5704 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5705 else
5706 CmdArgs.push_back("/lib/ld-linux.so.3");
5707 }
5708 else if (ToolChain.getArch() == llvm::Triple::mips ||
5709 ToolChain.getArch() == llvm::Triple::mipsel)
5710 CmdArgs.push_back("/lib/ld.so.1");
5711 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5712 ToolChain.getArch() == llvm::Triple::mips64el)
5713 CmdArgs.push_back("/lib64/ld.so.1");
5714 else if (ToolChain.getArch() == llvm::Triple::ppc)
5715 CmdArgs.push_back("/lib/ld.so.1");
5716 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5717 CmdArgs.push_back("/lib64/ld64.so.1");
5718 else
5719 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5720 }
5721
5722 CmdArgs.push_back("-o");
5723 CmdArgs.push_back(Output.getFilename());
5724
5725 if (!Args.hasArg(options::OPT_nostdlib) &&
5726 !Args.hasArg(options::OPT_nostartfiles)) {
5727 if (!isAndroid) {
5728 const char *crt1 = NULL;
5729 if (!Args.hasArg(options::OPT_shared)){
5730 if (Args.hasArg(options::OPT_pie))
5731 crt1 = "Scrt1.o";
5732 else
5733 crt1 = "crt1.o";
5734 }
5735 if (crt1)
5736 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5737
5738 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5739 }
5740
5741 const char *crtbegin;
5742 if (Args.hasArg(options::OPT_static))
5743 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
5744 else if (Args.hasArg(options::OPT_shared))
5745 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
5746 else if (Args.hasArg(options::OPT_pie))
5747 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
5748 else
5749 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
5750 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5751 }
5752
5753 Args.AddAllArgs(CmdArgs, options::OPT_L);
5754
5755 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5756
5757 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5758 i != e; ++i)
5759 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5760
5761 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5762 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5763 // forward.
5764 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5765 CmdArgs.push_back("-plugin");
5766 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5767 CmdArgs.push_back(Args.MakeArgString(Plugin));
5768 }
5769
5770 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5771 CmdArgs.push_back("--no-demangle");
5772
5773 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5774
5775 if (D.CCCIsCXX &&
5776 !Args.hasArg(options::OPT_nostdlib) &&
5777 !Args.hasArg(options::OPT_nodefaultlibs)) {
5778 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5779 !Args.hasArg(options::OPT_static);
5780 if (OnlyLibstdcxxStatic)
5781 CmdArgs.push_back("-Bstatic");
5782 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5783 if (OnlyLibstdcxxStatic)
5784 CmdArgs.push_back("-Bdynamic");
5785 CmdArgs.push_back("-lm");
5786 }
5787
5788 // Call this before we add the C run-time.
5789 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5790 addTsanRTLinux(getToolChain(), Args, CmdArgs);
5791
5792 if (!Args.hasArg(options::OPT_nostdlib)) {
5793 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5794 if (Args.hasArg(options::OPT_static))
5795 CmdArgs.push_back("--start-group");
5796
5797 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5798
5799 if (Args.hasArg(options::OPT_pthread) ||
5800 Args.hasArg(options::OPT_pthreads))
5801 CmdArgs.push_back("-lpthread");
5802
5803 CmdArgs.push_back("-lc");
5804
5805 if (Args.hasArg(options::OPT_static))
5806 CmdArgs.push_back("--end-group");
5807 else
5808 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5809 }
5810
5811 if (!Args.hasArg(options::OPT_nostartfiles)) {
5812 const char *crtend;
5813 if (Args.hasArg(options::OPT_shared))
5814 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
5815 else if (Args.hasArg(options::OPT_pie))
5816 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
5817 else
5818 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
5819
5820 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
5821 if (!isAndroid)
5822 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
5823 }
5824 }
5825
5826 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5827
5828 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5829 }
5830
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5831 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5832 const InputInfo &Output,
5833 const InputInfoList &Inputs,
5834 const ArgList &Args,
5835 const char *LinkingOutput) const {
5836 ArgStringList CmdArgs;
5837
5838 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5839 options::OPT_Xassembler);
5840
5841 CmdArgs.push_back("-o");
5842 CmdArgs.push_back(Output.getFilename());
5843
5844 for (InputInfoList::const_iterator
5845 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5846 const InputInfo &II = *it;
5847 CmdArgs.push_back(II.getFilename());
5848 }
5849
5850 const char *Exec =
5851 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5852 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5853 }
5854
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5855 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
5856 const InputInfo &Output,
5857 const InputInfoList &Inputs,
5858 const ArgList &Args,
5859 const char *LinkingOutput) const {
5860 const Driver &D = getToolChain().getDriver();
5861 ArgStringList CmdArgs;
5862
5863 if (Output.isFilename()) {
5864 CmdArgs.push_back("-o");
5865 CmdArgs.push_back(Output.getFilename());
5866 } else {
5867 assert(Output.isNothing() && "Invalid output.");
5868 }
5869
5870 if (!Args.hasArg(options::OPT_nostdlib) &&
5871 !Args.hasArg(options::OPT_nostartfiles)) {
5872 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5873 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5874 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5875 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5876 }
5877
5878 Args.AddAllArgs(CmdArgs, options::OPT_L);
5879 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5880 Args.AddAllArgs(CmdArgs, options::OPT_e);
5881
5882 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5883
5884 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5885
5886 if (!Args.hasArg(options::OPT_nostdlib) &&
5887 !Args.hasArg(options::OPT_nodefaultlibs)) {
5888 if (D.CCCIsCXX) {
5889 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5890 CmdArgs.push_back("-lm");
5891 }
5892 }
5893
5894 if (!Args.hasArg(options::OPT_nostdlib) &&
5895 !Args.hasArg(options::OPT_nostartfiles)) {
5896 if (Args.hasArg(options::OPT_pthread))
5897 CmdArgs.push_back("-lpthread");
5898 CmdArgs.push_back("-lc");
5899 CmdArgs.push_back("-lCompilerRT-Generic");
5900 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5901 CmdArgs.push_back(
5902 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
5903 }
5904
5905 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5906 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5907 }
5908
5909 /// DragonFly Tools
5910
5911 // For now, DragonFly Assemble does just about the same as for
5912 // FreeBSD, but this may change soon.
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5913 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5914 const InputInfo &Output,
5915 const InputInfoList &Inputs,
5916 const ArgList &Args,
5917 const char *LinkingOutput) const {
5918 ArgStringList CmdArgs;
5919
5920 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5921 // instruct as in the base system to assemble 32-bit code.
5922 if (getToolChain().getArchName() == "i386")
5923 CmdArgs.push_back("--32");
5924
5925 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5926 options::OPT_Xassembler);
5927
5928 CmdArgs.push_back("-o");
5929 CmdArgs.push_back(Output.getFilename());
5930
5931 for (InputInfoList::const_iterator
5932 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5933 const InputInfo &II = *it;
5934 CmdArgs.push_back(II.getFilename());
5935 }
5936
5937 const char *Exec =
5938 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5939 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5940 }
5941
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5942 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
5943 const InputInfo &Output,
5944 const InputInfoList &Inputs,
5945 const ArgList &Args,
5946 const char *LinkingOutput) const {
5947 const Driver &D = getToolChain().getDriver();
5948 ArgStringList CmdArgs;
5949
5950 if (!D.SysRoot.empty())
5951 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5952
5953 if (Args.hasArg(options::OPT_static)) {
5954 CmdArgs.push_back("-Bstatic");
5955 } else {
5956 if (Args.hasArg(options::OPT_shared))
5957 CmdArgs.push_back("-Bshareable");
5958 else {
5959 CmdArgs.push_back("-dynamic-linker");
5960 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5961 }
5962 }
5963
5964 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5965 // instruct ld in the base system to link 32-bit code.
5966 if (getToolChain().getArchName() == "i386") {
5967 CmdArgs.push_back("-m");
5968 CmdArgs.push_back("elf_i386");
5969 }
5970
5971 if (Output.isFilename()) {
5972 CmdArgs.push_back("-o");
5973 CmdArgs.push_back(Output.getFilename());
5974 } else {
5975 assert(Output.isNothing() && "Invalid output.");
5976 }
5977
5978 if (!Args.hasArg(options::OPT_nostdlib) &&
5979 !Args.hasArg(options::OPT_nostartfiles)) {
5980 if (!Args.hasArg(options::OPT_shared)) {
5981 CmdArgs.push_back(
5982 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5983 CmdArgs.push_back(
5984 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5985 CmdArgs.push_back(
5986 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5987 } else {
5988 CmdArgs.push_back(
5989 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5990 CmdArgs.push_back(
5991 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
5992 }
5993 }
5994
5995 Args.AddAllArgs(CmdArgs, options::OPT_L);
5996 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5997 Args.AddAllArgs(CmdArgs, options::OPT_e);
5998
5999 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6000
6001 if (!Args.hasArg(options::OPT_nostdlib) &&
6002 !Args.hasArg(options::OPT_nodefaultlibs)) {
6003 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6004 // rpaths
6005 CmdArgs.push_back("-L/usr/lib/gcc41");
6006
6007 if (!Args.hasArg(options::OPT_static)) {
6008 CmdArgs.push_back("-rpath");
6009 CmdArgs.push_back("/usr/lib/gcc41");
6010
6011 CmdArgs.push_back("-rpath-link");
6012 CmdArgs.push_back("/usr/lib/gcc41");
6013
6014 CmdArgs.push_back("-rpath");
6015 CmdArgs.push_back("/usr/lib");
6016
6017 CmdArgs.push_back("-rpath-link");
6018 CmdArgs.push_back("/usr/lib");
6019 }
6020
6021 if (D.CCCIsCXX) {
6022 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6023 CmdArgs.push_back("-lm");
6024 }
6025
6026 if (Args.hasArg(options::OPT_shared)) {
6027 CmdArgs.push_back("-lgcc_pic");
6028 } else {
6029 CmdArgs.push_back("-lgcc");
6030 }
6031
6032
6033 if (Args.hasArg(options::OPT_pthread))
6034 CmdArgs.push_back("-lpthread");
6035
6036 if (!Args.hasArg(options::OPT_nolibc)) {
6037 CmdArgs.push_back("-lc");
6038 }
6039
6040 if (Args.hasArg(options::OPT_shared)) {
6041 CmdArgs.push_back("-lgcc_pic");
6042 } else {
6043 CmdArgs.push_back("-lgcc");
6044 }
6045 }
6046
6047 if (!Args.hasArg(options::OPT_nostdlib) &&
6048 !Args.hasArg(options::OPT_nostartfiles)) {
6049 if (!Args.hasArg(options::OPT_shared))
6050 CmdArgs.push_back(Args.MakeArgString(
6051 getToolChain().GetFilePath("crtend.o")));
6052 else
6053 CmdArgs.push_back(Args.MakeArgString(
6054 getToolChain().GetFilePath("crtendS.o")));
6055 CmdArgs.push_back(Args.MakeArgString(
6056 getToolChain().GetFilePath("crtn.o")));
6057 }
6058
6059 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6060
6061 const char *Exec =
6062 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
6063 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6064 }
6065
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6066 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6067 const InputInfo &Output,
6068 const InputInfoList &Inputs,
6069 const ArgList &Args,
6070 const char *LinkingOutput) const {
6071 ArgStringList CmdArgs;
6072
6073 if (Output.isFilename()) {
6074 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6075 Output.getFilename()));
6076 } else {
6077 assert(Output.isNothing() && "Invalid output.");
6078 }
6079
6080 if (!Args.hasArg(options::OPT_nostdlib) &&
6081 !Args.hasArg(options::OPT_nostartfiles)) {
6082 CmdArgs.push_back("-defaultlib:libcmt");
6083 }
6084
6085 CmdArgs.push_back("-nologo");
6086
6087 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6088
6089 // Add filenames immediately.
6090 for (InputInfoList::const_iterator
6091 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6092 if (it->isFilename())
6093 CmdArgs.push_back(it->getFilename());
6094 }
6095
6096 const char *Exec =
6097 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
6098 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6099 }
6100