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