1 //===--- Tools.cpp - Tools Implementations --------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "Tools.h"
11 #include "InputInfo.h"
12 #include "ToolChains.h"
13 #include "clang/Basic/LangOptions.h"
14 #include "clang/Basic/ObjCRuntime.h"
15 #include "clang/Basic/Version.h"
16 #include "clang/Driver/Action.h"
17 #include "clang/Driver/Compilation.h"
18 #include "clang/Driver/Driver.h"
19 #include "clang/Driver/DriverDiagnostic.h"
20 #include "clang/Driver/Job.h"
21 #include "clang/Driver/Options.h"
22 #include "clang/Driver/SanitizerArgs.h"
23 #include "clang/Driver/ToolChain.h"
24 #include "clang/Driver/Util.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/ADT/StringExtras.h"
27 #include "llvm/ADT/StringSwitch.h"
28 #include "llvm/ADT/Twine.h"
29 #include "llvm/Option/Arg.h"
30 #include "llvm/Option/ArgList.h"
31 #include "llvm/Option/Option.h"
32 #include "llvm/Support/Compression.h"
33 #include "llvm/Support/ErrorHandling.h"
34 #include "llvm/Support/FileSystem.h"
35 #include "llvm/Support/Format.h"
36 #include "llvm/Support/Host.h"
37 #include "llvm/Support/Path.h"
38 #include "llvm/Support/Process.h"
39 #include "llvm/Support/Program.h"
40 #include "llvm/Support/raw_ostream.h"
41
42 using namespace clang::driver;
43 using namespace clang::driver::tools;
44 using namespace clang;
45 using namespace llvm::opt;
46
addAssemblerKPIC(const ArgList & Args,ArgStringList & CmdArgs)47 static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
48 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
49 options::OPT_fpic, options::OPT_fno_pic,
50 options::OPT_fPIE, options::OPT_fno_PIE,
51 options::OPT_fpie, options::OPT_fno_pie);
52 if (!LastPICArg)
53 return;
54 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
55 LastPICArg->getOption().matches(options::OPT_fpic) ||
56 LastPICArg->getOption().matches(options::OPT_fPIE) ||
57 LastPICArg->getOption().matches(options::OPT_fpie)) {
58 CmdArgs.push_back("-KPIC");
59 }
60 }
61
62 /// CheckPreprocessingOptions - Perform some validation of preprocessing
63 /// arguments that is shared with gcc.
CheckPreprocessingOptions(const Driver & D,const ArgList & Args)64 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
65 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
66 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
67 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
68 D.Diag(diag::err_drv_argument_only_allowed_with)
69 << A->getBaseArg().getAsString(Args)
70 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
71 }
72 }
73 }
74
75 /// CheckCodeGenerationOptions - Perform some validation of code generation
76 /// arguments that is shared with gcc.
CheckCodeGenerationOptions(const Driver & D,const ArgList & Args)77 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
78 // In gcc, only ARM checks this, but it seems reasonable to check universally.
79 if (Args.hasArg(options::OPT_static))
80 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
81 options::OPT_mdynamic_no_pic))
82 D.Diag(diag::err_drv_argument_not_allowed_with)
83 << A->getAsString(Args) << "-static";
84 }
85
86 // Quote target names for inclusion in GNU Make dependency files.
87 // Only the characters '$', '#', ' ', '\t' are quoted.
QuoteTarget(StringRef Target,SmallVectorImpl<char> & Res)88 static void QuoteTarget(StringRef Target,
89 SmallVectorImpl<char> &Res) {
90 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
91 switch (Target[i]) {
92 case ' ':
93 case '\t':
94 // Escape the preceding backslashes
95 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
96 Res.push_back('\\');
97
98 // Escape the space/tab
99 Res.push_back('\\');
100 break;
101 case '$':
102 Res.push_back('$');
103 break;
104 case '#':
105 Res.push_back('\\');
106 break;
107 default:
108 break;
109 }
110
111 Res.push_back(Target[i]);
112 }
113 }
114
addDirectoryList(const ArgList & Args,ArgStringList & CmdArgs,const char * ArgName,const char * EnvVar)115 static void addDirectoryList(const ArgList &Args,
116 ArgStringList &CmdArgs,
117 const char *ArgName,
118 const char *EnvVar) {
119 const char *DirList = ::getenv(EnvVar);
120 bool CombinedArg = false;
121
122 if (!DirList)
123 return; // Nothing to do.
124
125 StringRef Name(ArgName);
126 if (Name.equals("-I") || Name.equals("-L"))
127 CombinedArg = true;
128
129 StringRef Dirs(DirList);
130 if (Dirs.empty()) // Empty string should not add '.'.
131 return;
132
133 StringRef::size_type Delim;
134 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
135 if (Delim == 0) { // Leading colon.
136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(".");
141 }
142 } else {
143 if (CombinedArg) {
144 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
145 } else {
146 CmdArgs.push_back(ArgName);
147 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
148 }
149 }
150 Dirs = Dirs.substr(Delim + 1);
151 }
152
153 if (Dirs.empty()) { // Trailing colon.
154 if (CombinedArg) {
155 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
156 } else {
157 CmdArgs.push_back(ArgName);
158 CmdArgs.push_back(".");
159 }
160 } else { // Add the last path.
161 if (CombinedArg) {
162 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
163 } else {
164 CmdArgs.push_back(ArgName);
165 CmdArgs.push_back(Args.MakeArgString(Dirs));
166 }
167 }
168 }
169
AddLinkerInputs(const ToolChain & TC,const InputInfoList & Inputs,const ArgList & Args,ArgStringList & CmdArgs)170 static void AddLinkerInputs(const ToolChain &TC,
171 const InputInfoList &Inputs, const ArgList &Args,
172 ArgStringList &CmdArgs) {
173 const Driver &D = TC.getDriver();
174
175 // Add extra linker input arguments which are not treated as inputs
176 // (constructed via -Xarch_).
177 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
178
179 for (const auto &II : Inputs) {
180 if (!TC.HasNativeLLVMSupport()) {
181 // Don't try to pass LLVM inputs unless we have native support.
182 if (II.getType() == types::TY_LLVM_IR ||
183 II.getType() == types::TY_LTO_IR ||
184 II.getType() == types::TY_LLVM_BC ||
185 II.getType() == types::TY_LTO_BC)
186 D.Diag(diag::err_drv_no_linker_llvm_support)
187 << TC.getTripleString();
188 }
189
190 // Add filenames immediately.
191 if (II.isFilename()) {
192 CmdArgs.push_back(II.getFilename());
193 continue;
194 }
195
196 // Otherwise, this is a linker input argument.
197 const Arg &A = II.getInputArg();
198
199 // Handle reserved library options.
200 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
201 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
202 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
203 TC.AddCCKextLibArgs(Args, CmdArgs);
204 else
205 A.renderAsInput(Args, CmdArgs);
206 }
207
208 // LIBRARY_PATH - included following the user specified library paths.
209 // and only supported on native toolchains.
210 if (!TC.isCrossCompiling())
211 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
212 }
213
214 /// \brief Determine whether Objective-C automated reference counting is
215 /// enabled.
isObjCAutoRefCount(const ArgList & Args)216 static bool isObjCAutoRefCount(const ArgList &Args) {
217 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
218 }
219
220 /// \brief Determine whether we are linking the ObjC runtime.
isObjCRuntimeLinked(const ArgList & Args)221 static bool isObjCRuntimeLinked(const ArgList &Args) {
222 if (isObjCAutoRefCount(Args)) {
223 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
224 return true;
225 }
226 return Args.hasArg(options::OPT_fobjc_link_runtime);
227 }
228
forwardToGCC(const Option & O)229 static bool forwardToGCC(const Option &O) {
230 // Don't forward inputs from the original command line. They are added from
231 // InputInfoList.
232 return O.getKind() != Option::InputClass &&
233 !O.hasFlag(options::DriverOption) &&
234 !O.hasFlag(options::LinkerInput);
235 }
236
AddPreprocessingOptions(Compilation & C,const JobAction & JA,const Driver & D,const ArgList & Args,ArgStringList & CmdArgs,const InputInfo & Output,const InputInfoList & Inputs) const237 void Clang::AddPreprocessingOptions(Compilation &C,
238 const JobAction &JA,
239 const Driver &D,
240 const ArgList &Args,
241 ArgStringList &CmdArgs,
242 const InputInfo &Output,
243 const InputInfoList &Inputs) const {
244 Arg *A;
245
246 CheckPreprocessingOptions(D, Args);
247
248 Args.AddLastArg(CmdArgs, options::OPT_C);
249 Args.AddLastArg(CmdArgs, options::OPT_CC);
250
251 // Handle dependency file generation.
252 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
253 (A = Args.getLastArg(options::OPT_MD)) ||
254 (A = Args.getLastArg(options::OPT_MMD))) {
255 // Determine the output location.
256 const char *DepFile;
257 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
258 DepFile = MF->getValue();
259 C.addFailureResultFile(DepFile, &JA);
260 } else if (Output.getType() == types::TY_Dependencies) {
261 DepFile = Output.getFilename();
262 } else if (A->getOption().matches(options::OPT_M) ||
263 A->getOption().matches(options::OPT_MM)) {
264 DepFile = "-";
265 } else {
266 DepFile = getDependencyFileName(Args, Inputs);
267 C.addFailureResultFile(DepFile, &JA);
268 }
269 CmdArgs.push_back("-dependency-file");
270 CmdArgs.push_back(DepFile);
271
272 // Add a default target if one wasn't specified.
273 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274 const char *DepTarget;
275
276 // If user provided -o, that is the dependency target, except
277 // when we are only generating a dependency file.
278 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
280 DepTarget = OutputOpt->getValue();
281 } else {
282 // Otherwise derive from the base input.
283 //
284 // FIXME: This should use the computed output file location.
285 SmallString<128> P(Inputs[0].getBaseInput());
286 llvm::sys::path::replace_extension(P, "o");
287 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
288 }
289
290 CmdArgs.push_back("-MT");
291 SmallString<128> Quoted;
292 QuoteTarget(DepTarget, Quoted);
293 CmdArgs.push_back(Args.MakeArgString(Quoted));
294 }
295
296 if (A->getOption().matches(options::OPT_M) ||
297 A->getOption().matches(options::OPT_MD))
298 CmdArgs.push_back("-sys-header-deps");
299
300 if (isa<PrecompileJobAction>(JA))
301 CmdArgs.push_back("-module-file-deps");
302 }
303
304 if (Args.hasArg(options::OPT_MG)) {
305 if (!A || A->getOption().matches(options::OPT_MD) ||
306 A->getOption().matches(options::OPT_MMD))
307 D.Diag(diag::err_drv_mg_requires_m_or_mm);
308 CmdArgs.push_back("-MG");
309 }
310
311 Args.AddLastArg(CmdArgs, options::OPT_MP);
312
313 // Convert all -MQ <target> args to -MT <quoted target>
314 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
315 options::OPT_MQ),
316 ie = Args.filtered_end(); it != ie; ++it) {
317 const Arg *A = *it;
318 A->claim();
319
320 if (A->getOption().matches(options::OPT_MQ)) {
321 CmdArgs.push_back("-MT");
322 SmallString<128> Quoted;
323 QuoteTarget(A->getValue(), Quoted);
324 CmdArgs.push_back(Args.MakeArgString(Quoted));
325
326 // -MT flag - no change
327 } else {
328 A->render(Args, CmdArgs);
329 }
330 }
331
332 // Add -i* options, and automatically translate to
333 // -include-pch/-include-pth for transparent PCH support. It's
334 // wonky, but we include looking for .gch so we can support seamless
335 // replacement into a build system already set up to be generating
336 // .gch files.
337 bool RenderedImplicitInclude = false;
338 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
339 ie = Args.filtered_end(); it != ie; ++it) {
340 const Arg *A = it;
341
342 if (A->getOption().matches(options::OPT_include)) {
343 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
344 RenderedImplicitInclude = true;
345
346 // Use PCH if the user requested it.
347 bool UsePCH = D.CCCUsePCH;
348
349 bool FoundPTH = false;
350 bool FoundPCH = false;
351 SmallString<128> P(A->getValue());
352 // We want the files to have a name like foo.h.pch. Add a dummy extension
353 // so that replace_extension does the right thing.
354 P += ".dummy";
355 if (UsePCH) {
356 llvm::sys::path::replace_extension(P, "pch");
357 if (llvm::sys::fs::exists(P.str()))
358 FoundPCH = true;
359 }
360
361 if (!FoundPCH) {
362 llvm::sys::path::replace_extension(P, "pth");
363 if (llvm::sys::fs::exists(P.str()))
364 FoundPTH = true;
365 }
366
367 if (!FoundPCH && !FoundPTH) {
368 llvm::sys::path::replace_extension(P, "gch");
369 if (llvm::sys::fs::exists(P.str())) {
370 FoundPCH = UsePCH;
371 FoundPTH = !UsePCH;
372 }
373 }
374
375 if (FoundPCH || FoundPTH) {
376 if (IsFirstImplicitInclude) {
377 A->claim();
378 if (UsePCH)
379 CmdArgs.push_back("-include-pch");
380 else
381 CmdArgs.push_back("-include-pth");
382 CmdArgs.push_back(Args.MakeArgString(P.str()));
383 continue;
384 } else {
385 // Ignore the PCH if not first on command line and emit warning.
386 D.Diag(diag::warn_drv_pch_not_first_include)
387 << P.str() << A->getAsString(Args);
388 }
389 }
390 }
391
392 // Not translated, render as usual.
393 A->claim();
394 A->render(Args, CmdArgs);
395 }
396
397 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
398 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
399 options::OPT_index_header_map);
400
401 // Add -Wp, and -Xassembler if using the preprocessor.
402
403 // FIXME: There is a very unfortunate problem here, some troubled
404 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
405 // really support that we would have to parse and then translate
406 // those options. :(
407 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
408 options::OPT_Xpreprocessor);
409
410 // -I- is a deprecated GCC feature, reject it.
411 if (Arg *A = Args.getLastArg(options::OPT_I_))
412 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
413
414 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
415 // -isysroot to the CC1 invocation.
416 StringRef sysroot = C.getSysRoot();
417 if (sysroot != "") {
418 if (!Args.hasArg(options::OPT_isysroot)) {
419 CmdArgs.push_back("-isysroot");
420 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
421 }
422 }
423
424 // Parse additional include paths from environment variables.
425 // FIXME: We should probably sink the logic for handling these from the
426 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
427 // CPATH - included following the user specified includes (but prior to
428 // builtin and standard includes).
429 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
430 // C_INCLUDE_PATH - system includes enabled when compiling C.
431 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
432 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
433 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
434 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
435 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
436 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
437 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
438
439 // Add C++ include arguments, if needed.
440 if (types::isCXX(Inputs[0].getType()))
441 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
442
443 // Add system include arguments.
444 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
445 }
446
447 // FIXME: Move to target hook.
isSignedCharDefault(const llvm::Triple & Triple)448 static bool isSignedCharDefault(const llvm::Triple &Triple) {
449 switch (Triple.getArch()) {
450 default:
451 return true;
452
453 case llvm::Triple::aarch64:
454 case llvm::Triple::aarch64_be:
455 case llvm::Triple::arm64:
456 case llvm::Triple::arm64_be:
457 case llvm::Triple::arm:
458 case llvm::Triple::armeb:
459 if (Triple.isOSDarwin() || Triple.isOSWindows())
460 return true;
461 return false;
462
463 case llvm::Triple::ppc:
464 case llvm::Triple::ppc64:
465 if (Triple.isOSDarwin())
466 return true;
467 return false;
468
469 case llvm::Triple::ppc64le:
470 case llvm::Triple::systemz:
471 case llvm::Triple::xcore:
472 return false;
473 }
474 }
475
isNoCommonDefault(const llvm::Triple & Triple)476 static bool isNoCommonDefault(const llvm::Triple &Triple) {
477 switch (Triple.getArch()) {
478 default:
479 return false;
480
481 case llvm::Triple::xcore:
482 return true;
483 }
484 }
485
486 // Handle -mfpu=.
487 //
488 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
489 // frontend target.
getAArch64FPUFeatures(const Driver & D,const Arg * A,const ArgList & Args,std::vector<const char * > & Features)490 static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
491 const ArgList &Args,
492 std::vector<const char *> &Features) {
493 StringRef FPU = A->getValue();
494 if (FPU == "fp-armv8") {
495 Features.push_back("+fp-armv8");
496 } else if (FPU == "neon-fp-armv8") {
497 Features.push_back("+fp-armv8");
498 Features.push_back("+neon");
499 } else if (FPU == "crypto-neon-fp-armv8") {
500 Features.push_back("+fp-armv8");
501 Features.push_back("+neon");
502 Features.push_back("+crypto");
503 } else if (FPU == "neon") {
504 Features.push_back("+neon");
505 } else
506 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
507 }
508
509 // Handle -mhwdiv=.
getARMHWDivFeatures(const Driver & D,const Arg * A,const ArgList & Args,std::vector<const char * > & Features)510 static void getARMHWDivFeatures(const Driver &D, const Arg *A,
511 const ArgList &Args,
512 std::vector<const char *> &Features) {
513 StringRef HWDiv = A->getValue();
514 if (HWDiv == "arm") {
515 Features.push_back("+hwdiv-arm");
516 Features.push_back("-hwdiv");
517 } else if (HWDiv == "thumb") {
518 Features.push_back("-hwdiv-arm");
519 Features.push_back("+hwdiv");
520 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
521 Features.push_back("+hwdiv-arm");
522 Features.push_back("+hwdiv");
523 } else if (HWDiv == "none") {
524 Features.push_back("-hwdiv-arm");
525 Features.push_back("-hwdiv");
526 } else
527 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
528 }
529
530 // Handle -mfpu=.
531 //
532 // FIXME: Centralize feature selection, defaulting shouldn't be also in the
533 // frontend target.
getARMFPUFeatures(const Driver & D,const Arg * A,const ArgList & Args,std::vector<const char * > & Features)534 static void getARMFPUFeatures(const Driver &D, const Arg *A,
535 const ArgList &Args,
536 std::vector<const char *> &Features) {
537 StringRef FPU = A->getValue();
538
539 // Set the target features based on the FPU.
540 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
541 // Disable any default FPU support.
542 Features.push_back("-vfp2");
543 Features.push_back("-vfp3");
544 Features.push_back("-neon");
545 } else if (FPU == "vfp") {
546 Features.push_back("+vfp2");
547 Features.push_back("-neon");
548 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
549 Features.push_back("+vfp3");
550 Features.push_back("+d16");
551 Features.push_back("-neon");
552 } else if (FPU == "vfp3" || FPU == "vfpv3") {
553 Features.push_back("+vfp3");
554 Features.push_back("-neon");
555 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
556 Features.push_back("+vfp4");
557 Features.push_back("+d16");
558 Features.push_back("-neon");
559 } else if (FPU == "vfp4" || FPU == "vfpv4") {
560 Features.push_back("+vfp4");
561 Features.push_back("-neon");
562 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
563 Features.push_back("+vfp4");
564 Features.push_back("+d16");
565 Features.push_back("+fp-only-sp");
566 Features.push_back("-neon");
567 } else if (FPU == "fp-armv8") {
568 Features.push_back("+fp-armv8");
569 Features.push_back("-neon");
570 Features.push_back("-crypto");
571 } else if (FPU == "neon-fp-armv8") {
572 Features.push_back("+fp-armv8");
573 Features.push_back("+neon");
574 Features.push_back("-crypto");
575 } else if (FPU == "crypto-neon-fp-armv8") {
576 Features.push_back("+fp-armv8");
577 Features.push_back("+neon");
578 Features.push_back("+crypto");
579 } else if (FPU == "neon") {
580 Features.push_back("+neon");
581 } else if (FPU == "none") {
582 Features.push_back("-vfp2");
583 Features.push_back("-vfp3");
584 Features.push_back("-vfp4");
585 Features.push_back("-fp-armv8");
586 Features.push_back("-crypto");
587 Features.push_back("-neon");
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 StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
595 const llvm::Triple &Triple) {
596 StringRef FloatABI;
597 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
598 options::OPT_mhard_float,
599 options::OPT_mfloat_abi_EQ)) {
600 if (A->getOption().matches(options::OPT_msoft_float))
601 FloatABI = "soft";
602 else if (A->getOption().matches(options::OPT_mhard_float))
603 FloatABI = "hard";
604 else {
605 FloatABI = A->getValue();
606 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
607 D.Diag(diag::err_drv_invalid_mfloat_abi)
608 << A->getAsString(Args);
609 FloatABI = "soft";
610 }
611 }
612 }
613
614 // If unspecified, choose the default based on the platform.
615 if (FloatABI.empty()) {
616 switch (Triple.getOS()) {
617 case llvm::Triple::Darwin:
618 case llvm::Triple::MacOSX:
619 case llvm::Triple::IOS: {
620 // Darwin defaults to "softfp" for v6 and v7.
621 //
622 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
623 std::string ArchName =
624 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
625 if (StringRef(ArchName).startswith("v6") ||
626 StringRef(ArchName).startswith("v7"))
627 FloatABI = "softfp";
628 else
629 FloatABI = "soft";
630 break;
631 }
632
633 // FIXME: this is invalid for WindowsCE
634 case llvm::Triple::Win32:
635 FloatABI = "hard";
636 break;
637
638 case llvm::Triple::FreeBSD:
639 switch(Triple.getEnvironment()) {
640 case llvm::Triple::GNUEABIHF:
641 FloatABI = "hard";
642 break;
643 default:
644 // FreeBSD defaults to soft float
645 FloatABI = "soft";
646 break;
647 }
648 break;
649
650 default:
651 switch(Triple.getEnvironment()) {
652 case llvm::Triple::GNUEABIHF:
653 FloatABI = "hard";
654 break;
655 case llvm::Triple::GNUEABI:
656 FloatABI = "softfp";
657 break;
658 case llvm::Triple::EABIHF:
659 FloatABI = "hard";
660 break;
661 case llvm::Triple::EABI:
662 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
663 FloatABI = "softfp";
664 break;
665 case llvm::Triple::Android: {
666 std::string ArchName =
667 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
668 if (StringRef(ArchName).startswith("v7"))
669 FloatABI = "softfp";
670 else
671 FloatABI = "soft";
672 break;
673 }
674 default:
675 // Assume "soft", but warn the user we are guessing.
676 FloatABI = "soft";
677 if (Triple.getOS() != llvm::Triple::UnknownOS ||
678 !Triple.isOSBinFormatMachO())
679 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
680 break;
681 }
682 }
683 }
684
685 return FloatABI;
686 }
687
getARMTargetFeatures(const Driver & D,const llvm::Triple & Triple,const ArgList & Args,std::vector<const char * > & Features,bool ForAS)688 static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
689 const ArgList &Args,
690 std::vector<const char *> &Features,
691 bool ForAS) {
692 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
693 if (!ForAS) {
694 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
695 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
696 // stripped out by the ARM target. We should probably pass this a new
697 // -target-option, which is handled by the -cc1/-cc1as invocation.
698 //
699 // FIXME2: For consistency, it would be ideal if we set up the target
700 // machine state the same when using the frontend or the assembler. We don't
701 // currently do that for the assembler, we pass the options directly to the
702 // backend and never even instantiate the frontend TargetInfo. If we did,
703 // and used its handleTargetFeatures hook, then we could ensure the
704 // assembler and the frontend behave the same.
705
706 // Use software floating point operations?
707 if (FloatABI == "soft")
708 Features.push_back("+soft-float");
709
710 // Use software floating point argument passing?
711 if (FloatABI != "hard")
712 Features.push_back("+soft-float-abi");
713 }
714
715 // Honor -mfpu=.
716 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
717 getARMFPUFeatures(D, A, Args, Features);
718 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
719 getARMHWDivFeatures(D, A, Args, Features);
720
721 // Setting -msoft-float effectively disables NEON because of the GCC
722 // implementation, although the same isn't true of VFP or VFP3.
723 if (FloatABI == "soft") {
724 Features.push_back("-neon");
725 // Also need to explicitly disable features which imply NEON.
726 Features.push_back("-crypto");
727 }
728
729 // En/disable crc
730 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
731 options::OPT_mnocrc)) {
732 if (A->getOption().matches(options::OPT_mcrc))
733 Features.push_back("+crc");
734 else
735 Features.push_back("-crc");
736 }
737 }
738
AddARMTargetArgs(const ArgList & Args,ArgStringList & CmdArgs,bool KernelOrKext) const739 void Clang::AddARMTargetArgs(const ArgList &Args,
740 ArgStringList &CmdArgs,
741 bool KernelOrKext) const {
742 const Driver &D = getToolChain().getDriver();
743 // Get the effective triple, which takes into account the deployment target.
744 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
745 llvm::Triple Triple(TripleStr);
746 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
747
748 // Select the ABI to use.
749 //
750 // FIXME: Support -meabi.
751 const char *ABIName = nullptr;
752 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
753 ABIName = A->getValue();
754 } else if (Triple.isOSBinFormatMachO()) {
755 // The backend is hardwired to assume AAPCS for M-class processors, ensure
756 // the frontend matches that.
757 if (Triple.getEnvironment() == llvm::Triple::EABI ||
758 (Triple.getOS() == llvm::Triple::UnknownOS &&
759 Triple.getObjectFormat() == llvm::Triple::MachO) ||
760 StringRef(CPUName).startswith("cortex-m")) {
761 ABIName = "aapcs";
762 } else {
763 ABIName = "apcs-gnu";
764 }
765 } else if (Triple.isOSWindows()) {
766 // FIXME: this is invalid for WindowsCE
767 ABIName = "aapcs";
768 } else {
769 // Select the default based on the platform.
770 switch(Triple.getEnvironment()) {
771 case llvm::Triple::Android:
772 case llvm::Triple::GNUEABI:
773 case llvm::Triple::GNUEABIHF:
774 ABIName = "aapcs-linux";
775 break;
776 case llvm::Triple::EABIHF:
777 case llvm::Triple::EABI:
778 ABIName = "aapcs";
779 break;
780 default:
781 ABIName = "apcs-gnu";
782 }
783 }
784 CmdArgs.push_back("-target-abi");
785 CmdArgs.push_back(ABIName);
786
787 // Determine floating point ABI from the options & target defaults.
788 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
789 if (FloatABI == "soft") {
790 // Floating point operations and argument passing are soft.
791 //
792 // FIXME: This changes CPP defines, we need -target-soft-float.
793 CmdArgs.push_back("-msoft-float");
794 CmdArgs.push_back("-mfloat-abi");
795 CmdArgs.push_back("soft");
796 } else if (FloatABI == "softfp") {
797 // Floating point operations are hard, but argument passing is soft.
798 CmdArgs.push_back("-mfloat-abi");
799 CmdArgs.push_back("soft");
800 } else {
801 // Floating point operations and argument passing are hard.
802 assert(FloatABI == "hard" && "Invalid float abi!");
803 CmdArgs.push_back("-mfloat-abi");
804 CmdArgs.push_back("hard");
805 }
806
807 // Kernel code has more strict alignment requirements.
808 if (KernelOrKext) {
809 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
810 CmdArgs.push_back("-backend-option");
811 CmdArgs.push_back("-arm-long-calls");
812 }
813
814 CmdArgs.push_back("-backend-option");
815 CmdArgs.push_back("-arm-strict-align");
816
817 // The kext linker doesn't know how to deal with movw/movt.
818 CmdArgs.push_back("-backend-option");
819 CmdArgs.push_back("-arm-use-movt=0");
820 }
821
822 // Setting -mno-global-merge disables the codegen global merge pass. Setting
823 // -mglobal-merge has no effect as the pass is enabled by default.
824 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
825 options::OPT_mno_global_merge)) {
826 if (A->getOption().matches(options::OPT_mno_global_merge))
827 CmdArgs.push_back("-mno-global-merge");
828 }
829
830 if (!Args.hasFlag(options::OPT_mimplicit_float,
831 options::OPT_mno_implicit_float,
832 true))
833 CmdArgs.push_back("-no-implicit-float");
834
835 // llvm does not support reserving registers in general. There is support
836 // for reserving r9 on ARM though (defined as a platform-specific register
837 // in ARM EABI).
838 if (Args.hasArg(options::OPT_ffixed_r9)) {
839 CmdArgs.push_back("-backend-option");
840 CmdArgs.push_back("-arm-reserve-r9");
841 }
842 }
843
844 /// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
845 /// targeting.
getAArch64TargetCPU(const ArgList & Args)846 static std::string getAArch64TargetCPU(const ArgList &Args) {
847 // If we have -mcpu=, use that.
848 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
849 StringRef MCPU = A->getValue();
850 // Handle -mcpu=native.
851 if (MCPU == "native")
852 return llvm::sys::getHostCPUName();
853 else
854 return MCPU;
855 }
856
857 // At some point, we may need to check -march here, but for now we only
858 // one arm64 architecture.
859
860 // Make sure we pick "cyclone" if -arch is used.
861 // FIXME: Should this be picked by checking the target triple instead?
862 if (Args.getLastArg(options::OPT_arch))
863 return "cyclone";
864
865 return "generic";
866 }
867
AddAArch64TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const868 void Clang::AddAArch64TargetArgs(const ArgList &Args,
869 ArgStringList &CmdArgs) const {
870 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
871 llvm::Triple Triple(TripleStr);
872
873 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
874 Args.hasArg(options::OPT_mkernel) ||
875 Args.hasArg(options::OPT_fapple_kext))
876 CmdArgs.push_back("-disable-red-zone");
877
878 if (!Args.hasFlag(options::OPT_mimplicit_float,
879 options::OPT_mno_implicit_float, true))
880 CmdArgs.push_back("-no-implicit-float");
881
882 const char *ABIName = nullptr;
883 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
884 ABIName = A->getValue();
885 else if (Triple.isOSDarwin())
886 ABIName = "darwinpcs";
887 else
888 ABIName = "aapcs";
889
890 CmdArgs.push_back("-target-abi");
891 CmdArgs.push_back(ABIName);
892
893 CmdArgs.push_back("-target-cpu");
894 CmdArgs.push_back(Args.MakeArgString(getAArch64TargetCPU(Args)));
895
896 if (Args.hasArg(options::OPT_mstrict_align)) {
897 CmdArgs.push_back("-backend-option");
898 CmdArgs.push_back("-aarch64-strict-align");
899 }
900
901 // Setting -mno-global-merge disables the codegen global merge pass. Setting
902 // -mglobal-merge has no effect as the pass is enabled by default.
903 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
904 options::OPT_mno_global_merge)) {
905 if (A->getOption().matches(options::OPT_mno_global_merge))
906 CmdArgs.push_back("-mno-global-merge");
907 }
908 }
909
910 // Get CPU and ABI names. They are not independent
911 // so we have to calculate them together.
getMipsCPUAndABI(const ArgList & Args,const llvm::Triple & Triple,StringRef & CPUName,StringRef & ABIName)912 static void getMipsCPUAndABI(const ArgList &Args,
913 const llvm::Triple &Triple,
914 StringRef &CPUName,
915 StringRef &ABIName) {
916 const char *DefMips32CPU = "mips32r2";
917 const char *DefMips64CPU = "mips64r2";
918
919 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
920 // default for mips64(el)?-img-linux-gnu.
921 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
922 Triple.getEnvironment() == llvm::Triple::GNU) {
923 DefMips32CPU = "mips32r6";
924 DefMips64CPU = "mips64r6";
925 }
926
927 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
928 options::OPT_mcpu_EQ))
929 CPUName = A->getValue();
930
931 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
932 ABIName = A->getValue();
933 // Convert a GNU style Mips ABI name to the name
934 // accepted by LLVM Mips backend.
935 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
936 .Case("32", "o32")
937 .Case("64", "n64")
938 .Default(ABIName);
939 }
940
941 // Setup default CPU and ABI names.
942 if (CPUName.empty() && ABIName.empty()) {
943 switch (Triple.getArch()) {
944 default:
945 llvm_unreachable("Unexpected triple arch name");
946 case llvm::Triple::mips:
947 case llvm::Triple::mipsel:
948 CPUName = DefMips32CPU;
949 break;
950 case llvm::Triple::mips64:
951 case llvm::Triple::mips64el:
952 CPUName = DefMips64CPU;
953 break;
954 }
955 }
956
957 if (ABIName.empty()) {
958 // Deduce ABI name from the target triple.
959 if (Triple.getArch() == llvm::Triple::mips ||
960 Triple.getArch() == llvm::Triple::mipsel)
961 ABIName = "o32";
962 else
963 ABIName = "n64";
964 }
965
966 if (CPUName.empty()) {
967 // Deduce CPU name from ABI name.
968 CPUName = llvm::StringSwitch<const char *>(ABIName)
969 .Cases("o32", "eabi", DefMips32CPU)
970 .Cases("n32", "n64", DefMips64CPU)
971 .Default("");
972 }
973 }
974
975 // Convert ABI name to the GNU tools acceptable variant.
getGnuCompatibleMipsABIName(StringRef ABI)976 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
977 return llvm::StringSwitch<llvm::StringRef>(ABI)
978 .Case("o32", "32")
979 .Case("n64", "64")
980 .Default(ABI);
981 }
982
983 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
984 // and -mfloat-abi=.
getMipsFloatABI(const Driver & D,const ArgList & Args)985 static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
986 StringRef FloatABI;
987 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
988 options::OPT_mhard_float,
989 options::OPT_mfloat_abi_EQ)) {
990 if (A->getOption().matches(options::OPT_msoft_float))
991 FloatABI = "soft";
992 else if (A->getOption().matches(options::OPT_mhard_float))
993 FloatABI = "hard";
994 else {
995 FloatABI = A->getValue();
996 if (FloatABI != "soft" && FloatABI != "hard") {
997 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
998 FloatABI = "hard";
999 }
1000 }
1001 }
1002
1003 // If unspecified, choose the default based on the platform.
1004 if (FloatABI.empty()) {
1005 // Assume "hard", because it's a default value used by gcc.
1006 // When we start to recognize specific target MIPS processors,
1007 // we will be able to select the default more correctly.
1008 FloatABI = "hard";
1009 }
1010
1011 return FloatABI;
1012 }
1013
AddTargetFeature(const ArgList & Args,std::vector<const char * > & Features,OptSpecifier OnOpt,OptSpecifier OffOpt,StringRef FeatureName)1014 static void AddTargetFeature(const ArgList &Args,
1015 std::vector<const char *> &Features,
1016 OptSpecifier OnOpt, OptSpecifier OffOpt,
1017 StringRef FeatureName) {
1018 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
1019 if (A->getOption().matches(OnOpt))
1020 Features.push_back(Args.MakeArgString("+" + FeatureName));
1021 else
1022 Features.push_back(Args.MakeArgString("-" + FeatureName));
1023 }
1024 }
1025
getMIPSTargetFeatures(const Driver & D,const ArgList & Args,std::vector<const char * > & Features)1026 static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1027 std::vector<const char *> &Features) {
1028 StringRef FloatABI = getMipsFloatABI(D, Args);
1029 if (FloatABI == "soft") {
1030 // FIXME: Note, this is a hack. We need to pass the selected float
1031 // mode to the MipsTargetInfoBase to define appropriate macros there.
1032 // Now it is the only method.
1033 Features.push_back("+soft-float");
1034 }
1035
1036 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1037 StringRef Val = StringRef(A->getValue());
1038 if (Val == "2008")
1039 Features.push_back("+nan2008");
1040 else if (Val == "legacy")
1041 Features.push_back("-nan2008");
1042 else
1043 D.Diag(diag::err_drv_unsupported_option_argument)
1044 << A->getOption().getName() << Val;
1045 }
1046
1047 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1048 options::OPT_mdouble_float, "single-float");
1049 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1050 "mips16");
1051 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1052 options::OPT_mno_micromips, "micromips");
1053 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1054 "dsp");
1055 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1056 "dspr2");
1057 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1058 "msa");
1059 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1060 "fp64");
1061 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1062 options::OPT_modd_spreg, "nooddspreg");
1063 }
1064
AddMIPSTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1065 void Clang::AddMIPSTargetArgs(const ArgList &Args,
1066 ArgStringList &CmdArgs) const {
1067 const Driver &D = getToolChain().getDriver();
1068 StringRef CPUName;
1069 StringRef ABIName;
1070 const llvm::Triple &Triple = getToolChain().getTriple();
1071 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1072
1073 CmdArgs.push_back("-target-abi");
1074 CmdArgs.push_back(ABIName.data());
1075
1076 StringRef FloatABI = getMipsFloatABI(D, Args);
1077
1078 if (FloatABI == "soft") {
1079 // Floating point operations and argument passing are soft.
1080 CmdArgs.push_back("-msoft-float");
1081 CmdArgs.push_back("-mfloat-abi");
1082 CmdArgs.push_back("soft");
1083 }
1084 else {
1085 // Floating point operations and argument passing are hard.
1086 assert(FloatABI == "hard" && "Invalid float abi!");
1087 CmdArgs.push_back("-mfloat-abi");
1088 CmdArgs.push_back("hard");
1089 }
1090
1091 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1092 if (A->getOption().matches(options::OPT_mxgot)) {
1093 CmdArgs.push_back("-mllvm");
1094 CmdArgs.push_back("-mxgot");
1095 }
1096 }
1097
1098 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1099 options::OPT_mno_ldc1_sdc1)) {
1100 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1101 CmdArgs.push_back("-mllvm");
1102 CmdArgs.push_back("-mno-ldc1-sdc1");
1103 }
1104 }
1105
1106 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1107 options::OPT_mno_check_zero_division)) {
1108 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1109 CmdArgs.push_back("-mllvm");
1110 CmdArgs.push_back("-mno-check-zero-division");
1111 }
1112 }
1113
1114 if (Arg *A = Args.getLastArg(options::OPT_G)) {
1115 StringRef v = A->getValue();
1116 CmdArgs.push_back("-mllvm");
1117 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1118 A->claim();
1119 }
1120 }
1121
1122 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
getPPCTargetCPU(const ArgList & Args)1123 static std::string getPPCTargetCPU(const ArgList &Args) {
1124 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1125 StringRef CPUName = A->getValue();
1126
1127 if (CPUName == "native") {
1128 std::string CPU = llvm::sys::getHostCPUName();
1129 if (!CPU.empty() && CPU != "generic")
1130 return CPU;
1131 else
1132 return "";
1133 }
1134
1135 return llvm::StringSwitch<const char *>(CPUName)
1136 .Case("common", "generic")
1137 .Case("440", "440")
1138 .Case("440fp", "440")
1139 .Case("450", "450")
1140 .Case("601", "601")
1141 .Case("602", "602")
1142 .Case("603", "603")
1143 .Case("603e", "603e")
1144 .Case("603ev", "603ev")
1145 .Case("604", "604")
1146 .Case("604e", "604e")
1147 .Case("620", "620")
1148 .Case("630", "pwr3")
1149 .Case("G3", "g3")
1150 .Case("7400", "7400")
1151 .Case("G4", "g4")
1152 .Case("7450", "7450")
1153 .Case("G4+", "g4+")
1154 .Case("750", "750")
1155 .Case("970", "970")
1156 .Case("G5", "g5")
1157 .Case("a2", "a2")
1158 .Case("a2q", "a2q")
1159 .Case("e500mc", "e500mc")
1160 .Case("e5500", "e5500")
1161 .Case("power3", "pwr3")
1162 .Case("power4", "pwr4")
1163 .Case("power5", "pwr5")
1164 .Case("power5x", "pwr5x")
1165 .Case("power6", "pwr6")
1166 .Case("power6x", "pwr6x")
1167 .Case("power7", "pwr7")
1168 .Case("power8", "pwr8")
1169 .Case("pwr3", "pwr3")
1170 .Case("pwr4", "pwr4")
1171 .Case("pwr5", "pwr5")
1172 .Case("pwr5x", "pwr5x")
1173 .Case("pwr6", "pwr6")
1174 .Case("pwr6x", "pwr6x")
1175 .Case("pwr7", "pwr7")
1176 .Case("pwr8", "pwr8")
1177 .Case("powerpc", "ppc")
1178 .Case("powerpc64", "ppc64")
1179 .Case("powerpc64le", "ppc64le")
1180 .Default("");
1181 }
1182
1183 return "";
1184 }
1185
getPPCTargetFeatures(const ArgList & Args,std::vector<const char * > & Features)1186 static void getPPCTargetFeatures(const ArgList &Args,
1187 std::vector<const char *> &Features) {
1188 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1189 ie = Args.filtered_end();
1190 it != ie; ++it) {
1191 StringRef Name = (*it)->getOption().getName();
1192 (*it)->claim();
1193
1194 // Skip over "-m".
1195 assert(Name.startswith("m") && "Invalid feature name.");
1196 Name = Name.substr(1);
1197
1198 bool IsNegative = Name.startswith("no-");
1199 if (IsNegative)
1200 Name = Name.substr(3);
1201
1202 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1203 // pass the correct option to the backend while calling the frontend
1204 // option the same.
1205 // TODO: Change the LLVM backend option maybe?
1206 if (Name == "mfcrf")
1207 Name = "mfocrf";
1208
1209 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1210 }
1211
1212 // Altivec is a bit weird, allow overriding of the Altivec feature here.
1213 AddTargetFeature(Args, Features, options::OPT_faltivec,
1214 options::OPT_fno_altivec, "altivec");
1215 }
1216
1217 /// Get the (LLVM) name of the R600 gpu we are targeting.
getR600TargetGPU(const ArgList & Args)1218 static std::string getR600TargetGPU(const ArgList &Args) {
1219 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1220 const char *GPUName = A->getValue();
1221 return llvm::StringSwitch<const char *>(GPUName)
1222 .Cases("rv630", "rv635", "r600")
1223 .Cases("rv610", "rv620", "rs780", "rs880")
1224 .Case("rv740", "rv770")
1225 .Case("palm", "cedar")
1226 .Cases("sumo", "sumo2", "sumo")
1227 .Case("hemlock", "cypress")
1228 .Case("aruba", "cayman")
1229 .Default(GPUName);
1230 }
1231 return "";
1232 }
1233
getSparcTargetFeatures(const ArgList & Args,std::vector<const char * > Features)1234 static void getSparcTargetFeatures(const ArgList &Args,
1235 std::vector<const char *> Features) {
1236 bool SoftFloatABI = true;
1237 if (Arg *A =
1238 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1239 if (A->getOption().matches(options::OPT_mhard_float))
1240 SoftFloatABI = false;
1241 }
1242 if (SoftFloatABI)
1243 Features.push_back("+soft-float");
1244 }
1245
AddSparcTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1246 void Clang::AddSparcTargetArgs(const ArgList &Args,
1247 ArgStringList &CmdArgs) const {
1248 const Driver &D = getToolChain().getDriver();
1249
1250 // Select the float ABI as determined by -msoft-float, -mhard-float, and
1251 StringRef FloatABI;
1252 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1253 options::OPT_mhard_float)) {
1254 if (A->getOption().matches(options::OPT_msoft_float))
1255 FloatABI = "soft";
1256 else if (A->getOption().matches(options::OPT_mhard_float))
1257 FloatABI = "hard";
1258 }
1259
1260 // If unspecified, choose the default based on the platform.
1261 if (FloatABI.empty()) {
1262 // Assume "soft", but warn the user we are guessing.
1263 FloatABI = "soft";
1264 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
1265 }
1266
1267 if (FloatABI == "soft") {
1268 // Floating point operations and argument passing are soft.
1269 //
1270 // FIXME: This changes CPP defines, we need -target-soft-float.
1271 CmdArgs.push_back("-msoft-float");
1272 } else {
1273 assert(FloatABI == "hard" && "Invalid float abi!");
1274 CmdArgs.push_back("-mhard-float");
1275 }
1276 }
1277
getSystemZTargetCPU(const ArgList & Args)1278 static const char *getSystemZTargetCPU(const ArgList &Args) {
1279 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1280 return A->getValue();
1281 return "z10";
1282 }
1283
getX86TargetCPU(const ArgList & Args,const llvm::Triple & Triple)1284 static const char *getX86TargetCPU(const ArgList &Args,
1285 const llvm::Triple &Triple) {
1286 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1287 if (StringRef(A->getValue()) != "native") {
1288 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
1289 return "core-avx2";
1290
1291 return A->getValue();
1292 }
1293
1294 // FIXME: Reject attempts to use -march=native unless the target matches
1295 // the host.
1296 //
1297 // FIXME: We should also incorporate the detected target features for use
1298 // with -native.
1299 std::string CPU = llvm::sys::getHostCPUName();
1300 if (!CPU.empty() && CPU != "generic")
1301 return Args.MakeArgString(CPU);
1302 }
1303
1304 // Select the default CPU if none was given (or detection failed).
1305
1306 if (Triple.getArch() != llvm::Triple::x86_64 &&
1307 Triple.getArch() != llvm::Triple::x86)
1308 return nullptr; // This routine is only handling x86 targets.
1309
1310 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1311
1312 // FIXME: Need target hooks.
1313 if (Triple.isOSDarwin()) {
1314 if (Triple.getArchName() == "x86_64h")
1315 return "core-avx2";
1316 return Is64Bit ? "core2" : "yonah";
1317 }
1318
1319 // On Android use targets compatible with gcc
1320 if (Triple.getEnvironment() == llvm::Triple::Android)
1321 return Is64Bit ? "x86-64" : "i686";
1322
1323 // Everything else goes to x86-64 in 64-bit mode.
1324 if (Is64Bit)
1325 return "x86-64";
1326
1327 switch (Triple.getOS()) {
1328 case llvm::Triple::FreeBSD:
1329 case llvm::Triple::NetBSD:
1330 case llvm::Triple::OpenBSD:
1331 return "i486";
1332 case llvm::Triple::Haiku:
1333 return "i586";
1334 case llvm::Triple::Bitrig:
1335 return "i686";
1336 default:
1337 // Fallback to p4.
1338 return "pentium4";
1339 }
1340 }
1341
getCPUName(const ArgList & Args,const llvm::Triple & T)1342 static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1343 switch(T.getArch()) {
1344 default:
1345 return "";
1346
1347 case llvm::Triple::aarch64:
1348 case llvm::Triple::aarch64_be:
1349 case llvm::Triple::arm64:
1350 case llvm::Triple::arm64_be:
1351 return getAArch64TargetCPU(Args);
1352
1353 case llvm::Triple::arm:
1354 case llvm::Triple::armeb:
1355 case llvm::Triple::thumb:
1356 case llvm::Triple::thumbeb:
1357 return arm::getARMTargetCPU(Args, T);
1358
1359 case llvm::Triple::mips:
1360 case llvm::Triple::mipsel:
1361 case llvm::Triple::mips64:
1362 case llvm::Triple::mips64el: {
1363 StringRef CPUName;
1364 StringRef ABIName;
1365 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1366 return CPUName;
1367 }
1368
1369 case llvm::Triple::ppc:
1370 case llvm::Triple::ppc64:
1371 case llvm::Triple::ppc64le: {
1372 std::string TargetCPUName = getPPCTargetCPU(Args);
1373 // LLVM may default to generating code for the native CPU,
1374 // but, like gcc, we default to a more generic option for
1375 // each architecture. (except on Darwin)
1376 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1377 if (T.getArch() == llvm::Triple::ppc64)
1378 TargetCPUName = "ppc64";
1379 else if (T.getArch() == llvm::Triple::ppc64le)
1380 TargetCPUName = "ppc64le";
1381 else
1382 TargetCPUName = "ppc";
1383 }
1384 return TargetCPUName;
1385 }
1386
1387 case llvm::Triple::sparc:
1388 case llvm::Triple::sparcv9:
1389 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1390 return A->getValue();
1391 return "";
1392
1393 case llvm::Triple::x86:
1394 case llvm::Triple::x86_64:
1395 return getX86TargetCPU(Args, T);
1396
1397 case llvm::Triple::hexagon:
1398 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1399
1400 case llvm::Triple::systemz:
1401 return getSystemZTargetCPU(Args);
1402
1403 case llvm::Triple::r600:
1404 return getR600TargetGPU(Args);
1405 }
1406 }
1407
AddGoldPlugin(const ToolChain & ToolChain,const ArgList & Args,ArgStringList & CmdArgs)1408 static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1409 ArgStringList &CmdArgs) {
1410 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1411 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1412 // forward.
1413 CmdArgs.push_back("-plugin");
1414 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1415 CmdArgs.push_back(Args.MakeArgString(Plugin));
1416
1417 // Try to pass driver level flags relevant to LTO code generation down to
1418 // the plugin.
1419
1420 // Handle flags for selecting CPU variants.
1421 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1422 if (!CPU.empty())
1423 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1424 }
1425
getX86TargetFeatures(const llvm::Triple & Triple,const ArgList & Args,std::vector<const char * > & Features)1426 static void getX86TargetFeatures(const llvm::Triple &Triple,
1427 const ArgList &Args,
1428 std::vector<const char *> &Features) {
1429 if (Triple.getArchName() == "x86_64h") {
1430 // x86_64h implies quite a few of the more modern subtarget features
1431 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1432 Features.push_back("-rdrnd");
1433 Features.push_back("-aes");
1434 Features.push_back("-pclmul");
1435 Features.push_back("-rtm");
1436 Features.push_back("-hle");
1437 Features.push_back("-fsgsbase");
1438 }
1439
1440 // Add features to comply with gcc on Android
1441 if (Triple.getEnvironment() == llvm::Triple::Android) {
1442 if (Triple.getArch() == llvm::Triple::x86_64) {
1443 Features.push_back("+sse4.2");
1444 Features.push_back("+popcnt");
1445 } else
1446 Features.push_back("+ssse3");
1447 }
1448
1449 // Now add any that the user explicitly requested on the command line,
1450 // which may override the defaults.
1451 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1452 ie = Args.filtered_end();
1453 it != ie; ++it) {
1454 StringRef Name = (*it)->getOption().getName();
1455 (*it)->claim();
1456
1457 // Skip over "-m".
1458 assert(Name.startswith("m") && "Invalid feature name.");
1459 Name = Name.substr(1);
1460
1461 bool IsNegative = Name.startswith("no-");
1462 if (IsNegative)
1463 Name = Name.substr(3);
1464
1465 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1466 }
1467 }
1468
AddX86TargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1469 void Clang::AddX86TargetArgs(const ArgList &Args,
1470 ArgStringList &CmdArgs) const {
1471 if (!Args.hasFlag(options::OPT_mred_zone,
1472 options::OPT_mno_red_zone,
1473 true) ||
1474 Args.hasArg(options::OPT_mkernel) ||
1475 Args.hasArg(options::OPT_fapple_kext))
1476 CmdArgs.push_back("-disable-red-zone");
1477
1478 // Default to avoid implicit floating-point for kernel/kext code, but allow
1479 // that to be overridden with -mno-soft-float.
1480 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1481 Args.hasArg(options::OPT_fapple_kext));
1482 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1483 options::OPT_mno_soft_float,
1484 options::OPT_mimplicit_float,
1485 options::OPT_mno_implicit_float)) {
1486 const Option &O = A->getOption();
1487 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1488 O.matches(options::OPT_msoft_float));
1489 }
1490 if (NoImplicitFloat)
1491 CmdArgs.push_back("-no-implicit-float");
1492
1493 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1494 StringRef Value = A->getValue();
1495 if (Value == "intel" || Value == "att") {
1496 CmdArgs.push_back("-mllvm");
1497 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1498 } else {
1499 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1500 << A->getOption().getName() << Value;
1501 }
1502 }
1503 }
1504
HasPICArg(const ArgList & Args)1505 static inline bool HasPICArg(const ArgList &Args) {
1506 return Args.hasArg(options::OPT_fPIC)
1507 || Args.hasArg(options::OPT_fpic);
1508 }
1509
GetLastSmallDataThresholdArg(const ArgList & Args)1510 static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1511 return Args.getLastArg(options::OPT_G,
1512 options::OPT_G_EQ,
1513 options::OPT_msmall_data_threshold_EQ);
1514 }
1515
GetHexagonSmallDataThresholdValue(const ArgList & Args)1516 static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1517 std::string value;
1518 if (HasPICArg(Args))
1519 value = "0";
1520 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1521 value = A->getValue();
1522 A->claim();
1523 }
1524 return value;
1525 }
1526
AddHexagonTargetArgs(const ArgList & Args,ArgStringList & CmdArgs) const1527 void Clang::AddHexagonTargetArgs(const ArgList &Args,
1528 ArgStringList &CmdArgs) const {
1529 CmdArgs.push_back("-fno-signed-char");
1530 CmdArgs.push_back("-mqdsp6-compat");
1531 CmdArgs.push_back("-Wreturn-type");
1532
1533 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1534 if (!SmallDataThreshold.empty()) {
1535 CmdArgs.push_back ("-mllvm");
1536 CmdArgs.push_back(Args.MakeArgString(
1537 "-hexagon-small-data-threshold=" + SmallDataThreshold));
1538 }
1539
1540 if (!Args.hasArg(options::OPT_fno_short_enums))
1541 CmdArgs.push_back("-fshort-enums");
1542 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1543 CmdArgs.push_back ("-mllvm");
1544 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1545 }
1546 CmdArgs.push_back ("-mllvm");
1547 CmdArgs.push_back ("-machine-sink-split=0");
1548 }
1549
getAArch64TargetFeatures(const Driver & D,const ArgList & Args,std::vector<const char * > & Features)1550 static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1551 std::vector<const char *> &Features) {
1552 // Honor -mfpu=.
1553 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
1554 getAArch64FPUFeatures(D, A, Args, Features);
1555 else
1556 Features.push_back("+neon");
1557
1558 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1559 Features.push_back("-fp-armv8");
1560 Features.push_back("-crypto");
1561 Features.push_back("-neon");
1562 }
1563
1564 // En/disable crc
1565 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1566 options::OPT_mnocrc)) {
1567 if (A->getOption().matches(options::OPT_mcrc))
1568 Features.push_back("+crc");
1569 else
1570 Features.push_back("-crc");
1571 }
1572 }
1573
getTargetFeatures(const Driver & D,const llvm::Triple & Triple,const ArgList & Args,ArgStringList & CmdArgs,bool ForAS)1574 static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1575 const ArgList &Args, ArgStringList &CmdArgs,
1576 bool ForAS) {
1577 std::vector<const char *> Features;
1578 switch (Triple.getArch()) {
1579 default:
1580 break;
1581 case llvm::Triple::mips:
1582 case llvm::Triple::mipsel:
1583 case llvm::Triple::mips64:
1584 case llvm::Triple::mips64el:
1585 getMIPSTargetFeatures(D, Args, Features);
1586 break;
1587
1588 case llvm::Triple::arm:
1589 case llvm::Triple::armeb:
1590 case llvm::Triple::thumb:
1591 case llvm::Triple::thumbeb:
1592 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
1593 break;
1594
1595 case llvm::Triple::ppc:
1596 case llvm::Triple::ppc64:
1597 case llvm::Triple::ppc64le:
1598 getPPCTargetFeatures(Args, Features);
1599 break;
1600 case llvm::Triple::sparc:
1601 getSparcTargetFeatures(Args, Features);
1602 break;
1603 case llvm::Triple::aarch64:
1604 case llvm::Triple::aarch64_be:
1605 case llvm::Triple::arm64:
1606 case llvm::Triple::arm64_be:
1607 getAArch64TargetFeatures(D, Args, Features);
1608 break;
1609 case llvm::Triple::x86:
1610 case llvm::Triple::x86_64:
1611 getX86TargetFeatures(Triple, Args, Features);
1612 break;
1613 }
1614
1615 // Find the last of each feature.
1616 llvm::StringMap<unsigned> LastOpt;
1617 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1618 const char *Name = Features[I];
1619 assert(Name[0] == '-' || Name[0] == '+');
1620 LastOpt[Name + 1] = I;
1621 }
1622
1623 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1624 // If this feature was overridden, ignore it.
1625 const char *Name = Features[I];
1626 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1627 assert(LastI != LastOpt.end());
1628 unsigned Last = LastI->second;
1629 if (Last != I)
1630 continue;
1631
1632 CmdArgs.push_back("-target-feature");
1633 CmdArgs.push_back(Name);
1634 }
1635 }
1636
1637 static bool
shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime & runtime,const llvm::Triple & Triple)1638 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1639 const llvm::Triple &Triple) {
1640 // We use the zero-cost exception tables for Objective-C if the non-fragile
1641 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1642 // later.
1643 if (runtime.isNonFragile())
1644 return true;
1645
1646 if (!Triple.isMacOSX())
1647 return false;
1648
1649 return (!Triple.isMacOSXVersionLT(10,5) &&
1650 (Triple.getArch() == llvm::Triple::x86_64 ||
1651 Triple.getArch() == llvm::Triple::arm));
1652 }
1653
1654 namespace {
1655 struct ExceptionSettings {
1656 bool ExceptionsEnabled;
1657 bool ShouldUseExceptionTables;
ExceptionSettings__anonebe874ec0111::ExceptionSettings1658 ExceptionSettings() : ExceptionsEnabled(false),
1659 ShouldUseExceptionTables(false) {}
1660 };
1661 } // end anonymous namespace.
1662
1663 // exceptionSettings() exists to share the logic between -cc1 and linker
1664 // invocations.
exceptionSettings(const ArgList & Args,const llvm::Triple & Triple)1665 static ExceptionSettings exceptionSettings(const ArgList &Args,
1666 const llvm::Triple &Triple) {
1667 ExceptionSettings ES;
1668
1669 // Are exceptions enabled by default?
1670 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1671
1672 // This keeps track of whether exceptions were explicitly turned on or off.
1673 bool DidHaveExplicitExceptionFlag = false;
1674
1675 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1676 options::OPT_fno_exceptions)) {
1677 if (A->getOption().matches(options::OPT_fexceptions))
1678 ES.ExceptionsEnabled = true;
1679 else
1680 ES.ExceptionsEnabled = false;
1681
1682 DidHaveExplicitExceptionFlag = true;
1683 }
1684
1685 // Exception tables and cleanups can be enabled with -fexceptions even if the
1686 // language itself doesn't support exceptions.
1687 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1688 ES.ShouldUseExceptionTables = true;
1689
1690 return ES;
1691 }
1692
1693 /// addExceptionArgs - Adds exception related arguments to the driver command
1694 /// arguments. There's a master flag, -fexceptions and also language specific
1695 /// flags to enable/disable C++ and Objective-C exceptions.
1696 /// This makes it possible to for example disable C++ exceptions but enable
1697 /// Objective-C exceptions.
addExceptionArgs(const ArgList & Args,types::ID InputType,const llvm::Triple & Triple,bool KernelOrKext,const ObjCRuntime & objcRuntime,ArgStringList & CmdArgs)1698 static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1699 const llvm::Triple &Triple,
1700 bool KernelOrKext,
1701 const ObjCRuntime &objcRuntime,
1702 ArgStringList &CmdArgs) {
1703 if (KernelOrKext) {
1704 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1705 // arguments now to avoid warnings about unused arguments.
1706 Args.ClaimAllArgs(options::OPT_fexceptions);
1707 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1708 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1709 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1710 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1711 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
1712 return;
1713 }
1714
1715 // Gather the exception settings from the command line arguments.
1716 ExceptionSettings ES = exceptionSettings(Args, Triple);
1717
1718 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1719 // is not necessarily sensible, but follows GCC.
1720 if (types::isObjC(InputType) &&
1721 Args.hasFlag(options::OPT_fobjc_exceptions,
1722 options::OPT_fno_objc_exceptions,
1723 true)) {
1724 CmdArgs.push_back("-fobjc-exceptions");
1725
1726 ES.ShouldUseExceptionTables |=
1727 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
1728 }
1729
1730 if (types::isCXX(InputType)) {
1731 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
1732
1733 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1734 options::OPT_fno_cxx_exceptions,
1735 options::OPT_fexceptions,
1736 options::OPT_fno_exceptions)) {
1737 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1738 CXXExceptionsEnabled = true;
1739 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
1740 CXXExceptionsEnabled = false;
1741 }
1742
1743 if (CXXExceptionsEnabled) {
1744 CmdArgs.push_back("-fcxx-exceptions");
1745
1746 ES.ShouldUseExceptionTables = true;
1747 }
1748 }
1749
1750 if (ES.ShouldUseExceptionTables)
1751 CmdArgs.push_back("-fexceptions");
1752 }
1753
ShouldDisableAutolink(const ArgList & Args,const ToolChain & TC)1754 static bool ShouldDisableAutolink(const ArgList &Args,
1755 const ToolChain &TC) {
1756 bool Default = true;
1757 if (TC.getTriple().isOSDarwin()) {
1758 // The native darwin assembler doesn't support the linker_option directives,
1759 // so we disable them if we think the .s file will be passed to it.
1760 Default = TC.useIntegratedAs();
1761 }
1762 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1763 Default);
1764 }
1765
ShouldDisableDwarfDirectory(const ArgList & Args,const ToolChain & TC)1766 static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1767 const ToolChain &TC) {
1768 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1769 options::OPT_fno_dwarf_directory_asm,
1770 TC.useIntegratedAs());
1771 return !UseDwarfDirectory;
1772 }
1773
1774 /// \brief Check whether the given input tree contains any compilation actions.
ContainsCompileAction(const Action * A)1775 static bool ContainsCompileAction(const Action *A) {
1776 if (isa<CompileJobAction>(A))
1777 return true;
1778
1779 for (const auto &Act : *A)
1780 if (ContainsCompileAction(Act))
1781 return true;
1782
1783 return false;
1784 }
1785
1786 /// \brief Check if -relax-all should be passed to the internal assembler.
1787 /// This is done by default when compiling non-assembler source with -O0.
UseRelaxAll(Compilation & C,const ArgList & Args)1788 static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1789 bool RelaxDefault = true;
1790
1791 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1792 RelaxDefault = A->getOption().matches(options::OPT_O0);
1793
1794 if (RelaxDefault) {
1795 RelaxDefault = false;
1796 for (const auto &Act : C.getActions()) {
1797 if (ContainsCompileAction(Act)) {
1798 RelaxDefault = true;
1799 break;
1800 }
1801 }
1802 }
1803
1804 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1805 RelaxDefault);
1806 }
1807
CollectArgsForIntegratedAssembler(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs,const Driver & D)1808 static void CollectArgsForIntegratedAssembler(Compilation &C,
1809 const ArgList &Args,
1810 ArgStringList &CmdArgs,
1811 const Driver &D) {
1812 if (UseRelaxAll(C, Args))
1813 CmdArgs.push_back("-mrelax-all");
1814
1815 // When passing -I arguments to the assembler we sometimes need to
1816 // unconditionally take the next argument. For example, when parsing
1817 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1818 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1819 // arg after parsing the '-I' arg.
1820 bool TakeNextArg = false;
1821
1822 // When using an integrated assembler, translate -Wa, and -Xassembler
1823 // options.
1824 bool CompressDebugSections = false;
1825 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1826 options::OPT_Xassembler),
1827 ie = Args.filtered_end(); it != ie; ++it) {
1828 const Arg *A = *it;
1829 A->claim();
1830
1831 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1832 StringRef Value = A->getValue(i);
1833 if (TakeNextArg) {
1834 CmdArgs.push_back(Value.data());
1835 TakeNextArg = false;
1836 continue;
1837 }
1838
1839 if (Value == "-force_cpusubtype_ALL") {
1840 // Do nothing, this is the default and we don't support anything else.
1841 } else if (Value == "-L") {
1842 CmdArgs.push_back("-msave-temp-labels");
1843 } else if (Value == "--fatal-warnings") {
1844 CmdArgs.push_back("-mllvm");
1845 CmdArgs.push_back("-fatal-assembler-warnings");
1846 } else if (Value == "--noexecstack") {
1847 CmdArgs.push_back("-mnoexecstack");
1848 } else if (Value == "-compress-debug-sections" ||
1849 Value == "--compress-debug-sections") {
1850 CompressDebugSections = true;
1851 } else if (Value == "-nocompress-debug-sections" ||
1852 Value == "--nocompress-debug-sections") {
1853 CompressDebugSections = false;
1854 } else if (Value.startswith("-I")) {
1855 CmdArgs.push_back(Value.data());
1856 // We need to consume the next argument if the current arg is a plain
1857 // -I. The next arg will be the include directory.
1858 if (Value == "-I")
1859 TakeNextArg = true;
1860 } else if (Value.startswith("-gdwarf-")) {
1861 CmdArgs.push_back(Value.data());
1862 } else {
1863 D.Diag(diag::err_drv_unsupported_option_argument)
1864 << A->getOption().getName() << Value;
1865 }
1866 }
1867 }
1868 if (CompressDebugSections) {
1869 if (llvm::zlib::isAvailable())
1870 CmdArgs.push_back("-compress-debug-sections");
1871 else
1872 D.Diag(diag::warn_debug_compression_unavailable);
1873 }
1874 }
1875
1876 // Until ARM libraries are build separately, we have them all in one library
getArchNameForCompilerRTLib(const ToolChain & TC)1877 static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
1878 if (TC.getArch() == llvm::Triple::arm ||
1879 TC.getArch() == llvm::Triple::armeb)
1880 return "arm";
1881 else
1882 return TC.getArchName();
1883 }
1884
getCompilerRTLibDir(const ToolChain & TC)1885 static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1886 // The runtimes are located in the OS-specific resource directory.
1887 SmallString<128> Res(TC.getDriver().ResourceDir);
1888 const llvm::Triple &Triple = TC.getTriple();
1889 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1890 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1891 "freebsd" : TC.getOS();
1892 llvm::sys::path::append(Res, "lib", OSLibName);
1893 return Res;
1894 }
1895
1896 // This adds the static libclang_rt.builtins-arch.a directly to the command line
1897 // FIXME: Make sure we can also emit shared objects if they're requested
1898 // and available, check for possible errors, etc.
addClangRTLinux(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)1899 static void addClangRTLinux(
1900 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1901 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
1902 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
1903 getArchNameForCompilerRTLib(TC) +
1904 ".a");
1905
1906 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
1907 CmdArgs.push_back("-lgcc_s");
1908 if (TC.getDriver().CCCIsCXX())
1909 CmdArgs.push_back("-lgcc_eh");
1910 }
1911
addProfileRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)1912 static void addProfileRT(
1913 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1914 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1915 Args.hasArg(options::OPT_fprofile_generate) ||
1916 Args.hasArg(options::OPT_fprofile_instr_generate) ||
1917 Args.hasArg(options::OPT_fcreate_profile) ||
1918 Args.hasArg(options::OPT_coverage)))
1919 return;
1920
1921 // -fprofile-instr-generate requires position-independent code to build with
1922 // shared objects. Link against the right archive.
1923 const char *Lib = "libclang_rt.profile-";
1924 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
1925 Args.hasArg(options::OPT_shared))
1926 Lib = "libclang_rt.profile-pic-";
1927
1928 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1929 llvm::sys::path::append(LibProfile,
1930 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
1931
1932 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1933 }
1934
getSanitizerRTLibName(const ToolChain & TC,const StringRef Sanitizer,bool Shared)1935 static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
1936 const StringRef Sanitizer,
1937 bool Shared) {
1938 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
1939 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
1940 const char *EnvSuffix =
1941 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
1942 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1943 llvm::sys::path::append(LibSanitizer,
1944 Twine("libclang_rt.") + Sanitizer + "-" +
1945 getArchNameForCompilerRTLib(TC) + EnvSuffix +
1946 (Shared ? ".so" : ".a"));
1947 return LibSanitizer;
1948 }
1949
addSanitizerRTLinkFlags(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,const StringRef Sanitizer,bool BeforeLibStdCXX,bool ExportSymbols=true,bool LinkDeps=true)1950 static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
1951 ArgStringList &CmdArgs,
1952 const StringRef Sanitizer,
1953 bool BeforeLibStdCXX,
1954 bool ExportSymbols = true,
1955 bool LinkDeps = true) {
1956 SmallString<128> LibSanitizer =
1957 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
1958
1959 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1960 // etc.) so that the linker picks custom versions of the global 'operator
1961 // new' and 'operator delete' symbols. We take the extreme (but simple)
1962 // strategy of inserting it at the front of the link command. It also
1963 // needs to be forced to end up in the executable, so wrap it in
1964 // whole-archive.
1965 SmallVector<const char *, 3> LibSanitizerArgs;
1966 LibSanitizerArgs.push_back("-whole-archive");
1967 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1968 LibSanitizerArgs.push_back("-no-whole-archive");
1969
1970 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1971 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1972
1973 if (LinkDeps) {
1974 // Link sanitizer dependencies explicitly
1975 CmdArgs.push_back("-lpthread");
1976 CmdArgs.push_back("-lrt");
1977 CmdArgs.push_back("-lm");
1978 // There's no libdl on FreeBSD.
1979 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1980 CmdArgs.push_back("-ldl");
1981 }
1982
1983 // If possible, use a dynamic symbols file to export the symbols from the
1984 // runtime library. If we can't do so, use -export-dynamic instead to export
1985 // all symbols from the binary.
1986 if (ExportSymbols) {
1987 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1988 CmdArgs.push_back(
1989 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1990 else
1991 CmdArgs.push_back("-export-dynamic");
1992 }
1993 }
1994
1995 /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1996 /// This needs to be called before we add the C run-time (malloc, etc).
addAsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,bool Shared,bool IsCXX)1997 static void addAsanRT(const ToolChain &TC, const ArgList &Args,
1998 ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
1999 if (Shared) {
2000 // Link dynamic runtime if necessary.
2001 SmallString<128> LibSanitizer =
2002 getSanitizerRTLibName(TC, "asan", Shared);
2003 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
2004 }
2005
2006 // Do not link static runtime to DSOs or if compiling for Android.
2007 if (Args.hasArg(options::OPT_shared) ||
2008 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
2009 return;
2010
2011 if (Shared) {
2012 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2013 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2014 /*LinkDeps*/ false);
2015 } else {
2016 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2017 if (IsCXX)
2018 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2019 }
2020 }
2021
2022 /// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2023 /// This needs to be called before we add the C run-time (malloc, etc).
addTsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2024 static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2025 ArgStringList &CmdArgs) {
2026 if (!Args.hasArg(options::OPT_shared))
2027 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
2028 }
2029
2030 /// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2031 /// This needs to be called before we add the C run-time (malloc, etc).
addMsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2032 static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2033 ArgStringList &CmdArgs) {
2034 if (!Args.hasArg(options::OPT_shared))
2035 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
2036 }
2037
2038 /// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2039 /// This needs to be called before we add the C run-time (malloc, etc).
addLsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2040 static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2041 ArgStringList &CmdArgs) {
2042 if (!Args.hasArg(options::OPT_shared))
2043 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
2044 }
2045
2046 /// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2047 /// (Linux).
addUbsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,bool IsCXX,bool HasOtherSanitizerRt)2048 static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2049 ArgStringList &CmdArgs, bool IsCXX,
2050 bool HasOtherSanitizerRt) {
2051 // Do not link runtime into shared libraries.
2052 if (Args.hasArg(options::OPT_shared))
2053 return;
2054
2055 // Need a copy of sanitizer_common. This could come from another sanitizer
2056 // runtime; if we're not including one, include our own copy.
2057 if (!HasOtherSanitizerRt)
2058 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
2059
2060 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, true);
2061
2062 // Only include the bits of the runtime which need a C++ ABI library if
2063 // we're linking in C++ mode.
2064 if (IsCXX)
2065 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false, true);
2066 }
2067
addDfsanRT(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2068 static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2069 ArgStringList &CmdArgs) {
2070 if (!Args.hasArg(options::OPT_shared))
2071 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2072 }
2073
2074 // Should be called before we add C++ ABI library.
addSanitizerRuntimes(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs)2075 static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2076 ArgStringList &CmdArgs) {
2077 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2078 const Driver &D = TC.getDriver();
2079 if (Sanitize.needsUbsanRt())
2080 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2081 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2082 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2083 if (Sanitize.needsAsanRt())
2084 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());
2085 if (Sanitize.needsTsanRt())
2086 addTsanRT(TC, Args, CmdArgs);
2087 if (Sanitize.needsMsanRt())
2088 addMsanRT(TC, Args, CmdArgs);
2089 if (Sanitize.needsLsanRt())
2090 addLsanRT(TC, Args, CmdArgs);
2091 if (Sanitize.needsDfsanRt())
2092 addDfsanRT(TC, Args, CmdArgs);
2093 }
2094
shouldUseFramePointerForTarget(const ArgList & Args,const llvm::Triple & Triple)2095 static bool shouldUseFramePointerForTarget(const ArgList &Args,
2096 const llvm::Triple &Triple) {
2097 switch (Triple.getArch()) {
2098 // Don't use a frame pointer on linux if optimizing for certain targets.
2099 case llvm::Triple::mips64:
2100 case llvm::Triple::mips64el:
2101 case llvm::Triple::mips:
2102 case llvm::Triple::mipsel:
2103 case llvm::Triple::systemz:
2104 case llvm::Triple::x86:
2105 case llvm::Triple::x86_64:
2106 if (Triple.isOSLinux())
2107 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2108 if (!A->getOption().matches(options::OPT_O0))
2109 return false;
2110 return true;
2111 case llvm::Triple::xcore:
2112 return false;
2113 default:
2114 return true;
2115 }
2116 }
2117
shouldUseFramePointer(const ArgList & Args,const llvm::Triple & Triple)2118 static bool shouldUseFramePointer(const ArgList &Args,
2119 const llvm::Triple &Triple) {
2120 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2121 options::OPT_fomit_frame_pointer))
2122 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2123
2124 return shouldUseFramePointerForTarget(Args, Triple);
2125 }
2126
shouldUseLeafFramePointer(const ArgList & Args,const llvm::Triple & Triple)2127 static bool shouldUseLeafFramePointer(const ArgList &Args,
2128 const llvm::Triple &Triple) {
2129 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2130 options::OPT_momit_leaf_frame_pointer))
2131 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2132
2133 return shouldUseFramePointerForTarget(Args, Triple);
2134 }
2135
2136 /// Add a CC1 option to specify the debug compilation directory.
addDebugCompDirArg(const ArgList & Args,ArgStringList & CmdArgs)2137 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
2138 SmallString<128> cwd;
2139 if (!llvm::sys::fs::current_path(cwd)) {
2140 CmdArgs.push_back("-fdebug-compilation-dir");
2141 CmdArgs.push_back(Args.MakeArgString(cwd));
2142 }
2143 }
2144
SplitDebugName(const ArgList & Args,const InputInfoList & Inputs)2145 static const char *SplitDebugName(const ArgList &Args,
2146 const InputInfoList &Inputs) {
2147 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2148 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2149 SmallString<128> T(FinalOutput->getValue());
2150 llvm::sys::path::replace_extension(T, "dwo");
2151 return Args.MakeArgString(T);
2152 } else {
2153 // Use the compilation dir.
2154 SmallString<128> T(
2155 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
2156 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2157 llvm::sys::path::replace_extension(F, "dwo");
2158 T += F;
2159 return Args.MakeArgString(F);
2160 }
2161 }
2162
SplitDebugInfo(const ToolChain & TC,Compilation & C,const Tool & T,const JobAction & JA,const ArgList & Args,const InputInfo & Output,const char * OutFile)2163 static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2164 const Tool &T, const JobAction &JA,
2165 const ArgList &Args, const InputInfo &Output,
2166 const char *OutFile) {
2167 ArgStringList ExtractArgs;
2168 ExtractArgs.push_back("--extract-dwo");
2169
2170 ArgStringList StripArgs;
2171 StripArgs.push_back("--strip-dwo");
2172
2173 // Grabbing the output of the earlier compile step.
2174 StripArgs.push_back(Output.getFilename());
2175 ExtractArgs.push_back(Output.getFilename());
2176 ExtractArgs.push_back(OutFile);
2177
2178 const char *Exec =
2179 Args.MakeArgString(TC.GetProgramPath("objcopy"));
2180
2181 // First extract the dwo sections.
2182 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
2183
2184 // Then remove them from the original .o file.
2185 C.addCommand(new Command(JA, T, Exec, StripArgs));
2186 }
2187
2188 /// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2189 /// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
shouldEnableVectorizerAtOLevel(const ArgList & Args,bool isSlpVec)2190 static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
2191 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2192 if (A->getOption().matches(options::OPT_O4) ||
2193 A->getOption().matches(options::OPT_Ofast))
2194 return true;
2195
2196 if (A->getOption().matches(options::OPT_O0))
2197 return false;
2198
2199 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2200
2201 // Vectorize -Os.
2202 StringRef S(A->getValue());
2203 if (S == "s")
2204 return true;
2205
2206 // Don't vectorize -Oz, unless it's the slp vectorizer.
2207 if (S == "z")
2208 return isSlpVec;
2209
2210 unsigned OptLevel = 0;
2211 if (S.getAsInteger(10, OptLevel))
2212 return false;
2213
2214 return OptLevel > 1;
2215 }
2216
2217 return false;
2218 }
2219
2220 /// Add -x lang to \p CmdArgs for \p Input.
addDashXForInput(const ArgList & Args,const InputInfo & Input,ArgStringList & CmdArgs)2221 static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2222 ArgStringList &CmdArgs) {
2223 // When using -verify-pch, we don't want to provide the type
2224 // 'precompiled-header' if it was inferred from the file extension
2225 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2226 return;
2227
2228 CmdArgs.push_back("-x");
2229 if (Args.hasArg(options::OPT_rewrite_objc))
2230 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2231 else
2232 CmdArgs.push_back(types::getTypeName(Input.getType()));
2233 }
2234
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const2235 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
2236 const InputInfo &Output,
2237 const InputInfoList &Inputs,
2238 const ArgList &Args,
2239 const char *LinkingOutput) const {
2240 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2241 options::OPT_fapple_kext);
2242 const Driver &D = getToolChain().getDriver();
2243 ArgStringList CmdArgs;
2244
2245 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
2246 bool IsWindowsCygnus =
2247 getToolChain().getTriple().isWindowsCygwinEnvironment();
2248 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2249
2250 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2251
2252 // Invoke ourselves in -cc1 mode.
2253 //
2254 // FIXME: Implement custom jobs for internal actions.
2255 CmdArgs.push_back("-cc1");
2256
2257 // Add the "effective" target triple.
2258 CmdArgs.push_back("-triple");
2259 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2260 CmdArgs.push_back(Args.MakeArgString(TripleStr));
2261
2262 const llvm::Triple TT(TripleStr);
2263 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2264 TT.getArch() == llvm::Triple::thumb)) {
2265 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2266 unsigned Version;
2267 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2268 if (Version < 7)
2269 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2270 << TripleStr;
2271 }
2272
2273 // Push all default warning arguments that are specific to
2274 // the given target. These come before user provided warning options
2275 // are provided.
2276 getToolChain().addClangWarningOptions(CmdArgs);
2277
2278 // Select the appropriate action.
2279 RewriteKind rewriteKind = RK_None;
2280
2281 if (isa<AnalyzeJobAction>(JA)) {
2282 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2283 CmdArgs.push_back("-analyze");
2284 } else if (isa<MigrateJobAction>(JA)) {
2285 CmdArgs.push_back("-migrate");
2286 } else if (isa<PreprocessJobAction>(JA)) {
2287 if (Output.getType() == types::TY_Dependencies)
2288 CmdArgs.push_back("-Eonly");
2289 else {
2290 CmdArgs.push_back("-E");
2291 if (Args.hasArg(options::OPT_rewrite_objc) &&
2292 !Args.hasArg(options::OPT_g_Group))
2293 CmdArgs.push_back("-P");
2294 }
2295 } else if (isa<AssembleJobAction>(JA)) {
2296 CmdArgs.push_back("-emit-obj");
2297
2298 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
2299
2300 // Also ignore explicit -force_cpusubtype_ALL option.
2301 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
2302 } else if (isa<PrecompileJobAction>(JA)) {
2303 // Use PCH if the user requested it.
2304 bool UsePCH = D.CCCUsePCH;
2305
2306 if (JA.getType() == types::TY_Nothing)
2307 CmdArgs.push_back("-fsyntax-only");
2308 else if (UsePCH)
2309 CmdArgs.push_back("-emit-pch");
2310 else
2311 CmdArgs.push_back("-emit-pth");
2312 } else if (isa<VerifyPCHJobAction>(JA)) {
2313 CmdArgs.push_back("-verify-pch");
2314 } else {
2315 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
2316
2317 if (JA.getType() == types::TY_Nothing) {
2318 CmdArgs.push_back("-fsyntax-only");
2319 } else if (JA.getType() == types::TY_LLVM_IR ||
2320 JA.getType() == types::TY_LTO_IR) {
2321 CmdArgs.push_back("-emit-llvm");
2322 } else if (JA.getType() == types::TY_LLVM_BC ||
2323 JA.getType() == types::TY_LTO_BC) {
2324 CmdArgs.push_back("-emit-llvm-bc");
2325 } else if (JA.getType() == types::TY_PP_Asm) {
2326 CmdArgs.push_back("-S");
2327 } else if (JA.getType() == types::TY_AST) {
2328 CmdArgs.push_back("-emit-pch");
2329 } else if (JA.getType() == types::TY_ModuleFile) {
2330 CmdArgs.push_back("-module-file-info");
2331 } else if (JA.getType() == types::TY_RewrittenObjC) {
2332 CmdArgs.push_back("-rewrite-objc");
2333 rewriteKind = RK_NonFragile;
2334 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2335 CmdArgs.push_back("-rewrite-objc");
2336 rewriteKind = RK_Fragile;
2337 } else {
2338 assert(JA.getType() == types::TY_PP_Asm &&
2339 "Unexpected output type!");
2340 }
2341 }
2342
2343 // We normally speed up the clang process a bit by skipping destructors at
2344 // exit, but when we're generating diagnostics we can rely on some of the
2345 // cleanup.
2346 if (!C.isForDiagnostics())
2347 CmdArgs.push_back("-disable-free");
2348
2349 // Disable the verification pass in -asserts builds.
2350 #ifdef NDEBUG
2351 CmdArgs.push_back("-disable-llvm-verifier");
2352 #endif
2353
2354 // Set the main file name, so that debug info works even with
2355 // -save-temps.
2356 CmdArgs.push_back("-main-file-name");
2357 CmdArgs.push_back(getBaseInputName(Args, Inputs));
2358
2359 // Some flags which affect the language (via preprocessor
2360 // defines).
2361 if (Args.hasArg(options::OPT_static))
2362 CmdArgs.push_back("-static-define");
2363
2364 if (isa<AnalyzeJobAction>(JA)) {
2365 // Enable region store model by default.
2366 CmdArgs.push_back("-analyzer-store=region");
2367
2368 // Treat blocks as analysis entry points.
2369 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2370
2371 CmdArgs.push_back("-analyzer-eagerly-assume");
2372
2373 // Add default argument set.
2374 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
2375 CmdArgs.push_back("-analyzer-checker=core");
2376
2377 if (!IsWindowsMSVC)
2378 CmdArgs.push_back("-analyzer-checker=unix");
2379
2380 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
2381 CmdArgs.push_back("-analyzer-checker=osx");
2382
2383 CmdArgs.push_back("-analyzer-checker=deadcode");
2384
2385 if (types::isCXX(Inputs[0].getType()))
2386 CmdArgs.push_back("-analyzer-checker=cplusplus");
2387
2388 // Enable the following experimental checkers for testing.
2389 CmdArgs.push_back(
2390 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
2391 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2392 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2393 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2394 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2395 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
2396 }
2397
2398 // Set the output format. The default is plist, for (lame) historical
2399 // reasons.
2400 CmdArgs.push_back("-analyzer-output");
2401 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
2402 CmdArgs.push_back(A->getValue());
2403 else
2404 CmdArgs.push_back("plist");
2405
2406 // Disable the presentation of standard compiler warnings when
2407 // using --analyze. We only want to show static analyzer diagnostics
2408 // or frontend errors.
2409 CmdArgs.push_back("-w");
2410
2411 // Add -Xanalyzer arguments when running as analyzer.
2412 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
2413 }
2414
2415 CheckCodeGenerationOptions(D, Args);
2416
2417 bool PIE = getToolChain().isPIEDefault();
2418 bool PIC = PIE || getToolChain().isPICDefault();
2419 bool IsPICLevelTwo = PIC;
2420
2421 // Android-specific defaults for PIC/PIE
2422 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2423 switch (getToolChain().getTriple().getArch()) {
2424 case llvm::Triple::arm:
2425 case llvm::Triple::armeb:
2426 case llvm::Triple::thumb:
2427 case llvm::Triple::thumbeb:
2428 case llvm::Triple::aarch64:
2429 case llvm::Triple::arm64:
2430 case llvm::Triple::mips:
2431 case llvm::Triple::mipsel:
2432 case llvm::Triple::mips64:
2433 case llvm::Triple::mips64el:
2434 PIC = true; // "-fpic"
2435 break;
2436
2437 case llvm::Triple::x86:
2438 case llvm::Triple::x86_64:
2439 PIC = true; // "-fPIC"
2440 IsPICLevelTwo = true;
2441 break;
2442
2443 default:
2444 break;
2445 }
2446 }
2447
2448 // OpenBSD-specific defaults for PIE
2449 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2450 switch (getToolChain().getTriple().getArch()) {
2451 case llvm::Triple::mips64:
2452 case llvm::Triple::mips64el:
2453 case llvm::Triple::sparc:
2454 case llvm::Triple::x86:
2455 case llvm::Triple::x86_64:
2456 IsPICLevelTwo = false; // "-fpie"
2457 break;
2458
2459 case llvm::Triple::ppc:
2460 case llvm::Triple::sparcv9:
2461 IsPICLevelTwo = true; // "-fPIE"
2462 break;
2463
2464 default:
2465 break;
2466 }
2467 }
2468
2469 // For the PIC and PIE flag options, this logic is different from the
2470 // legacy logic in very old versions of GCC, as that logic was just
2471 // a bug no one had ever fixed. This logic is both more rational and
2472 // consistent with GCC's new logic now that the bugs are fixed. The last
2473 // argument relating to either PIC or PIE wins, and no other argument is
2474 // used. If the last argument is any flavor of the '-fno-...' arguments,
2475 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2476 // at the same level.
2477 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2478 options::OPT_fpic, options::OPT_fno_pic,
2479 options::OPT_fPIE, options::OPT_fno_PIE,
2480 options::OPT_fpie, options::OPT_fno_pie);
2481 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2482 // is forced, then neither PIC nor PIE flags will have no effect.
2483 if (!getToolChain().isPICDefaultForced()) {
2484 if (LastPICArg) {
2485 Option O = LastPICArg->getOption();
2486 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2487 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2488 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2489 PIC = PIE || O.matches(options::OPT_fPIC) ||
2490 O.matches(options::OPT_fpic);
2491 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2492 O.matches(options::OPT_fPIC);
2493 } else {
2494 PIE = PIC = false;
2495 }
2496 }
2497 }
2498
2499 // Introduce a Darwin-specific hack. If the default is PIC but the flags
2500 // specified while enabling PIC enabled level 1 PIC, just force it back to
2501 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2502 // informal testing).
2503 if (PIC && getToolChain().getTriple().isOSDarwin())
2504 IsPICLevelTwo |= getToolChain().isPICDefault();
2505
2506 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2507 // PIC or PIE options above, if these show up, PIC is disabled.
2508 llvm::Triple Triple(TripleStr);
2509 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
2510 Triple.getArch() == llvm::Triple::arm64 ||
2511 Triple.getArch() == llvm::Triple::aarch64))
2512 PIC = PIE = false;
2513 if (Args.hasArg(options::OPT_static))
2514 PIC = PIE = false;
2515
2516 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2517 // This is a very special mode. It trumps the other modes, almost no one
2518 // uses it, and it isn't even valid on any OS but Darwin.
2519 if (!getToolChain().getTriple().isOSDarwin())
2520 D.Diag(diag::err_drv_unsupported_opt_for_target)
2521 << A->getSpelling() << getToolChain().getTriple().str();
2522
2523 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2524
2525 CmdArgs.push_back("-mrelocation-model");
2526 CmdArgs.push_back("dynamic-no-pic");
2527
2528 // Only a forced PIC mode can cause the actual compile to have PIC defines
2529 // etc., no flags are sufficient. This behavior was selected to closely
2530 // match that of llvm-gcc and Apple GCC before that.
2531 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2532 CmdArgs.push_back("-pic-level");
2533 CmdArgs.push_back("2");
2534 }
2535 } else {
2536 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2537 // handled in Clang's IRGen by the -pie-level flag.
2538 CmdArgs.push_back("-mrelocation-model");
2539 CmdArgs.push_back(PIC ? "pic" : "static");
2540
2541 if (PIC) {
2542 CmdArgs.push_back("-pic-level");
2543 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2544 if (PIE) {
2545 CmdArgs.push_back("-pie-level");
2546 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2547 }
2548 }
2549 }
2550
2551 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2552 options::OPT_fno_merge_all_constants))
2553 CmdArgs.push_back("-fno-merge-all-constants");
2554
2555 // LLVM Code Generator Options.
2556
2557 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2558 StringRef v = A->getValue();
2559 CmdArgs.push_back("-mllvm");
2560 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2561 A->claim();
2562 }
2563
2564 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2565 CmdArgs.push_back("-mregparm");
2566 CmdArgs.push_back(A->getValue());
2567 }
2568
2569 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2570 options::OPT_freg_struct_return)) {
2571 if (getToolChain().getArch() != llvm::Triple::x86) {
2572 D.Diag(diag::err_drv_unsupported_opt_for_target)
2573 << A->getSpelling() << getToolChain().getTriple().str();
2574 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2575 CmdArgs.push_back("-fpcc-struct-return");
2576 } else {
2577 assert(A->getOption().matches(options::OPT_freg_struct_return));
2578 CmdArgs.push_back("-freg-struct-return");
2579 }
2580 }
2581
2582 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2583 CmdArgs.push_back("-mrtd");
2584
2585 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
2586 CmdArgs.push_back("-mdisable-fp-elim");
2587 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2588 options::OPT_fno_zero_initialized_in_bss))
2589 CmdArgs.push_back("-mno-zero-initialized-in-bss");
2590
2591 bool OFastEnabled = isOptimizationLevelFast(Args);
2592 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2593 // enabled. This alias option is being used to simplify the hasFlag logic.
2594 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2595 options::OPT_fstrict_aliasing;
2596 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2597 // doesn't do any TBAA.
2598 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
2599 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
2600 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
2601 CmdArgs.push_back("-relaxed-aliasing");
2602 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2603 options::OPT_fno_struct_path_tbaa))
2604 CmdArgs.push_back("-no-struct-path-tbaa");
2605 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2606 false))
2607 CmdArgs.push_back("-fstrict-enums");
2608 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2609 options::OPT_fno_optimize_sibling_calls))
2610 CmdArgs.push_back("-mdisable-tail-calls");
2611
2612 // Handle segmented stacks.
2613 if (Args.hasArg(options::OPT_fsplit_stack))
2614 CmdArgs.push_back("-split-stacks");
2615
2616 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2617 // This alias option is being used to simplify the getLastArg logic.
2618 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2619 options::OPT_ffast_math;
2620
2621 // Handle various floating point optimization flags, mapping them to the
2622 // appropriate LLVM code generation flags. The pattern for all of these is to
2623 // default off the codegen optimizations, and if any flag enables them and no
2624 // flag disables them after the flag enabling them, enable the codegen
2625 // optimization. This is complicated by several "umbrella" flags.
2626 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2627 options::OPT_fno_fast_math,
2628 options::OPT_ffinite_math_only,
2629 options::OPT_fno_finite_math_only,
2630 options::OPT_fhonor_infinities,
2631 options::OPT_fno_honor_infinities))
2632 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2633 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2634 A->getOption().getID() != options::OPT_fhonor_infinities)
2635 CmdArgs.push_back("-menable-no-infs");
2636 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2637 options::OPT_fno_fast_math,
2638 options::OPT_ffinite_math_only,
2639 options::OPT_fno_finite_math_only,
2640 options::OPT_fhonor_nans,
2641 options::OPT_fno_honor_nans))
2642 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2643 A->getOption().getID() != options::OPT_fno_finite_math_only &&
2644 A->getOption().getID() != options::OPT_fhonor_nans)
2645 CmdArgs.push_back("-menable-no-nans");
2646
2647 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2648 bool MathErrno = getToolChain().IsMathErrnoDefault();
2649 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2650 options::OPT_fno_fast_math,
2651 options::OPT_fmath_errno,
2652 options::OPT_fno_math_errno)) {
2653 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2654 // However, turning *off* -ffast_math merely restores the toolchain default
2655 // (which may be false).
2656 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2657 A->getOption().getID() == options::OPT_ffast_math ||
2658 A->getOption().getID() == options::OPT_Ofast)
2659 MathErrno = false;
2660 else if (A->getOption().getID() == options::OPT_fmath_errno)
2661 MathErrno = true;
2662 }
2663 if (MathErrno)
2664 CmdArgs.push_back("-fmath-errno");
2665
2666 // There are several flags which require disabling very specific
2667 // optimizations. Any of these being disabled forces us to turn off the
2668 // entire set of LLVM optimizations, so collect them through all the flag
2669 // madness.
2670 bool AssociativeMath = false;
2671 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2672 options::OPT_fno_fast_math,
2673 options::OPT_funsafe_math_optimizations,
2674 options::OPT_fno_unsafe_math_optimizations,
2675 options::OPT_fassociative_math,
2676 options::OPT_fno_associative_math))
2677 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2678 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2679 A->getOption().getID() != options::OPT_fno_associative_math)
2680 AssociativeMath = true;
2681 bool ReciprocalMath = false;
2682 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2683 options::OPT_fno_fast_math,
2684 options::OPT_funsafe_math_optimizations,
2685 options::OPT_fno_unsafe_math_optimizations,
2686 options::OPT_freciprocal_math,
2687 options::OPT_fno_reciprocal_math))
2688 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2689 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2690 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2691 ReciprocalMath = true;
2692 bool SignedZeros = true;
2693 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2694 options::OPT_fno_fast_math,
2695 options::OPT_funsafe_math_optimizations,
2696 options::OPT_fno_unsafe_math_optimizations,
2697 options::OPT_fsigned_zeros,
2698 options::OPT_fno_signed_zeros))
2699 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2700 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2701 A->getOption().getID() != options::OPT_fsigned_zeros)
2702 SignedZeros = false;
2703 bool TrappingMath = true;
2704 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2705 options::OPT_fno_fast_math,
2706 options::OPT_funsafe_math_optimizations,
2707 options::OPT_fno_unsafe_math_optimizations,
2708 options::OPT_ftrapping_math,
2709 options::OPT_fno_trapping_math))
2710 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2711 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2712 A->getOption().getID() != options::OPT_ftrapping_math)
2713 TrappingMath = false;
2714 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2715 !TrappingMath)
2716 CmdArgs.push_back("-menable-unsafe-fp-math");
2717
2718
2719 // Validate and pass through -fp-contract option.
2720 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2721 options::OPT_fno_fast_math,
2722 options::OPT_ffp_contract)) {
2723 if (A->getOption().getID() == options::OPT_ffp_contract) {
2724 StringRef Val = A->getValue();
2725 if (Val == "fast" || Val == "on" || Val == "off") {
2726 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2727 } else {
2728 D.Diag(diag::err_drv_unsupported_option_argument)
2729 << A->getOption().getName() << Val;
2730 }
2731 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2732 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
2733 // If fast-math is set then set the fp-contract mode to fast.
2734 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2735 }
2736 }
2737
2738 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2739 // and if we find them, tell the frontend to provide the appropriate
2740 // preprocessor macros. This is distinct from enabling any optimizations as
2741 // these options induce language changes which must survive serialization
2742 // and deserialization, etc.
2743 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2744 options::OPT_fno_fast_math))
2745 if (!A->getOption().matches(options::OPT_fno_fast_math))
2746 CmdArgs.push_back("-ffast-math");
2747 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2748 options::OPT_fno_fast_math))
2749 if (A->getOption().matches(options::OPT_ffinite_math_only))
2750 CmdArgs.push_back("-ffinite-math-only");
2751
2752 // Decide whether to use verbose asm. Verbose assembly is the default on
2753 // toolchains which have the integrated assembler on by default.
2754 bool IsIntegratedAssemblerDefault =
2755 getToolChain().IsIntegratedAssemblerDefault();
2756 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
2757 IsIntegratedAssemblerDefault) ||
2758 Args.hasArg(options::OPT_dA))
2759 CmdArgs.push_back("-masm-verbose");
2760
2761 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
2762 IsIntegratedAssemblerDefault))
2763 CmdArgs.push_back("-no-integrated-as");
2764
2765 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2766 CmdArgs.push_back("-mdebug-pass");
2767 CmdArgs.push_back("Structure");
2768 }
2769 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2770 CmdArgs.push_back("-mdebug-pass");
2771 CmdArgs.push_back("Arguments");
2772 }
2773
2774 // Enable -mconstructor-aliases except on darwin, where we have to
2775 // work around a linker bug; see <rdar://problem/7651567>.
2776 if (!getToolChain().getTriple().isOSDarwin())
2777 CmdArgs.push_back("-mconstructor-aliases");
2778
2779 // Darwin's kernel doesn't support guard variables; just die if we
2780 // try to use them.
2781 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
2782 CmdArgs.push_back("-fforbid-guard-variables");
2783
2784 if (Args.hasArg(options::OPT_mms_bitfields)) {
2785 CmdArgs.push_back("-mms-bitfields");
2786 }
2787
2788 // This is a coarse approximation of what llvm-gcc actually does, both
2789 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2790 // complicated ways.
2791 bool AsynchronousUnwindTables =
2792 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2793 options::OPT_fno_asynchronous_unwind_tables,
2794 (getToolChain().IsUnwindTablesDefault() ||
2795 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2796 !KernelOrKext);
2797 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2798 AsynchronousUnwindTables))
2799 CmdArgs.push_back("-munwind-tables");
2800
2801 getToolChain().addClangTargetOptions(Args, CmdArgs);
2802
2803 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2804 CmdArgs.push_back("-mlimit-float-precision");
2805 CmdArgs.push_back(A->getValue());
2806 }
2807
2808 // FIXME: Handle -mtune=.
2809 (void) Args.hasArg(options::OPT_mtune_EQ);
2810
2811 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2812 CmdArgs.push_back("-mcode-model");
2813 CmdArgs.push_back(A->getValue());
2814 }
2815
2816 // Add the target cpu
2817 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2818 llvm::Triple ETriple(ETripleStr);
2819 std::string CPU = getCPUName(Args, ETriple);
2820 if (!CPU.empty()) {
2821 CmdArgs.push_back("-target-cpu");
2822 CmdArgs.push_back(Args.MakeArgString(CPU));
2823 }
2824
2825 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2826 CmdArgs.push_back("-mfpmath");
2827 CmdArgs.push_back(A->getValue());
2828 }
2829
2830 // Add the target features
2831 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
2832
2833 // Add target specific flags.
2834 switch(getToolChain().getArch()) {
2835 default:
2836 break;
2837
2838 case llvm::Triple::arm:
2839 case llvm::Triple::armeb:
2840 case llvm::Triple::thumb:
2841 case llvm::Triple::thumbeb:
2842 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2843 break;
2844
2845 case llvm::Triple::aarch64:
2846 case llvm::Triple::aarch64_be:
2847 case llvm::Triple::arm64:
2848 case llvm::Triple::arm64_be:
2849 AddAArch64TargetArgs(Args, CmdArgs);
2850 break;
2851
2852 case llvm::Triple::mips:
2853 case llvm::Triple::mipsel:
2854 case llvm::Triple::mips64:
2855 case llvm::Triple::mips64el:
2856 AddMIPSTargetArgs(Args, CmdArgs);
2857 break;
2858
2859 case llvm::Triple::sparc:
2860 AddSparcTargetArgs(Args, CmdArgs);
2861 break;
2862
2863 case llvm::Triple::x86:
2864 case llvm::Triple::x86_64:
2865 AddX86TargetArgs(Args, CmdArgs);
2866 break;
2867
2868 case llvm::Triple::hexagon:
2869 AddHexagonTargetArgs(Args, CmdArgs);
2870 break;
2871 }
2872
2873 // Add clang-cl arguments.
2874 if (getToolChain().getDriver().IsCLMode())
2875 AddClangCLArgs(Args, CmdArgs);
2876
2877 // Pass the linker version in use.
2878 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2879 CmdArgs.push_back("-target-linker-version");
2880 CmdArgs.push_back(A->getValue());
2881 }
2882
2883 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
2884 CmdArgs.push_back("-momit-leaf-frame-pointer");
2885
2886 // Explicitly error on some things we know we don't support and can't just
2887 // ignore.
2888 types::ID InputType = Inputs[0].getType();
2889 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2890 Arg *Unsupported;
2891 if (types::isCXX(InputType) &&
2892 getToolChain().getTriple().isOSDarwin() &&
2893 getToolChain().getArch() == llvm::Triple::x86) {
2894 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2895 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
2896 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
2897 << Unsupported->getOption().getName();
2898 }
2899 }
2900
2901 Args.AddAllArgs(CmdArgs, options::OPT_v);
2902 Args.AddLastArg(CmdArgs, options::OPT_H);
2903 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
2904 CmdArgs.push_back("-header-include-file");
2905 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2906 D.CCPrintHeadersFilename : "-");
2907 }
2908 Args.AddLastArg(CmdArgs, options::OPT_P);
2909 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
2910
2911 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2912 CmdArgs.push_back("-diagnostic-log-file");
2913 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2914 D.CCLogDiagnosticsFilename : "-");
2915 }
2916
2917 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2918 // are preserved, all other debug options are substituted with "-g".
2919 Args.ClaimAllArgs(options::OPT_g_Group);
2920 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2921 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2922 // FIXME: we should support specifying dwarf version with
2923 // -gline-tables-only.
2924 CmdArgs.push_back("-gline-tables-only");
2925 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2926 const llvm::Triple &Triple = getToolChain().getTriple();
2927 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2928 Triple.getOS() == llvm::Triple::FreeBSD)
2929 CmdArgs.push_back("-gdwarf-2");
2930 } else if (A->getOption().matches(options::OPT_gdwarf_2))
2931 CmdArgs.push_back("-gdwarf-2");
2932 else if (A->getOption().matches(options::OPT_gdwarf_3))
2933 CmdArgs.push_back("-gdwarf-3");
2934 else if (A->getOption().matches(options::OPT_gdwarf_4))
2935 CmdArgs.push_back("-gdwarf-4");
2936 else if (!A->getOption().matches(options::OPT_g0) &&
2937 !A->getOption().matches(options::OPT_ggdb0)) {
2938 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2939 const llvm::Triple &Triple = getToolChain().getTriple();
2940 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2941 Triple.getOS() == llvm::Triple::FreeBSD)
2942 CmdArgs.push_back("-gdwarf-2");
2943 else
2944 CmdArgs.push_back("-g");
2945 }
2946 }
2947
2948 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2949 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2950 if (Args.hasArg(options::OPT_gcolumn_info))
2951 CmdArgs.push_back("-dwarf-column-info");
2952
2953 // FIXME: Move backend command line options to the module.
2954 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2955 // splitting and extraction.
2956 // FIXME: Currently only works on Linux.
2957 if (getToolChain().getTriple().isOSLinux() &&
2958 Args.hasArg(options::OPT_gsplit_dwarf)) {
2959 CmdArgs.push_back("-g");
2960 CmdArgs.push_back("-backend-option");
2961 CmdArgs.push_back("-split-dwarf=Enable");
2962 }
2963
2964 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2965 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2966 CmdArgs.push_back("-backend-option");
2967 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2968 }
2969
2970 // -gdwarf-aranges turns on the emission of the aranges section in the
2971 // backend.
2972 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2973 CmdArgs.push_back("-backend-option");
2974 CmdArgs.push_back("-generate-arange-section");
2975 }
2976
2977 if (Args.hasFlag(options::OPT_fdebug_types_section,
2978 options::OPT_fno_debug_types_section, false)) {
2979 CmdArgs.push_back("-backend-option");
2980 CmdArgs.push_back("-generate-type-units");
2981 }
2982
2983 if (Args.hasFlag(options::OPT_ffunction_sections,
2984 options::OPT_fno_function_sections, false)) {
2985 CmdArgs.push_back("-ffunction-sections");
2986 }
2987
2988 if (Args.hasFlag(options::OPT_fdata_sections,
2989 options::OPT_fno_data_sections, false)) {
2990 CmdArgs.push_back("-fdata-sections");
2991 }
2992
2993 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2994
2995 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2996 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2997 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2998 D.Diag(diag::err_drv_argument_not_allowed_with)
2999 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3000
3001 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3002
3003 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3004 A->render(Args, CmdArgs);
3005 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3006 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3007
3008 if (Args.hasArg(options::OPT_ftest_coverage) ||
3009 Args.hasArg(options::OPT_coverage))
3010 CmdArgs.push_back("-femit-coverage-notes");
3011 if (Args.hasArg(options::OPT_fprofile_arcs) ||
3012 Args.hasArg(options::OPT_coverage))
3013 CmdArgs.push_back("-femit-coverage-data");
3014
3015 if (C.getArgs().hasArg(options::OPT_c) ||
3016 C.getArgs().hasArg(options::OPT_S)) {
3017 if (Output.isFilename()) {
3018 CmdArgs.push_back("-coverage-file");
3019 SmallString<128> CoverageFilename(Output.getFilename());
3020 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
3021 SmallString<128> Pwd;
3022 if (!llvm::sys::fs::current_path(Pwd)) {
3023 llvm::sys::path::append(Pwd, CoverageFilename.str());
3024 CoverageFilename.swap(Pwd);
3025 }
3026 }
3027 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3028 }
3029 }
3030
3031 // Pass options for controlling the default header search paths.
3032 if (Args.hasArg(options::OPT_nostdinc)) {
3033 CmdArgs.push_back("-nostdsysteminc");
3034 CmdArgs.push_back("-nobuiltininc");
3035 } else {
3036 if (Args.hasArg(options::OPT_nostdlibinc))
3037 CmdArgs.push_back("-nostdsysteminc");
3038 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3039 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3040 }
3041
3042 // Pass the path to compiler resource files.
3043 CmdArgs.push_back("-resource-dir");
3044 CmdArgs.push_back(D.ResourceDir.c_str());
3045
3046 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3047
3048 bool ARCMTEnabled = false;
3049 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
3050 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
3051 options::OPT_ccc_arcmt_modify,
3052 options::OPT_ccc_arcmt_migrate)) {
3053 ARCMTEnabled = true;
3054 switch (A->getOption().getID()) {
3055 default:
3056 llvm_unreachable("missed a case");
3057 case options::OPT_ccc_arcmt_check:
3058 CmdArgs.push_back("-arcmt-check");
3059 break;
3060 case options::OPT_ccc_arcmt_modify:
3061 CmdArgs.push_back("-arcmt-modify");
3062 break;
3063 case options::OPT_ccc_arcmt_migrate:
3064 CmdArgs.push_back("-arcmt-migrate");
3065 CmdArgs.push_back("-mt-migrate-directory");
3066 CmdArgs.push_back(A->getValue());
3067
3068 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3069 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
3070 break;
3071 }
3072 }
3073 } else {
3074 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3075 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3076 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
3077 }
3078
3079 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3080 if (ARCMTEnabled) {
3081 D.Diag(diag::err_drv_argument_not_allowed_with)
3082 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3083 }
3084 CmdArgs.push_back("-mt-migrate-directory");
3085 CmdArgs.push_back(A->getValue());
3086
3087 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
3088 options::OPT_objcmt_migrate_subscripting,
3089 options::OPT_objcmt_migrate_property)) {
3090 // None specified, means enable them all.
3091 CmdArgs.push_back("-objcmt-migrate-literals");
3092 CmdArgs.push_back("-objcmt-migrate-subscripting");
3093 CmdArgs.push_back("-objcmt-migrate-property");
3094 } else {
3095 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3096 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3097 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3098 }
3099 } else {
3100 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3101 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3102 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3103 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3104 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3105 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3106 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3107 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3108 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3109 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3110 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3112 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
3113 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
3114 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
3115 }
3116
3117 // Add preprocessing options like -I, -D, etc. if we are using the
3118 // preprocessor.
3119 //
3120 // FIXME: Support -fpreprocessed
3121 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
3122 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
3123
3124 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3125 // that "The compiler can only warn and ignore the option if not recognized".
3126 // When building with ccache, it will pass -D options to clang even on
3127 // preprocessed inputs and configure concludes that -fPIC is not supported.
3128 Args.ClaimAllArgs(options::OPT_D);
3129
3130 // Manually translate -O4 to -O3; let clang reject others.
3131 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3132 if (A->getOption().matches(options::OPT_O4)) {
3133 CmdArgs.push_back("-O3");
3134 D.Diag(diag::warn_O4_is_O3);
3135 } else {
3136 A->render(Args, CmdArgs);
3137 }
3138 }
3139
3140 // Don't warn about unused -flto. This can happen when we're preprocessing or
3141 // precompiling.
3142 Args.ClaimAllArgs(options::OPT_flto);
3143
3144 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
3145 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3146 CmdArgs.push_back("-pedantic");
3147 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
3148 Args.AddLastArg(CmdArgs, options::OPT_w);
3149
3150 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
3151 // (-ansi is equivalent to -std=c89 or -std=c++98).
3152 //
3153 // If a std is supplied, only add -trigraphs if it follows the
3154 // option.
3155 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3156 if (Std->getOption().matches(options::OPT_ansi))
3157 if (types::isCXX(InputType))
3158 CmdArgs.push_back("-std=c++98");
3159 else
3160 CmdArgs.push_back("-std=c89");
3161 else
3162 Std->render(Args, CmdArgs);
3163
3164 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3165 options::OPT_trigraphs))
3166 if (A != Std)
3167 A->render(Args, CmdArgs);
3168 } else {
3169 // Honor -std-default.
3170 //
3171 // FIXME: Clang doesn't correctly handle -std= when the input language
3172 // doesn't match. For the time being just ignore this for C++ inputs;
3173 // eventually we want to do all the standard defaulting here instead of
3174 // splitting it between the driver and clang -cc1.
3175 if (!types::isCXX(InputType))
3176 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3177 "-std=", /*Joined=*/true);
3178 else if (IsWindowsMSVC)
3179 CmdArgs.push_back("-std=c++11");
3180
3181 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
3182 }
3183
3184 // GCC's behavior for -Wwrite-strings is a bit strange:
3185 // * In C, this "warning flag" changes the types of string literals from
3186 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3187 // for the discarded qualifier.
3188 // * In C++, this is just a normal warning flag.
3189 //
3190 // Implementing this warning correctly in C is hard, so we follow GCC's
3191 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3192 // a non-const char* in C, rather than using this crude hack.
3193 if (!types::isCXX(InputType)) {
3194 // FIXME: This should behave just like a warning flag, and thus should also
3195 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3196 Arg *WriteStrings =
3197 Args.getLastArg(options::OPT_Wwrite_strings,
3198 options::OPT_Wno_write_strings, options::OPT_w);
3199 if (WriteStrings &&
3200 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
3201 CmdArgs.push_back("-fconst-strings");
3202 }
3203
3204 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
3205 // during C++ compilation, which it is by default. GCC keeps this define even
3206 // in the presence of '-w', match this behavior bug-for-bug.
3207 if (types::isCXX(InputType) &&
3208 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3209 true)) {
3210 CmdArgs.push_back("-fdeprecated-macro");
3211 }
3212
3213 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3214 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3215 if (Asm->getOption().matches(options::OPT_fasm))
3216 CmdArgs.push_back("-fgnu-keywords");
3217 else
3218 CmdArgs.push_back("-fno-gnu-keywords");
3219 }
3220
3221 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3222 CmdArgs.push_back("-fno-dwarf-directory-asm");
3223
3224 if (ShouldDisableAutolink(Args, getToolChain()))
3225 CmdArgs.push_back("-fno-autolink");
3226
3227 // Add in -fdebug-compilation-dir if necessary.
3228 addDebugCompDirArg(Args, CmdArgs);
3229
3230 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3231 options::OPT_ftemplate_depth_EQ)) {
3232 CmdArgs.push_back("-ftemplate-depth");
3233 CmdArgs.push_back(A->getValue());
3234 }
3235
3236 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3237 CmdArgs.push_back("-foperator-arrow-depth");
3238 CmdArgs.push_back(A->getValue());
3239 }
3240
3241 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3242 CmdArgs.push_back("-fconstexpr-depth");
3243 CmdArgs.push_back(A->getValue());
3244 }
3245
3246 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3247 CmdArgs.push_back("-fconstexpr-steps");
3248 CmdArgs.push_back(A->getValue());
3249 }
3250
3251 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3252 CmdArgs.push_back("-fbracket-depth");
3253 CmdArgs.push_back(A->getValue());
3254 }
3255
3256 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3257 options::OPT_Wlarge_by_value_copy_def)) {
3258 if (A->getNumValues()) {
3259 StringRef bytes = A->getValue();
3260 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3261 } else
3262 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
3263 }
3264
3265
3266 if (Args.hasArg(options::OPT_relocatable_pch))
3267 CmdArgs.push_back("-relocatable-pch");
3268
3269 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3270 CmdArgs.push_back("-fconstant-string-class");
3271 CmdArgs.push_back(A->getValue());
3272 }
3273
3274 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3275 CmdArgs.push_back("-ftabstop");
3276 CmdArgs.push_back(A->getValue());
3277 }
3278
3279 CmdArgs.push_back("-ferror-limit");
3280 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
3281 CmdArgs.push_back(A->getValue());
3282 else
3283 CmdArgs.push_back("19");
3284
3285 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3286 CmdArgs.push_back("-fmacro-backtrace-limit");
3287 CmdArgs.push_back(A->getValue());
3288 }
3289
3290 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3291 CmdArgs.push_back("-ftemplate-backtrace-limit");
3292 CmdArgs.push_back(A->getValue());
3293 }
3294
3295 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3296 CmdArgs.push_back("-fconstexpr-backtrace-limit");
3297 CmdArgs.push_back(A->getValue());
3298 }
3299
3300 // Pass -fmessage-length=.
3301 CmdArgs.push_back("-fmessage-length");
3302 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
3303 CmdArgs.push_back(A->getValue());
3304 } else {
3305 // If -fmessage-length=N was not specified, determine whether this is a
3306 // terminal and, if so, implicitly define -fmessage-length appropriately.
3307 unsigned N = llvm::sys::Process::StandardErrColumns();
3308 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
3309 }
3310
3311 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3312 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3313 options::OPT_fvisibility_ms_compat)) {
3314 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3315 CmdArgs.push_back("-fvisibility");
3316 CmdArgs.push_back(A->getValue());
3317 } else {
3318 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3319 CmdArgs.push_back("-fvisibility");
3320 CmdArgs.push_back("hidden");
3321 CmdArgs.push_back("-ftype-visibility");
3322 CmdArgs.push_back("default");
3323 }
3324 }
3325
3326 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
3327
3328 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3329
3330 // -fhosted is default.
3331 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3332 KernelOrKext)
3333 CmdArgs.push_back("-ffreestanding");
3334
3335 // Forward -f (flag) options which we can pass directly.
3336 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
3337 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
3338 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3339 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
3340 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
3341 // AltiVec language extensions aren't relevant for assembling.
3342 if (!isa<PreprocessJobAction>(JA) ||
3343 Output.getType() != types::TY_PP_Asm)
3344 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
3345 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3346 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
3347
3348 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3349 Sanitize.addArgs(Args, CmdArgs);
3350
3351 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3352 options::OPT_fno_sanitize_recover,
3353 true))
3354 CmdArgs.push_back("-fno-sanitize-recover");
3355
3356 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
3357 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3358 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3359
3360 // Report an error for -faltivec on anything other than PowerPC.
3361 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
3362 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
3363 getToolChain().getArch() == llvm::Triple::ppc64 ||
3364 getToolChain().getArch() == llvm::Triple::ppc64le))
3365 D.Diag(diag::err_drv_argument_only_allowed_with)
3366 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
3367
3368 if (getToolChain().SupportsProfiling())
3369 Args.AddLastArg(CmdArgs, options::OPT_pg);
3370
3371 // -flax-vector-conversions is default.
3372 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3373 options::OPT_fno_lax_vector_conversions))
3374 CmdArgs.push_back("-fno-lax-vector-conversions");
3375
3376 if (Args.getLastArg(options::OPT_fapple_kext))
3377 CmdArgs.push_back("-fapple-kext");
3378
3379 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
3380 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
3381 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
3382 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3383 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
3384
3385 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3386 CmdArgs.push_back("-ftrapv-handler");
3387 CmdArgs.push_back(A->getValue());
3388 }
3389
3390 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
3391
3392 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3393 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3394 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3395 options::OPT_fno_wrapv)) {
3396 if (A->getOption().matches(options::OPT_fwrapv))
3397 CmdArgs.push_back("-fwrapv");
3398 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3399 options::OPT_fno_strict_overflow)) {
3400 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3401 CmdArgs.push_back("-fwrapv");
3402 }
3403
3404 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3405 options::OPT_fno_reroll_loops))
3406 if (A->getOption().matches(options::OPT_freroll_loops))
3407 CmdArgs.push_back("-freroll-loops");
3408
3409 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
3410 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3411 options::OPT_fno_unroll_loops);
3412
3413 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3414
3415
3416 // -stack-protector=0 is default.
3417 unsigned StackProtectorLevel = 0;
3418 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3419 options::OPT_fstack_protector_all,
3420 options::OPT_fstack_protector_strong,
3421 options::OPT_fstack_protector)) {
3422 if (A->getOption().matches(options::OPT_fstack_protector)) {
3423 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3424 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3425 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3426 StackProtectorLevel = LangOptions::SSPStrong;
3427 else if (A->getOption().matches(options::OPT_fstack_protector_all))
3428 StackProtectorLevel = LangOptions::SSPReq;
3429 } else {
3430 StackProtectorLevel =
3431 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3432 }
3433 if (StackProtectorLevel) {
3434 CmdArgs.push_back("-stack-protector");
3435 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
3436 }
3437
3438 // --param ssp-buffer-size=
3439 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3440 ie = Args.filtered_end(); it != ie; ++it) {
3441 StringRef Str((*it)->getValue());
3442 if (Str.startswith("ssp-buffer-size=")) {
3443 if (StackProtectorLevel) {
3444 CmdArgs.push_back("-stack-protector-buffer-size");
3445 // FIXME: Verify the argument is a valid integer.
3446 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
3447 }
3448 (*it)->claim();
3449 }
3450 }
3451
3452 // Translate -mstackrealign
3453 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3454 false)) {
3455 CmdArgs.push_back("-backend-option");
3456 CmdArgs.push_back("-force-align-stack");
3457 }
3458 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3459 false)) {
3460 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3461 }
3462
3463 if (Args.hasArg(options::OPT_mstack_alignment)) {
3464 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3465 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
3466 }
3467 // -mkernel implies -mstrict-align; don't add the redundant option.
3468 if (!KernelOrKext) {
3469 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3470 options::OPT_munaligned_access)) {
3471 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3472 CmdArgs.push_back("-backend-option");
3473 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3474 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3475 getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
3476 getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
3477 CmdArgs.push_back("-aarch64-strict-align");
3478 else
3479 CmdArgs.push_back("-arm-strict-align");
3480 } else {
3481 CmdArgs.push_back("-backend-option");
3482 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3483 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3484 getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
3485 getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
3486 CmdArgs.push_back("-aarch64-no-strict-align");
3487 else
3488 CmdArgs.push_back("-arm-no-strict-align");
3489 }
3490 }
3491 }
3492
3493 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3494 options::OPT_mno_restrict_it)) {
3495 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3496 CmdArgs.push_back("-backend-option");
3497 CmdArgs.push_back("-arm-restrict-it");
3498 } else {
3499 CmdArgs.push_back("-backend-option");
3500 CmdArgs.push_back("-arm-no-restrict-it");
3501 }
3502 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3503 TT.getArch() == llvm::Triple::thumb)) {
3504 // Windows on ARM expects restricted IT blocks
3505 CmdArgs.push_back("-backend-option");
3506 CmdArgs.push_back("-arm-restrict-it");
3507 }
3508
3509 if (TT.getArch() == llvm::Triple::arm ||
3510 TT.getArch() == llvm::Triple::thumb) {
3511 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3512 options::OPT_mno_long_calls)) {
3513 if (A->getOption().matches(options::OPT_mlong_calls)) {
3514 CmdArgs.push_back("-backend-option");
3515 CmdArgs.push_back("-arm-long-calls");
3516 }
3517 }
3518 }
3519
3520 // Forward -f options with positive and negative forms; we translate
3521 // these by hand.
3522 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3523 StringRef fname = A->getValue();
3524 if (!llvm::sys::fs::exists(fname))
3525 D.Diag(diag::err_drv_no_such_file) << fname;
3526 else
3527 A->render(Args, CmdArgs);
3528 }
3529
3530 if (Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
3531 A->render(Args, CmdArgs);
3532
3533 if (Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
3534 A->render(Args, CmdArgs);
3535
3536 if (Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
3537 A->render(Args, CmdArgs);
3538
3539 if (Args.hasArg(options::OPT_mkernel)) {
3540 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
3541 CmdArgs.push_back("-fapple-kext");
3542 if (!Args.hasArg(options::OPT_fbuiltin))
3543 CmdArgs.push_back("-fno-builtin");
3544 Args.ClaimAllArgs(options::OPT_fno_builtin);
3545 }
3546 // -fbuiltin is default.
3547 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
3548 CmdArgs.push_back("-fno-builtin");
3549
3550 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3551 options::OPT_fno_assume_sane_operator_new))
3552 CmdArgs.push_back("-fno-assume-sane-operator-new");
3553
3554 // -fblocks=0 is default.
3555 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
3556 getToolChain().IsBlocksDefault()) ||
3557 (Args.hasArg(options::OPT_fgnu_runtime) &&
3558 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3559 !Args.hasArg(options::OPT_fno_blocks))) {
3560 CmdArgs.push_back("-fblocks");
3561
3562 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3563 !getToolChain().hasBlocksRuntime())
3564 CmdArgs.push_back("-fblocks-runtime-optional");
3565 }
3566
3567 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3568 // users must also pass -fcxx-modules. The latter flag will disappear once the
3569 // modules implementation is solid for C++/Objective-C++ programs as well.
3570 bool HaveModules = false;
3571 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3572 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3573 options::OPT_fno_cxx_modules,
3574 false);
3575 if (AllowedInCXX || !types::isCXX(InputType)) {
3576 CmdArgs.push_back("-fmodules");
3577 HaveModules = true;
3578 }
3579 }
3580
3581 // -fmodule-maps enables module map processing (off by default) for header
3582 // checking. It is implied by -fmodules.
3583 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3584 false)) {
3585 CmdArgs.push_back("-fmodule-maps");
3586 }
3587
3588 // -fmodules-decluse checks that modules used are declared so (off by
3589 // default).
3590 if (Args.hasFlag(options::OPT_fmodules_decluse,
3591 options::OPT_fno_modules_decluse,
3592 false)) {
3593 CmdArgs.push_back("-fmodules-decluse");
3594 }
3595
3596 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3597 // all #included headers are part of modules.
3598 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3599 options::OPT_fno_modules_strict_decluse,
3600 false)) {
3601 CmdArgs.push_back("-fmodules-strict-decluse");
3602 }
3603
3604 // -fmodule-name specifies the module that is currently being built (or
3605 // used for header checking by -fmodule-maps).
3606 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
3607 A->render(Args, CmdArgs);
3608
3609 // -fmodule-map-file can be used to specify a file containing module
3610 // definitions.
3611 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
3612 A->render(Args, CmdArgs);
3613
3614 // -fmodule-cache-path specifies where our module files should be written.
3615 SmallString<128> ModuleCachePath;
3616 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3617 ModuleCachePath = A->getValue();
3618 if (HaveModules) {
3619 if (C.isForDiagnostics()) {
3620 // When generating crash reports, we want to emit the modules along with
3621 // the reproduction sources, so we ignore any provided module path.
3622 ModuleCachePath = Output.getFilename();
3623 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3624 llvm::sys::path::append(ModuleCachePath, "modules");
3625 } else if (ModuleCachePath.empty()) {
3626 // No module path was provided: use the default.
3627 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3628 ModuleCachePath);
3629 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3630 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3631 }
3632 const char Arg[] = "-fmodules-cache-path=";
3633 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3634 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3635 }
3636
3637 // When building modules and generating crashdumps, we need to dump a module
3638 // dependency VFS alongside the output.
3639 if (HaveModules && C.isForDiagnostics()) {
3640 SmallString<128> VFSDir(Output.getFilename());
3641 llvm::sys::path::replace_extension(VFSDir, ".cache");
3642 llvm::sys::path::append(VFSDir, "vfs");
3643 CmdArgs.push_back("-module-dependency-dir");
3644 CmdArgs.push_back(Args.MakeArgString(VFSDir));
3645 }
3646
3647 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3648 if (HaveModules)
3649 A->render(Args, CmdArgs);
3650
3651 // Pass through all -fmodules-ignore-macro arguments.
3652 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
3653 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3654 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
3655
3656 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3657
3658 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3659 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3660 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3661
3662 Args.AddLastArg(CmdArgs,
3663 options::OPT_fmodules_validate_once_per_build_session);
3664 }
3665
3666 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3667
3668 // -faccess-control is default.
3669 if (Args.hasFlag(options::OPT_fno_access_control,
3670 options::OPT_faccess_control,
3671 false))
3672 CmdArgs.push_back("-fno-access-control");
3673
3674 // -felide-constructors is the default.
3675 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3676 options::OPT_felide_constructors,
3677 false))
3678 CmdArgs.push_back("-fno-elide-constructors");
3679
3680 // -frtti is default.
3681 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
3682 KernelOrKext) {
3683 CmdArgs.push_back("-fno-rtti");
3684
3685 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
3686 if (Sanitize.sanitizesVptr()) {
3687 std::string NoRttiArg =
3688 Args.getLastArg(options::OPT_mkernel,
3689 options::OPT_fapple_kext,
3690 options::OPT_fno_rtti)->getAsString(Args);
3691 D.Diag(diag::err_drv_argument_not_allowed_with)
3692 << "-fsanitize=vptr" << NoRttiArg;
3693 }
3694 }
3695
3696 // -fshort-enums=0 is default for all architectures except Hexagon.
3697 if (Args.hasFlag(options::OPT_fshort_enums,
3698 options::OPT_fno_short_enums,
3699 getToolChain().getArch() ==
3700 llvm::Triple::hexagon))
3701 CmdArgs.push_back("-fshort-enums");
3702
3703 // -fsigned-char is default.
3704 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
3705 isSignedCharDefault(getToolChain().getTriple())))
3706 CmdArgs.push_back("-fno-signed-char");
3707
3708 // -fthreadsafe-static is default.
3709 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
3710 options::OPT_fno_threadsafe_statics))
3711 CmdArgs.push_back("-fno-threadsafe-statics");
3712
3713 // -fuse-cxa-atexit is default.
3714 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3715 options::OPT_fno_use_cxa_atexit,
3716 !IsWindowsCygnus && !IsWindowsGNU &&
3717 getToolChain().getArch() != llvm::Triple::hexagon &&
3718 getToolChain().getArch() != llvm::Triple::xcore) ||
3719 KernelOrKext)
3720 CmdArgs.push_back("-fno-use-cxa-atexit");
3721
3722 // -fms-extensions=0 is default.
3723 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3724 IsWindowsMSVC))
3725 CmdArgs.push_back("-fms-extensions");
3726
3727 // -fms-compatibility=0 is default.
3728 if (Args.hasFlag(options::OPT_fms_compatibility,
3729 options::OPT_fno_ms_compatibility,
3730 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3731 options::OPT_fno_ms_extensions,
3732 true))))
3733 CmdArgs.push_back("-fms-compatibility");
3734
3735 // -fmsc-version=1700 is default.
3736 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3737 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
3738 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
3739 if (msc_ver.empty())
3740 CmdArgs.push_back("-fmsc-version=1700");
3741 else
3742 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3743 }
3744
3745
3746 // -fno-borland-extensions is default.
3747 if (Args.hasFlag(options::OPT_fborland_extensions,
3748 options::OPT_fno_borland_extensions, false))
3749 CmdArgs.push_back("-fborland-extensions");
3750
3751 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3752 // needs it.
3753 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3754 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
3755 CmdArgs.push_back("-fdelayed-template-parsing");
3756
3757 // -fgnu-keywords default varies depending on language; only pass if
3758 // specified.
3759 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
3760 options::OPT_fno_gnu_keywords))
3761 A->render(Args, CmdArgs);
3762
3763 if (Args.hasFlag(options::OPT_fgnu89_inline,
3764 options::OPT_fno_gnu89_inline,
3765 false))
3766 CmdArgs.push_back("-fgnu89-inline");
3767
3768 if (Args.hasArg(options::OPT_fno_inline))
3769 CmdArgs.push_back("-fno-inline");
3770
3771 if (Args.hasArg(options::OPT_fno_inline_functions))
3772 CmdArgs.push_back("-fno-inline-functions");
3773
3774 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
3775
3776 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3777 // legacy is the default. Except for deployment taget of 10.5,
3778 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3779 // gets ignored silently.
3780 if (objcRuntime.isNonFragile()) {
3781 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3782 options::OPT_fno_objc_legacy_dispatch,
3783 objcRuntime.isLegacyDispatchDefaultForArch(
3784 getToolChain().getArch()))) {
3785 if (getToolChain().UseObjCMixedDispatch())
3786 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3787 else
3788 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3789 }
3790 }
3791
3792 // When ObjectiveC legacy runtime is in effect on MacOSX,
3793 // turn on the option to do Array/Dictionary subscripting
3794 // by default.
3795 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3796 getToolChain().getTriple().isMacOSX() &&
3797 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3798 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
3799 objcRuntime.isNeXTFamily())
3800 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3801
3802 // -fencode-extended-block-signature=1 is default.
3803 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3804 CmdArgs.push_back("-fencode-extended-block-signature");
3805 }
3806
3807 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3808 // NOTE: This logic is duplicated in ToolChains.cpp.
3809 bool ARC = isObjCAutoRefCount(Args);
3810 if (ARC) {
3811 getToolChain().CheckObjCARC();
3812
3813 CmdArgs.push_back("-fobjc-arc");
3814
3815 // FIXME: It seems like this entire block, and several around it should be
3816 // wrapped in isObjC, but for now we just use it here as this is where it
3817 // was being used previously.
3818 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3819 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3820 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3821 else
3822 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3823 }
3824
3825 // Allow the user to enable full exceptions code emission.
3826 // We define off for Objective-CC, on for Objective-C++.
3827 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3828 options::OPT_fno_objc_arc_exceptions,
3829 /*default*/ types::isCXX(InputType)))
3830 CmdArgs.push_back("-fobjc-arc-exceptions");
3831 }
3832
3833 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3834 // rewriter.
3835 if (rewriteKind != RK_None)
3836 CmdArgs.push_back("-fno-objc-infer-related-result-type");
3837
3838 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3839 // takes precedence.
3840 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3841 if (!GCArg)
3842 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3843 if (GCArg) {
3844 if (ARC) {
3845 D.Diag(diag::err_drv_objc_gc_arr)
3846 << GCArg->getAsString(Args);
3847 } else if (getToolChain().SupportsObjCGC()) {
3848 GCArg->render(Args, CmdArgs);
3849 } else {
3850 // FIXME: We should move this to a hard error.
3851 D.Diag(diag::warn_drv_objc_gc_unsupported)
3852 << GCArg->getAsString(Args);
3853 }
3854 }
3855
3856 // Handle GCC-style exception args.
3857 if (!C.getDriver().IsCLMode())
3858 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
3859 objcRuntime, CmdArgs);
3860
3861 if (getToolChain().UseSjLjExceptions())
3862 CmdArgs.push_back("-fsjlj-exceptions");
3863
3864 // C++ "sane" operator new.
3865 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3866 options::OPT_fno_assume_sane_operator_new))
3867 CmdArgs.push_back("-fno-assume-sane-operator-new");
3868
3869 // -fconstant-cfstrings is default, and may be subject to argument translation
3870 // on Darwin.
3871 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3872 options::OPT_fno_constant_cfstrings) ||
3873 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3874 options::OPT_mno_constant_cfstrings))
3875 CmdArgs.push_back("-fno-constant-cfstrings");
3876
3877 // -fshort-wchar default varies depending on platform; only
3878 // pass if specified.
3879 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3880 options::OPT_fno_short_wchar))
3881 A->render(Args, CmdArgs);
3882
3883 // -fno-pascal-strings is default, only pass non-default.
3884 if (Args.hasFlag(options::OPT_fpascal_strings,
3885 options::OPT_fno_pascal_strings,
3886 false))
3887 CmdArgs.push_back("-fpascal-strings");
3888
3889 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3890 // -fno-pack-struct doesn't apply to -fpack-struct=.
3891 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
3892 std::string PackStructStr = "-fpack-struct=";
3893 PackStructStr += A->getValue();
3894 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
3895 } else if (Args.hasFlag(options::OPT_fpack_struct,
3896 options::OPT_fno_pack_struct, false)) {
3897 CmdArgs.push_back("-fpack-struct=1");
3898 }
3899
3900 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
3901 if (!Args.hasArg(options::OPT_fcommon))
3902 CmdArgs.push_back("-fno-common");
3903 Args.ClaimAllArgs(options::OPT_fno_common);
3904 }
3905
3906 // -fcommon is default, only pass non-default.
3907 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
3908 CmdArgs.push_back("-fno-common");
3909
3910 // -fsigned-bitfields is default, and clang doesn't yet support
3911 // -funsigned-bitfields.
3912 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
3913 options::OPT_funsigned_bitfields))
3914 D.Diag(diag::warn_drv_clang_unsupported)
3915 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3916
3917 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3918 if (!Args.hasFlag(options::OPT_ffor_scope,
3919 options::OPT_fno_for_scope))
3920 D.Diag(diag::err_drv_clang_unsupported)
3921 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3922
3923 // -finput_charset=UTF-8 is default. Reject others
3924 if (Arg *inputCharset = Args.getLastArg(
3925 options::OPT_finput_charset_EQ)) {
3926 StringRef value = inputCharset->getValue();
3927 if (value != "UTF-8")
3928 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
3929 }
3930
3931 // -fcaret-diagnostics is default.
3932 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3933 options::OPT_fno_caret_diagnostics, true))
3934 CmdArgs.push_back("-fno-caret-diagnostics");
3935
3936 // -fdiagnostics-fixit-info is default, only pass non-default.
3937 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
3938 options::OPT_fno_diagnostics_fixit_info))
3939 CmdArgs.push_back("-fno-diagnostics-fixit-info");
3940
3941 // Enable -fdiagnostics-show-option by default.
3942 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
3943 options::OPT_fno_diagnostics_show_option))
3944 CmdArgs.push_back("-fdiagnostics-show-option");
3945
3946 if (const Arg *A =
3947 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3948 CmdArgs.push_back("-fdiagnostics-show-category");
3949 CmdArgs.push_back(A->getValue());
3950 }
3951
3952 if (const Arg *A =
3953 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3954 CmdArgs.push_back("-fdiagnostics-format");
3955 CmdArgs.push_back(A->getValue());
3956 }
3957
3958 if (Arg *A = Args.getLastArg(
3959 options::OPT_fdiagnostics_show_note_include_stack,
3960 options::OPT_fno_diagnostics_show_note_include_stack)) {
3961 if (A->getOption().matches(
3962 options::OPT_fdiagnostics_show_note_include_stack))
3963 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3964 else
3965 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3966 }
3967
3968 // Color diagnostics are the default, unless the terminal doesn't support
3969 // them.
3970 // Support both clang's -f[no-]color-diagnostics and gcc's
3971 // -f[no-]diagnostics-colors[=never|always|auto].
3972 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3973 for (const auto &Arg : Args) {
3974 const Option &O = Arg->getOption();
3975 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3976 !O.matches(options::OPT_fdiagnostics_color) &&
3977 !O.matches(options::OPT_fno_color_diagnostics) &&
3978 !O.matches(options::OPT_fno_diagnostics_color) &&
3979 !O.matches(options::OPT_fdiagnostics_color_EQ))
3980 continue;
3981
3982 Arg->claim();
3983 if (O.matches(options::OPT_fcolor_diagnostics) ||
3984 O.matches(options::OPT_fdiagnostics_color)) {
3985 ShowColors = Colors_On;
3986 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3987 O.matches(options::OPT_fno_diagnostics_color)) {
3988 ShowColors = Colors_Off;
3989 } else {
3990 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3991 StringRef value(Arg->getValue());
3992 if (value == "always")
3993 ShowColors = Colors_On;
3994 else if (value == "never")
3995 ShowColors = Colors_Off;
3996 else if (value == "auto")
3997 ShowColors = Colors_Auto;
3998 else
3999 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4000 << ("-fdiagnostics-color=" + value).str();
4001 }
4002 }
4003 if (ShowColors == Colors_On ||
4004 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
4005 CmdArgs.push_back("-fcolor-diagnostics");
4006
4007 if (Args.hasArg(options::OPT_fansi_escape_codes))
4008 CmdArgs.push_back("-fansi-escape-codes");
4009
4010 if (!Args.hasFlag(options::OPT_fshow_source_location,
4011 options::OPT_fno_show_source_location))
4012 CmdArgs.push_back("-fno-show-source-location");
4013
4014 if (!Args.hasFlag(options::OPT_fshow_column,
4015 options::OPT_fno_show_column,
4016 true))
4017 CmdArgs.push_back("-fno-show-column");
4018
4019 if (!Args.hasFlag(options::OPT_fspell_checking,
4020 options::OPT_fno_spell_checking))
4021 CmdArgs.push_back("-fno-spell-checking");
4022
4023
4024 // -fno-asm-blocks is default.
4025 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4026 false))
4027 CmdArgs.push_back("-fasm-blocks");
4028
4029 // Enable vectorization per default according to the optimization level
4030 // selected. For optimization levels that want vectorization we use the alias
4031 // option to simplify the hasFlag logic.
4032 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
4033 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
4034 options::OPT_fvectorize;
4035 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
4036 options::OPT_fno_vectorize, EnableVec))
4037 CmdArgs.push_back("-vectorize-loops");
4038
4039 // -fslp-vectorize is enabled based on the optimization level selected.
4040 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4041 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
4042 options::OPT_fslp_vectorize;
4043 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
4044 options::OPT_fno_slp_vectorize, EnableSLPVec))
4045 CmdArgs.push_back("-vectorize-slp");
4046
4047 // -fno-slp-vectorize-aggressive is default.
4048 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
4049 options::OPT_fno_slp_vectorize_aggressive, false))
4050 CmdArgs.push_back("-vectorize-slp-aggressive");
4051
4052 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4053 A->render(Args, CmdArgs);
4054
4055 // -fdollars-in-identifiers default varies depending on platform and
4056 // language; only pass if specified.
4057 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
4058 options::OPT_fno_dollars_in_identifiers)) {
4059 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
4060 CmdArgs.push_back("-fdollars-in-identifiers");
4061 else
4062 CmdArgs.push_back("-fno-dollars-in-identifiers");
4063 }
4064
4065 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4066 // practical purposes.
4067 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
4068 options::OPT_fno_unit_at_a_time)) {
4069 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
4070 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
4071 }
4072
4073 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4074 options::OPT_fno_apple_pragma_pack, false))
4075 CmdArgs.push_back("-fapple-pragma-pack");
4076
4077 // le32-specific flags:
4078 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4079 // by default.
4080 if (getToolChain().getArch() == llvm::Triple::le32) {
4081 CmdArgs.push_back("-fno-math-builtin");
4082 }
4083
4084 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4085 //
4086 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
4087 #if 0
4088 if (getToolChain().getTriple().isOSDarwin() &&
4089 (getToolChain().getArch() == llvm::Triple::arm ||
4090 getToolChain().getArch() == llvm::Triple::thumb)) {
4091 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4092 CmdArgs.push_back("-fno-builtin-strcat");
4093 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4094 CmdArgs.push_back("-fno-builtin-strcpy");
4095 }
4096 #endif
4097
4098 // Enable rewrite includes if the user's asked for it or if we're generating
4099 // diagnostics.
4100 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4101 // nice to enable this when doing a crashdump for modules as well.
4102 if (Args.hasFlag(options::OPT_frewrite_includes,
4103 options::OPT_fno_rewrite_includes, false) ||
4104 (C.isForDiagnostics() && !HaveModules))
4105 CmdArgs.push_back("-frewrite-includes");
4106
4107 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
4108 if (Arg *A = Args.getLastArg(options::OPT_traditional,
4109 options::OPT_traditional_cpp)) {
4110 if (isa<PreprocessJobAction>(JA))
4111 CmdArgs.push_back("-traditional-cpp");
4112 else
4113 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
4114 }
4115
4116 Args.AddLastArg(CmdArgs, options::OPT_dM);
4117 Args.AddLastArg(CmdArgs, options::OPT_dD);
4118
4119 // Handle serialized diagnostics.
4120 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4121 CmdArgs.push_back("-serialize-diagnostic-file");
4122 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
4123 }
4124
4125 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4126 CmdArgs.push_back("-fretain-comments-from-system-headers");
4127
4128 // Forward -fcomment-block-commands to -cc1.
4129 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
4130 // Forward -fparse-all-comments to -cc1.
4131 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
4132
4133 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4134 // parser.
4135 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
4136 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4137 ie = Args.filtered_end(); it != ie; ++it) {
4138 (*it)->claim();
4139
4140 // We translate this by hand to the -cc1 argument, since nightly test uses
4141 // it and developers have been trained to spell it with -mllvm.
4142 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
4143 CmdArgs.push_back("-disable-llvm-optzns");
4144 else
4145 (*it)->render(Args, CmdArgs);
4146 }
4147
4148 if (Output.getType() == types::TY_Dependencies) {
4149 // Handled with other dependency code.
4150 } else if (Output.isFilename()) {
4151 CmdArgs.push_back("-o");
4152 CmdArgs.push_back(Output.getFilename());
4153 } else {
4154 assert(Output.isNothing() && "Invalid output.");
4155 }
4156
4157 for (const auto &II : Inputs) {
4158 addDashXForInput(Args, II, CmdArgs);
4159
4160 if (II.isFilename())
4161 CmdArgs.push_back(II.getFilename());
4162 else
4163 II.getInputArg().renderAsInput(Args, CmdArgs);
4164 }
4165
4166 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4167
4168 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4169
4170 // Optionally embed the -cc1 level arguments into the debug info, for build
4171 // analysis.
4172 if (getToolChain().UseDwarfDebugFlags()) {
4173 ArgStringList OriginalArgs;
4174 for (const auto &Arg : Args)
4175 Arg->render(Args, OriginalArgs);
4176
4177 SmallString<256> Flags;
4178 Flags += Exec;
4179 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4180 Flags += " ";
4181 Flags += OriginalArgs[i];
4182 }
4183 CmdArgs.push_back("-dwarf-debug-flags");
4184 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4185 }
4186
4187 // Add the split debug info name to the command lines here so we
4188 // can propagate it to the backend.
4189 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
4190 getToolChain().getTriple().isOSLinux() &&
4191 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
4192 const char *SplitDwarfOut;
4193 if (SplitDwarf) {
4194 CmdArgs.push_back("-split-dwarf-file");
4195 SplitDwarfOut = SplitDebugName(Args, Inputs);
4196 CmdArgs.push_back(SplitDwarfOut);
4197 }
4198
4199 // Finally add the compile command to the compilation.
4200 if (Args.hasArg(options::OPT__SLASH_fallback) &&
4201 Output.getType() == types::TY_Object &&
4202 (InputType == types::TY_C || InputType == types::TY_CXX)) {
4203 Command *CLCommand = getCLFallback()->GetCommand(C, JA, Output, Inputs,
4204 Args, LinkingOutput);
4205 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
4206 } else {
4207 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4208 }
4209
4210
4211 // Handle the debug info splitting at object creation time if we're
4212 // creating an object.
4213 // TODO: Currently only works on linux with newer objcopy.
4214 if (SplitDwarf && !isa<CompileJobAction>(JA))
4215 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
4216
4217 if (Arg *A = Args.getLastArg(options::OPT_pg))
4218 if (Args.hasArg(options::OPT_fomit_frame_pointer))
4219 D.Diag(diag::err_drv_argument_not_allowed_with)
4220 << "-fomit-frame-pointer" << A->getAsString(Args);
4221
4222 // Claim some arguments which clang supports automatically.
4223
4224 // -fpch-preprocess is used with gcc to add a special marker in the output to
4225 // include the PCH file. Clang's PTH solution is completely transparent, so we
4226 // do not need to deal with it at all.
4227 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
4228
4229 // Claim some arguments which clang doesn't support, but we don't
4230 // care to warn the user about.
4231 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4232 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
4233
4234 // Disable warnings for clang -E -emit-llvm foo.c
4235 Args.ClaimAllArgs(options::OPT_emit_llvm);
4236 }
4237
4238 /// Add options related to the Objective-C runtime/ABI.
4239 ///
4240 /// Returns true if the runtime is non-fragile.
AddObjCRuntimeArgs(const ArgList & args,ArgStringList & cmdArgs,RewriteKind rewriteKind) const4241 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4242 ArgStringList &cmdArgs,
4243 RewriteKind rewriteKind) const {
4244 // Look for the controlling runtime option.
4245 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4246 options::OPT_fgnu_runtime,
4247 options::OPT_fobjc_runtime_EQ);
4248
4249 // Just forward -fobjc-runtime= to the frontend. This supercedes
4250 // options about fragility.
4251 if (runtimeArg &&
4252 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4253 ObjCRuntime runtime;
4254 StringRef value = runtimeArg->getValue();
4255 if (runtime.tryParse(value)) {
4256 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4257 << value;
4258 }
4259
4260 runtimeArg->render(args, cmdArgs);
4261 return runtime;
4262 }
4263
4264 // Otherwise, we'll need the ABI "version". Version numbers are
4265 // slightly confusing for historical reasons:
4266 // 1 - Traditional "fragile" ABI
4267 // 2 - Non-fragile ABI, version 1
4268 // 3 - Non-fragile ABI, version 2
4269 unsigned objcABIVersion = 1;
4270 // If -fobjc-abi-version= is present, use that to set the version.
4271 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
4272 StringRef value = abiArg->getValue();
4273 if (value == "1")
4274 objcABIVersion = 1;
4275 else if (value == "2")
4276 objcABIVersion = 2;
4277 else if (value == "3")
4278 objcABIVersion = 3;
4279 else
4280 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4281 << value;
4282 } else {
4283 // Otherwise, determine if we are using the non-fragile ABI.
4284 bool nonFragileABIIsDefault =
4285 (rewriteKind == RK_NonFragile ||
4286 (rewriteKind == RK_None &&
4287 getToolChain().IsObjCNonFragileABIDefault()));
4288 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4289 options::OPT_fno_objc_nonfragile_abi,
4290 nonFragileABIIsDefault)) {
4291 // Determine the non-fragile ABI version to use.
4292 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4293 unsigned nonFragileABIVersion = 1;
4294 #else
4295 unsigned nonFragileABIVersion = 2;
4296 #endif
4297
4298 if (Arg *abiArg = args.getLastArg(
4299 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
4300 StringRef value = abiArg->getValue();
4301 if (value == "1")
4302 nonFragileABIVersion = 1;
4303 else if (value == "2")
4304 nonFragileABIVersion = 2;
4305 else
4306 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4307 << value;
4308 }
4309
4310 objcABIVersion = 1 + nonFragileABIVersion;
4311 } else {
4312 objcABIVersion = 1;
4313 }
4314 }
4315
4316 // We don't actually care about the ABI version other than whether
4317 // it's non-fragile.
4318 bool isNonFragile = objcABIVersion != 1;
4319
4320 // If we have no runtime argument, ask the toolchain for its default runtime.
4321 // However, the rewriter only really supports the Mac runtime, so assume that.
4322 ObjCRuntime runtime;
4323 if (!runtimeArg) {
4324 switch (rewriteKind) {
4325 case RK_None:
4326 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4327 break;
4328 case RK_Fragile:
4329 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4330 break;
4331 case RK_NonFragile:
4332 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4333 break;
4334 }
4335
4336 // -fnext-runtime
4337 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4338 // On Darwin, make this use the default behavior for the toolchain.
4339 if (getToolChain().getTriple().isOSDarwin()) {
4340 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4341
4342 // Otherwise, build for a generic macosx port.
4343 } else {
4344 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4345 }
4346
4347 // -fgnu-runtime
4348 } else {
4349 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
4350 // Legacy behaviour is to target the gnustep runtime if we are i
4351 // non-fragile mode or the GCC runtime in fragile mode.
4352 if (isNonFragile)
4353 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
4354 else
4355 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
4356 }
4357
4358 cmdArgs.push_back(args.MakeArgString(
4359 "-fobjc-runtime=" + runtime.getAsString()));
4360 return runtime;
4361 }
4362
maybeConsumeDash(const std::string & EH,size_t & I)4363 static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4364 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4365 I += HaveDash;
4366 return !HaveDash;
4367 }
4368
4369 struct EHFlags {
EHFlagsEHFlags4370 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4371 bool Synch;
4372 bool Asynch;
4373 bool NoExceptC;
4374 };
4375
4376 /// /EH controls whether to run destructor cleanups when exceptions are
4377 /// thrown. There are three modifiers:
4378 /// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4379 /// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4380 /// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4381 /// - c: Assume that extern "C" functions are implicitly noexcept. This
4382 /// modifier is an optimization, so we ignore it for now.
4383 /// The default is /EHs-c-, meaning cleanups are disabled.
parseClangCLEHFlags(const Driver & D,const ArgList & Args)4384 static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4385 EHFlags EH;
4386 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4387 for (auto EHVal : EHArgs) {
4388 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4389 switch (EHVal[I]) {
4390 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4391 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4392 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4393 default: break;
4394 }
4395 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4396 break;
4397 }
4398 }
4399 return EH;
4400 }
4401
AddClangCLArgs(const ArgList & Args,ArgStringList & CmdArgs) const4402 void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4403 unsigned RTOptionID = options::OPT__SLASH_MT;
4404
4405 if (Args.hasArg(options::OPT__SLASH_LDd))
4406 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4407 // but defining _DEBUG is sticky.
4408 RTOptionID = options::OPT__SLASH_MTd;
4409
4410 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
4411 RTOptionID = A->getOption().getID();
4412
4413 switch(RTOptionID) {
4414 case options::OPT__SLASH_MD:
4415 if (Args.hasArg(options::OPT__SLASH_LDd))
4416 CmdArgs.push_back("-D_DEBUG");
4417 CmdArgs.push_back("-D_MT");
4418 CmdArgs.push_back("-D_DLL");
4419 CmdArgs.push_back("--dependent-lib=msvcrt");
4420 break;
4421 case options::OPT__SLASH_MDd:
4422 CmdArgs.push_back("-D_DEBUG");
4423 CmdArgs.push_back("-D_MT");
4424 CmdArgs.push_back("-D_DLL");
4425 CmdArgs.push_back("--dependent-lib=msvcrtd");
4426 break;
4427 case options::OPT__SLASH_MT:
4428 if (Args.hasArg(options::OPT__SLASH_LDd))
4429 CmdArgs.push_back("-D_DEBUG");
4430 CmdArgs.push_back("-D_MT");
4431 CmdArgs.push_back("--dependent-lib=libcmt");
4432 break;
4433 case options::OPT__SLASH_MTd:
4434 CmdArgs.push_back("-D_DEBUG");
4435 CmdArgs.push_back("-D_MT");
4436 CmdArgs.push_back("--dependent-lib=libcmtd");
4437 break;
4438 default:
4439 llvm_unreachable("Unexpected option ID.");
4440 }
4441
4442 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4443 // users want. The /Za flag to cl.exe turns this off, but it's not
4444 // implemented in clang.
4445 CmdArgs.push_back("--dependent-lib=oldnames");
4446
4447 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4448 A->render(Args, CmdArgs);
4449
4450 // This controls whether or not we emit RTTI data for polymorphic types.
4451 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4452 /*default=*/false))
4453 CmdArgs.push_back("-fno-rtti-data");
4454
4455 const Driver &D = getToolChain().getDriver();
4456 EHFlags EH = parseClangCLEHFlags(D, Args);
4457 // FIXME: Do something with NoExceptC.
4458 if (EH.Synch || EH.Asynch) {
4459 CmdArgs.push_back("-fexceptions");
4460 CmdArgs.push_back("-fcxx-exceptions");
4461 }
4462
4463 // /EP should expand to -E -P.
4464 if (Args.hasArg(options::OPT__SLASH_EP)) {
4465 CmdArgs.push_back("-E");
4466 CmdArgs.push_back("-P");
4467 }
4468
4469 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4470 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4471 if (MostGeneralArg && BestCaseArg)
4472 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4473 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4474
4475 if (MostGeneralArg) {
4476 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4477 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4478 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4479
4480 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4481 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4482 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4483 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4484 << FirstConflict->getAsString(Args)
4485 << SecondConflict->getAsString(Args);
4486
4487 if (SingleArg)
4488 CmdArgs.push_back("-fms-memptr-rep=single");
4489 else if (MultipleArg)
4490 CmdArgs.push_back("-fms-memptr-rep=multiple");
4491 else
4492 CmdArgs.push_back("-fms-memptr-rep=virtual");
4493 }
4494
4495 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4496 A->render(Args, CmdArgs);
4497
4498 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4499 CmdArgs.push_back("-fdiagnostics-format");
4500 if (Args.hasArg(options::OPT__SLASH_fallback))
4501 CmdArgs.push_back("msvc-fallback");
4502 else
4503 CmdArgs.push_back("msvc");
4504 }
4505 }
4506
getCLFallback() const4507 visualstudio::Compile *Clang::getCLFallback() const {
4508 if (!CLFallback)
4509 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4510 return CLFallback.get();
4511 }
4512
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4513 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
4514 const InputInfo &Output,
4515 const InputInfoList &Inputs,
4516 const ArgList &Args,
4517 const char *LinkingOutput) const {
4518 ArgStringList CmdArgs;
4519
4520 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4521 const InputInfo &Input = Inputs[0];
4522
4523 // Don't warn about "clang -w -c foo.s"
4524 Args.ClaimAllArgs(options::OPT_w);
4525 // and "clang -emit-llvm -c foo.s"
4526 Args.ClaimAllArgs(options::OPT_emit_llvm);
4527
4528 // Invoke ourselves in -cc1as mode.
4529 //
4530 // FIXME: Implement custom jobs for internal actions.
4531 CmdArgs.push_back("-cc1as");
4532
4533 // Add the "effective" target triple.
4534 CmdArgs.push_back("-triple");
4535 std::string TripleStr =
4536 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
4537 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4538
4539 // Set the output mode, we currently only expect to be used as a real
4540 // assembler.
4541 CmdArgs.push_back("-filetype");
4542 CmdArgs.push_back("obj");
4543
4544 // Set the main file name, so that debug info works even with
4545 // -save-temps or preprocessed assembly.
4546 CmdArgs.push_back("-main-file-name");
4547 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4548
4549 // Add the target cpu
4550 const llvm::Triple &Triple = getToolChain().getTriple();
4551 std::string CPU = getCPUName(Args, Triple);
4552 if (!CPU.empty()) {
4553 CmdArgs.push_back("-target-cpu");
4554 CmdArgs.push_back(Args.MakeArgString(CPU));
4555 }
4556
4557 // Add the target features
4558 const Driver &D = getToolChain().getDriver();
4559 getTargetFeatures(D, Triple, Args, CmdArgs, true);
4560
4561 // Ignore explicit -force_cpusubtype_ALL option.
4562 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
4563
4564 // Determine the original source input.
4565 const Action *SourceAction = &JA;
4566 while (SourceAction->getKind() != Action::InputClass) {
4567 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4568 SourceAction = SourceAction->getInputs()[0];
4569 }
4570
4571 // Forward -g and handle debug info related flags, assuming we are dealing
4572 // with an actual assembly file.
4573 if (SourceAction->getType() == types::TY_Asm ||
4574 SourceAction->getType() == types::TY_PP_Asm) {
4575 Args.ClaimAllArgs(options::OPT_g_Group);
4576 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4577 if (!A->getOption().matches(options::OPT_g0))
4578 CmdArgs.push_back("-g");
4579
4580 if (Args.hasArg(options::OPT_gdwarf_2))
4581 CmdArgs.push_back("-gdwarf-2");
4582 if (Args.hasArg(options::OPT_gdwarf_3))
4583 CmdArgs.push_back("-gdwarf-3");
4584 if (Args.hasArg(options::OPT_gdwarf_4))
4585 CmdArgs.push_back("-gdwarf-4");
4586
4587 // Add the -fdebug-compilation-dir flag if needed.
4588 addDebugCompDirArg(Args, CmdArgs);
4589
4590 // Set the AT_producer to the clang version when using the integrated
4591 // assembler on assembly source files.
4592 CmdArgs.push_back("-dwarf-debug-producer");
4593 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
4594 }
4595
4596 // Optionally embed the -cc1as level arguments into the debug info, for build
4597 // analysis.
4598 if (getToolChain().UseDwarfDebugFlags()) {
4599 ArgStringList OriginalArgs;
4600 for (const auto &Arg : Args)
4601 Arg->render(Args, OriginalArgs);
4602
4603 SmallString<256> Flags;
4604 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4605 Flags += Exec;
4606 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4607 Flags += " ";
4608 Flags += OriginalArgs[i];
4609 }
4610 CmdArgs.push_back("-dwarf-debug-flags");
4611 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4612 }
4613
4614 // FIXME: Add -static support, once we have it.
4615
4616 // Consume all the warning flags. Usually this would be handled more
4617 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4618 // doesn't handle that so rather than warning about unused flags that are
4619 // actually used, we'll lie by omission instead.
4620 // FIXME: Stop lying and consume only the appropriate driver flags
4621 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4622 ie = Args.filtered_end();
4623 it != ie; ++it)
4624 (*it)->claim();
4625
4626 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4627 getToolChain().getDriver());
4628
4629 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
4630
4631 assert(Output.isFilename() && "Unexpected lipo output.");
4632 CmdArgs.push_back("-o");
4633 CmdArgs.push_back(Output.getFilename());
4634
4635 assert(Input.isFilename() && "Invalid input.");
4636 CmdArgs.push_back(Input.getFilename());
4637
4638 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4639 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4640
4641 // Handle the debug info splitting at object creation time if we're
4642 // creating an object.
4643 // TODO: Currently only works on linux with newer objcopy.
4644 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
4645 getToolChain().getTriple().isOSLinux())
4646 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4647 SplitDebugName(Args, Inputs));
4648 }
4649
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4650 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
4651 const InputInfo &Output,
4652 const InputInfoList &Inputs,
4653 const ArgList &Args,
4654 const char *LinkingOutput) const {
4655 const Driver &D = getToolChain().getDriver();
4656 ArgStringList CmdArgs;
4657
4658 for (const auto &A : Args) {
4659 if (forwardToGCC(A->getOption())) {
4660 // Don't forward any -g arguments to assembly steps.
4661 if (isa<AssembleJobAction>(JA) &&
4662 A->getOption().matches(options::OPT_g_Group))
4663 continue;
4664
4665 // Don't forward any -W arguments to assembly and link steps.
4666 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4667 A->getOption().matches(options::OPT_W_Group))
4668 continue;
4669
4670 // It is unfortunate that we have to claim here, as this means
4671 // we will basically never report anything interesting for
4672 // platforms using a generic gcc, even if we are just using gcc
4673 // to get to the assembler.
4674 A->claim();
4675 A->render(Args, CmdArgs);
4676 }
4677 }
4678
4679 RenderExtraToolArgs(JA, CmdArgs);
4680
4681 // If using a driver driver, force the arch.
4682 llvm::Triple::ArchType Arch = getToolChain().getArch();
4683 if (getToolChain().getTriple().isOSDarwin()) {
4684 CmdArgs.push_back("-arch");
4685
4686 // FIXME: Remove these special cases.
4687 if (Arch == llvm::Triple::ppc)
4688 CmdArgs.push_back("ppc");
4689 else if (Arch == llvm::Triple::ppc64)
4690 CmdArgs.push_back("ppc64");
4691 else if (Arch == llvm::Triple::ppc64le)
4692 CmdArgs.push_back("ppc64le");
4693 else
4694 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
4695 }
4696
4697 // Try to force gcc to match the tool chain we want, if we recognize
4698 // the arch.
4699 //
4700 // FIXME: The triple class should directly provide the information we want
4701 // here.
4702 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
4703 CmdArgs.push_back("-m32");
4704 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4705 Arch == llvm::Triple::ppc64le)
4706 CmdArgs.push_back("-m64");
4707
4708 if (Output.isFilename()) {
4709 CmdArgs.push_back("-o");
4710 CmdArgs.push_back(Output.getFilename());
4711 } else {
4712 assert(Output.isNothing() && "Unexpected output");
4713 CmdArgs.push_back("-fsyntax-only");
4714 }
4715
4716 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4717 options::OPT_Xassembler);
4718
4719 // Only pass -x if gcc will understand it; otherwise hope gcc
4720 // understands the suffix correctly. The main use case this would go
4721 // wrong in is for linker inputs if they happened to have an odd
4722 // suffix; really the only way to get this to happen is a command
4723 // like '-x foobar a.c' which will treat a.c like a linker input.
4724 //
4725 // FIXME: For the linker case specifically, can we safely convert
4726 // inputs into '-Wl,' options?
4727 for (const auto &II : Inputs) {
4728 // Don't try to pass LLVM or AST inputs to a generic gcc.
4729 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4730 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4731 D.Diag(diag::err_drv_no_linker_llvm_support)
4732 << getToolChain().getTripleString();
4733 else if (II.getType() == types::TY_AST)
4734 D.Diag(diag::err_drv_no_ast_support)
4735 << getToolChain().getTripleString();
4736 else if (II.getType() == types::TY_ModuleFile)
4737 D.Diag(diag::err_drv_no_module_support)
4738 << getToolChain().getTripleString();
4739
4740 if (types::canTypeBeUserSpecified(II.getType())) {
4741 CmdArgs.push_back("-x");
4742 CmdArgs.push_back(types::getTypeName(II.getType()));
4743 }
4744
4745 if (II.isFilename())
4746 CmdArgs.push_back(II.getFilename());
4747 else {
4748 const Arg &A = II.getInputArg();
4749
4750 // Reverse translate some rewritten options.
4751 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4752 CmdArgs.push_back("-lstdc++");
4753 continue;
4754 }
4755
4756 // Don't render as input, we need gcc to do the translations.
4757 A.render(Args, CmdArgs);
4758 }
4759 }
4760
4761 const std::string customGCCName = D.getCCCGenericGCCName();
4762 const char *GCCName;
4763 if (!customGCCName.empty())
4764 GCCName = customGCCName.c_str();
4765 else if (D.CCCIsCXX()) {
4766 GCCName = "g++";
4767 } else
4768 GCCName = "gcc";
4769
4770 const char *Exec =
4771 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4772 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4773 }
4774
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4775 void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4776 ArgStringList &CmdArgs) const {
4777 CmdArgs.push_back("-E");
4778 }
4779
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4780 void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4781 ArgStringList &CmdArgs) const {
4782 const Driver &D = getToolChain().getDriver();
4783
4784 // If -flto, etc. are present then make sure not to force assembly output.
4785 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4786 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
4787 CmdArgs.push_back("-c");
4788 else {
4789 if (JA.getType() != types::TY_PP_Asm)
4790 D.Diag(diag::err_drv_invalid_gcc_output_type)
4791 << getTypeName(JA.getType());
4792
4793 CmdArgs.push_back("-S");
4794 }
4795 }
4796
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4797 void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4798 ArgStringList &CmdArgs) const {
4799 // The types are (hopefully) good enough.
4800 }
4801
4802 // Hexagon tools start.
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4803 void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4804 ArgStringList &CmdArgs) const {
4805
4806 }
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4807 void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4808 const InputInfo &Output,
4809 const InputInfoList &Inputs,
4810 const ArgList &Args,
4811 const char *LinkingOutput) const {
4812
4813 const Driver &D = getToolChain().getDriver();
4814 ArgStringList CmdArgs;
4815
4816 std::string MarchString = "-march=";
4817 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
4818 CmdArgs.push_back(Args.MakeArgString(MarchString));
4819
4820 RenderExtraToolArgs(JA, CmdArgs);
4821
4822 if (Output.isFilename()) {
4823 CmdArgs.push_back("-o");
4824 CmdArgs.push_back(Output.getFilename());
4825 } else {
4826 assert(Output.isNothing() && "Unexpected output");
4827 CmdArgs.push_back("-fsyntax-only");
4828 }
4829
4830 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4831 if (!SmallDataThreshold.empty())
4832 CmdArgs.push_back(
4833 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4834
4835 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4836 options::OPT_Xassembler);
4837
4838 // Only pass -x if gcc will understand it; otherwise hope gcc
4839 // understands the suffix correctly. The main use case this would go
4840 // wrong in is for linker inputs if they happened to have an odd
4841 // suffix; really the only way to get this to happen is a command
4842 // like '-x foobar a.c' which will treat a.c like a linker input.
4843 //
4844 // FIXME: For the linker case specifically, can we safely convert
4845 // inputs into '-Wl,' options?
4846 for (const auto &II : Inputs) {
4847 // Don't try to pass LLVM or AST inputs to a generic gcc.
4848 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4849 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4850 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4851 << getToolChain().getTripleString();
4852 else if (II.getType() == types::TY_AST)
4853 D.Diag(clang::diag::err_drv_no_ast_support)
4854 << getToolChain().getTripleString();
4855 else if (II.getType() == types::TY_ModuleFile)
4856 D.Diag(diag::err_drv_no_module_support)
4857 << getToolChain().getTripleString();
4858
4859 if (II.isFilename())
4860 CmdArgs.push_back(II.getFilename());
4861 else
4862 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4863 II.getInputArg().render(Args, CmdArgs);
4864 }
4865
4866 const char *GCCName = "hexagon-as";
4867 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4868 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4869 }
4870
RenderExtraToolArgs(const JobAction & JA,ArgStringList & CmdArgs) const4871 void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4872 ArgStringList &CmdArgs) const {
4873 // The types are (hopefully) good enough.
4874 }
4875
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const4876 void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4877 const InputInfo &Output,
4878 const InputInfoList &Inputs,
4879 const ArgList &Args,
4880 const char *LinkingOutput) const {
4881
4882 const toolchains::Hexagon_TC& ToolChain =
4883 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4884 const Driver &D = ToolChain.getDriver();
4885
4886 ArgStringList CmdArgs;
4887
4888 //----------------------------------------------------------------------------
4889 //
4890 //----------------------------------------------------------------------------
4891 bool hasStaticArg = Args.hasArg(options::OPT_static);
4892 bool buildingLib = Args.hasArg(options::OPT_shared);
4893 bool buildPIE = Args.hasArg(options::OPT_pie);
4894 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4895 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4896 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4897 bool useShared = buildingLib && !hasStaticArg;
4898
4899 //----------------------------------------------------------------------------
4900 // Silence warnings for various options
4901 //----------------------------------------------------------------------------
4902
4903 Args.ClaimAllArgs(options::OPT_g_Group);
4904 Args.ClaimAllArgs(options::OPT_emit_llvm);
4905 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4906 // handled somewhere else.
4907 Args.ClaimAllArgs(options::OPT_static_libgcc);
4908
4909 //----------------------------------------------------------------------------
4910 //
4911 //----------------------------------------------------------------------------
4912 for (const auto &Opt : ToolChain.ExtraOpts)
4913 CmdArgs.push_back(Opt.c_str());
4914
4915 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4916 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
4917
4918 if (buildingLib) {
4919 CmdArgs.push_back("-shared");
4920 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4921 // hexagon-gcc does
4922 }
4923
4924 if (hasStaticArg)
4925 CmdArgs.push_back("-static");
4926
4927 if (buildPIE && !buildingLib)
4928 CmdArgs.push_back("-pie");
4929
4930 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4931 if (!SmallDataThreshold.empty()) {
4932 CmdArgs.push_back(
4933 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4934 }
4935
4936 //----------------------------------------------------------------------------
4937 //
4938 //----------------------------------------------------------------------------
4939 CmdArgs.push_back("-o");
4940 CmdArgs.push_back(Output.getFilename());
4941
4942 const std::string MarchSuffix = "/" + MarchString;
4943 const std::string G0Suffix = "/G0";
4944 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4945 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4946 + "/";
4947 const std::string StartFilesDir = RootDir
4948 + "hexagon/lib"
4949 + (buildingLib
4950 ? MarchG0Suffix : MarchSuffix);
4951
4952 //----------------------------------------------------------------------------
4953 // moslib
4954 //----------------------------------------------------------------------------
4955 std::vector<std::string> oslibs;
4956 bool hasStandalone= false;
4957
4958 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4959 ie = Args.filtered_end(); it != ie; ++it) {
4960 (*it)->claim();
4961 oslibs.push_back((*it)->getValue());
4962 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
4963 }
4964 if (oslibs.empty()) {
4965 oslibs.push_back("standalone");
4966 hasStandalone = true;
4967 }
4968
4969 //----------------------------------------------------------------------------
4970 // Start Files
4971 //----------------------------------------------------------------------------
4972 if (incStdLib && incStartFiles) {
4973
4974 if (!buildingLib) {
4975 if (hasStandalone) {
4976 CmdArgs.push_back(
4977 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4978 }
4979 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4980 }
4981 std::string initObj = useShared ? "/initS.o" : "/init.o";
4982 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4983 }
4984
4985 //----------------------------------------------------------------------------
4986 // Library Search Paths
4987 //----------------------------------------------------------------------------
4988 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4989 for (const auto &LibPath : LibPaths)
4990 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
4991
4992 //----------------------------------------------------------------------------
4993 //
4994 //----------------------------------------------------------------------------
4995 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4996 Args.AddAllArgs(CmdArgs, options::OPT_e);
4997 Args.AddAllArgs(CmdArgs, options::OPT_s);
4998 Args.AddAllArgs(CmdArgs, options::OPT_t);
4999 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5000
5001 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5002
5003 //----------------------------------------------------------------------------
5004 // Libraries
5005 //----------------------------------------------------------------------------
5006 if (incStdLib && incDefLibs) {
5007 if (D.CCCIsCXX()) {
5008 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5009 CmdArgs.push_back("-lm");
5010 }
5011
5012 CmdArgs.push_back("--start-group");
5013
5014 if (!buildingLib) {
5015 for(std::vector<std::string>::iterator i = oslibs.begin(),
5016 e = oslibs.end(); i != e; ++i)
5017 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5018 CmdArgs.push_back("-lc");
5019 }
5020 CmdArgs.push_back("-lgcc");
5021
5022 CmdArgs.push_back("--end-group");
5023 }
5024
5025 //----------------------------------------------------------------------------
5026 // End files
5027 //----------------------------------------------------------------------------
5028 if (incStdLib && incStartFiles) {
5029 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5030 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5031 }
5032
5033 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
5034 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
5035 }
5036 // Hexagon tools end.
5037
getARMCPUForMArch(const ArgList & Args,const llvm::Triple & Triple)5038 const char *arm::getARMCPUForMArch(const ArgList &Args,
5039 const llvm::Triple &Triple) {
5040 StringRef MArch;
5041 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5042 // Otherwise, if we have -march= choose the base CPU for that arch.
5043 MArch = A->getValue();
5044 } else {
5045 // Otherwise, use the Arch from the triple.
5046 MArch = Triple.getArchName();
5047 }
5048
5049 // Handle -march=native.
5050 if (MArch == "native") {
5051 std::string CPU = llvm::sys::getHostCPUName();
5052 if (CPU != "generic") {
5053 // Translate the native cpu into the architecture. The switch below will
5054 // then chose the minimum cpu for that arch.
5055 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
5056 }
5057 }
5058
5059 return driver::getARMCPUForMArch(MArch, Triple);
5060 }
5061
5062 /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
5063 //
5064 // FIXME: tblgen this.
getARMCPUForMArch(StringRef MArch,const llvm::Triple & Triple)5065 const char *driver::getARMCPUForMArch(StringRef MArch,
5066 const llvm::Triple &Triple) {
5067 switch (Triple.getOS()) {
5068 case llvm::Triple::NetBSD:
5069 if (MArch == "armv6")
5070 return "arm1176jzf-s";
5071 break;
5072 case llvm::Triple::Win32:
5073 // FIXME: this is invalid for WindowsCE
5074 return "cortex-a9";
5075 default:
5076 break;
5077 }
5078
5079 const char *result = nullptr;
5080 size_t offset = StringRef::npos;
5081 if (MArch.startswith("arm"))
5082 offset = 3;
5083 if (MArch.startswith("thumb"))
5084 offset = 5;
5085 if (offset != StringRef::npos && MArch.substr(offset, 2) == "eb")
5086 offset += 2;
5087 if (offset != StringRef::npos)
5088 result = llvm::StringSwitch<const char *>(MArch.substr(offset))
5089 .Cases("v2", "v2a", "arm2")
5090 .Case("v3", "arm6")
5091 .Case("v3m", "arm7m")
5092 .Case("v4", "strongarm")
5093 .Case("v4t", "arm7tdmi")
5094 .Cases("v5", "v5t", "arm10tdmi")
5095 .Cases("v5e", "v5te", "arm1022e")
5096 .Case("v5tej", "arm926ej-s")
5097 .Cases("v6", "v6k", "arm1136jf-s")
5098 .Case("v6j", "arm1136j-s")
5099 .Cases("v6z", "v6zk", "arm1176jzf-s")
5100 .Case("v6t2", "arm1156t2-s")
5101 .Cases("v6m", "v6-m", "cortex-m0")
5102 .Cases("v7", "v7a", "v7-a", "v7l", "v7-l", "cortex-a8")
5103 .Cases("v7s", "v7-s", "swift")
5104 .Cases("v7r", "v7-r", "cortex-r4")
5105 .Cases("v7m", "v7-m", "cortex-m3")
5106 .Cases("v7em", "v7e-m", "cortex-m4")
5107 .Cases("v8", "v8a", "v8-a", "cortex-a53")
5108 .Default(nullptr);
5109 else
5110 result = llvm::StringSwitch<const char *>(MArch)
5111 .Case("ep9312", "ep9312")
5112 .Case("iwmmxt", "iwmmxt")
5113 .Case("xscale", "xscale")
5114 .Default(nullptr);
5115
5116 if (result)
5117 return result;
5118
5119 // If all else failed, return the most base CPU with thumb interworking
5120 // supported by LLVM.
5121 // FIXME: Should warn once that we're falling back.
5122 switch (Triple.getOS()) {
5123 case llvm::Triple::NetBSD:
5124 switch (Triple.getEnvironment()) {
5125 case llvm::Triple::GNUEABIHF:
5126 case llvm::Triple::GNUEABI:
5127 case llvm::Triple::EABIHF:
5128 case llvm::Triple::EABI:
5129 return "arm926ej-s";
5130 default:
5131 return "strongarm";
5132 }
5133 default:
5134 switch (Triple.getEnvironment()) {
5135 case llvm::Triple::EABIHF:
5136 case llvm::Triple::GNUEABIHF:
5137 return "arm1176jzf-s";
5138 default:
5139 return "arm7tdmi";
5140 }
5141 }
5142 }
5143
5144 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
getARMTargetCPU(const ArgList & Args,const llvm::Triple & Triple)5145 StringRef arm::getARMTargetCPU(const ArgList &Args,
5146 const llvm::Triple &Triple) {
5147 // FIXME: Warn on inconsistent use of -mcpu and -march.
5148 // If we have -mcpu=, use that.
5149 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5150 StringRef MCPU = A->getValue();
5151 // Handle -mcpu=native.
5152 if (MCPU == "native")
5153 return llvm::sys::getHostCPUName();
5154 else
5155 return MCPU;
5156 }
5157
5158 return getARMCPUForMArch(Args, Triple);
5159 }
5160
5161 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5162 /// CPU.
5163 //
5164 // FIXME: This is redundant with -mcpu, why does LLVM use this.
5165 // FIXME: tblgen this, or kill it!
getLLVMArchSuffixForARM(StringRef CPU)5166 const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5167 return llvm::StringSwitch<const char *>(CPU)
5168 .Case("strongarm", "v4")
5169 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5170 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5171 .Cases("arm920", "arm920t", "arm922t", "v4t")
5172 .Cases("arm940t", "ep9312","v4t")
5173 .Cases("arm10tdmi", "arm1020t", "v5")
5174 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5175 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5176 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5177 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5178 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5179 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
5180 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
5181 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5182 .Cases("cortex-r4", "cortex-r5", "v7r")
5183 .Case("cortex-m0", "v6m")
5184 .Case("cortex-m3", "v7m")
5185 .Case("cortex-m4", "v7em")
5186 .Case("swift", "v7s")
5187 .Case("cyclone", "v8")
5188 .Cases("cortex-a53", "cortex-a57", "v8")
5189 .Default("");
5190 }
5191
hasMipsAbiArg(const ArgList & Args,const char * Value)5192 bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5193 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5194 return A && (A->getValue() == StringRef(Value));
5195 }
5196
isNaN2008(const ArgList & Args,const llvm::Triple & Triple)5197 bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
5198 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5199 return llvm::StringSwitch<bool>(NaNArg->getValue())
5200 .Case("2008", true)
5201 .Case("legacy", false)
5202 .Default(false);
5203
5204 // NaN2008 is the default for MIPS32r6/MIPS64r6.
5205 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5206 .Cases("mips32r6", "mips64r6", true)
5207 .Default(false);
5208
5209 return false;
5210 }
5211
getArchTypeForMachOArchName(StringRef Str)5212 llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
5213 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5214 // archs which Darwin doesn't use.
5215
5216 // The matching this routine does is fairly pointless, since it is neither the
5217 // complete architecture list, nor a reasonable subset. The problem is that
5218 // historically the driver driver accepts this and also ties its -march=
5219 // handling to the architecture name, so we need to be careful before removing
5220 // support for it.
5221
5222 // This code must be kept in sync with Clang's Darwin specific argument
5223 // translation.
5224
5225 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5226 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5227 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5228 .Case("ppc64", llvm::Triple::ppc64)
5229 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5230 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5231 llvm::Triple::x86)
5232 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
5233 // This is derived from the driver driver.
5234 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5235 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
5236 .Cases("armv7s", "xscale", llvm::Triple::arm)
5237 .Case("arm64", llvm::Triple::arm64)
5238 .Case("r600", llvm::Triple::r600)
5239 .Case("nvptx", llvm::Triple::nvptx)
5240 .Case("nvptx64", llvm::Triple::nvptx64)
5241 .Case("amdil", llvm::Triple::amdil)
5242 .Case("spir", llvm::Triple::spir)
5243 .Default(llvm::Triple::UnknownArch);
5244 }
5245
setTripleTypeForMachOArchName(llvm::Triple & T,StringRef Str)5246 void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5247 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5248 T.setArch(Arch);
5249
5250 if (Str == "x86_64h")
5251 T.setArchName(Str);
5252 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5253 T.setOS(llvm::Triple::UnknownOS);
5254 T.setObjectFormat(llvm::Triple::MachO);
5255 }
5256 }
5257
getBaseInputName(const ArgList & Args,const InputInfoList & Inputs)5258 const char *Clang::getBaseInputName(const ArgList &Args,
5259 const InputInfoList &Inputs) {
5260 return Args.MakeArgString(
5261 llvm::sys::path::filename(Inputs[0].getBaseInput()));
5262 }
5263
getBaseInputStem(const ArgList & Args,const InputInfoList & Inputs)5264 const char *Clang::getBaseInputStem(const ArgList &Args,
5265 const InputInfoList &Inputs) {
5266 const char *Str = getBaseInputName(Args, Inputs);
5267
5268 if (const char *End = strrchr(Str, '.'))
5269 return Args.MakeArgString(std::string(Str, End));
5270
5271 return Str;
5272 }
5273
getDependencyFileName(const ArgList & Args,const InputInfoList & Inputs)5274 const char *Clang::getDependencyFileName(const ArgList &Args,
5275 const InputInfoList &Inputs) {
5276 // FIXME: Think about this more.
5277 std::string Res;
5278
5279 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
5280 std::string Str(OutputOpt->getValue());
5281 Res = Str.substr(0, Str.rfind('.'));
5282 } else {
5283 Res = getBaseInputStem(Args, Inputs);
5284 }
5285 return Args.MakeArgString(Res + ".d");
5286 }
5287
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5288 void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5289 const InputInfo &Output,
5290 const InputInfoList &Inputs,
5291 const ArgList &Args,
5292 const char *LinkingOutput) const {
5293 ArgStringList CmdArgs;
5294
5295 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5296 const InputInfo &Input = Inputs[0];
5297
5298 // Determine the original source input.
5299 const Action *SourceAction = &JA;
5300 while (SourceAction->getKind() != Action::InputClass) {
5301 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5302 SourceAction = SourceAction->getInputs()[0];
5303 }
5304
5305 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
5306 // sure it runs its system assembler not clang's integrated assembler.
5307 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5308 // FIXME: at run-time detect assembler capabilities or rely on version
5309 // information forwarded by -target-assembler-version (future)
5310 if (Args.hasArg(options::OPT_fno_integrated_as)) {
5311 const llvm::Triple &T(getToolChain().getTriple());
5312 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
5313 CmdArgs.push_back("-Q");
5314 }
5315
5316 // Forward -g, assuming we are dealing with an actual assembly file.
5317 if (SourceAction->getType() == types::TY_Asm ||
5318 SourceAction->getType() == types::TY_PP_Asm) {
5319 if (Args.hasArg(options::OPT_gstabs))
5320 CmdArgs.push_back("--gstabs");
5321 else if (Args.hasArg(options::OPT_g_Group))
5322 CmdArgs.push_back("-g");
5323 }
5324
5325 // Derived from asm spec.
5326 AddMachOArch(Args, CmdArgs);
5327
5328 // Use -force_cpusubtype_ALL on x86 by default.
5329 if (getToolChain().getArch() == llvm::Triple::x86 ||
5330 getToolChain().getArch() == llvm::Triple::x86_64 ||
5331 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5332 CmdArgs.push_back("-force_cpusubtype_ALL");
5333
5334 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
5335 (((Args.hasArg(options::OPT_mkernel) ||
5336 Args.hasArg(options::OPT_fapple_kext)) &&
5337 getMachOToolChain().isKernelStatic()) ||
5338 Args.hasArg(options::OPT_static)))
5339 CmdArgs.push_back("-static");
5340
5341 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5342 options::OPT_Xassembler);
5343
5344 assert(Output.isFilename() && "Unexpected lipo output.");
5345 CmdArgs.push_back("-o");
5346 CmdArgs.push_back(Output.getFilename());
5347
5348 assert(Input.isFilename() && "Invalid input.");
5349 CmdArgs.push_back(Input.getFilename());
5350
5351 // asm_final spec is empty.
5352
5353 const char *Exec =
5354 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5355 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5356 }
5357
anchor()5358 void darwin::MachOTool::anchor() {}
5359
AddMachOArch(const ArgList & Args,ArgStringList & CmdArgs) const5360 void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5361 ArgStringList &CmdArgs) const {
5362 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
5363
5364 // Derived from darwin_arch spec.
5365 CmdArgs.push_back("-arch");
5366 CmdArgs.push_back(Args.MakeArgString(ArchName));
5367
5368 // FIXME: Is this needed anymore?
5369 if (ArchName == "arm")
5370 CmdArgs.push_back("-force_cpusubtype_ALL");
5371 }
5372
NeedsTempPath(const InputInfoList & Inputs) const5373 bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5374 // We only need to generate a temp path for LTO if we aren't compiling object
5375 // files. When compiling source files, we run 'dsymutil' after linking. We
5376 // don't run 'dsymutil' when compiling object files.
5377 for (const auto &Input : Inputs)
5378 if (Input.getType() != types::TY_Object)
5379 return true;
5380
5381 return false;
5382 }
5383
AddLinkArgs(Compilation & C,const ArgList & Args,ArgStringList & CmdArgs,const InputInfoList & Inputs) const5384 void darwin::Link::AddLinkArgs(Compilation &C,
5385 const ArgList &Args,
5386 ArgStringList &CmdArgs,
5387 const InputInfoList &Inputs) const {
5388 const Driver &D = getToolChain().getDriver();
5389 const toolchains::MachO &MachOTC = getMachOToolChain();
5390
5391 unsigned Version[3] = { 0, 0, 0 };
5392 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5393 bool HadExtra;
5394 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
5395 Version[1], Version[2], HadExtra) ||
5396 HadExtra)
5397 D.Diag(diag::err_drv_invalid_version_number)
5398 << A->getAsString(Args);
5399 }
5400
5401 // Newer linkers support -demangle. Pass it if supported and not disabled by
5402 // the user.
5403 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5404 CmdArgs.push_back("-demangle");
5405
5406 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5407 CmdArgs.push_back("-export_dynamic");
5408
5409 // If we are using LTO, then automatically create a temporary file path for
5410 // the linker to use, so that it's lifetime will extend past a possible
5411 // dsymutil step.
5412 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5413 const char *TmpPath = C.getArgs().MakeArgString(
5414 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5415 C.addTempFile(TmpPath);
5416 CmdArgs.push_back("-object_path_lto");
5417 CmdArgs.push_back(TmpPath);
5418 }
5419
5420 // Derived from the "link" spec.
5421 Args.AddAllArgs(CmdArgs, options::OPT_static);
5422 if (!Args.hasArg(options::OPT_static))
5423 CmdArgs.push_back("-dynamic");
5424 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5425 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5426 // here. How do we wish to handle such things?
5427 }
5428
5429 if (!Args.hasArg(options::OPT_dynamiclib)) {
5430 AddMachOArch(Args, CmdArgs);
5431 // FIXME: Why do this only on this path?
5432 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
5433
5434 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5435 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5436 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5437
5438 Arg *A;
5439 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5440 (A = Args.getLastArg(options::OPT_current__version)) ||
5441 (A = Args.getLastArg(options::OPT_install__name)))
5442 D.Diag(diag::err_drv_argument_only_allowed_with)
5443 << A->getAsString(Args) << "-dynamiclib";
5444
5445 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5446 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5447 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5448 } else {
5449 CmdArgs.push_back("-dylib");
5450
5451 Arg *A;
5452 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5453 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5454 (A = Args.getLastArg(options::OPT_client__name)) ||
5455 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5456 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5457 (A = Args.getLastArg(options::OPT_private__bundle)))
5458 D.Diag(diag::err_drv_argument_not_allowed_with)
5459 << A->getAsString(Args) << "-dynamiclib";
5460
5461 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5462 "-dylib_compatibility_version");
5463 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5464 "-dylib_current_version");
5465
5466 AddMachOArch(Args, CmdArgs);
5467
5468 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5469 "-dylib_install_name");
5470 }
5471
5472 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5473 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5474 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
5475 if (MachOTC.isTargetIOSBased())
5476 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
5477 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5478 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5479 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5480 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5481 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5482 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
5483 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
5484 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5485 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5486 Args.AddAllArgs(CmdArgs, options::OPT_init);
5487
5488 // Add the deployment target.
5489 MachOTC.addMinVersionArgs(Args, CmdArgs);
5490
5491 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5492 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5493 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5494 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5495 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
5496
5497 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5498 options::OPT_fno_pie,
5499 options::OPT_fno_PIE)) {
5500 if (A->getOption().matches(options::OPT_fpie) ||
5501 A->getOption().matches(options::OPT_fPIE))
5502 CmdArgs.push_back("-pie");
5503 else
5504 CmdArgs.push_back("-no_pie");
5505 }
5506
5507 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5508 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5509 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5510 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5511 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5512 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5513 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5514 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5515 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5516 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5517 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5518 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5519 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5520 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5521 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5522 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
5523
5524 // Give --sysroot= preference, over the Apple specific behavior to also use
5525 // --isysroot as the syslibroot.
5526 StringRef sysroot = C.getSysRoot();
5527 if (sysroot != "") {
5528 CmdArgs.push_back("-syslibroot");
5529 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
5530 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5531 CmdArgs.push_back("-syslibroot");
5532 CmdArgs.push_back(A->getValue());
5533 }
5534
5535 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5536 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5537 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5538 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5539 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
5540 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
5541 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5542 Args.AddAllArgs(CmdArgs, options::OPT_y);
5543 Args.AddLastArg(CmdArgs, options::OPT_w);
5544 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5545 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5546 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5547 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5548 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5549 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5550 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5551 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5552 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5553 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5554 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5555 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5556 }
5557
5558 enum LibOpenMP {
5559 LibUnknown,
5560 LibGOMP,
5561 LibIOMP5
5562 };
5563
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5564 void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
5565 const InputInfo &Output,
5566 const InputInfoList &Inputs,
5567 const ArgList &Args,
5568 const char *LinkingOutput) const {
5569 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
5570
5571 // The logic here is derived from gcc's behavior; most of which
5572 // comes from specs (starting with link_command). Consult gcc for
5573 // more information.
5574 ArgStringList CmdArgs;
5575
5576 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5577 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5578 options::OPT_ccc_arcmt_migrate)) {
5579 for (const auto &Arg : Args)
5580 Arg->claim();
5581 const char *Exec =
5582 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5583 CmdArgs.push_back(Output.getFilename());
5584 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5585 return;
5586 }
5587
5588 // I'm not sure why this particular decomposition exists in gcc, but
5589 // we follow suite for ease of comparison.
5590 AddLinkArgs(C, Args, CmdArgs, Inputs);
5591
5592 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5593 Args.AddAllArgs(CmdArgs, options::OPT_s);
5594 Args.AddAllArgs(CmdArgs, options::OPT_t);
5595 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5596 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5597 Args.AddLastArg(CmdArgs, options::OPT_e);
5598 Args.AddAllArgs(CmdArgs, options::OPT_r);
5599
5600 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5601 // members of static archive libraries which implement Objective-C classes or
5602 // categories.
5603 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5604 CmdArgs.push_back("-ObjC");
5605
5606 CmdArgs.push_back("-o");
5607 CmdArgs.push_back(Output.getFilename());
5608
5609 if (!Args.hasArg(options::OPT_nostdlib) &&
5610 !Args.hasArg(options::OPT_nostartfiles))
5611 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
5612
5613 Args.AddAllArgs(CmdArgs, options::OPT_L);
5614
5615 LibOpenMP UsedOpenMPLib = LibUnknown;
5616 if (Args.hasArg(options::OPT_fopenmp)) {
5617 UsedOpenMPLib = LibGOMP;
5618 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5619 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5620 .Case("libgomp", LibGOMP)
5621 .Case("libiomp5", LibIOMP5)
5622 .Default(LibUnknown);
5623 if (UsedOpenMPLib == LibUnknown)
5624 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5625 << A->getOption().getName() << A->getValue();
5626 }
5627 switch (UsedOpenMPLib) {
5628 case LibGOMP:
5629 CmdArgs.push_back("-lgomp");
5630 break;
5631 case LibIOMP5:
5632 CmdArgs.push_back("-liomp5");
5633 break;
5634 case LibUnknown:
5635 break;
5636 }
5637
5638 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5639
5640 if (isObjCRuntimeLinked(Args) &&
5641 !Args.hasArg(options::OPT_nostdlib) &&
5642 !Args.hasArg(options::OPT_nodefaultlibs)) {
5643 // We use arclite library for both ARC and subscripting support.
5644 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5645
5646 CmdArgs.push_back("-framework");
5647 CmdArgs.push_back("Foundation");
5648 // Link libobj.
5649 CmdArgs.push_back("-lobjc");
5650 }
5651
5652 if (LinkingOutput) {
5653 CmdArgs.push_back("-arch_multiple");
5654 CmdArgs.push_back("-final_output");
5655 CmdArgs.push_back(LinkingOutput);
5656 }
5657
5658 if (Args.hasArg(options::OPT_fnested_functions))
5659 CmdArgs.push_back("-allow_stack_execute");
5660
5661 if (!Args.hasArg(options::OPT_nostdlib) &&
5662 !Args.hasArg(options::OPT_nodefaultlibs)) {
5663 if (getToolChain().getDriver().CCCIsCXX())
5664 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5665
5666 // link_ssp spec is empty.
5667
5668 // Let the tool chain choose which runtime library to link.
5669 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
5670 }
5671
5672 if (!Args.hasArg(options::OPT_nostdlib) &&
5673 !Args.hasArg(options::OPT_nostartfiles)) {
5674 // endfile_spec is empty.
5675 }
5676
5677 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5678 Args.AddAllArgs(CmdArgs, options::OPT_F);
5679
5680 const char *Exec =
5681 Args.MakeArgString(getToolChain().GetLinkerPath());
5682 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5683 }
5684
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5685 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
5686 const InputInfo &Output,
5687 const InputInfoList &Inputs,
5688 const ArgList &Args,
5689 const char *LinkingOutput) const {
5690 ArgStringList CmdArgs;
5691
5692 CmdArgs.push_back("-create");
5693 assert(Output.isFilename() && "Unexpected lipo output.");
5694
5695 CmdArgs.push_back("-output");
5696 CmdArgs.push_back(Output.getFilename());
5697
5698 for (const auto &II : Inputs) {
5699 assert(II.isFilename() && "Unexpected lipo input.");
5700 CmdArgs.push_back(II.getFilename());
5701 }
5702
5703 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
5704 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5705 }
5706
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5707 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
5708 const InputInfo &Output,
5709 const InputInfoList &Inputs,
5710 const ArgList &Args,
5711 const char *LinkingOutput) const {
5712 ArgStringList CmdArgs;
5713
5714 CmdArgs.push_back("-o");
5715 CmdArgs.push_back(Output.getFilename());
5716
5717 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5718 const InputInfo &Input = Inputs[0];
5719 assert(Input.isFilename() && "Unexpected dsymutil input.");
5720 CmdArgs.push_back(Input.getFilename());
5721
5722 const char *Exec =
5723 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
5724 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5725 }
5726
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5727 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
5728 const InputInfo &Output,
5729 const InputInfoList &Inputs,
5730 const ArgList &Args,
5731 const char *LinkingOutput) const {
5732 ArgStringList CmdArgs;
5733 CmdArgs.push_back("--verify");
5734 CmdArgs.push_back("--debug-info");
5735 CmdArgs.push_back("--eh-frame");
5736 CmdArgs.push_back("--quiet");
5737
5738 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5739 const InputInfo &Input = Inputs[0];
5740 assert(Input.isFilename() && "Unexpected verify input");
5741
5742 // Grabbing the output of the earlier dsymutil run.
5743 CmdArgs.push_back(Input.getFilename());
5744
5745 const char *Exec =
5746 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5747 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5748 }
5749
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5750 void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5751 const InputInfo &Output,
5752 const InputInfoList &Inputs,
5753 const ArgList &Args,
5754 const char *LinkingOutput) const {
5755 ArgStringList CmdArgs;
5756
5757 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5758 options::OPT_Xassembler);
5759
5760 CmdArgs.push_back("-o");
5761 CmdArgs.push_back(Output.getFilename());
5762
5763 for (const auto &II : Inputs)
5764 CmdArgs.push_back(II.getFilename());
5765
5766 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
5767 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5768 }
5769
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5770 void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5771 const InputInfo &Output,
5772 const InputInfoList &Inputs,
5773 const ArgList &Args,
5774 const char *LinkingOutput) const {
5775 // FIXME: Find a real GCC, don't hard-code versions here
5776 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5777 const llvm::Triple &T = getToolChain().getTriple();
5778 std::string LibPath = "/usr/lib/";
5779 llvm::Triple::ArchType Arch = T.getArch();
5780 switch (Arch) {
5781 case llvm::Triple::x86:
5782 GCCLibPath +=
5783 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5784 break;
5785 case llvm::Triple::x86_64:
5786 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5787 GCCLibPath += "/4.5.2/amd64/";
5788 LibPath += "amd64/";
5789 break;
5790 default:
5791 llvm_unreachable("Unsupported architecture");
5792 }
5793
5794 ArgStringList CmdArgs;
5795
5796 // Demangle C++ names in errors
5797 CmdArgs.push_back("-C");
5798
5799 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5800 (!Args.hasArg(options::OPT_shared))) {
5801 CmdArgs.push_back("-e");
5802 CmdArgs.push_back("_start");
5803 }
5804
5805 if (Args.hasArg(options::OPT_static)) {
5806 CmdArgs.push_back("-Bstatic");
5807 CmdArgs.push_back("-dn");
5808 } else {
5809 CmdArgs.push_back("-Bdynamic");
5810 if (Args.hasArg(options::OPT_shared)) {
5811 CmdArgs.push_back("-shared");
5812 } else {
5813 CmdArgs.push_back("--dynamic-linker");
5814 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5815 }
5816 }
5817
5818 if (Output.isFilename()) {
5819 CmdArgs.push_back("-o");
5820 CmdArgs.push_back(Output.getFilename());
5821 } else {
5822 assert(Output.isNothing() && "Invalid output.");
5823 }
5824
5825 if (!Args.hasArg(options::OPT_nostdlib) &&
5826 !Args.hasArg(options::OPT_nostartfiles)) {
5827 if (!Args.hasArg(options::OPT_shared)) {
5828 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5829 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5830 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5831 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5832 } else {
5833 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
5834 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5835 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5836 }
5837 if (getToolChain().getDriver().CCCIsCXX())
5838 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
5839 }
5840
5841 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5842
5843 Args.AddAllArgs(CmdArgs, options::OPT_L);
5844 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5845 Args.AddAllArgs(CmdArgs, options::OPT_e);
5846 Args.AddAllArgs(CmdArgs, options::OPT_r);
5847
5848 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5849
5850 if (!Args.hasArg(options::OPT_nostdlib) &&
5851 !Args.hasArg(options::OPT_nodefaultlibs)) {
5852 if (getToolChain().getDriver().CCCIsCXX())
5853 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5854 CmdArgs.push_back("-lgcc_s");
5855 if (!Args.hasArg(options::OPT_shared)) {
5856 CmdArgs.push_back("-lgcc");
5857 CmdArgs.push_back("-lc");
5858 CmdArgs.push_back("-lm");
5859 }
5860 }
5861
5862 if (!Args.hasArg(options::OPT_nostdlib) &&
5863 !Args.hasArg(options::OPT_nostartfiles)) {
5864 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
5865 }
5866 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
5867
5868 addProfileRT(getToolChain(), Args, CmdArgs);
5869
5870 const char *Exec =
5871 Args.MakeArgString(getToolChain().GetLinkerPath());
5872 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5873 }
5874
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5875 void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5876 const InputInfo &Output,
5877 const InputInfoList &Inputs,
5878 const ArgList &Args,
5879 const char *LinkingOutput) const {
5880 ArgStringList CmdArgs;
5881
5882 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5883 options::OPT_Xassembler);
5884
5885 CmdArgs.push_back("-o");
5886 CmdArgs.push_back(Output.getFilename());
5887
5888 for (const auto &II : Inputs)
5889 CmdArgs.push_back(II.getFilename());
5890
5891 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
5892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5893 }
5894
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5895 void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
5896 const InputInfo &Output,
5897 const InputInfoList &Inputs,
5898 const ArgList &Args,
5899 const char *LinkingOutput) const {
5900 ArgStringList CmdArgs;
5901
5902 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5903 (!Args.hasArg(options::OPT_shared))) {
5904 CmdArgs.push_back("-e");
5905 CmdArgs.push_back("_start");
5906 }
5907
5908 if (Args.hasArg(options::OPT_static)) {
5909 CmdArgs.push_back("-Bstatic");
5910 CmdArgs.push_back("-dn");
5911 } else {
5912 // CmdArgs.push_back("--eh-frame-hdr");
5913 CmdArgs.push_back("-Bdynamic");
5914 if (Args.hasArg(options::OPT_shared)) {
5915 CmdArgs.push_back("-shared");
5916 } else {
5917 CmdArgs.push_back("--dynamic-linker");
5918 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5919 }
5920 }
5921
5922 if (Output.isFilename()) {
5923 CmdArgs.push_back("-o");
5924 CmdArgs.push_back(Output.getFilename());
5925 } else {
5926 assert(Output.isNothing() && "Invalid output.");
5927 }
5928
5929 if (!Args.hasArg(options::OPT_nostdlib) &&
5930 !Args.hasArg(options::OPT_nostartfiles)) {
5931 if (!Args.hasArg(options::OPT_shared)) {
5932 CmdArgs.push_back(Args.MakeArgString(
5933 getToolChain().GetFilePath("crt1.o")));
5934 CmdArgs.push_back(Args.MakeArgString(
5935 getToolChain().GetFilePath("crti.o")));
5936 CmdArgs.push_back(Args.MakeArgString(
5937 getToolChain().GetFilePath("crtbegin.o")));
5938 } else {
5939 CmdArgs.push_back(Args.MakeArgString(
5940 getToolChain().GetFilePath("crti.o")));
5941 }
5942 CmdArgs.push_back(Args.MakeArgString(
5943 getToolChain().GetFilePath("crtn.o")));
5944 }
5945
5946 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5947 + getToolChain().getTripleString()
5948 + "/4.2.4"));
5949
5950 Args.AddAllArgs(CmdArgs, options::OPT_L);
5951 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5952 Args.AddAllArgs(CmdArgs, options::OPT_e);
5953
5954 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5955
5956 if (!Args.hasArg(options::OPT_nostdlib) &&
5957 !Args.hasArg(options::OPT_nodefaultlibs)) {
5958 // FIXME: For some reason GCC passes -lgcc before adding
5959 // the default system libraries. Just mimic this for now.
5960 CmdArgs.push_back("-lgcc");
5961
5962 if (Args.hasArg(options::OPT_pthread))
5963 CmdArgs.push_back("-pthread");
5964 if (!Args.hasArg(options::OPT_shared))
5965 CmdArgs.push_back("-lc");
5966 CmdArgs.push_back("-lgcc");
5967 }
5968
5969 if (!Args.hasArg(options::OPT_nostdlib) &&
5970 !Args.hasArg(options::OPT_nostartfiles)) {
5971 if (!Args.hasArg(options::OPT_shared))
5972 CmdArgs.push_back(Args.MakeArgString(
5973 getToolChain().GetFilePath("crtend.o")));
5974 }
5975
5976 addProfileRT(getToolChain(), Args, CmdArgs);
5977
5978 const char *Exec =
5979 Args.MakeArgString(getToolChain().GetLinkerPath());
5980 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5981 }
5982
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const5983 void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5984 const InputInfo &Output,
5985 const InputInfoList &Inputs,
5986 const ArgList &Args,
5987 const char *LinkingOutput) const {
5988 ArgStringList CmdArgs;
5989 bool NeedsKPIC = false;
5990
5991 switch (getToolChain().getArch()) {
5992 case llvm::Triple::x86:
5993 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5994 // instruct as in the base system to assemble 32-bit code.
5995 CmdArgs.push_back("--32");
5996 break;
5997
5998 case llvm::Triple::ppc:
5999 CmdArgs.push_back("-mppc");
6000 CmdArgs.push_back("-many");
6001 break;
6002
6003 case llvm::Triple::sparc:
6004 CmdArgs.push_back("-32");
6005 NeedsKPIC = true;
6006 break;
6007
6008 case llvm::Triple::sparcv9:
6009 CmdArgs.push_back("-64");
6010 CmdArgs.push_back("-Av9a");
6011 NeedsKPIC = true;
6012 break;
6013
6014 case llvm::Triple::mips64:
6015 case llvm::Triple::mips64el: {
6016 StringRef CPUName;
6017 StringRef ABIName;
6018 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6019
6020 CmdArgs.push_back("-mabi");
6021 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6022
6023 if (getToolChain().getArch() == llvm::Triple::mips64)
6024 CmdArgs.push_back("-EB");
6025 else
6026 CmdArgs.push_back("-EL");
6027
6028 NeedsKPIC = true;
6029 break;
6030 }
6031
6032 default:
6033 break;
6034 }
6035
6036 if (NeedsKPIC)
6037 addAssemblerKPIC(Args, CmdArgs);
6038
6039 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6040 options::OPT_Xassembler);
6041
6042 CmdArgs.push_back("-o");
6043 CmdArgs.push_back(Output.getFilename());
6044
6045 for (const auto &II : Inputs)
6046 CmdArgs.push_back(II.getFilename());
6047
6048 const char *Exec =
6049 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6050 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6051 }
6052
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6053 void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6054 const InputInfo &Output,
6055 const InputInfoList &Inputs,
6056 const ArgList &Args,
6057 const char *LinkingOutput) const {
6058 const Driver &D = getToolChain().getDriver();
6059 ArgStringList CmdArgs;
6060
6061 // Silence warning for "clang -g foo.o -o foo"
6062 Args.ClaimAllArgs(options::OPT_g_Group);
6063 // and "clang -emit-llvm foo.o -o foo"
6064 Args.ClaimAllArgs(options::OPT_emit_llvm);
6065 // and for "clang -w foo.o -o foo". Other warning options are already
6066 // handled somewhere else.
6067 Args.ClaimAllArgs(options::OPT_w);
6068
6069 if (getToolChain().getArch() == llvm::Triple::mips64)
6070 CmdArgs.push_back("-EB");
6071 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6072 CmdArgs.push_back("-EL");
6073
6074 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6075 (!Args.hasArg(options::OPT_shared))) {
6076 CmdArgs.push_back("-e");
6077 CmdArgs.push_back("__start");
6078 }
6079
6080 if (Args.hasArg(options::OPT_static)) {
6081 CmdArgs.push_back("-Bstatic");
6082 } else {
6083 if (Args.hasArg(options::OPT_rdynamic))
6084 CmdArgs.push_back("-export-dynamic");
6085 CmdArgs.push_back("--eh-frame-hdr");
6086 CmdArgs.push_back("-Bdynamic");
6087 if (Args.hasArg(options::OPT_shared)) {
6088 CmdArgs.push_back("-shared");
6089 } else {
6090 CmdArgs.push_back("-dynamic-linker");
6091 CmdArgs.push_back("/usr/libexec/ld.so");
6092 }
6093 }
6094
6095 if (Args.hasArg(options::OPT_nopie))
6096 CmdArgs.push_back("-nopie");
6097
6098 if (Output.isFilename()) {
6099 CmdArgs.push_back("-o");
6100 CmdArgs.push_back(Output.getFilename());
6101 } else {
6102 assert(Output.isNothing() && "Invalid output.");
6103 }
6104
6105 if (!Args.hasArg(options::OPT_nostdlib) &&
6106 !Args.hasArg(options::OPT_nostartfiles)) {
6107 if (!Args.hasArg(options::OPT_shared)) {
6108 if (Args.hasArg(options::OPT_pg))
6109 CmdArgs.push_back(Args.MakeArgString(
6110 getToolChain().GetFilePath("gcrt0.o")));
6111 else
6112 CmdArgs.push_back(Args.MakeArgString(
6113 getToolChain().GetFilePath("crt0.o")));
6114 CmdArgs.push_back(Args.MakeArgString(
6115 getToolChain().GetFilePath("crtbegin.o")));
6116 } else {
6117 CmdArgs.push_back(Args.MakeArgString(
6118 getToolChain().GetFilePath("crtbeginS.o")));
6119 }
6120 }
6121
6122 std::string Triple = getToolChain().getTripleString();
6123 if (Triple.substr(0, 6) == "x86_64")
6124 Triple.replace(0, 6, "amd64");
6125 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
6126 "/4.2.1"));
6127
6128 Args.AddAllArgs(CmdArgs, options::OPT_L);
6129 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6130 Args.AddAllArgs(CmdArgs, options::OPT_e);
6131 Args.AddAllArgs(CmdArgs, options::OPT_s);
6132 Args.AddAllArgs(CmdArgs, options::OPT_t);
6133 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6134 Args.AddAllArgs(CmdArgs, options::OPT_r);
6135
6136 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6137
6138 if (!Args.hasArg(options::OPT_nostdlib) &&
6139 !Args.hasArg(options::OPT_nodefaultlibs)) {
6140 if (D.CCCIsCXX()) {
6141 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6142 if (Args.hasArg(options::OPT_pg))
6143 CmdArgs.push_back("-lm_p");
6144 else
6145 CmdArgs.push_back("-lm");
6146 }
6147
6148 // FIXME: For some reason GCC passes -lgcc before adding
6149 // the default system libraries. Just mimic this for now.
6150 CmdArgs.push_back("-lgcc");
6151
6152 if (Args.hasArg(options::OPT_pthread)) {
6153 if (!Args.hasArg(options::OPT_shared) &&
6154 Args.hasArg(options::OPT_pg))
6155 CmdArgs.push_back("-lpthread_p");
6156 else
6157 CmdArgs.push_back("-lpthread");
6158 }
6159
6160 if (!Args.hasArg(options::OPT_shared)) {
6161 if (Args.hasArg(options::OPT_pg))
6162 CmdArgs.push_back("-lc_p");
6163 else
6164 CmdArgs.push_back("-lc");
6165 }
6166
6167 CmdArgs.push_back("-lgcc");
6168 }
6169
6170 if (!Args.hasArg(options::OPT_nostdlib) &&
6171 !Args.hasArg(options::OPT_nostartfiles)) {
6172 if (!Args.hasArg(options::OPT_shared))
6173 CmdArgs.push_back(Args.MakeArgString(
6174 getToolChain().GetFilePath("crtend.o")));
6175 else
6176 CmdArgs.push_back(Args.MakeArgString(
6177 getToolChain().GetFilePath("crtendS.o")));
6178 }
6179
6180 const char *Exec =
6181 Args.MakeArgString(getToolChain().GetLinkerPath());
6182 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6183 }
6184
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6185 void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6186 const InputInfo &Output,
6187 const InputInfoList &Inputs,
6188 const ArgList &Args,
6189 const char *LinkingOutput) const {
6190 ArgStringList CmdArgs;
6191
6192 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6193 options::OPT_Xassembler);
6194
6195 CmdArgs.push_back("-o");
6196 CmdArgs.push_back(Output.getFilename());
6197
6198 for (const auto &II : Inputs)
6199 CmdArgs.push_back(II.getFilename());
6200
6201 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6202 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6203 }
6204
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6205 void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6206 const InputInfo &Output,
6207 const InputInfoList &Inputs,
6208 const ArgList &Args,
6209 const char *LinkingOutput) const {
6210 const Driver &D = getToolChain().getDriver();
6211 ArgStringList CmdArgs;
6212
6213 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6214 (!Args.hasArg(options::OPT_shared))) {
6215 CmdArgs.push_back("-e");
6216 CmdArgs.push_back("__start");
6217 }
6218
6219 if (Args.hasArg(options::OPT_static)) {
6220 CmdArgs.push_back("-Bstatic");
6221 } else {
6222 if (Args.hasArg(options::OPT_rdynamic))
6223 CmdArgs.push_back("-export-dynamic");
6224 CmdArgs.push_back("--eh-frame-hdr");
6225 CmdArgs.push_back("-Bdynamic");
6226 if (Args.hasArg(options::OPT_shared)) {
6227 CmdArgs.push_back("-shared");
6228 } else {
6229 CmdArgs.push_back("-dynamic-linker");
6230 CmdArgs.push_back("/usr/libexec/ld.so");
6231 }
6232 }
6233
6234 if (Output.isFilename()) {
6235 CmdArgs.push_back("-o");
6236 CmdArgs.push_back(Output.getFilename());
6237 } else {
6238 assert(Output.isNothing() && "Invalid output.");
6239 }
6240
6241 if (!Args.hasArg(options::OPT_nostdlib) &&
6242 !Args.hasArg(options::OPT_nostartfiles)) {
6243 if (!Args.hasArg(options::OPT_shared)) {
6244 if (Args.hasArg(options::OPT_pg))
6245 CmdArgs.push_back(Args.MakeArgString(
6246 getToolChain().GetFilePath("gcrt0.o")));
6247 else
6248 CmdArgs.push_back(Args.MakeArgString(
6249 getToolChain().GetFilePath("crt0.o")));
6250 CmdArgs.push_back(Args.MakeArgString(
6251 getToolChain().GetFilePath("crtbegin.o")));
6252 } else {
6253 CmdArgs.push_back(Args.MakeArgString(
6254 getToolChain().GetFilePath("crtbeginS.o")));
6255 }
6256 }
6257
6258 Args.AddAllArgs(CmdArgs, options::OPT_L);
6259 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6260 Args.AddAllArgs(CmdArgs, options::OPT_e);
6261
6262 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6263
6264 if (!Args.hasArg(options::OPT_nostdlib) &&
6265 !Args.hasArg(options::OPT_nodefaultlibs)) {
6266 if (D.CCCIsCXX()) {
6267 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6268 if (Args.hasArg(options::OPT_pg))
6269 CmdArgs.push_back("-lm_p");
6270 else
6271 CmdArgs.push_back("-lm");
6272 }
6273
6274 if (Args.hasArg(options::OPT_pthread)) {
6275 if (!Args.hasArg(options::OPT_shared) &&
6276 Args.hasArg(options::OPT_pg))
6277 CmdArgs.push_back("-lpthread_p");
6278 else
6279 CmdArgs.push_back("-lpthread");
6280 }
6281
6282 if (!Args.hasArg(options::OPT_shared)) {
6283 if (Args.hasArg(options::OPT_pg))
6284 CmdArgs.push_back("-lc_p");
6285 else
6286 CmdArgs.push_back("-lc");
6287 }
6288
6289 StringRef MyArch;
6290 switch (getToolChain().getTriple().getArch()) {
6291 case llvm::Triple::arm:
6292 MyArch = "arm";
6293 break;
6294 case llvm::Triple::x86:
6295 MyArch = "i386";
6296 break;
6297 case llvm::Triple::x86_64:
6298 MyArch = "amd64";
6299 break;
6300 default:
6301 llvm_unreachable("Unsupported architecture");
6302 }
6303 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
6304 }
6305
6306 if (!Args.hasArg(options::OPT_nostdlib) &&
6307 !Args.hasArg(options::OPT_nostartfiles)) {
6308 if (!Args.hasArg(options::OPT_shared))
6309 CmdArgs.push_back(Args.MakeArgString(
6310 getToolChain().GetFilePath("crtend.o")));
6311 else
6312 CmdArgs.push_back(Args.MakeArgString(
6313 getToolChain().GetFilePath("crtendS.o")));
6314 }
6315
6316 const char *Exec =
6317 Args.MakeArgString(getToolChain().GetLinkerPath());
6318 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6319 }
6320
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6321 void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6322 const InputInfo &Output,
6323 const InputInfoList &Inputs,
6324 const ArgList &Args,
6325 const char *LinkingOutput) const {
6326 ArgStringList CmdArgs;
6327
6328 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6329 // instruct as in the base system to assemble 32-bit code.
6330 if (getToolChain().getArch() == llvm::Triple::x86)
6331 CmdArgs.push_back("--32");
6332 else if (getToolChain().getArch() == llvm::Triple::ppc)
6333 CmdArgs.push_back("-a32");
6334 else if (getToolChain().getArch() == llvm::Triple::mips ||
6335 getToolChain().getArch() == llvm::Triple::mipsel ||
6336 getToolChain().getArch() == llvm::Triple::mips64 ||
6337 getToolChain().getArch() == llvm::Triple::mips64el) {
6338 StringRef CPUName;
6339 StringRef ABIName;
6340 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6341
6342 CmdArgs.push_back("-march");
6343 CmdArgs.push_back(CPUName.data());
6344
6345 CmdArgs.push_back("-mabi");
6346 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6347
6348 if (getToolChain().getArch() == llvm::Triple::mips ||
6349 getToolChain().getArch() == llvm::Triple::mips64)
6350 CmdArgs.push_back("-EB");
6351 else
6352 CmdArgs.push_back("-EL");
6353
6354 addAssemblerKPIC(Args, CmdArgs);
6355 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6356 getToolChain().getArch() == llvm::Triple::armeb ||
6357 getToolChain().getArch() == llvm::Triple::thumb ||
6358 getToolChain().getArch() == llvm::Triple::thumbeb) {
6359 const Driver &D = getToolChain().getDriver();
6360 const llvm::Triple &Triple = getToolChain().getTriple();
6361 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6362
6363 if (FloatABI == "hard") {
6364 CmdArgs.push_back("-mfpu=vfp");
6365 } else {
6366 CmdArgs.push_back("-mfpu=softvfp");
6367 }
6368
6369 switch(getToolChain().getTriple().getEnvironment()) {
6370 case llvm::Triple::GNUEABIHF:
6371 case llvm::Triple::GNUEABI:
6372 case llvm::Triple::EABI:
6373 CmdArgs.push_back("-meabi=5");
6374 break;
6375
6376 default:
6377 CmdArgs.push_back("-matpcs");
6378 }
6379 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
6380 getToolChain().getArch() == llvm::Triple::sparcv9) {
6381 if (getToolChain().getArch() == llvm::Triple::sparc)
6382 CmdArgs.push_back("-Av8plusa");
6383 else
6384 CmdArgs.push_back("-Av9a");
6385
6386 addAssemblerKPIC(Args, CmdArgs);
6387 }
6388
6389 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6390 options::OPT_Xassembler);
6391
6392 CmdArgs.push_back("-o");
6393 CmdArgs.push_back(Output.getFilename());
6394
6395 for (const auto &II : Inputs)
6396 CmdArgs.push_back(II.getFilename());
6397
6398 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6399 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6400 }
6401
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6402 void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6403 const InputInfo &Output,
6404 const InputInfoList &Inputs,
6405 const ArgList &Args,
6406 const char *LinkingOutput) const {
6407 const toolchains::FreeBSD& ToolChain =
6408 static_cast<const toolchains::FreeBSD&>(getToolChain());
6409 const Driver &D = ToolChain.getDriver();
6410 const bool IsPIE =
6411 !Args.hasArg(options::OPT_shared) &&
6412 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
6413 ArgStringList CmdArgs;
6414
6415 // Silence warning for "clang -g foo.o -o foo"
6416 Args.ClaimAllArgs(options::OPT_g_Group);
6417 // and "clang -emit-llvm foo.o -o foo"
6418 Args.ClaimAllArgs(options::OPT_emit_llvm);
6419 // and for "clang -w foo.o -o foo". Other warning options are already
6420 // handled somewhere else.
6421 Args.ClaimAllArgs(options::OPT_w);
6422
6423 if (!D.SysRoot.empty())
6424 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6425
6426 if (IsPIE)
6427 CmdArgs.push_back("-pie");
6428
6429 if (Args.hasArg(options::OPT_static)) {
6430 CmdArgs.push_back("-Bstatic");
6431 } else {
6432 if (Args.hasArg(options::OPT_rdynamic))
6433 CmdArgs.push_back("-export-dynamic");
6434 CmdArgs.push_back("--eh-frame-hdr");
6435 if (Args.hasArg(options::OPT_shared)) {
6436 CmdArgs.push_back("-Bshareable");
6437 } else {
6438 CmdArgs.push_back("-dynamic-linker");
6439 CmdArgs.push_back("/libexec/ld-elf.so.1");
6440 }
6441 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6442 llvm::Triple::ArchType Arch = ToolChain.getArch();
6443 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6444 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6445 CmdArgs.push_back("--hash-style=both");
6446 }
6447 }
6448 CmdArgs.push_back("--enable-new-dtags");
6449 }
6450
6451 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6452 // instruct ld in the base system to link 32-bit code.
6453 if (ToolChain.getArch() == llvm::Triple::x86) {
6454 CmdArgs.push_back("-m");
6455 CmdArgs.push_back("elf_i386_fbsd");
6456 }
6457
6458 if (ToolChain.getArch() == llvm::Triple::ppc) {
6459 CmdArgs.push_back("-m");
6460 CmdArgs.push_back("elf32ppc_fbsd");
6461 }
6462
6463 if (Output.isFilename()) {
6464 CmdArgs.push_back("-o");
6465 CmdArgs.push_back(Output.getFilename());
6466 } else {
6467 assert(Output.isNothing() && "Invalid output.");
6468 }
6469
6470 if (!Args.hasArg(options::OPT_nostdlib) &&
6471 !Args.hasArg(options::OPT_nostartfiles)) {
6472 const char *crt1 = nullptr;
6473 if (!Args.hasArg(options::OPT_shared)) {
6474 if (Args.hasArg(options::OPT_pg))
6475 crt1 = "gcrt1.o";
6476 else if (IsPIE)
6477 crt1 = "Scrt1.o";
6478 else
6479 crt1 = "crt1.o";
6480 }
6481 if (crt1)
6482 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6483
6484 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6485
6486 const char *crtbegin = nullptr;
6487 if (Args.hasArg(options::OPT_static))
6488 crtbegin = "crtbeginT.o";
6489 else if (Args.hasArg(options::OPT_shared) || IsPIE)
6490 crtbegin = "crtbeginS.o";
6491 else
6492 crtbegin = "crtbegin.o";
6493
6494 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
6495 }
6496
6497 Args.AddAllArgs(CmdArgs, options::OPT_L);
6498 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6499 for (const auto &Path : Paths)
6500 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
6501 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6502 Args.AddAllArgs(CmdArgs, options::OPT_e);
6503 Args.AddAllArgs(CmdArgs, options::OPT_s);
6504 Args.AddAllArgs(CmdArgs, options::OPT_t);
6505 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6506 Args.AddAllArgs(CmdArgs, options::OPT_r);
6507
6508 if (D.IsUsingLTO(Args))
6509 AddGoldPlugin(ToolChain, Args, CmdArgs);
6510
6511 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6512
6513 if (!Args.hasArg(options::OPT_nostdlib) &&
6514 !Args.hasArg(options::OPT_nodefaultlibs)) {
6515 if (D.CCCIsCXX()) {
6516 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6517 if (Args.hasArg(options::OPT_pg))
6518 CmdArgs.push_back("-lm_p");
6519 else
6520 CmdArgs.push_back("-lm");
6521 }
6522 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6523 // the default system libraries. Just mimic this for now.
6524 if (Args.hasArg(options::OPT_pg))
6525 CmdArgs.push_back("-lgcc_p");
6526 else
6527 CmdArgs.push_back("-lgcc");
6528 if (Args.hasArg(options::OPT_static)) {
6529 CmdArgs.push_back("-lgcc_eh");
6530 } else if (Args.hasArg(options::OPT_pg)) {
6531 CmdArgs.push_back("-lgcc_eh_p");
6532 } else {
6533 CmdArgs.push_back("--as-needed");
6534 CmdArgs.push_back("-lgcc_s");
6535 CmdArgs.push_back("--no-as-needed");
6536 }
6537
6538 if (Args.hasArg(options::OPT_pthread)) {
6539 if (Args.hasArg(options::OPT_pg))
6540 CmdArgs.push_back("-lpthread_p");
6541 else
6542 CmdArgs.push_back("-lpthread");
6543 }
6544
6545 if (Args.hasArg(options::OPT_pg)) {
6546 if (Args.hasArg(options::OPT_shared))
6547 CmdArgs.push_back("-lc");
6548 else
6549 CmdArgs.push_back("-lc_p");
6550 CmdArgs.push_back("-lgcc_p");
6551 } else {
6552 CmdArgs.push_back("-lc");
6553 CmdArgs.push_back("-lgcc");
6554 }
6555
6556 if (Args.hasArg(options::OPT_static)) {
6557 CmdArgs.push_back("-lgcc_eh");
6558 } else if (Args.hasArg(options::OPT_pg)) {
6559 CmdArgs.push_back("-lgcc_eh_p");
6560 } else {
6561 CmdArgs.push_back("--as-needed");
6562 CmdArgs.push_back("-lgcc_s");
6563 CmdArgs.push_back("--no-as-needed");
6564 }
6565 }
6566
6567 if (!Args.hasArg(options::OPT_nostdlib) &&
6568 !Args.hasArg(options::OPT_nostartfiles)) {
6569 if (Args.hasArg(options::OPT_shared) || IsPIE)
6570 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
6571 else
6572 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6573 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6574 }
6575
6576 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6577
6578 addProfileRT(ToolChain, Args, CmdArgs);
6579
6580 const char *Exec =
6581 Args.MakeArgString(getToolChain().GetLinkerPath());
6582 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6583 }
6584
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6585 void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6586 const InputInfo &Output,
6587 const InputInfoList &Inputs,
6588 const ArgList &Args,
6589 const char *LinkingOutput) const {
6590 ArgStringList CmdArgs;
6591
6592 // GNU as needs different flags for creating the correct output format
6593 // on architectures with different ABIs or optional feature sets.
6594 switch (getToolChain().getArch()) {
6595 case llvm::Triple::x86:
6596 CmdArgs.push_back("--32");
6597 break;
6598 case llvm::Triple::arm:
6599 case llvm::Triple::armeb:
6600 case llvm::Triple::thumb:
6601 case llvm::Triple::thumbeb: {
6602 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
6603 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
6604 break;
6605 }
6606
6607 case llvm::Triple::mips:
6608 case llvm::Triple::mipsel:
6609 case llvm::Triple::mips64:
6610 case llvm::Triple::mips64el: {
6611 StringRef CPUName;
6612 StringRef ABIName;
6613 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6614
6615 CmdArgs.push_back("-march");
6616 CmdArgs.push_back(CPUName.data());
6617
6618 CmdArgs.push_back("-mabi");
6619 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6620
6621 if (getToolChain().getArch() == llvm::Triple::mips ||
6622 getToolChain().getArch() == llvm::Triple::mips64)
6623 CmdArgs.push_back("-EB");
6624 else
6625 CmdArgs.push_back("-EL");
6626
6627 addAssemblerKPIC(Args, CmdArgs);
6628 break;
6629 }
6630
6631 case llvm::Triple::sparc:
6632 CmdArgs.push_back("-32");
6633 addAssemblerKPIC(Args, CmdArgs);
6634 break;
6635
6636 case llvm::Triple::sparcv9:
6637 CmdArgs.push_back("-64");
6638 CmdArgs.push_back("-Av9");
6639 addAssemblerKPIC(Args, CmdArgs);
6640 break;
6641
6642 default:
6643 break;
6644 }
6645
6646 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6647 options::OPT_Xassembler);
6648
6649 CmdArgs.push_back("-o");
6650 CmdArgs.push_back(Output.getFilename());
6651
6652 for (const auto &II : Inputs)
6653 CmdArgs.push_back(II.getFilename());
6654
6655 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
6656 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6657 }
6658
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6659 void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6660 const InputInfo &Output,
6661 const InputInfoList &Inputs,
6662 const ArgList &Args,
6663 const char *LinkingOutput) const {
6664 const Driver &D = getToolChain().getDriver();
6665 ArgStringList CmdArgs;
6666
6667 if (!D.SysRoot.empty())
6668 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6669
6670 CmdArgs.push_back("--eh-frame-hdr");
6671 if (Args.hasArg(options::OPT_static)) {
6672 CmdArgs.push_back("-Bstatic");
6673 } else {
6674 if (Args.hasArg(options::OPT_rdynamic))
6675 CmdArgs.push_back("-export-dynamic");
6676 if (Args.hasArg(options::OPT_shared)) {
6677 CmdArgs.push_back("-Bshareable");
6678 } else {
6679 CmdArgs.push_back("-dynamic-linker");
6680 CmdArgs.push_back("/libexec/ld.elf_so");
6681 }
6682 }
6683
6684 // Many NetBSD architectures support more than one ABI.
6685 // Determine the correct emulation for ld.
6686 switch (getToolChain().getArch()) {
6687 case llvm::Triple::x86:
6688 CmdArgs.push_back("-m");
6689 CmdArgs.push_back("elf_i386");
6690 break;
6691 case llvm::Triple::arm:
6692 case llvm::Triple::armeb:
6693 case llvm::Triple::thumb:
6694 case llvm::Triple::thumbeb:
6695 CmdArgs.push_back("-m");
6696 switch (getToolChain().getTriple().getEnvironment()) {
6697 case llvm::Triple::EABI:
6698 case llvm::Triple::GNUEABI:
6699 CmdArgs.push_back("armelf_nbsd_eabi");
6700 break;
6701 case llvm::Triple::EABIHF:
6702 case llvm::Triple::GNUEABIHF:
6703 CmdArgs.push_back("armelf_nbsd_eabihf");
6704 break;
6705 default:
6706 CmdArgs.push_back("armelf_nbsd");
6707 break;
6708 }
6709 break;
6710 case llvm::Triple::mips64:
6711 case llvm::Triple::mips64el:
6712 if (mips::hasMipsAbiArg(Args, "32")) {
6713 CmdArgs.push_back("-m");
6714 if (getToolChain().getArch() == llvm::Triple::mips64)
6715 CmdArgs.push_back("elf32btsmip");
6716 else
6717 CmdArgs.push_back("elf32ltsmip");
6718 } else if (mips::hasMipsAbiArg(Args, "64")) {
6719 CmdArgs.push_back("-m");
6720 if (getToolChain().getArch() == llvm::Triple::mips64)
6721 CmdArgs.push_back("elf64btsmip");
6722 else
6723 CmdArgs.push_back("elf64ltsmip");
6724 }
6725 break;
6726
6727 case llvm::Triple::sparc:
6728 CmdArgs.push_back("-m");
6729 CmdArgs.push_back("elf32_sparc");
6730 break;
6731
6732 case llvm::Triple::sparcv9:
6733 CmdArgs.push_back("-m");
6734 CmdArgs.push_back("elf64_sparc");
6735 break;
6736
6737 default:
6738 break;
6739 }
6740
6741 if (Output.isFilename()) {
6742 CmdArgs.push_back("-o");
6743 CmdArgs.push_back(Output.getFilename());
6744 } else {
6745 assert(Output.isNothing() && "Invalid output.");
6746 }
6747
6748 if (!Args.hasArg(options::OPT_nostdlib) &&
6749 !Args.hasArg(options::OPT_nostartfiles)) {
6750 if (!Args.hasArg(options::OPT_shared)) {
6751 CmdArgs.push_back(Args.MakeArgString(
6752 getToolChain().GetFilePath("crt0.o")));
6753 CmdArgs.push_back(Args.MakeArgString(
6754 getToolChain().GetFilePath("crti.o")));
6755 CmdArgs.push_back(Args.MakeArgString(
6756 getToolChain().GetFilePath("crtbegin.o")));
6757 } else {
6758 CmdArgs.push_back(Args.MakeArgString(
6759 getToolChain().GetFilePath("crti.o")));
6760 CmdArgs.push_back(Args.MakeArgString(
6761 getToolChain().GetFilePath("crtbeginS.o")));
6762 }
6763 }
6764
6765 Args.AddAllArgs(CmdArgs, options::OPT_L);
6766 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6767 Args.AddAllArgs(CmdArgs, options::OPT_e);
6768 Args.AddAllArgs(CmdArgs, options::OPT_s);
6769 Args.AddAllArgs(CmdArgs, options::OPT_t);
6770 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6771 Args.AddAllArgs(CmdArgs, options::OPT_r);
6772
6773 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6774
6775 unsigned Major, Minor, Micro;
6776 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6777 bool useLibgcc = true;
6778 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 40) || Major == 0) {
6779 switch(getToolChain().getArch()) {
6780 case llvm::Triple::arm:
6781 case llvm::Triple::armeb:
6782 case llvm::Triple::thumb:
6783 case llvm::Triple::thumbeb:
6784 case llvm::Triple::x86:
6785 case llvm::Triple::x86_64:
6786 useLibgcc = false;
6787 break;
6788 default:
6789 break;
6790 }
6791 }
6792
6793 if (!Args.hasArg(options::OPT_nostdlib) &&
6794 !Args.hasArg(options::OPT_nodefaultlibs)) {
6795 if (D.CCCIsCXX()) {
6796 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6797 CmdArgs.push_back("-lm");
6798 }
6799 if (Args.hasArg(options::OPT_pthread))
6800 CmdArgs.push_back("-lpthread");
6801 CmdArgs.push_back("-lc");
6802
6803 if (useLibgcc) {
6804 if (Args.hasArg(options::OPT_static)) {
6805 // libgcc_eh depends on libc, so resolve as much as possible,
6806 // pull in any new requirements from libc and then get the rest
6807 // of libgcc.
6808 CmdArgs.push_back("-lgcc_eh");
6809 CmdArgs.push_back("-lc");
6810 CmdArgs.push_back("-lgcc");
6811 } else {
6812 CmdArgs.push_back("-lgcc");
6813 CmdArgs.push_back("--as-needed");
6814 CmdArgs.push_back("-lgcc_s");
6815 CmdArgs.push_back("--no-as-needed");
6816 }
6817 }
6818 }
6819
6820 if (!Args.hasArg(options::OPT_nostdlib) &&
6821 !Args.hasArg(options::OPT_nostartfiles)) {
6822 if (!Args.hasArg(options::OPT_shared))
6823 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6824 "crtend.o")));
6825 else
6826 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6827 "crtendS.o")));
6828 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6829 "crtn.o")));
6830 }
6831
6832 addProfileRT(getToolChain(), Args, CmdArgs);
6833
6834 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
6835 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6836 }
6837
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const6838 void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6839 const InputInfo &Output,
6840 const InputInfoList &Inputs,
6841 const ArgList &Args,
6842 const char *LinkingOutput) const {
6843 ArgStringList CmdArgs;
6844 bool NeedsKPIC = false;
6845
6846 // Add --32/--64 to make sure we get the format we want.
6847 // This is incomplete
6848 if (getToolChain().getArch() == llvm::Triple::x86) {
6849 CmdArgs.push_back("--32");
6850 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6851 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
6852 CmdArgs.push_back("--x32");
6853 else
6854 CmdArgs.push_back("--64");
6855 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6856 CmdArgs.push_back("-a32");
6857 CmdArgs.push_back("-mppc");
6858 CmdArgs.push_back("-many");
6859 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6860 CmdArgs.push_back("-a64");
6861 CmdArgs.push_back("-mppc64");
6862 CmdArgs.push_back("-many");
6863 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6864 CmdArgs.push_back("-a64");
6865 CmdArgs.push_back("-mppc64");
6866 CmdArgs.push_back("-many");
6867 CmdArgs.push_back("-mlittle-endian");
6868 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6869 CmdArgs.push_back("-32");
6870 CmdArgs.push_back("-Av8plusa");
6871 NeedsKPIC = true;
6872 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6873 CmdArgs.push_back("-64");
6874 CmdArgs.push_back("-Av9a");
6875 NeedsKPIC = true;
6876 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6877 getToolChain().getArch() == llvm::Triple::armeb) {
6878 StringRef MArch = getToolChain().getArchName();
6879 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6880 CmdArgs.push_back("-mfpu=neon");
6881 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6882 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
6883 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
6884
6885 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6886 getToolChain().getDriver(), Args, getToolChain().getTriple());
6887 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
6888
6889 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
6890
6891 // FIXME: remove krait check when GNU tools support krait cpu
6892 // for now replace it with -march=armv7-a to avoid a lower
6893 // march from being picked in the absence of a cpu flag.
6894 Arg *A;
6895 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6896 StringRef(A->getValue()) == "krait")
6897 CmdArgs.push_back("-march=armv7-a");
6898 else
6899 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
6900 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
6901 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6902 getToolChain().getArch() == llvm::Triple::mipsel ||
6903 getToolChain().getArch() == llvm::Triple::mips64 ||
6904 getToolChain().getArch() == llvm::Triple::mips64el) {
6905 StringRef CPUName;
6906 StringRef ABIName;
6907 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6908
6909 CmdArgs.push_back("-march");
6910 CmdArgs.push_back(CPUName.data());
6911
6912 CmdArgs.push_back("-mabi");
6913 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6914
6915 if (getToolChain().getArch() == llvm::Triple::mips ||
6916 getToolChain().getArch() == llvm::Triple::mips64)
6917 CmdArgs.push_back("-EB");
6918 else
6919 CmdArgs.push_back("-EL");
6920
6921 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6922 if (StringRef(A->getValue()) == "2008")
6923 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6924 }
6925
6926 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
6927 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6928 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6929 options::OPT_mno_micromips);
6930 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6931 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6932
6933 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6934 // Do not use AddLastArg because not all versions of MIPS assembler
6935 // support -mmsa / -mno-msa options.
6936 if (A->getOption().matches(options::OPT_mmsa))
6937 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6938 }
6939
6940 NeedsKPIC = true;
6941 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6942 // Always pass an -march option, since our default of z10 is later
6943 // than the GNU assembler's default.
6944 StringRef CPUName = getSystemZTargetCPU(Args);
6945 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6946 }
6947
6948 if (NeedsKPIC)
6949 addAssemblerKPIC(Args, CmdArgs);
6950
6951 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6952 options::OPT_Xassembler);
6953
6954 CmdArgs.push_back("-o");
6955 CmdArgs.push_back(Output.getFilename());
6956
6957 for (const auto &II : Inputs)
6958 CmdArgs.push_back(II.getFilename());
6959
6960 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
6961 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6962
6963 // Handle the debug info splitting at object creation time if we're
6964 // creating an object.
6965 // TODO: Currently only works on linux with newer objcopy.
6966 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
6967 getToolChain().getTriple().isOSLinux())
6968 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6969 SplitDebugName(Args, Inputs));
6970 }
6971
AddLibgcc(const llvm::Triple & Triple,const Driver & D,ArgStringList & CmdArgs,const ArgList & Args)6972 static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
6973 ArgStringList &CmdArgs, const ArgList &Args) {
6974 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
6975 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6976 Args.hasArg(options::OPT_static);
6977 if (!D.CCCIsCXX())
6978 CmdArgs.push_back("-lgcc");
6979
6980 if (StaticLibgcc || isAndroid) {
6981 if (D.CCCIsCXX())
6982 CmdArgs.push_back("-lgcc");
6983 } else {
6984 if (!D.CCCIsCXX())
6985 CmdArgs.push_back("--as-needed");
6986 CmdArgs.push_back("-lgcc_s");
6987 if (!D.CCCIsCXX())
6988 CmdArgs.push_back("--no-as-needed");
6989 }
6990
6991 if (StaticLibgcc && !isAndroid)
6992 CmdArgs.push_back("-lgcc_eh");
6993 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
6994 CmdArgs.push_back("-lgcc");
6995
6996 // According to Android ABI, we have to link with libdl if we are
6997 // linking with non-static libgcc.
6998 //
6999 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7000 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7001 if (isAndroid && !StaticLibgcc)
7002 CmdArgs.push_back("-ldl");
7003 }
7004
getLinuxDynamicLinker(const ArgList & Args,const toolchains::Linux & ToolChain)7005 static StringRef getLinuxDynamicLinker(const ArgList &Args,
7006 const toolchains::Linux &ToolChain) {
7007 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7008 if (ToolChain.getTriple().isArch64Bit())
7009 return "/system/bin/linker64";
7010 else
7011 return "/system/bin/linker";
7012 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7013 ToolChain.getArch() == llvm::Triple::sparc)
7014 return "/lib/ld-linux.so.2";
7015 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7016 ToolChain.getArch() == llvm::Triple::arm64)
7017 return "/lib/ld-linux-aarch64.so.1";
7018 else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7019 ToolChain.getArch() == llvm::Triple::arm64_be)
7020 return "/lib/ld-linux-aarch64_be.so.1";
7021 else if (ToolChain.getArch() == llvm::Triple::arm ||
7022 ToolChain.getArch() == llvm::Triple::thumb) {
7023 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7024 return "/lib/ld-linux-armhf.so.3";
7025 else
7026 return "/lib/ld-linux.so.3";
7027 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7028 ToolChain.getArch() == llvm::Triple::thumbeb) {
7029 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7030 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7031 else
7032 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
7033 } else if (ToolChain.getArch() == llvm::Triple::mips ||
7034 ToolChain.getArch() == llvm::Triple::mipsel) {
7035 if (mips::isNaN2008(Args, ToolChain.getTriple()))
7036 return "/lib/ld-linux-mipsn8.so.1";
7037 return "/lib/ld.so.1";
7038 } else if (ToolChain.getArch() == llvm::Triple::mips64 ||
7039 ToolChain.getArch() == llvm::Triple::mips64el) {
7040 if (mips::hasMipsAbiArg(Args, "n32"))
7041 return mips::isNaN2008(Args, ToolChain.getTriple())
7042 ? "/lib32/ld-linux-mipsn8.so.1" : "/lib32/ld.so.1";
7043 return mips::isNaN2008(Args, ToolChain.getTriple())
7044 ? "/lib64/ld-linux-mipsn8.so.1" : "/lib64/ld.so.1";
7045 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7046 return "/lib/ld.so.1";
7047 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7048 ToolChain.getArch() == llvm::Triple::systemz)
7049 return "/lib64/ld64.so.1";
7050 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7051 return "/lib64/ld64.so.2";
7052 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7053 return "/lib64/ld-linux.so.2";
7054 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7055 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7056 return "/libx32/ld-linux-x32.so.2";
7057 else
7058 return "/lib64/ld-linux-x86-64.so.2";
7059 }
7060
AddRunTimeLibs(const ToolChain & TC,const Driver & D,ArgStringList & CmdArgs,const ArgList & Args)7061 static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
7062 ArgStringList &CmdArgs, const ArgList &Args) {
7063 // Make use of compiler-rt if --rtlib option is used
7064 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7065
7066 switch(RLT) {
7067 case ToolChain::RLT_CompilerRT:
7068 addClangRTLinux(TC, Args, CmdArgs);
7069 break;
7070 case ToolChain::RLT_Libgcc:
7071 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7072 break;
7073 }
7074 }
7075
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7076 void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7077 const InputInfo &Output,
7078 const InputInfoList &Inputs,
7079 const ArgList &Args,
7080 const char *LinkingOutput) const {
7081 const toolchains::Linux& ToolChain =
7082 static_cast<const toolchains::Linux&>(getToolChain());
7083 const Driver &D = ToolChain.getDriver();
7084 const bool isAndroid =
7085 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
7086 const bool IsPIE =
7087 !Args.hasArg(options::OPT_shared) &&
7088 !Args.hasArg(options::OPT_static) &&
7089 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7090 // On Android every code is PIC so every executable is PIE
7091 // Cannot use isPIEDefault here since otherwise
7092 // PIE only logic will be enabled during compilation
7093 isAndroid);
7094
7095 ArgStringList CmdArgs;
7096
7097 // Silence warning for "clang -g foo.o -o foo"
7098 Args.ClaimAllArgs(options::OPT_g_Group);
7099 // and "clang -emit-llvm foo.o -o foo"
7100 Args.ClaimAllArgs(options::OPT_emit_llvm);
7101 // and for "clang -w foo.o -o foo". Other warning options are already
7102 // handled somewhere else.
7103 Args.ClaimAllArgs(options::OPT_w);
7104
7105 if (!D.SysRoot.empty())
7106 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7107
7108 if (IsPIE)
7109 CmdArgs.push_back("-pie");
7110
7111 if (Args.hasArg(options::OPT_rdynamic))
7112 CmdArgs.push_back("-export-dynamic");
7113
7114 if (Args.hasArg(options::OPT_s))
7115 CmdArgs.push_back("-s");
7116
7117 for (const auto &Opt : ToolChain.ExtraOpts)
7118 CmdArgs.push_back(Opt.c_str());
7119
7120 if (!Args.hasArg(options::OPT_static)) {
7121 CmdArgs.push_back("--eh-frame-hdr");
7122 }
7123
7124 CmdArgs.push_back("-m");
7125 if (ToolChain.getArch() == llvm::Triple::x86)
7126 CmdArgs.push_back("elf_i386");
7127 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7128 ToolChain.getArch() == llvm::Triple::arm64)
7129 CmdArgs.push_back("aarch64linux");
7130 else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7131 ToolChain.getArch() == llvm::Triple::arm64_be)
7132 CmdArgs.push_back("aarch64_be_linux");
7133 else if (ToolChain.getArch() == llvm::Triple::arm
7134 || ToolChain.getArch() == llvm::Triple::thumb)
7135 CmdArgs.push_back("armelf_linux_eabi");
7136 else if (ToolChain.getArch() == llvm::Triple::armeb
7137 || ToolChain.getArch() == llvm::Triple::thumbeb)
7138 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
7139 else if (ToolChain.getArch() == llvm::Triple::ppc)
7140 CmdArgs.push_back("elf32ppclinux");
7141 else if (ToolChain.getArch() == llvm::Triple::ppc64)
7142 CmdArgs.push_back("elf64ppc");
7143 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7144 CmdArgs.push_back("elf64lppc");
7145 else if (ToolChain.getArch() == llvm::Triple::sparc)
7146 CmdArgs.push_back("elf32_sparc");
7147 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7148 CmdArgs.push_back("elf64_sparc");
7149 else if (ToolChain.getArch() == llvm::Triple::mips)
7150 CmdArgs.push_back("elf32btsmip");
7151 else if (ToolChain.getArch() == llvm::Triple::mipsel)
7152 CmdArgs.push_back("elf32ltsmip");
7153 else if (ToolChain.getArch() == llvm::Triple::mips64) {
7154 if (mips::hasMipsAbiArg(Args, "n32"))
7155 CmdArgs.push_back("elf32btsmipn32");
7156 else
7157 CmdArgs.push_back("elf64btsmip");
7158 }
7159 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
7160 if (mips::hasMipsAbiArg(Args, "n32"))
7161 CmdArgs.push_back("elf32ltsmipn32");
7162 else
7163 CmdArgs.push_back("elf64ltsmip");
7164 }
7165 else if (ToolChain.getArch() == llvm::Triple::systemz)
7166 CmdArgs.push_back("elf64_s390");
7167 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7168 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7169 CmdArgs.push_back("elf32_x86_64");
7170 else
7171 CmdArgs.push_back("elf_x86_64");
7172
7173 if (Args.hasArg(options::OPT_static)) {
7174 if (ToolChain.getArch() == llvm::Triple::arm ||
7175 ToolChain.getArch() == llvm::Triple::armeb ||
7176 ToolChain.getArch() == llvm::Triple::thumb ||
7177 ToolChain.getArch() == llvm::Triple::thumbeb)
7178 CmdArgs.push_back("-Bstatic");
7179 else
7180 CmdArgs.push_back("-static");
7181 } else if (Args.hasArg(options::OPT_shared)) {
7182 CmdArgs.push_back("-shared");
7183 }
7184
7185 if (ToolChain.getArch() == llvm::Triple::arm ||
7186 ToolChain.getArch() == llvm::Triple::armeb ||
7187 ToolChain.getArch() == llvm::Triple::thumb ||
7188 ToolChain.getArch() == llvm::Triple::thumbeb ||
7189 (!Args.hasArg(options::OPT_static) &&
7190 !Args.hasArg(options::OPT_shared))) {
7191 CmdArgs.push_back("-dynamic-linker");
7192 CmdArgs.push_back(Args.MakeArgString(
7193 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7194 }
7195
7196 CmdArgs.push_back("-o");
7197 CmdArgs.push_back(Output.getFilename());
7198
7199 if (!Args.hasArg(options::OPT_nostdlib) &&
7200 !Args.hasArg(options::OPT_nostartfiles)) {
7201 if (!isAndroid) {
7202 const char *crt1 = nullptr;
7203 if (!Args.hasArg(options::OPT_shared)){
7204 if (Args.hasArg(options::OPT_pg))
7205 crt1 = "gcrt1.o";
7206 else if (IsPIE)
7207 crt1 = "Scrt1.o";
7208 else
7209 crt1 = "crt1.o";
7210 }
7211 if (crt1)
7212 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7213
7214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7215 }
7216
7217 const char *crtbegin;
7218 if (Args.hasArg(options::OPT_static))
7219 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
7220 else if (Args.hasArg(options::OPT_shared))
7221 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
7222 else if (IsPIE)
7223 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
7224 else
7225 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
7226 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
7227
7228 // Add crtfastmath.o if available and fast math is enabled.
7229 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
7230 }
7231
7232 Args.AddAllArgs(CmdArgs, options::OPT_L);
7233 Args.AddAllArgs(CmdArgs, options::OPT_u);
7234
7235 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7236
7237 for (const auto &Path : Paths)
7238 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
7239
7240 if (D.IsUsingLTO(Args))
7241 AddGoldPlugin(ToolChain, Args, CmdArgs);
7242
7243 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7244 CmdArgs.push_back("--no-demangle");
7245
7246 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7247
7248 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
7249 // The profile runtime also needs access to system libraries.
7250 addProfileRT(getToolChain(), Args, CmdArgs);
7251
7252 if (D.CCCIsCXX() &&
7253 !Args.hasArg(options::OPT_nostdlib) &&
7254 !Args.hasArg(options::OPT_nodefaultlibs)) {
7255 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7256 !Args.hasArg(options::OPT_static);
7257 if (OnlyLibstdcxxStatic)
7258 CmdArgs.push_back("-Bstatic");
7259 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7260 if (OnlyLibstdcxxStatic)
7261 CmdArgs.push_back("-Bdynamic");
7262 CmdArgs.push_back("-lm");
7263 }
7264
7265 if (!Args.hasArg(options::OPT_nostdlib)) {
7266 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7267 if (Args.hasArg(options::OPT_static))
7268 CmdArgs.push_back("--start-group");
7269
7270 LibOpenMP UsedOpenMPLib = LibUnknown;
7271 if (Args.hasArg(options::OPT_fopenmp)) {
7272 UsedOpenMPLib = LibGOMP;
7273 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7274 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7275 .Case("libgomp", LibGOMP)
7276 .Case("libiomp5", LibIOMP5)
7277 .Default(LibUnknown);
7278 if (UsedOpenMPLib == LibUnknown)
7279 D.Diag(diag::err_drv_unsupported_option_argument)
7280 << A->getOption().getName() << A->getValue();
7281 }
7282 switch (UsedOpenMPLib) {
7283 case LibGOMP:
7284 CmdArgs.push_back("-lgomp");
7285
7286 // FIXME: Exclude this for platforms with libgomp that don't require
7287 // librt. Most modern Linux platforms require it, but some may not.
7288 CmdArgs.push_back("-lrt");
7289 break;
7290 case LibIOMP5:
7291 CmdArgs.push_back("-liomp5");
7292 break;
7293 case LibUnknown:
7294 break;
7295 }
7296 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
7297
7298 if ((Args.hasArg(options::OPT_pthread) ||
7299 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7300 !isAndroid)
7301 CmdArgs.push_back("-lpthread");
7302
7303 CmdArgs.push_back("-lc");
7304
7305 if (Args.hasArg(options::OPT_static))
7306 CmdArgs.push_back("--end-group");
7307 else
7308 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
7309 }
7310
7311 if (!Args.hasArg(options::OPT_nostartfiles)) {
7312 const char *crtend;
7313 if (Args.hasArg(options::OPT_shared))
7314 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
7315 else if (IsPIE)
7316 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
7317 else
7318 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
7319
7320 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
7321 if (!isAndroid)
7322 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
7323 }
7324 }
7325
7326 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7327 }
7328
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7329 void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7330 const InputInfo &Output,
7331 const InputInfoList &Inputs,
7332 const ArgList &Args,
7333 const char *LinkingOutput) const {
7334 ArgStringList CmdArgs;
7335
7336 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
7337
7338 CmdArgs.push_back("-o");
7339 CmdArgs.push_back(Output.getFilename());
7340
7341 for (const auto &II : Inputs)
7342 CmdArgs.push_back(II.getFilename());
7343
7344 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
7345 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7346 }
7347
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7348 void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
7349 const InputInfo &Output,
7350 const InputInfoList &Inputs,
7351 const ArgList &Args,
7352 const char *LinkingOutput) const {
7353 const Driver &D = getToolChain().getDriver();
7354 ArgStringList CmdArgs;
7355
7356 if (Output.isFilename()) {
7357 CmdArgs.push_back("-o");
7358 CmdArgs.push_back(Output.getFilename());
7359 } else {
7360 assert(Output.isNothing() && "Invalid output.");
7361 }
7362
7363 if (!Args.hasArg(options::OPT_nostdlib) &&
7364 !Args.hasArg(options::OPT_nostartfiles)) {
7365 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7366 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7367 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7368 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7369 }
7370
7371 Args.AddAllArgs(CmdArgs, options::OPT_L);
7372 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7373 Args.AddAllArgs(CmdArgs, options::OPT_e);
7374
7375 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7376
7377 addProfileRT(getToolChain(), Args, CmdArgs);
7378
7379 if (!Args.hasArg(options::OPT_nostdlib) &&
7380 !Args.hasArg(options::OPT_nodefaultlibs)) {
7381 if (D.CCCIsCXX()) {
7382 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7383 CmdArgs.push_back("-lm");
7384 }
7385 }
7386
7387 if (!Args.hasArg(options::OPT_nostdlib) &&
7388 !Args.hasArg(options::OPT_nostartfiles)) {
7389 if (Args.hasArg(options::OPT_pthread))
7390 CmdArgs.push_back("-lpthread");
7391 CmdArgs.push_back("-lc");
7392 CmdArgs.push_back("-lCompilerRT-Generic");
7393 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7394 CmdArgs.push_back(
7395 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
7396 }
7397
7398 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7399 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7400 }
7401
7402 /// DragonFly Tools
7403
7404 // For now, DragonFly Assemble does just about the same as for
7405 // FreeBSD, but this may change soon.
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7406 void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7407 const InputInfo &Output,
7408 const InputInfoList &Inputs,
7409 const ArgList &Args,
7410 const char *LinkingOutput) const {
7411 ArgStringList CmdArgs;
7412
7413 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7414 // instruct as in the base system to assemble 32-bit code.
7415 if (getToolChain().getArch() == llvm::Triple::x86)
7416 CmdArgs.push_back("--32");
7417
7418 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
7419
7420 CmdArgs.push_back("-o");
7421 CmdArgs.push_back(Output.getFilename());
7422
7423 for (const auto &II : Inputs)
7424 CmdArgs.push_back(II.getFilename());
7425
7426 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
7427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7428 }
7429
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7430 void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
7431 const InputInfo &Output,
7432 const InputInfoList &Inputs,
7433 const ArgList &Args,
7434 const char *LinkingOutput) const {
7435 bool UseGCC47 = false;
7436 const Driver &D = getToolChain().getDriver();
7437 ArgStringList CmdArgs;
7438
7439 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7440 UseGCC47 = false;
7441
7442 if (!D.SysRoot.empty())
7443 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7444
7445 CmdArgs.push_back("--eh-frame-hdr");
7446 if (Args.hasArg(options::OPT_static)) {
7447 CmdArgs.push_back("-Bstatic");
7448 } else {
7449 if (Args.hasArg(options::OPT_rdynamic))
7450 CmdArgs.push_back("-export-dynamic");
7451 if (Args.hasArg(options::OPT_shared))
7452 CmdArgs.push_back("-Bshareable");
7453 else {
7454 CmdArgs.push_back("-dynamic-linker");
7455 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7456 }
7457 CmdArgs.push_back("--hash-style=both");
7458 }
7459
7460 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7461 // instruct ld in the base system to link 32-bit code.
7462 if (getToolChain().getArch() == llvm::Triple::x86) {
7463 CmdArgs.push_back("-m");
7464 CmdArgs.push_back("elf_i386");
7465 }
7466
7467 if (Output.isFilename()) {
7468 CmdArgs.push_back("-o");
7469 CmdArgs.push_back(Output.getFilename());
7470 } else {
7471 assert(Output.isNothing() && "Invalid output.");
7472 }
7473
7474 if (!Args.hasArg(options::OPT_nostdlib) &&
7475 !Args.hasArg(options::OPT_nostartfiles)) {
7476 if (!Args.hasArg(options::OPT_shared)) {
7477 if (Args.hasArg(options::OPT_pg))
7478 CmdArgs.push_back(Args.MakeArgString(
7479 getToolChain().GetFilePath("gcrt1.o")));
7480 else {
7481 if (Args.hasArg(options::OPT_pie))
7482 CmdArgs.push_back(Args.MakeArgString(
7483 getToolChain().GetFilePath("Scrt1.o")));
7484 else
7485 CmdArgs.push_back(Args.MakeArgString(
7486 getToolChain().GetFilePath("crt1.o")));
7487 }
7488 }
7489 CmdArgs.push_back(Args.MakeArgString(
7490 getToolChain().GetFilePath("crti.o")));
7491 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7492 CmdArgs.push_back(Args.MakeArgString(
7493 getToolChain().GetFilePath("crtbeginS.o")));
7494 else
7495 CmdArgs.push_back(Args.MakeArgString(
7496 getToolChain().GetFilePath("crtbegin.o")));
7497 }
7498
7499 Args.AddAllArgs(CmdArgs, options::OPT_L);
7500 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7501 Args.AddAllArgs(CmdArgs, options::OPT_e);
7502
7503 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7504
7505 if (!Args.hasArg(options::OPT_nostdlib) &&
7506 !Args.hasArg(options::OPT_nodefaultlibs)) {
7507 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7508 // rpaths
7509 if (UseGCC47)
7510 CmdArgs.push_back("-L/usr/lib/gcc47");
7511 else
7512 CmdArgs.push_back("-L/usr/lib/gcc44");
7513
7514 if (!Args.hasArg(options::OPT_static)) {
7515 if (UseGCC47) {
7516 CmdArgs.push_back("-rpath");
7517 CmdArgs.push_back("/usr/lib/gcc47");
7518 } else {
7519 CmdArgs.push_back("-rpath");
7520 CmdArgs.push_back("/usr/lib/gcc44");
7521 }
7522 }
7523
7524 if (D.CCCIsCXX()) {
7525 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7526 CmdArgs.push_back("-lm");
7527 }
7528
7529 if (Args.hasArg(options::OPT_pthread))
7530 CmdArgs.push_back("-lpthread");
7531
7532 if (!Args.hasArg(options::OPT_nolibc)) {
7533 CmdArgs.push_back("-lc");
7534 }
7535
7536 if (UseGCC47) {
7537 if (Args.hasArg(options::OPT_static) ||
7538 Args.hasArg(options::OPT_static_libgcc)) {
7539 CmdArgs.push_back("-lgcc");
7540 CmdArgs.push_back("-lgcc_eh");
7541 } else {
7542 if (Args.hasArg(options::OPT_shared_libgcc)) {
7543 CmdArgs.push_back("-lgcc_pic");
7544 if (!Args.hasArg(options::OPT_shared))
7545 CmdArgs.push_back("-lgcc");
7546 } else {
7547 CmdArgs.push_back("-lgcc");
7548 CmdArgs.push_back("--as-needed");
7549 CmdArgs.push_back("-lgcc_pic");
7550 CmdArgs.push_back("--no-as-needed");
7551 }
7552 }
7553 } else {
7554 if (Args.hasArg(options::OPT_shared)) {
7555 CmdArgs.push_back("-lgcc_pic");
7556 } else {
7557 CmdArgs.push_back("-lgcc");
7558 }
7559 }
7560 }
7561
7562 if (!Args.hasArg(options::OPT_nostdlib) &&
7563 !Args.hasArg(options::OPT_nostartfiles)) {
7564 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7565 CmdArgs.push_back(Args.MakeArgString(
7566 getToolChain().GetFilePath("crtendS.o")));
7567 else
7568 CmdArgs.push_back(Args.MakeArgString(
7569 getToolChain().GetFilePath("crtend.o")));
7570 CmdArgs.push_back(Args.MakeArgString(
7571 getToolChain().GetFilePath("crtn.o")));
7572 }
7573
7574 addProfileRT(getToolChain(), Args, CmdArgs);
7575
7576 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
7577 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7578 }
7579
addSanitizerRTWindows(const ToolChain & TC,const ArgList & Args,ArgStringList & CmdArgs,const StringRef RTName)7580 static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7581 ArgStringList &CmdArgs,
7582 const StringRef RTName) {
7583 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7584 llvm::sys::path::append(LibSanitizer,
7585 Twine("clang_rt.") + RTName + ".lib");
7586 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7587 }
7588
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7589 void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7590 const InputInfo &Output,
7591 const InputInfoList &Inputs,
7592 const ArgList &Args,
7593 const char *LinkingOutput) const {
7594 ArgStringList CmdArgs;
7595
7596 if (Output.isFilename()) {
7597 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7598 Output.getFilename()));
7599 } else {
7600 assert(Output.isNothing() && "Invalid output.");
7601 }
7602
7603 if (!Args.hasArg(options::OPT_nostdlib) &&
7604 !Args.hasArg(options::OPT_nostartfiles) &&
7605 !C.getDriver().IsCLMode()) {
7606 CmdArgs.push_back("-defaultlib:libcmt");
7607 }
7608
7609 CmdArgs.push_back("-nologo");
7610
7611 if (Args.hasArg(options::OPT_g_Group)) {
7612 CmdArgs.push_back("-debug");
7613 }
7614
7615 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7616
7617 if (DLL) {
7618 CmdArgs.push_back(Args.MakeArgString("-dll"));
7619
7620 SmallString<128> ImplibName(Output.getFilename());
7621 llvm::sys::path::replace_extension(ImplibName, "lib");
7622 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7623 ImplibName.str()));
7624 }
7625
7626 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
7627 CmdArgs.push_back(Args.MakeArgString("-debug"));
7628 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
7629 // FIXME: Handle 64-bit.
7630 if (DLL) {
7631 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7632 "asan_dll_thunk-i386");
7633 } else {
7634 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7635 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7636 }
7637 }
7638
7639 Args.AddAllArgValues(CmdArgs, options::OPT_l);
7640 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
7641
7642 // Add filenames immediately.
7643 for (const auto &Input : Inputs)
7644 if (Input.isFilename())
7645 CmdArgs.push_back(Input.getFilename());
7646 else
7647 Input.getInputArg().renderAsInput(Args, CmdArgs);
7648
7649 const char *Exec =
7650 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
7651 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7652 }
7653
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7654 void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7655 const InputInfo &Output,
7656 const InputInfoList &Inputs,
7657 const ArgList &Args,
7658 const char *LinkingOutput) const {
7659 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7660 }
7661
7662 // Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7663 // If one cannot be found, return FallbackName.
7664 // We do this special search to prevent clang-cl from falling back onto itself
7665 // if it's available as cl.exe on the path.
FindFallback(const char * FallbackName,const char * ClangProgramPath)7666 static std::string FindFallback(const char *FallbackName,
7667 const char *ClangProgramPath) {
7668 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7669 if (!OptPath.hasValue())
7670 return FallbackName;
7671
7672 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
7673 SmallVector<StringRef, 8> PathSegments;
7674 llvm::SplitString(OptPath.getValue(), PathSegments, EnvPathSeparatorStr);
7675
7676 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7677 const StringRef &PathSegment = PathSegments[i];
7678 if (PathSegment.empty())
7679 continue;
7680
7681 SmallString<128> FilePath(PathSegment);
7682 llvm::sys::path::append(FilePath, FallbackName);
7683 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7684 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7685 return FilePath.str();
7686 }
7687
7688 return FallbackName;
7689 }
7690
GetCommand(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7691 Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7692 const InputInfo &Output,
7693 const InputInfoList &Inputs,
7694 const ArgList &Args,
7695 const char *LinkingOutput) const {
7696 ArgStringList CmdArgs;
7697 CmdArgs.push_back("/nologo");
7698 CmdArgs.push_back("/c"); // Compile only.
7699 CmdArgs.push_back("/W0"); // No warnings.
7700
7701 // The goal is to be able to invoke this tool correctly based on
7702 // any flag accepted by clang-cl.
7703
7704 // These are spelled the same way in clang and cl.exe,.
7705 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7706 Args.AddAllArgs(CmdArgs, options::OPT_I);
7707
7708 // Optimization level.
7709 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7710 if (A->getOption().getID() == options::OPT_O0) {
7711 CmdArgs.push_back("/Od");
7712 } else {
7713 StringRef OptLevel = A->getValue();
7714 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7715 A->render(Args, CmdArgs);
7716 else if (OptLevel == "3")
7717 CmdArgs.push_back("/Ox");
7718 }
7719 }
7720
7721 // Flags for which clang-cl have an alias.
7722 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7723
7724 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
7725 /*default=*/false))
7726 CmdArgs.push_back("/GR-");
7727 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7728 options::OPT_fno_function_sections))
7729 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7730 ? "/Gy"
7731 : "/Gy-");
7732 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7733 options::OPT_fno_data_sections))
7734 CmdArgs.push_back(
7735 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
7736 if (Args.hasArg(options::OPT_fsyntax_only))
7737 CmdArgs.push_back("/Zs");
7738 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7739 CmdArgs.push_back("/Z7");
7740
7741 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7742 for (const auto &Include : Includes)
7743 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
7744
7745 // Flags that can simply be passed through.
7746 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7747 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7748 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
7749
7750 // The order of these flags is relevant, so pick the last one.
7751 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7752 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7753 A->render(Args, CmdArgs);
7754
7755
7756 // Input filename.
7757 assert(Inputs.size() == 1);
7758 const InputInfo &II = Inputs[0];
7759 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7760 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7761 if (II.isFilename())
7762 CmdArgs.push_back(II.getFilename());
7763 else
7764 II.getInputArg().renderAsInput(Args, CmdArgs);
7765
7766 // Output filename.
7767 assert(Output.getType() == types::TY_Object);
7768 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7769 Output.getFilename());
7770 CmdArgs.push_back(Fo);
7771
7772 const Driver &D = getToolChain().getDriver();
7773 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
7774 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
7775 }
7776
7777
7778 /// XCore Tools
7779 // We pass assemble and link construction to the xcc tool.
7780
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7781 void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7782 const InputInfo &Output,
7783 const InputInfoList &Inputs,
7784 const ArgList &Args,
7785 const char *LinkingOutput) const {
7786 ArgStringList CmdArgs;
7787
7788 CmdArgs.push_back("-o");
7789 CmdArgs.push_back(Output.getFilename());
7790
7791 CmdArgs.push_back("-c");
7792
7793 if (Args.hasArg(options::OPT_v))
7794 CmdArgs.push_back("-v");
7795
7796 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
7797 if (!A->getOption().matches(options::OPT_g0))
7798 CmdArgs.push_back("-g");
7799
7800 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7801 false))
7802 CmdArgs.push_back("-fverbose-asm");
7803
7804 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7805 options::OPT_Xassembler);
7806
7807 for (const auto &II : Inputs)
7808 CmdArgs.push_back(II.getFilename());
7809
7810 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7811 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7812 }
7813
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const7814 void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7815 const InputInfo &Output,
7816 const InputInfoList &Inputs,
7817 const ArgList &Args,
7818 const char *LinkingOutput) const {
7819 ArgStringList CmdArgs;
7820
7821 if (Output.isFilename()) {
7822 CmdArgs.push_back("-o");
7823 CmdArgs.push_back(Output.getFilename());
7824 } else {
7825 assert(Output.isNothing() && "Invalid output.");
7826 }
7827
7828 if (Args.hasArg(options::OPT_v))
7829 CmdArgs.push_back("-v");
7830
7831 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7832 if (EH.ShouldUseExceptionTables)
7833 CmdArgs.push_back("-fexceptions");
7834
7835 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7836
7837 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7838 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7839 }
7840