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