1 //===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "Tools.h" 11 #include "InputInfo.h" 12 #include "ToolChains.h" 13 #include "clang/Basic/CharInfo.h" 14 #include "clang/Basic/LangOptions.h" 15 #include "clang/Basic/ObjCRuntime.h" 16 #include "clang/Basic/Version.h" 17 #include "clang/Config/config.h" 18 #include "clang/Driver/Action.h" 19 #include "clang/Driver/Compilation.h" 20 #include "clang/Driver/Driver.h" 21 #include "clang/Driver/DriverDiagnostic.h" 22 #include "clang/Driver/Job.h" 23 #include "clang/Driver/Options.h" 24 #include "clang/Driver/SanitizerArgs.h" 25 #include "clang/Driver/ToolChain.h" 26 #include "clang/Driver/Util.h" 27 #include "llvm/ADT/STLExtras.h" 28 #include "llvm/ADT/SmallString.h" 29 #include "llvm/ADT/StringExtras.h" 30 #include "llvm/ADT/StringSwitch.h" 31 #include "llvm/ADT/Twine.h" 32 #include "llvm/Option/Arg.h" 33 #include "llvm/Option/ArgList.h" 34 #include "llvm/Option/Option.h" 35 #include "llvm/Support/CodeGen.h" 36 #include "llvm/Support/Compression.h" 37 #include "llvm/Support/ErrorHandling.h" 38 #include "llvm/Support/FileSystem.h" 39 #include "llvm/Support/Host.h" 40 #include "llvm/Support/Path.h" 41 #include "llvm/Support/Process.h" 42 #include "llvm/Support/Program.h" 43 #include "llvm/Support/raw_ostream.h" 44 #include "llvm/Support/TargetParser.h" 45 46 #ifdef LLVM_ON_UNIX 47 #include <unistd.h> // For getuid(). 48 #endif 49 50 using namespace clang::driver; 51 using namespace clang::driver::tools; 52 using namespace clang; 53 using namespace llvm::opt; 54 55 static void handleTargetFeaturesGroup(const ArgList &Args, 56 std::vector<const char *> &Features, 57 OptSpecifier Group) { 58 for (const Arg *A : Args.filtered(Group)) { 59 StringRef Name = A->getOption().getName(); 60 A->claim(); 61 62 // Skip over "-m". 63 assert(Name.startswith("m") && "Invalid feature name."); 64 Name = Name.substr(1); 65 66 bool IsNegative = Name.startswith("no-"); 67 if (IsNegative) 68 Name = Name.substr(3); 69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 70 } 71 } 72 73 static const char *getSparcAsmModeForCPU(StringRef Name, 74 const llvm::Triple &Triple) { 75 if (Triple.getArch() == llvm::Triple::sparcv9) { 76 return llvm::StringSwitch<const char *>(Name) 77 .Case("niagara", "-Av9b") 78 .Case("niagara2", "-Av9b") 79 .Case("niagara3", "-Av9d") 80 .Case("niagara4", "-Av9d") 81 .Default("-Av9"); 82 } else { 83 return llvm::StringSwitch<const char *>(Name) 84 .Case("v8", "-Av8") 85 .Case("supersparc", "-Av8") 86 .Case("sparclite", "-Asparclite") 87 .Case("f934", "-Asparclite") 88 .Case("hypersparc", "-Av8") 89 .Case("sparclite86x", "-Asparclite") 90 .Case("sparclet", "-Asparclet") 91 .Case("tsc701", "-Asparclet") 92 .Case("v9", "-Av8plus") 93 .Case("ultrasparc", "-Av8plus") 94 .Case("ultrasparc3", "-Av8plus") 95 .Case("niagara", "-Av8plusb") 96 .Case("niagara2", "-Av8plusb") 97 .Case("niagara3", "-Av8plusd") 98 .Case("niagara4", "-Av8plusd") 99 .Case("leon2", "-Av8") 100 .Case("at697e", "-Av8") 101 .Case("at697f", "-Av8") 102 .Case("leon3", "-Av8") 103 .Case("ut699", "-Av8") 104 .Case("gr712rc", "-Av8") 105 .Case("leon4", "-Av8") 106 .Case("gr740", "-Av8") 107 .Default("-Av8"); 108 } 109 } 110 111 /// CheckPreprocessingOptions - Perform some validation of preprocessing 112 /// arguments that is shared with gcc. 113 static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 114 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) { 115 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) && 116 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) { 117 D.Diag(diag::err_drv_argument_only_allowed_with) 118 << A->getBaseArg().getAsString(Args) 119 << (D.IsCLMode() ? "/E, /P or /EP" : "-E"); 120 } 121 } 122 } 123 124 /// CheckCodeGenerationOptions - Perform some validation of code generation 125 /// arguments that is shared with gcc. 126 static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 127 // In gcc, only ARM checks this, but it seems reasonable to check universally. 128 if (Args.hasArg(options::OPT_static)) 129 if (const Arg *A = 130 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic)) 131 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) 132 << "-static"; 133 } 134 135 // Add backslashes to escape spaces and other backslashes. 136 // This is used for the space-separated argument list specified with 137 // the -dwarf-debug-flags option. 138 static void EscapeSpacesAndBackslashes(const char *Arg, 139 SmallVectorImpl<char> &Res) { 140 for (; *Arg; ++Arg) { 141 switch (*Arg) { 142 default: 143 break; 144 case ' ': 145 case '\\': 146 Res.push_back('\\'); 147 break; 148 } 149 Res.push_back(*Arg); 150 } 151 } 152 153 // Quote target names for inclusion in GNU Make dependency files. 154 // Only the characters '$', '#', ' ', '\t' are quoted. 155 static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) { 156 for (unsigned i = 0, e = Target.size(); i != e; ++i) { 157 switch (Target[i]) { 158 case ' ': 159 case '\t': 160 // Escape the preceding backslashes 161 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j) 162 Res.push_back('\\'); 163 164 // Escape the space/tab 165 Res.push_back('\\'); 166 break; 167 case '$': 168 Res.push_back('$'); 169 break; 170 case '#': 171 Res.push_back('\\'); 172 break; 173 default: 174 break; 175 } 176 177 Res.push_back(Target[i]); 178 } 179 } 180 181 static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs, 182 const char *ArgName, const char *EnvVar) { 183 const char *DirList = ::getenv(EnvVar); 184 bool CombinedArg = false; 185 186 if (!DirList) 187 return; // Nothing to do. 188 189 StringRef Name(ArgName); 190 if (Name.equals("-I") || Name.equals("-L")) 191 CombinedArg = true; 192 193 StringRef Dirs(DirList); 194 if (Dirs.empty()) // Empty string should not add '.'. 195 return; 196 197 StringRef::size_type Delim; 198 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) { 199 if (Delim == 0) { // Leading colon. 200 if (CombinedArg) { 201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); 202 } else { 203 CmdArgs.push_back(ArgName); 204 CmdArgs.push_back("."); 205 } 206 } else { 207 if (CombinedArg) { 208 CmdArgs.push_back( 209 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim))); 210 } else { 211 CmdArgs.push_back(ArgName); 212 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim))); 213 } 214 } 215 Dirs = Dirs.substr(Delim + 1); 216 } 217 218 if (Dirs.empty()) { // Trailing colon. 219 if (CombinedArg) { 220 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); 221 } else { 222 CmdArgs.push_back(ArgName); 223 CmdArgs.push_back("."); 224 } 225 } else { // Add the last path. 226 if (CombinedArg) { 227 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs)); 228 } else { 229 CmdArgs.push_back(ArgName); 230 CmdArgs.push_back(Args.MakeArgString(Dirs)); 231 } 232 } 233 } 234 235 static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs, 236 const ArgList &Args, ArgStringList &CmdArgs) { 237 const Driver &D = TC.getDriver(); 238 239 // Add extra linker input arguments which are not treated as inputs 240 // (constructed via -Xarch_). 241 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input); 242 243 for (const auto &II : Inputs) { 244 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType())) 245 // Don't try to pass LLVM inputs unless we have native support. 246 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString(); 247 248 // Add filenames immediately. 249 if (II.isFilename()) { 250 CmdArgs.push_back(II.getFilename()); 251 continue; 252 } 253 254 // Otherwise, this is a linker input argument. 255 const Arg &A = II.getInputArg(); 256 257 // Handle reserved library options. 258 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) 259 TC.AddCXXStdlibLibArgs(Args, CmdArgs); 260 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) 261 TC.AddCCKextLibArgs(Args, CmdArgs); 262 else if (A.getOption().matches(options::OPT_z)) { 263 // Pass -z prefix for gcc linker compatibility. 264 A.claim(); 265 A.render(Args, CmdArgs); 266 } else { 267 A.renderAsInput(Args, CmdArgs); 268 } 269 } 270 271 // LIBRARY_PATH - included following the user specified library paths. 272 // and only supported on native toolchains. 273 if (!TC.isCrossCompiling()) 274 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH"); 275 } 276 277 /// \brief Determine whether Objective-C automated reference counting is 278 /// enabled. 279 static bool isObjCAutoRefCount(const ArgList &Args) { 280 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false); 281 } 282 283 /// \brief Determine whether we are linking the ObjC runtime. 284 static bool isObjCRuntimeLinked(const ArgList &Args) { 285 if (isObjCAutoRefCount(Args)) { 286 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime); 287 return true; 288 } 289 return Args.hasArg(options::OPT_fobjc_link_runtime); 290 } 291 292 static bool forwardToGCC(const Option &O) { 293 // Don't forward inputs from the original command line. They are added from 294 // InputInfoList. 295 return O.getKind() != Option::InputClass && 296 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput); 297 } 298 299 void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, 300 const Driver &D, const ArgList &Args, 301 ArgStringList &CmdArgs, 302 const InputInfo &Output, 303 const InputInfoList &Inputs, 304 const ToolChain *AuxToolChain) const { 305 Arg *A; 306 const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); 307 308 CheckPreprocessingOptions(D, Args); 309 310 Args.AddLastArg(CmdArgs, options::OPT_C); 311 Args.AddLastArg(CmdArgs, options::OPT_CC); 312 313 // Handle dependency file generation. 314 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) || 315 (A = Args.getLastArg(options::OPT_MD)) || 316 (A = Args.getLastArg(options::OPT_MMD))) { 317 // Determine the output location. 318 const char *DepFile; 319 if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 320 DepFile = MF->getValue(); 321 C.addFailureResultFile(DepFile, &JA); 322 } else if (Output.getType() == types::TY_Dependencies) { 323 DepFile = Output.getFilename(); 324 } else if (A->getOption().matches(options::OPT_M) || 325 A->getOption().matches(options::OPT_MM)) { 326 DepFile = "-"; 327 } else { 328 DepFile = getDependencyFileName(Args, Inputs); 329 C.addFailureResultFile(DepFile, &JA); 330 } 331 CmdArgs.push_back("-dependency-file"); 332 CmdArgs.push_back(DepFile); 333 334 // Add a default target if one wasn't specified. 335 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 336 const char *DepTarget; 337 338 // If user provided -o, that is the dependency target, except 339 // when we are only generating a dependency file. 340 Arg *OutputOpt = Args.getLastArg(options::OPT_o); 341 if (OutputOpt && Output.getType() != types::TY_Dependencies) { 342 DepTarget = OutputOpt->getValue(); 343 } else { 344 // Otherwise derive from the base input. 345 // 346 // FIXME: This should use the computed output file location. 347 SmallString<128> P(Inputs[0].getBaseInput()); 348 llvm::sys::path::replace_extension(P, "o"); 349 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P)); 350 } 351 352 CmdArgs.push_back("-MT"); 353 SmallString<128> Quoted; 354 QuoteTarget(DepTarget, Quoted); 355 CmdArgs.push_back(Args.MakeArgString(Quoted)); 356 } 357 358 if (A->getOption().matches(options::OPT_M) || 359 A->getOption().matches(options::OPT_MD)) 360 CmdArgs.push_back("-sys-header-deps"); 361 if ((isa<PrecompileJobAction>(JA) && 362 !Args.hasArg(options::OPT_fno_module_file_deps)) || 363 Args.hasArg(options::OPT_fmodule_file_deps)) 364 CmdArgs.push_back("-module-file-deps"); 365 } 366 367 if (Args.hasArg(options::OPT_MG)) { 368 if (!A || A->getOption().matches(options::OPT_MD) || 369 A->getOption().matches(options::OPT_MMD)) 370 D.Diag(diag::err_drv_mg_requires_m_or_mm); 371 CmdArgs.push_back("-MG"); 372 } 373 374 Args.AddLastArg(CmdArgs, options::OPT_MP); 375 Args.AddLastArg(CmdArgs, options::OPT_MV); 376 377 // Convert all -MQ <target> args to -MT <quoted target> 378 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) { 379 A->claim(); 380 381 if (A->getOption().matches(options::OPT_MQ)) { 382 CmdArgs.push_back("-MT"); 383 SmallString<128> Quoted; 384 QuoteTarget(A->getValue(), Quoted); 385 CmdArgs.push_back(Args.MakeArgString(Quoted)); 386 387 // -MT flag - no change 388 } else { 389 A->render(Args, CmdArgs); 390 } 391 } 392 393 // Add -i* options, and automatically translate to 394 // -include-pch/-include-pth for transparent PCH support. It's 395 // wonky, but we include looking for .gch so we can support seamless 396 // replacement into a build system already set up to be generating 397 // .gch files. 398 int YcIndex = -1, YuIndex = -1; 399 { 400 int AI = -1; 401 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc); 402 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu); 403 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) { 404 // Walk the whole i_Group and skip non "-include" flags so that the index 405 // here matches the index in the next loop below. 406 ++AI; 407 if (!A->getOption().matches(options::OPT_include)) 408 continue; 409 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0) 410 YcIndex = AI; 411 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0) 412 YuIndex = AI; 413 } 414 } 415 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) { 416 Driver::InputList Inputs; 417 D.BuildInputs(getToolChain(), C.getArgs(), Inputs); 418 assert(Inputs.size() == 1 && "Need one input when building pch"); 419 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") + 420 Inputs[0].second->getValue())); 421 } 422 423 bool RenderedImplicitInclude = false; 424 int AI = -1; 425 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) { 426 ++AI; 427 428 if (getToolChain().getDriver().IsCLMode() && 429 A->getOption().matches(options::OPT_include)) { 430 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h 431 // include is compiled into foo.h, and everything after goes into 432 // the .obj file. /Yufoo.h means that all includes prior to and including 433 // foo.h are completely skipped and replaced with a use of the pch file 434 // for foo.h. (Each flag can have at most one value, multiple /Yc flags 435 // just mean that the last one wins.) If /Yc and /Yu are both present 436 // and refer to the same file, /Yc wins. 437 // Note that OPT__SLASH_FI gets mapped to OPT_include. 438 // FIXME: The code here assumes that /Yc and /Yu refer to the same file. 439 // cl.exe seems to support both flags with different values, but that 440 // seems strange (which flag does /Fp now refer to?), so don't implement 441 // that until someone needs it. 442 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex; 443 if (PchIndex != -1) { 444 if (isa<PrecompileJobAction>(JA)) { 445 // When building the pch, skip all includes after the pch. 446 assert(YcIndex != -1 && PchIndex == YcIndex); 447 if (AI >= YcIndex) 448 continue; 449 } else { 450 // When using the pch, skip all includes prior to the pch. 451 if (AI < PchIndex) { 452 A->claim(); 453 continue; 454 } 455 if (AI == PchIndex) { 456 A->claim(); 457 CmdArgs.push_back("-include-pch"); 458 CmdArgs.push_back( 459 Args.MakeArgString(D.GetClPchPath(C, A->getValue()))); 460 continue; 461 } 462 } 463 } 464 } else if (A->getOption().matches(options::OPT_include)) { 465 // Handling of gcc-style gch precompiled headers. 466 bool IsFirstImplicitInclude = !RenderedImplicitInclude; 467 RenderedImplicitInclude = true; 468 469 // Use PCH if the user requested it. 470 bool UsePCH = D.CCCUsePCH; 471 472 bool FoundPTH = false; 473 bool FoundPCH = false; 474 SmallString<128> P(A->getValue()); 475 // We want the files to have a name like foo.h.pch. Add a dummy extension 476 // so that replace_extension does the right thing. 477 P += ".dummy"; 478 if (UsePCH) { 479 llvm::sys::path::replace_extension(P, "pch"); 480 if (llvm::sys::fs::exists(P)) 481 FoundPCH = true; 482 } 483 484 if (!FoundPCH) { 485 llvm::sys::path::replace_extension(P, "pth"); 486 if (llvm::sys::fs::exists(P)) 487 FoundPTH = true; 488 } 489 490 if (!FoundPCH && !FoundPTH) { 491 llvm::sys::path::replace_extension(P, "gch"); 492 if (llvm::sys::fs::exists(P)) { 493 FoundPCH = UsePCH; 494 FoundPTH = !UsePCH; 495 } 496 } 497 498 if (FoundPCH || FoundPTH) { 499 if (IsFirstImplicitInclude) { 500 A->claim(); 501 if (UsePCH) 502 CmdArgs.push_back("-include-pch"); 503 else 504 CmdArgs.push_back("-include-pth"); 505 CmdArgs.push_back(Args.MakeArgString(P)); 506 continue; 507 } else { 508 // Ignore the PCH if not first on command line and emit warning. 509 D.Diag(diag::warn_drv_pch_not_first_include) << P 510 << A->getAsString(Args); 511 } 512 } 513 } else if (A->getOption().matches(options::OPT_isystem_after)) { 514 // Handling of paths which must come late. These entries are handled by 515 // the toolchain itself after the resource dir is inserted in the right 516 // search order. 517 // Do not claim the argument so that the use of the argument does not 518 // silently go unnoticed on toolchains which do not honour the option. 519 continue; 520 } 521 522 // Not translated, render as usual. 523 A->claim(); 524 A->render(Args, CmdArgs); 525 } 526 527 Args.AddAllArgs(CmdArgs, 528 {options::OPT_D, options::OPT_U, options::OPT_I_Group, 529 options::OPT_F, options::OPT_index_header_map}); 530 531 // Add -Wp, and -Xpreprocessor if using the preprocessor. 532 533 // FIXME: There is a very unfortunate problem here, some troubled 534 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 535 // really support that we would have to parse and then translate 536 // those options. :( 537 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 538 options::OPT_Xpreprocessor); 539 540 // -I- is a deprecated GCC feature, reject it. 541 if (Arg *A = Args.getLastArg(options::OPT_I_)) 542 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 543 544 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an 545 // -isysroot to the CC1 invocation. 546 StringRef sysroot = C.getSysRoot(); 547 if (sysroot != "") { 548 if (!Args.hasArg(options::OPT_isysroot)) { 549 CmdArgs.push_back("-isysroot"); 550 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 551 } 552 } 553 554 // Parse additional include paths from environment variables. 555 // FIXME: We should probably sink the logic for handling these from the 556 // frontend into the driver. It will allow deleting 4 otherwise unused flags. 557 // CPATH - included following the user specified includes (but prior to 558 // builtin and standard includes). 559 addDirectoryList(Args, CmdArgs, "-I", "CPATH"); 560 // C_INCLUDE_PATH - system includes enabled when compiling C. 561 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH"); 562 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++. 563 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH"); 564 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC. 565 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH"); 566 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++. 567 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH"); 568 569 // Optional AuxToolChain indicates that we need to include headers 570 // for more than one target. If that's the case, add include paths 571 // from AuxToolChain right after include paths of the same kind for 572 // the current target. 573 574 // Add C++ include arguments, if needed. 575 if (types::isCXX(Inputs[0].getType())) { 576 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs); 577 if (AuxToolChain) 578 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); 579 } 580 581 // Add system include arguments for all targets but IAMCU. 582 if (!IsIAMCU) { 583 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); 584 if (AuxToolChain) 585 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); 586 } else { 587 // For IAMCU add special include arguments. 588 getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); 589 } 590 591 // Add CUDA include arguments, if needed. 592 if (types::isCuda(Inputs[0].getType())) 593 getToolChain().AddCudaIncludeArgs(Args, CmdArgs); 594 } 595 596 // FIXME: Move to target hook. 597 static bool isSignedCharDefault(const llvm::Triple &Triple) { 598 switch (Triple.getArch()) { 599 default: 600 return true; 601 602 case llvm::Triple::aarch64: 603 case llvm::Triple::aarch64_be: 604 case llvm::Triple::arm: 605 case llvm::Triple::armeb: 606 case llvm::Triple::thumb: 607 case llvm::Triple::thumbeb: 608 if (Triple.isOSDarwin() || Triple.isOSWindows()) 609 return true; 610 return false; 611 612 case llvm::Triple::ppc: 613 case llvm::Triple::ppc64: 614 if (Triple.isOSDarwin()) 615 return true; 616 return false; 617 618 case llvm::Triple::hexagon: 619 case llvm::Triple::ppc64le: 620 case llvm::Triple::systemz: 621 case llvm::Triple::xcore: 622 return false; 623 } 624 } 625 626 static bool isNoCommonDefault(const llvm::Triple &Triple) { 627 switch (Triple.getArch()) { 628 default: 629 return false; 630 631 case llvm::Triple::xcore: 632 case llvm::Triple::wasm32: 633 case llvm::Triple::wasm64: 634 return true; 635 } 636 } 637 638 // ARM tools start. 639 640 // Get SubArch (vN). 641 static int getARMSubArchVersionNumber(const llvm::Triple &Triple) { 642 llvm::StringRef Arch = Triple.getArchName(); 643 return llvm::ARM::parseArchVersion(Arch); 644 } 645 646 // True if M-profile. 647 static bool isARMMProfile(const llvm::Triple &Triple) { 648 llvm::StringRef Arch = Triple.getArchName(); 649 unsigned Profile = llvm::ARM::parseArchProfile(Arch); 650 return Profile == llvm::ARM::PK_M; 651 } 652 653 // Get Arch/CPU from args. 654 static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch, 655 llvm::StringRef &CPU, bool FromAs = false) { 656 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 657 CPU = A->getValue(); 658 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 659 Arch = A->getValue(); 660 if (!FromAs) 661 return; 662 663 for (const Arg *A : 664 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { 665 StringRef Value = A->getValue(); 666 if (Value.startswith("-mcpu=")) 667 CPU = Value.substr(6); 668 if (Value.startswith("-march=")) 669 Arch = Value.substr(7); 670 } 671 } 672 673 // Handle -mhwdiv=. 674 // FIXME: Use ARMTargetParser. 675 static void getARMHWDivFeatures(const Driver &D, const Arg *A, 676 const ArgList &Args, StringRef HWDiv, 677 std::vector<const char *> &Features) { 678 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv); 679 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features)) 680 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 681 } 682 683 // Handle -mfpu=. 684 static void getARMFPUFeatures(const Driver &D, const Arg *A, 685 const ArgList &Args, StringRef FPU, 686 std::vector<const char *> &Features) { 687 unsigned FPUID = llvm::ARM::parseFPU(FPU); 688 if (!llvm::ARM::getFPUFeatures(FPUID, Features)) 689 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 690 } 691 692 // Decode ARM features from string like +[no]featureA+[no]featureB+... 693 static bool DecodeARMFeatures(const Driver &D, StringRef text, 694 std::vector<const char *> &Features) { 695 SmallVector<StringRef, 8> Split; 696 text.split(Split, StringRef("+"), -1, false); 697 698 for (StringRef Feature : Split) { 699 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature); 700 if (FeatureName) 701 Features.push_back(FeatureName); 702 else 703 return false; 704 } 705 return true; 706 } 707 708 // Check if -march is valid by checking if it can be canonicalised and parsed. 709 // getARMArch is used here instead of just checking the -march value in order 710 // to handle -march=native correctly. 711 static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args, 712 llvm::StringRef ArchName, 713 std::vector<const char *> &Features, 714 const llvm::Triple &Triple) { 715 std::pair<StringRef, StringRef> Split = ArchName.split("+"); 716 717 std::string MArch = arm::getARMArch(ArchName, Triple); 718 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID || 719 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features))) 720 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 721 } 722 723 // Check -mcpu=. Needs ArchName to handle -mcpu=generic. 724 static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args, 725 llvm::StringRef CPUName, llvm::StringRef ArchName, 726 std::vector<const char *> &Features, 727 const llvm::Triple &Triple) { 728 std::pair<StringRef, StringRef> Split = CPUName.split("+"); 729 730 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); 731 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() || 732 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features))) 733 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 734 } 735 736 static bool useAAPCSForMachO(const llvm::Triple &T) { 737 // The backend is hardwired to assume AAPCS for M-class processors, ensure 738 // the frontend matches that. 739 return T.getEnvironment() == llvm::Triple::EABI || 740 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); 741 } 742 743 // Select the float ABI as determined by -msoft-float, -mhard-float, and 744 // -mfloat-abi=. 745 arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { 746 const Driver &D = TC.getDriver(); 747 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args)); 748 auto SubArch = getARMSubArchVersionNumber(Triple); 749 arm::FloatABI ABI = FloatABI::Invalid; 750 if (Arg *A = 751 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, 752 options::OPT_mfloat_abi_EQ)) { 753 if (A->getOption().matches(options::OPT_msoft_float)) { 754 ABI = FloatABI::Soft; 755 } else if (A->getOption().matches(options::OPT_mhard_float)) { 756 ABI = FloatABI::Hard; 757 } else { 758 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue()) 759 .Case("soft", FloatABI::Soft) 760 .Case("softfp", FloatABI::SoftFP) 761 .Case("hard", FloatABI::Hard) 762 .Default(FloatABI::Invalid); 763 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) { 764 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); 765 ABI = FloatABI::Soft; 766 } 767 } 768 769 // It is incorrect to select hard float ABI on MachO platforms if the ABI is 770 // "apcs-gnu". 771 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) && 772 ABI == FloatABI::Hard) { 773 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args) 774 << Triple.getArchName(); 775 } 776 } 777 778 // If unspecified, choose the default based on the platform. 779 if (ABI == FloatABI::Invalid) { 780 switch (Triple.getOS()) { 781 case llvm::Triple::Darwin: 782 case llvm::Triple::MacOSX: 783 case llvm::Triple::IOS: 784 case llvm::Triple::TvOS: { 785 // Darwin defaults to "softfp" for v6 and v7. 786 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft; 787 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI; 788 break; 789 } 790 case llvm::Triple::WatchOS: 791 ABI = FloatABI::Hard; 792 break; 793 794 // FIXME: this is invalid for WindowsCE 795 case llvm::Triple::Win32: 796 ABI = FloatABI::Hard; 797 break; 798 799 case llvm::Triple::FreeBSD: 800 switch (Triple.getEnvironment()) { 801 case llvm::Triple::GNUEABIHF: 802 ABI = FloatABI::Hard; 803 break; 804 default: 805 // FreeBSD defaults to soft float 806 ABI = FloatABI::Soft; 807 break; 808 } 809 break; 810 811 default: 812 switch (Triple.getEnvironment()) { 813 case llvm::Triple::GNUEABIHF: 814 case llvm::Triple::MuslEABIHF: 815 case llvm::Triple::EABIHF: 816 ABI = FloatABI::Hard; 817 break; 818 case llvm::Triple::GNUEABI: 819 case llvm::Triple::MuslEABI: 820 case llvm::Triple::EABI: 821 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp 822 ABI = FloatABI::SoftFP; 823 break; 824 case llvm::Triple::Android: 825 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft; 826 break; 827 default: 828 // Assume "soft", but warn the user we are guessing. 829 if (Triple.isOSBinFormatMachO() && 830 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em) 831 ABI = FloatABI::Hard; 832 else 833 ABI = FloatABI::Soft; 834 835 if (Triple.getOS() != llvm::Triple::UnknownOS || 836 !Triple.isOSBinFormatMachO()) 837 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 838 break; 839 } 840 } 841 } 842 843 assert(ABI != FloatABI::Invalid && "must select an ABI"); 844 return ABI; 845 } 846 847 static void getARMTargetFeatures(const ToolChain &TC, 848 const llvm::Triple &Triple, 849 const ArgList &Args, 850 std::vector<const char *> &Features, 851 bool ForAS) { 852 const Driver &D = TC.getDriver(); 853 854 bool KernelOrKext = 855 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); 856 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); 857 const Arg *WaCPU = nullptr, *WaFPU = nullptr; 858 const Arg *WaHDiv = nullptr, *WaArch = nullptr; 859 860 if (!ForAS) { 861 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these 862 // yet (it uses the -mfloat-abi and -msoft-float options), and it is 863 // stripped out by the ARM target. We should probably pass this a new 864 // -target-option, which is handled by the -cc1/-cc1as invocation. 865 // 866 // FIXME2: For consistency, it would be ideal if we set up the target 867 // machine state the same when using the frontend or the assembler. We don't 868 // currently do that for the assembler, we pass the options directly to the 869 // backend and never even instantiate the frontend TargetInfo. If we did, 870 // and used its handleTargetFeatures hook, then we could ensure the 871 // assembler and the frontend behave the same. 872 873 // Use software floating point operations? 874 if (ABI == arm::FloatABI::Soft) 875 Features.push_back("+soft-float"); 876 877 // Use software floating point argument passing? 878 if (ABI != arm::FloatABI::Hard) 879 Features.push_back("+soft-float-abi"); 880 } else { 881 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down 882 // to the assembler correctly. 883 for (const Arg *A : 884 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { 885 StringRef Value = A->getValue(); 886 if (Value.startswith("-mfpu=")) { 887 WaFPU = A; 888 } else if (Value.startswith("-mcpu=")) { 889 WaCPU = A; 890 } else if (Value.startswith("-mhwdiv=")) { 891 WaHDiv = A; 892 } else if (Value.startswith("-march=")) { 893 WaArch = A; 894 } 895 } 896 } 897 898 // Check -march. ClangAs gives preference to -Wa,-march=. 899 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); 900 StringRef ArchName; 901 if (WaArch) { 902 if (ArchArg) 903 D.Diag(clang::diag::warn_drv_unused_argument) 904 << ArchArg->getAsString(Args); 905 ArchName = StringRef(WaArch->getValue()).substr(7); 906 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple); 907 // FIXME: Set Arch. 908 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args); 909 } else if (ArchArg) { 910 ArchName = ArchArg->getValue(); 911 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple); 912 } 913 914 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=. 915 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ); 916 StringRef CPUName; 917 if (WaCPU) { 918 if (CPUArg) 919 D.Diag(clang::diag::warn_drv_unused_argument) 920 << CPUArg->getAsString(Args); 921 CPUName = StringRef(WaCPU->getValue()).substr(6); 922 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple); 923 } else if (CPUArg) { 924 CPUName = CPUArg->getValue(); 925 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple); 926 } 927 928 // Add CPU features for generic CPUs 929 if (CPUName == "native") { 930 llvm::StringMap<bool> HostFeatures; 931 if (llvm::sys::getHostCPUFeatures(HostFeatures)) 932 for (auto &F : HostFeatures) 933 Features.push_back( 934 Args.MakeArgString((F.second ? "+" : "-") + F.first())); 935 } 936 937 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=. 938 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ); 939 if (WaFPU) { 940 if (FPUArg) 941 D.Diag(clang::diag::warn_drv_unused_argument) 942 << FPUArg->getAsString(Args); 943 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6), 944 Features); 945 } else if (FPUArg) { 946 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features); 947 } 948 949 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=. 950 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ); 951 if (WaHDiv) { 952 if (HDivArg) 953 D.Diag(clang::diag::warn_drv_unused_argument) 954 << HDivArg->getAsString(Args); 955 getARMHWDivFeatures(D, WaHDiv, Args, 956 StringRef(WaHDiv->getValue()).substr(8), Features); 957 } else if (HDivArg) 958 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features); 959 960 // Setting -msoft-float effectively disables NEON because of the GCC 961 // implementation, although the same isn't true of VFP or VFP3. 962 if (ABI == arm::FloatABI::Soft) { 963 Features.push_back("-neon"); 964 // Also need to explicitly disable features which imply NEON. 965 Features.push_back("-crypto"); 966 } 967 968 // En/disable crc code generation. 969 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) { 970 if (A->getOption().matches(options::OPT_mcrc)) 971 Features.push_back("+crc"); 972 else 973 Features.push_back("-crc"); 974 } 975 976 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If 977 // neither options are specified, see if we are compiling for kernel/kext and 978 // decide whether to pass "+long-calls" based on the OS and its version. 979 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls, 980 options::OPT_mno_long_calls)) { 981 if (A->getOption().matches(options::OPT_mlong_calls)) 982 Features.push_back("+long-calls"); 983 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) && 984 !Triple.isWatchOS()) { 985 Features.push_back("+long-calls"); 986 } 987 988 // Kernel code has more strict alignment requirements. 989 if (KernelOrKext) 990 Features.push_back("+strict-align"); 991 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, 992 options::OPT_munaligned_access)) { 993 if (A->getOption().matches(options::OPT_munaligned_access)) { 994 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2). 995 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) 996 D.Diag(diag::err_target_unsupported_unaligned) << "v6m"; 997 // v8M Baseline follows on from v6M, so doesn't support unaligned memory 998 // access either. 999 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline) 1000 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base"; 1001 } else 1002 Features.push_back("+strict-align"); 1003 } else { 1004 // Assume pre-ARMv6 doesn't support unaligned accesses. 1005 // 1006 // ARMv6 may or may not support unaligned accesses depending on the 1007 // SCTLR.U bit, which is architecture-specific. We assume ARMv6 1008 // Darwin and NetBSD targets support unaligned accesses, and others don't. 1009 // 1010 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit 1011 // which raises an alignment fault on unaligned accesses. Linux 1012 // defaults this bit to 0 and handles it as a system-wide (not 1013 // per-process) setting. It is therefore safe to assume that ARMv7+ 1014 // Linux targets support unaligned accesses. The same goes for NaCl. 1015 // 1016 // The above behavior is consistent with GCC. 1017 int VersionNum = getARMSubArchVersionNumber(Triple); 1018 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) { 1019 if (VersionNum < 6 || 1020 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) 1021 Features.push_back("+strict-align"); 1022 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) { 1023 if (VersionNum < 7) 1024 Features.push_back("+strict-align"); 1025 } else 1026 Features.push_back("+strict-align"); 1027 } 1028 1029 // llvm does not support reserving registers in general. There is support 1030 // for reserving r9 on ARM though (defined as a platform-specific register 1031 // in ARM EABI). 1032 if (Args.hasArg(options::OPT_ffixed_r9)) 1033 Features.push_back("+reserve-r9"); 1034 1035 // The kext linker doesn't know how to deal with movw/movt. 1036 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt)) 1037 Features.push_back("+no-movt"); 1038 } 1039 1040 void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args, 1041 ArgStringList &CmdArgs, bool KernelOrKext) const { 1042 // Select the ABI to use. 1043 // FIXME: Support -meabi. 1044 // FIXME: Parts of this are duplicated in the backend, unify this somehow. 1045 const char *ABIName = nullptr; 1046 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 1047 ABIName = A->getValue(); 1048 } else if (Triple.isOSBinFormatMachO()) { 1049 if (useAAPCSForMachO(Triple)) { 1050 ABIName = "aapcs"; 1051 } else if (Triple.isWatchABI()) { 1052 ABIName = "aapcs16"; 1053 } else { 1054 ABIName = "apcs-gnu"; 1055 } 1056 } else if (Triple.isOSWindows()) { 1057 // FIXME: this is invalid for WindowsCE 1058 ABIName = "aapcs"; 1059 } else { 1060 // Select the default based on the platform. 1061 switch (Triple.getEnvironment()) { 1062 case llvm::Triple::Android: 1063 case llvm::Triple::GNUEABI: 1064 case llvm::Triple::GNUEABIHF: 1065 case llvm::Triple::MuslEABI: 1066 case llvm::Triple::MuslEABIHF: 1067 ABIName = "aapcs-linux"; 1068 break; 1069 case llvm::Triple::EABIHF: 1070 case llvm::Triple::EABI: 1071 ABIName = "aapcs"; 1072 break; 1073 default: 1074 if (Triple.getOS() == llvm::Triple::NetBSD) 1075 ABIName = "apcs-gnu"; 1076 else 1077 ABIName = "aapcs"; 1078 break; 1079 } 1080 } 1081 CmdArgs.push_back("-target-abi"); 1082 CmdArgs.push_back(ABIName); 1083 1084 // Determine floating point ABI from the options & target defaults. 1085 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args); 1086 if (ABI == arm::FloatABI::Soft) { 1087 // Floating point operations and argument passing are soft. 1088 // FIXME: This changes CPP defines, we need -target-soft-float. 1089 CmdArgs.push_back("-msoft-float"); 1090 CmdArgs.push_back("-mfloat-abi"); 1091 CmdArgs.push_back("soft"); 1092 } else if (ABI == arm::FloatABI::SoftFP) { 1093 // Floating point operations are hard, but argument passing is soft. 1094 CmdArgs.push_back("-mfloat-abi"); 1095 CmdArgs.push_back("soft"); 1096 } else { 1097 // Floating point operations and argument passing are hard. 1098 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!"); 1099 CmdArgs.push_back("-mfloat-abi"); 1100 CmdArgs.push_back("hard"); 1101 } 1102 1103 // Forward the -mglobal-merge option for explicit control over the pass. 1104 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, 1105 options::OPT_mno_global_merge)) { 1106 CmdArgs.push_back("-backend-option"); 1107 if (A->getOption().matches(options::OPT_mno_global_merge)) 1108 CmdArgs.push_back("-arm-global-merge=false"); 1109 else 1110 CmdArgs.push_back("-arm-global-merge=true"); 1111 } 1112 1113 if (!Args.hasFlag(options::OPT_mimplicit_float, 1114 options::OPT_mno_implicit_float, true)) 1115 CmdArgs.push_back("-no-implicit-float"); 1116 } 1117 // ARM tools end. 1118 1119 /// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are 1120 /// targeting. 1121 static std::string getAArch64TargetCPU(const ArgList &Args) { 1122 Arg *A; 1123 std::string CPU; 1124 // If we have -mtune or -mcpu, use that. 1125 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) { 1126 CPU = StringRef(A->getValue()).lower(); 1127 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) { 1128 StringRef Mcpu = A->getValue(); 1129 CPU = Mcpu.split("+").first.lower(); 1130 } 1131 1132 // Handle CPU name is 'native'. 1133 if (CPU == "native") 1134 return llvm::sys::getHostCPUName(); 1135 else if (CPU.size()) 1136 return CPU; 1137 1138 // Make sure we pick "cyclone" if -arch is used. 1139 // FIXME: Should this be picked by checking the target triple instead? 1140 if (Args.getLastArg(options::OPT_arch)) 1141 return "cyclone"; 1142 1143 return "generic"; 1144 } 1145 1146 void Clang::AddAArch64TargetArgs(const ArgList &Args, 1147 ArgStringList &CmdArgs) const { 1148 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 1149 llvm::Triple Triple(TripleStr); 1150 1151 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) || 1152 Args.hasArg(options::OPT_mkernel) || 1153 Args.hasArg(options::OPT_fapple_kext)) 1154 CmdArgs.push_back("-disable-red-zone"); 1155 1156 if (!Args.hasFlag(options::OPT_mimplicit_float, 1157 options::OPT_mno_implicit_float, true)) 1158 CmdArgs.push_back("-no-implicit-float"); 1159 1160 const char *ABIName = nullptr; 1161 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) 1162 ABIName = A->getValue(); 1163 else if (Triple.isOSDarwin()) 1164 ABIName = "darwinpcs"; 1165 else 1166 ABIName = "aapcs"; 1167 1168 CmdArgs.push_back("-target-abi"); 1169 CmdArgs.push_back(ABIName); 1170 1171 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769, 1172 options::OPT_mno_fix_cortex_a53_835769)) { 1173 CmdArgs.push_back("-backend-option"); 1174 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769)) 1175 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1"); 1176 else 1177 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0"); 1178 } else if (Triple.isAndroid()) { 1179 // Enabled A53 errata (835769) workaround by default on android 1180 CmdArgs.push_back("-backend-option"); 1181 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1"); 1182 } 1183 1184 // Forward the -mglobal-merge option for explicit control over the pass. 1185 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, 1186 options::OPT_mno_global_merge)) { 1187 CmdArgs.push_back("-backend-option"); 1188 if (A->getOption().matches(options::OPT_mno_global_merge)) 1189 CmdArgs.push_back("-aarch64-global-merge=false"); 1190 else 1191 CmdArgs.push_back("-aarch64-global-merge=true"); 1192 } 1193 } 1194 1195 // Get CPU and ABI names. They are not independent 1196 // so we have to calculate them together. 1197 void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple, 1198 StringRef &CPUName, StringRef &ABIName) { 1199 const char *DefMips32CPU = "mips32r2"; 1200 const char *DefMips64CPU = "mips64r2"; 1201 1202 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the 1203 // default for mips64(el)?-img-linux-gnu. 1204 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies && 1205 Triple.getEnvironment() == llvm::Triple::GNU) { 1206 DefMips32CPU = "mips32r6"; 1207 DefMips64CPU = "mips64r6"; 1208 } 1209 1210 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android). 1211 if (Triple.isAndroid()) { 1212 DefMips32CPU = "mips32"; 1213 DefMips64CPU = "mips64r6"; 1214 } 1215 1216 // MIPS3 is the default for mips64*-unknown-openbsd. 1217 if (Triple.getOS() == llvm::Triple::OpenBSD) 1218 DefMips64CPU = "mips3"; 1219 1220 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ)) 1221 CPUName = A->getValue(); 1222 1223 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 1224 ABIName = A->getValue(); 1225 // Convert a GNU style Mips ABI name to the name 1226 // accepted by LLVM Mips backend. 1227 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName) 1228 .Case("32", "o32") 1229 .Case("64", "n64") 1230 .Default(ABIName); 1231 } 1232 1233 // Setup default CPU and ABI names. 1234 if (CPUName.empty() && ABIName.empty()) { 1235 switch (Triple.getArch()) { 1236 default: 1237 llvm_unreachable("Unexpected triple arch name"); 1238 case llvm::Triple::mips: 1239 case llvm::Triple::mipsel: 1240 CPUName = DefMips32CPU; 1241 break; 1242 case llvm::Triple::mips64: 1243 case llvm::Triple::mips64el: 1244 CPUName = DefMips64CPU; 1245 break; 1246 } 1247 } 1248 1249 if (ABIName.empty() && 1250 (Triple.getVendor() == llvm::Triple::MipsTechnologies || 1251 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) { 1252 ABIName = llvm::StringSwitch<const char *>(CPUName) 1253 .Case("mips1", "o32") 1254 .Case("mips2", "o32") 1255 .Case("mips3", "n64") 1256 .Case("mips4", "n64") 1257 .Case("mips5", "n64") 1258 .Case("mips32", "o32") 1259 .Case("mips32r2", "o32") 1260 .Case("mips32r3", "o32") 1261 .Case("mips32r5", "o32") 1262 .Case("mips32r6", "o32") 1263 .Case("mips64", "n64") 1264 .Case("mips64r2", "n64") 1265 .Case("mips64r3", "n64") 1266 .Case("mips64r5", "n64") 1267 .Case("mips64r6", "n64") 1268 .Case("octeon", "n64") 1269 .Case("p5600", "o32") 1270 .Default(""); 1271 } 1272 1273 if (ABIName.empty()) { 1274 // Deduce ABI name from the target triple. 1275 if (Triple.getArch() == llvm::Triple::mips || 1276 Triple.getArch() == llvm::Triple::mipsel) 1277 ABIName = "o32"; 1278 else 1279 ABIName = "n64"; 1280 } 1281 1282 if (CPUName.empty()) { 1283 // Deduce CPU name from ABI name. 1284 CPUName = llvm::StringSwitch<const char *>(ABIName) 1285 .Case("o32", DefMips32CPU) 1286 .Cases("n32", "n64", DefMips64CPU) 1287 .Default(""); 1288 } 1289 1290 // FIXME: Warn on inconsistent use of -march and -mabi. 1291 } 1292 1293 std::string mips::getMipsABILibSuffix(const ArgList &Args, 1294 const llvm::Triple &Triple) { 1295 StringRef CPUName, ABIName; 1296 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); 1297 return llvm::StringSwitch<std::string>(ABIName) 1298 .Case("o32", "") 1299 .Case("n32", "32") 1300 .Case("n64", "64"); 1301 } 1302 1303 // Convert ABI name to the GNU tools acceptable variant. 1304 static StringRef getGnuCompatibleMipsABIName(StringRef ABI) { 1305 return llvm::StringSwitch<llvm::StringRef>(ABI) 1306 .Case("o32", "32") 1307 .Case("n64", "64") 1308 .Default(ABI); 1309 } 1310 1311 // Select the MIPS float ABI as determined by -msoft-float, -mhard-float, 1312 // and -mfloat-abi=. 1313 static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) { 1314 mips::FloatABI ABI = mips::FloatABI::Invalid; 1315 if (Arg *A = 1316 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, 1317 options::OPT_mfloat_abi_EQ)) { 1318 if (A->getOption().matches(options::OPT_msoft_float)) 1319 ABI = mips::FloatABI::Soft; 1320 else if (A->getOption().matches(options::OPT_mhard_float)) 1321 ABI = mips::FloatABI::Hard; 1322 else { 1323 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue()) 1324 .Case("soft", mips::FloatABI::Soft) 1325 .Case("hard", mips::FloatABI::Hard) 1326 .Default(mips::FloatABI::Invalid); 1327 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) { 1328 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); 1329 ABI = mips::FloatABI::Hard; 1330 } 1331 } 1332 } 1333 1334 // If unspecified, choose the default based on the platform. 1335 if (ABI == mips::FloatABI::Invalid) { 1336 // Assume "hard", because it's a default value used by gcc. 1337 // When we start to recognize specific target MIPS processors, 1338 // we will be able to select the default more correctly. 1339 ABI = mips::FloatABI::Hard; 1340 } 1341 1342 assert(ABI != mips::FloatABI::Invalid && "must select an ABI"); 1343 return ABI; 1344 } 1345 1346 static void AddTargetFeature(const ArgList &Args, 1347 std::vector<const char *> &Features, 1348 OptSpecifier OnOpt, OptSpecifier OffOpt, 1349 StringRef FeatureName) { 1350 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) { 1351 if (A->getOption().matches(OnOpt)) 1352 Features.push_back(Args.MakeArgString("+" + FeatureName)); 1353 else 1354 Features.push_back(Args.MakeArgString("-" + FeatureName)); 1355 } 1356 } 1357 1358 static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple, 1359 const ArgList &Args, 1360 std::vector<const char *> &Features) { 1361 StringRef CPUName; 1362 StringRef ABIName; 1363 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); 1364 ABIName = getGnuCompatibleMipsABIName(ABIName); 1365 1366 AddTargetFeature(Args, Features, options::OPT_mno_abicalls, 1367 options::OPT_mabicalls, "noabicalls"); 1368 1369 mips::FloatABI FloatABI = getMipsFloatABI(D, Args); 1370 if (FloatABI == mips::FloatABI::Soft) { 1371 // FIXME: Note, this is a hack. We need to pass the selected float 1372 // mode to the MipsTargetInfoBase to define appropriate macros there. 1373 // Now it is the only method. 1374 Features.push_back("+soft-float"); 1375 } 1376 1377 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) { 1378 StringRef Val = StringRef(A->getValue()); 1379 if (Val == "2008") { 1380 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008) 1381 Features.push_back("+nan2008"); 1382 else { 1383 Features.push_back("-nan2008"); 1384 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName; 1385 } 1386 } else if (Val == "legacy") { 1387 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy) 1388 Features.push_back("-nan2008"); 1389 else { 1390 Features.push_back("+nan2008"); 1391 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName; 1392 } 1393 } else 1394 D.Diag(diag::err_drv_unsupported_option_argument) 1395 << A->getOption().getName() << Val; 1396 } 1397 1398 AddTargetFeature(Args, Features, options::OPT_msingle_float, 1399 options::OPT_mdouble_float, "single-float"); 1400 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16, 1401 "mips16"); 1402 AddTargetFeature(Args, Features, options::OPT_mmicromips, 1403 options::OPT_mno_micromips, "micromips"); 1404 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp, 1405 "dsp"); 1406 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2, 1407 "dspr2"); 1408 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa, 1409 "msa"); 1410 1411 // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32 1412 // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and 1413 // nooddspreg. 1414 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx, 1415 options::OPT_mfp64)) { 1416 if (A->getOption().matches(options::OPT_mfp32)) 1417 Features.push_back(Args.MakeArgString("-fp64")); 1418 else if (A->getOption().matches(options::OPT_mfpxx)) { 1419 Features.push_back(Args.MakeArgString("+fpxx")); 1420 Features.push_back(Args.MakeArgString("+nooddspreg")); 1421 } else 1422 Features.push_back(Args.MakeArgString("+fp64")); 1423 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) { 1424 Features.push_back(Args.MakeArgString("+fpxx")); 1425 Features.push_back(Args.MakeArgString("+nooddspreg")); 1426 } else if (mips::isFP64ADefault(Triple, CPUName)) { 1427 Features.push_back(Args.MakeArgString("+fp64")); 1428 Features.push_back(Args.MakeArgString("+nooddspreg")); 1429 } 1430 1431 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg, 1432 options::OPT_modd_spreg, "nooddspreg"); 1433 } 1434 1435 void Clang::AddMIPSTargetArgs(const ArgList &Args, 1436 ArgStringList &CmdArgs) const { 1437 const Driver &D = getToolChain().getDriver(); 1438 StringRef CPUName; 1439 StringRef ABIName; 1440 const llvm::Triple &Triple = getToolChain().getTriple(); 1441 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); 1442 1443 CmdArgs.push_back("-target-abi"); 1444 CmdArgs.push_back(ABIName.data()); 1445 1446 mips::FloatABI ABI = getMipsFloatABI(D, Args); 1447 if (ABI == mips::FloatABI::Soft) { 1448 // Floating point operations and argument passing are soft. 1449 CmdArgs.push_back("-msoft-float"); 1450 CmdArgs.push_back("-mfloat-abi"); 1451 CmdArgs.push_back("soft"); 1452 } else { 1453 // Floating point operations and argument passing are hard. 1454 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!"); 1455 CmdArgs.push_back("-mfloat-abi"); 1456 CmdArgs.push_back("hard"); 1457 } 1458 1459 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) { 1460 if (A->getOption().matches(options::OPT_mxgot)) { 1461 CmdArgs.push_back("-mllvm"); 1462 CmdArgs.push_back("-mxgot"); 1463 } 1464 } 1465 1466 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1, 1467 options::OPT_mno_ldc1_sdc1)) { 1468 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) { 1469 CmdArgs.push_back("-mllvm"); 1470 CmdArgs.push_back("-mno-ldc1-sdc1"); 1471 } 1472 } 1473 1474 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division, 1475 options::OPT_mno_check_zero_division)) { 1476 if (A->getOption().matches(options::OPT_mno_check_zero_division)) { 1477 CmdArgs.push_back("-mllvm"); 1478 CmdArgs.push_back("-mno-check-zero-division"); 1479 } 1480 } 1481 1482 if (Arg *A = Args.getLastArg(options::OPT_G)) { 1483 StringRef v = A->getValue(); 1484 CmdArgs.push_back("-mllvm"); 1485 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v)); 1486 A->claim(); 1487 } 1488 1489 if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) { 1490 StringRef Val = StringRef(A->getValue()); 1491 if (mips::hasCompactBranches(CPUName)) { 1492 if (Val == "never" || Val == "always" || Val == "optimal") { 1493 CmdArgs.push_back("-mllvm"); 1494 CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val)); 1495 } else 1496 D.Diag(diag::err_drv_unsupported_option_argument) 1497 << A->getOption().getName() << Val; 1498 } else 1499 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName; 1500 } 1501 } 1502 1503 /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting. 1504 static std::string getPPCTargetCPU(const ArgList &Args) { 1505 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 1506 StringRef CPUName = A->getValue(); 1507 1508 if (CPUName == "native") { 1509 std::string CPU = llvm::sys::getHostCPUName(); 1510 if (!CPU.empty() && CPU != "generic") 1511 return CPU; 1512 else 1513 return ""; 1514 } 1515 1516 return llvm::StringSwitch<const char *>(CPUName) 1517 .Case("common", "generic") 1518 .Case("440", "440") 1519 .Case("440fp", "440") 1520 .Case("450", "450") 1521 .Case("601", "601") 1522 .Case("602", "602") 1523 .Case("603", "603") 1524 .Case("603e", "603e") 1525 .Case("603ev", "603ev") 1526 .Case("604", "604") 1527 .Case("604e", "604e") 1528 .Case("620", "620") 1529 .Case("630", "pwr3") 1530 .Case("G3", "g3") 1531 .Case("7400", "7400") 1532 .Case("G4", "g4") 1533 .Case("7450", "7450") 1534 .Case("G4+", "g4+") 1535 .Case("750", "750") 1536 .Case("970", "970") 1537 .Case("G5", "g5") 1538 .Case("a2", "a2") 1539 .Case("a2q", "a2q") 1540 .Case("e500mc", "e500mc") 1541 .Case("e5500", "e5500") 1542 .Case("power3", "pwr3") 1543 .Case("power4", "pwr4") 1544 .Case("power5", "pwr5") 1545 .Case("power5x", "pwr5x") 1546 .Case("power6", "pwr6") 1547 .Case("power6x", "pwr6x") 1548 .Case("power7", "pwr7") 1549 .Case("power8", "pwr8") 1550 .Case("power9", "pwr9") 1551 .Case("pwr3", "pwr3") 1552 .Case("pwr4", "pwr4") 1553 .Case("pwr5", "pwr5") 1554 .Case("pwr5x", "pwr5x") 1555 .Case("pwr6", "pwr6") 1556 .Case("pwr6x", "pwr6x") 1557 .Case("pwr7", "pwr7") 1558 .Case("pwr8", "pwr8") 1559 .Case("pwr9", "pwr9") 1560 .Case("powerpc", "ppc") 1561 .Case("powerpc64", "ppc64") 1562 .Case("powerpc64le", "ppc64le") 1563 .Default(""); 1564 } 1565 1566 return ""; 1567 } 1568 1569 static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple, 1570 const ArgList &Args, 1571 std::vector<const char *> &Features) { 1572 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group); 1573 1574 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args); 1575 if (FloatABI == ppc::FloatABI::Soft && 1576 !(Triple.getArch() == llvm::Triple::ppc64 || 1577 Triple.getArch() == llvm::Triple::ppc64le)) 1578 Features.push_back("+soft-float"); 1579 else if (FloatABI == ppc::FloatABI::Soft && 1580 (Triple.getArch() == llvm::Triple::ppc64 || 1581 Triple.getArch() == llvm::Triple::ppc64le)) 1582 D.Diag(diag::err_drv_invalid_mfloat_abi) 1583 << "soft float is not supported for ppc64"; 1584 1585 // Altivec is a bit weird, allow overriding of the Altivec feature here. 1586 AddTargetFeature(Args, Features, options::OPT_faltivec, 1587 options::OPT_fno_altivec, "altivec"); 1588 } 1589 1590 ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) { 1591 ppc::FloatABI ABI = ppc::FloatABI::Invalid; 1592 if (Arg *A = 1593 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, 1594 options::OPT_mfloat_abi_EQ)) { 1595 if (A->getOption().matches(options::OPT_msoft_float)) 1596 ABI = ppc::FloatABI::Soft; 1597 else if (A->getOption().matches(options::OPT_mhard_float)) 1598 ABI = ppc::FloatABI::Hard; 1599 else { 1600 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue()) 1601 .Case("soft", ppc::FloatABI::Soft) 1602 .Case("hard", ppc::FloatABI::Hard) 1603 .Default(ppc::FloatABI::Invalid); 1604 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) { 1605 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); 1606 ABI = ppc::FloatABI::Hard; 1607 } 1608 } 1609 } 1610 1611 // If unspecified, choose the default based on the platform. 1612 if (ABI == ppc::FloatABI::Invalid) { 1613 ABI = ppc::FloatABI::Hard; 1614 } 1615 1616 return ABI; 1617 } 1618 1619 void Clang::AddPPCTargetArgs(const ArgList &Args, 1620 ArgStringList &CmdArgs) const { 1621 // Select the ABI to use. 1622 const char *ABIName = nullptr; 1623 if (getToolChain().getTriple().isOSLinux()) 1624 switch (getToolChain().getArch()) { 1625 case llvm::Triple::ppc64: { 1626 // When targeting a processor that supports QPX, or if QPX is 1627 // specifically enabled, default to using the ABI that supports QPX (so 1628 // long as it is not specifically disabled). 1629 bool HasQPX = false; 1630 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 1631 HasQPX = A->getValue() == StringRef("a2q"); 1632 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX); 1633 if (HasQPX) { 1634 ABIName = "elfv1-qpx"; 1635 break; 1636 } 1637 1638 ABIName = "elfv1"; 1639 break; 1640 } 1641 case llvm::Triple::ppc64le: 1642 ABIName = "elfv2"; 1643 break; 1644 default: 1645 break; 1646 } 1647 1648 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) 1649 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore 1650 // the option if given as we don't have backend support for any targets 1651 // that don't use the altivec abi. 1652 if (StringRef(A->getValue()) != "altivec") 1653 ABIName = A->getValue(); 1654 1655 ppc::FloatABI FloatABI = 1656 ppc::getPPCFloatABI(getToolChain().getDriver(), Args); 1657 1658 if (FloatABI == ppc::FloatABI::Soft) { 1659 // Floating point operations and argument passing are soft. 1660 CmdArgs.push_back("-msoft-float"); 1661 CmdArgs.push_back("-mfloat-abi"); 1662 CmdArgs.push_back("soft"); 1663 } else { 1664 // Floating point operations and argument passing are hard. 1665 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!"); 1666 CmdArgs.push_back("-mfloat-abi"); 1667 CmdArgs.push_back("hard"); 1668 } 1669 1670 if (ABIName) { 1671 CmdArgs.push_back("-target-abi"); 1672 CmdArgs.push_back(ABIName); 1673 } 1674 } 1675 1676 bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) { 1677 Arg *A = Args.getLastArg(options::OPT_mabi_EQ); 1678 return A && (A->getValue() == StringRef(Value)); 1679 } 1680 1681 /// Get the (LLVM) name of the R600 gpu we are targeting. 1682 static std::string getR600TargetGPU(const ArgList &Args) { 1683 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 1684 const char *GPUName = A->getValue(); 1685 return llvm::StringSwitch<const char *>(GPUName) 1686 .Cases("rv630", "rv635", "r600") 1687 .Cases("rv610", "rv620", "rs780", "rs880") 1688 .Case("rv740", "rv770") 1689 .Case("palm", "cedar") 1690 .Cases("sumo", "sumo2", "sumo") 1691 .Case("hemlock", "cypress") 1692 .Case("aruba", "cayman") 1693 .Default(GPUName); 1694 } 1695 return ""; 1696 } 1697 1698 static std::string getLanaiTargetCPU(const ArgList &Args) { 1699 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 1700 return A->getValue(); 1701 } 1702 return ""; 1703 } 1704 1705 sparc::FloatABI sparc::getSparcFloatABI(const Driver &D, 1706 const ArgList &Args) { 1707 sparc::FloatABI ABI = sparc::FloatABI::Invalid; 1708 if (Arg *A = 1709 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, 1710 options::OPT_mfloat_abi_EQ)) { 1711 if (A->getOption().matches(options::OPT_msoft_float)) 1712 ABI = sparc::FloatABI::Soft; 1713 else if (A->getOption().matches(options::OPT_mhard_float)) 1714 ABI = sparc::FloatABI::Hard; 1715 else { 1716 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue()) 1717 .Case("soft", sparc::FloatABI::Soft) 1718 .Case("hard", sparc::FloatABI::Hard) 1719 .Default(sparc::FloatABI::Invalid); 1720 if (ABI == sparc::FloatABI::Invalid && 1721 !StringRef(A->getValue()).empty()) { 1722 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); 1723 ABI = sparc::FloatABI::Hard; 1724 } 1725 } 1726 } 1727 1728 // If unspecified, choose the default based on the platform. 1729 // Only the hard-float ABI on Sparc is standardized, and it is the 1730 // default. GCC also supports a nonstandard soft-float ABI mode, also 1731 // implemented in LLVM. However as this is not standard we set the default 1732 // to be hard-float. 1733 if (ABI == sparc::FloatABI::Invalid) { 1734 ABI = sparc::FloatABI::Hard; 1735 } 1736 1737 return ABI; 1738 } 1739 1740 static void getSparcTargetFeatures(const Driver &D, const ArgList &Args, 1741 std::vector<const char *> &Features) { 1742 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args); 1743 if (FloatABI == sparc::FloatABI::Soft) 1744 Features.push_back("+soft-float"); 1745 } 1746 1747 void Clang::AddSparcTargetArgs(const ArgList &Args, 1748 ArgStringList &CmdArgs) const { 1749 sparc::FloatABI FloatABI = 1750 sparc::getSparcFloatABI(getToolChain().getDriver(), Args); 1751 1752 if (FloatABI == sparc::FloatABI::Soft) { 1753 // Floating point operations and argument passing are soft. 1754 CmdArgs.push_back("-msoft-float"); 1755 CmdArgs.push_back("-mfloat-abi"); 1756 CmdArgs.push_back("soft"); 1757 } else { 1758 // Floating point operations and argument passing are hard. 1759 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!"); 1760 CmdArgs.push_back("-mfloat-abi"); 1761 CmdArgs.push_back("hard"); 1762 } 1763 } 1764 1765 void Clang::AddSystemZTargetArgs(const ArgList &Args, 1766 ArgStringList &CmdArgs) const { 1767 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false)) 1768 CmdArgs.push_back("-mbackchain"); 1769 } 1770 1771 static const char *getSystemZTargetCPU(const ArgList &Args) { 1772 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 1773 return A->getValue(); 1774 return "z10"; 1775 } 1776 1777 static void getSystemZTargetFeatures(const ArgList &Args, 1778 std::vector<const char *> &Features) { 1779 // -m(no-)htm overrides use of the transactional-execution facility. 1780 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) { 1781 if (A->getOption().matches(options::OPT_mhtm)) 1782 Features.push_back("+transactional-execution"); 1783 else 1784 Features.push_back("-transactional-execution"); 1785 } 1786 // -m(no-)vx overrides use of the vector facility. 1787 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) { 1788 if (A->getOption().matches(options::OPT_mvx)) 1789 Features.push_back("+vector"); 1790 else 1791 Features.push_back("-vector"); 1792 } 1793 } 1794 1795 static const char *getX86TargetCPU(const ArgList &Args, 1796 const llvm::Triple &Triple) { 1797 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 1798 if (StringRef(A->getValue()) != "native") { 1799 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h") 1800 return "core-avx2"; 1801 1802 return A->getValue(); 1803 } 1804 1805 // FIXME: Reject attempts to use -march=native unless the target matches 1806 // the host. 1807 // 1808 // FIXME: We should also incorporate the detected target features for use 1809 // with -native. 1810 std::string CPU = llvm::sys::getHostCPUName(); 1811 if (!CPU.empty() && CPU != "generic") 1812 return Args.MakeArgString(CPU); 1813 } 1814 1815 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) { 1816 // Mapping built by referring to X86TargetInfo::getDefaultFeatures(). 1817 StringRef Arch = A->getValue(); 1818 const char *CPU; 1819 if (Triple.getArch() == llvm::Triple::x86) { 1820 CPU = llvm::StringSwitch<const char *>(Arch) 1821 .Case("IA32", "i386") 1822 .Case("SSE", "pentium3") 1823 .Case("SSE2", "pentium4") 1824 .Case("AVX", "sandybridge") 1825 .Case("AVX2", "haswell") 1826 .Default(nullptr); 1827 } else { 1828 CPU = llvm::StringSwitch<const char *>(Arch) 1829 .Case("AVX", "sandybridge") 1830 .Case("AVX2", "haswell") 1831 .Default(nullptr); 1832 } 1833 if (CPU) 1834 return CPU; 1835 } 1836 1837 // Select the default CPU if none was given (or detection failed). 1838 1839 if (Triple.getArch() != llvm::Triple::x86_64 && 1840 Triple.getArch() != llvm::Triple::x86) 1841 return nullptr; // This routine is only handling x86 targets. 1842 1843 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64; 1844 1845 // FIXME: Need target hooks. 1846 if (Triple.isOSDarwin()) { 1847 if (Triple.getArchName() == "x86_64h") 1848 return "core-avx2"; 1849 return Is64Bit ? "core2" : "yonah"; 1850 } 1851 1852 // Set up default CPU name for PS4 compilers. 1853 if (Triple.isPS4CPU()) 1854 return "btver2"; 1855 1856 // On Android use targets compatible with gcc 1857 if (Triple.isAndroid()) 1858 return Is64Bit ? "x86-64" : "i686"; 1859 1860 // Everything else goes to x86-64 in 64-bit mode. 1861 if (Is64Bit) 1862 return "x86-64"; 1863 1864 switch (Triple.getOS()) { 1865 case llvm::Triple::FreeBSD: 1866 case llvm::Triple::NetBSD: 1867 case llvm::Triple::OpenBSD: 1868 return "i486"; 1869 case llvm::Triple::Haiku: 1870 return "i586"; 1871 case llvm::Triple::Bitrig: 1872 return "i686"; 1873 default: 1874 // Fallback to p4. 1875 return "pentium4"; 1876 } 1877 } 1878 1879 /// Get the (LLVM) name of the WebAssembly cpu we are targeting. 1880 static StringRef getWebAssemblyTargetCPU(const ArgList &Args) { 1881 // If we have -mcpu=, use that. 1882 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 1883 StringRef CPU = A->getValue(); 1884 1885 #ifdef __wasm__ 1886 // Handle "native" by examining the host. "native" isn't meaningful when 1887 // cross compiling, so only support this when the host is also WebAssembly. 1888 if (CPU == "native") 1889 return llvm::sys::getHostCPUName(); 1890 #endif 1891 1892 return CPU; 1893 } 1894 1895 return "generic"; 1896 } 1897 1898 static std::string getCPUName(const ArgList &Args, const llvm::Triple &T, 1899 bool FromAs = false) { 1900 switch (T.getArch()) { 1901 default: 1902 return ""; 1903 1904 case llvm::Triple::aarch64: 1905 case llvm::Triple::aarch64_be: 1906 return getAArch64TargetCPU(Args); 1907 1908 case llvm::Triple::arm: 1909 case llvm::Triple::armeb: 1910 case llvm::Triple::thumb: 1911 case llvm::Triple::thumbeb: { 1912 StringRef MArch, MCPU; 1913 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs); 1914 return arm::getARMTargetCPU(MCPU, MArch, T); 1915 } 1916 case llvm::Triple::mips: 1917 case llvm::Triple::mipsel: 1918 case llvm::Triple::mips64: 1919 case llvm::Triple::mips64el: { 1920 StringRef CPUName; 1921 StringRef ABIName; 1922 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName); 1923 return CPUName; 1924 } 1925 1926 case llvm::Triple::nvptx: 1927 case llvm::Triple::nvptx64: 1928 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 1929 return A->getValue(); 1930 return ""; 1931 1932 case llvm::Triple::ppc: 1933 case llvm::Triple::ppc64: 1934 case llvm::Triple::ppc64le: { 1935 std::string TargetCPUName = getPPCTargetCPU(Args); 1936 // LLVM may default to generating code for the native CPU, 1937 // but, like gcc, we default to a more generic option for 1938 // each architecture. (except on Darwin) 1939 if (TargetCPUName.empty() && !T.isOSDarwin()) { 1940 if (T.getArch() == llvm::Triple::ppc64) 1941 TargetCPUName = "ppc64"; 1942 else if (T.getArch() == llvm::Triple::ppc64le) 1943 TargetCPUName = "ppc64le"; 1944 else 1945 TargetCPUName = "ppc"; 1946 } 1947 return TargetCPUName; 1948 } 1949 1950 case llvm::Triple::sparc: 1951 case llvm::Triple::sparcel: 1952 case llvm::Triple::sparcv9: 1953 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 1954 return A->getValue(); 1955 return ""; 1956 1957 case llvm::Triple::x86: 1958 case llvm::Triple::x86_64: 1959 return getX86TargetCPU(Args, T); 1960 1961 case llvm::Triple::hexagon: 1962 return "hexagon" + 1963 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); 1964 1965 case llvm::Triple::lanai: 1966 return getLanaiTargetCPU(Args); 1967 1968 case llvm::Triple::systemz: 1969 return getSystemZTargetCPU(Args); 1970 1971 case llvm::Triple::r600: 1972 case llvm::Triple::amdgcn: 1973 return getR600TargetGPU(Args); 1974 1975 case llvm::Triple::wasm32: 1976 case llvm::Triple::wasm64: 1977 return getWebAssemblyTargetCPU(Args); 1978 } 1979 } 1980 1981 static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, 1982 ArgStringList &CmdArgs, bool IsThinLTO) { 1983 // Tell the linker to load the plugin. This has to come before AddLinkerInputs 1984 // as gold requires -plugin to come before any -plugin-opt that -Wl might 1985 // forward. 1986 CmdArgs.push_back("-plugin"); 1987 std::string Plugin = 1988 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so"; 1989 CmdArgs.push_back(Args.MakeArgString(Plugin)); 1990 1991 // Try to pass driver level flags relevant to LTO code generation down to 1992 // the plugin. 1993 1994 // Handle flags for selecting CPU variants. 1995 std::string CPU = getCPUName(Args, ToolChain.getTriple()); 1996 if (!CPU.empty()) 1997 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU)); 1998 1999 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 2000 StringRef OOpt; 2001 if (A->getOption().matches(options::OPT_O4) || 2002 A->getOption().matches(options::OPT_Ofast)) 2003 OOpt = "3"; 2004 else if (A->getOption().matches(options::OPT_O)) 2005 OOpt = A->getValue(); 2006 else if (A->getOption().matches(options::OPT_O0)) 2007 OOpt = "0"; 2008 if (!OOpt.empty()) 2009 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt)); 2010 } 2011 2012 if (IsThinLTO) 2013 CmdArgs.push_back("-plugin-opt=thinlto"); 2014 2015 // If an explicit debugger tuning argument appeared, pass it along. 2016 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group, 2017 options::OPT_ggdbN_Group)) { 2018 if (A->getOption().matches(options::OPT_glldb)) 2019 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb"); 2020 else if (A->getOption().matches(options::OPT_gsce)) 2021 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce"); 2022 else 2023 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb"); 2024 } 2025 } 2026 2027 /// This is a helper function for validating the optional refinement step 2028 /// parameter in reciprocal argument strings. Return false if there is an error 2029 /// parsing the refinement step. Otherwise, return true and set the Position 2030 /// of the refinement step in the input string. 2031 static bool getRefinementStep(StringRef In, const Driver &D, 2032 const Arg &A, size_t &Position) { 2033 const char RefinementStepToken = ':'; 2034 Position = In.find(RefinementStepToken); 2035 if (Position != StringRef::npos) { 2036 StringRef Option = A.getOption().getName(); 2037 StringRef RefStep = In.substr(Position + 1); 2038 // Allow exactly one numeric character for the additional refinement 2039 // step parameter. This is reasonable for all currently-supported 2040 // operations and architectures because we would expect that a larger value 2041 // of refinement steps would cause the estimate "optimization" to 2042 // under-perform the native operation. Also, if the estimate does not 2043 // converge quickly, it probably will not ever converge, so further 2044 // refinement steps will not produce a better answer. 2045 if (RefStep.size() != 1) { 2046 D.Diag(diag::err_drv_invalid_value) << Option << RefStep; 2047 return false; 2048 } 2049 char RefStepChar = RefStep[0]; 2050 if (RefStepChar < '0' || RefStepChar > '9') { 2051 D.Diag(diag::err_drv_invalid_value) << Option << RefStep; 2052 return false; 2053 } 2054 } 2055 return true; 2056 } 2057 2058 /// The -mrecip flag requires processing of many optional parameters. 2059 static void ParseMRecip(const Driver &D, const ArgList &Args, 2060 ArgStringList &OutStrings) { 2061 StringRef DisabledPrefixIn = "!"; 2062 StringRef DisabledPrefixOut = "!"; 2063 StringRef EnabledPrefixOut = ""; 2064 StringRef Out = "-mrecip="; 2065 2066 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ); 2067 if (!A) 2068 return; 2069 2070 unsigned NumOptions = A->getNumValues(); 2071 if (NumOptions == 0) { 2072 // No option is the same as "all". 2073 OutStrings.push_back(Args.MakeArgString(Out + "all")); 2074 return; 2075 } 2076 2077 // Pass through "all", "none", or "default" with an optional refinement step. 2078 if (NumOptions == 1) { 2079 StringRef Val = A->getValue(0); 2080 size_t RefStepLoc; 2081 if (!getRefinementStep(Val, D, *A, RefStepLoc)) 2082 return; 2083 StringRef ValBase = Val.slice(0, RefStepLoc); 2084 if (ValBase == "all" || ValBase == "none" || ValBase == "default") { 2085 OutStrings.push_back(Args.MakeArgString(Out + Val)); 2086 return; 2087 } 2088 } 2089 2090 // Each reciprocal type may be enabled or disabled individually. 2091 // Check each input value for validity, concatenate them all back together, 2092 // and pass through. 2093 2094 llvm::StringMap<bool> OptionStrings; 2095 OptionStrings.insert(std::make_pair("divd", false)); 2096 OptionStrings.insert(std::make_pair("divf", false)); 2097 OptionStrings.insert(std::make_pair("vec-divd", false)); 2098 OptionStrings.insert(std::make_pair("vec-divf", false)); 2099 OptionStrings.insert(std::make_pair("sqrtd", false)); 2100 OptionStrings.insert(std::make_pair("sqrtf", false)); 2101 OptionStrings.insert(std::make_pair("vec-sqrtd", false)); 2102 OptionStrings.insert(std::make_pair("vec-sqrtf", false)); 2103 2104 for (unsigned i = 0; i != NumOptions; ++i) { 2105 StringRef Val = A->getValue(i); 2106 2107 bool IsDisabled = Val.startswith(DisabledPrefixIn); 2108 // Ignore the disablement token for string matching. 2109 if (IsDisabled) 2110 Val = Val.substr(1); 2111 2112 size_t RefStep; 2113 if (!getRefinementStep(Val, D, *A, RefStep)) 2114 return; 2115 2116 StringRef ValBase = Val.slice(0, RefStep); 2117 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase); 2118 if (OptionIter == OptionStrings.end()) { 2119 // Try again specifying float suffix. 2120 OptionIter = OptionStrings.find(ValBase.str() + 'f'); 2121 if (OptionIter == OptionStrings.end()) { 2122 // The input name did not match any known option string. 2123 D.Diag(diag::err_drv_unknown_argument) << Val; 2124 return; 2125 } 2126 // The option was specified without a float or double suffix. 2127 // Make sure that the double entry was not already specified. 2128 // The float entry will be checked below. 2129 if (OptionStrings[ValBase.str() + 'd']) { 2130 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val; 2131 return; 2132 } 2133 } 2134 2135 if (OptionIter->second == true) { 2136 // Duplicate option specified. 2137 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val; 2138 return; 2139 } 2140 2141 // Mark the matched option as found. Do not allow duplicate specifiers. 2142 OptionIter->second = true; 2143 2144 // If the precision was not specified, also mark the double entry as found. 2145 if (ValBase.back() != 'f' && ValBase.back() != 'd') 2146 OptionStrings[ValBase.str() + 'd'] = true; 2147 2148 // Build the output string. 2149 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut; 2150 Out = Args.MakeArgString(Out + Prefix + Val); 2151 if (i != NumOptions - 1) 2152 Out = Args.MakeArgString(Out + ","); 2153 } 2154 2155 OutStrings.push_back(Args.MakeArgString(Out)); 2156 } 2157 2158 static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple, 2159 const ArgList &Args, 2160 std::vector<const char *> &Features) { 2161 // If -march=native, autodetect the feature list. 2162 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 2163 if (StringRef(A->getValue()) == "native") { 2164 llvm::StringMap<bool> HostFeatures; 2165 if (llvm::sys::getHostCPUFeatures(HostFeatures)) 2166 for (auto &F : HostFeatures) 2167 Features.push_back( 2168 Args.MakeArgString((F.second ? "+" : "-") + F.first())); 2169 } 2170 } 2171 2172 if (Triple.getArchName() == "x86_64h") { 2173 // x86_64h implies quite a few of the more modern subtarget features 2174 // for Haswell class CPUs, but not all of them. Opt-out of a few. 2175 Features.push_back("-rdrnd"); 2176 Features.push_back("-aes"); 2177 Features.push_back("-pclmul"); 2178 Features.push_back("-rtm"); 2179 Features.push_back("-hle"); 2180 Features.push_back("-fsgsbase"); 2181 } 2182 2183 const llvm::Triple::ArchType ArchType = Triple.getArch(); 2184 // Add features to be compatible with gcc for Android. 2185 if (Triple.isAndroid()) { 2186 if (ArchType == llvm::Triple::x86_64) { 2187 Features.push_back("+sse4.2"); 2188 Features.push_back("+popcnt"); 2189 } else 2190 Features.push_back("+ssse3"); 2191 } 2192 2193 // Set features according to the -arch flag on MSVC. 2194 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) { 2195 StringRef Arch = A->getValue(); 2196 bool ArchUsed = false; 2197 // First, look for flags that are shared in x86 and x86-64. 2198 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) { 2199 if (Arch == "AVX" || Arch == "AVX2") { 2200 ArchUsed = true; 2201 Features.push_back(Args.MakeArgString("+" + Arch.lower())); 2202 } 2203 } 2204 // Then, look for x86-specific flags. 2205 if (ArchType == llvm::Triple::x86) { 2206 if (Arch == "IA32") { 2207 ArchUsed = true; 2208 } else if (Arch == "SSE" || Arch == "SSE2") { 2209 ArchUsed = true; 2210 Features.push_back(Args.MakeArgString("+" + Arch.lower())); 2211 } 2212 } 2213 if (!ArchUsed) 2214 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args); 2215 } 2216 2217 // Now add any that the user explicitly requested on the command line, 2218 // which may override the defaults. 2219 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group); 2220 } 2221 2222 void Clang::AddX86TargetArgs(const ArgList &Args, 2223 ArgStringList &CmdArgs) const { 2224 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) || 2225 Args.hasArg(options::OPT_mkernel) || 2226 Args.hasArg(options::OPT_fapple_kext)) 2227 CmdArgs.push_back("-disable-red-zone"); 2228 2229 // Default to avoid implicit floating-point for kernel/kext code, but allow 2230 // that to be overridden with -mno-soft-float. 2231 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) || 2232 Args.hasArg(options::OPT_fapple_kext)); 2233 if (Arg *A = Args.getLastArg( 2234 options::OPT_msoft_float, options::OPT_mno_soft_float, 2235 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) { 2236 const Option &O = A->getOption(); 2237 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) || 2238 O.matches(options::OPT_msoft_float)); 2239 } 2240 if (NoImplicitFloat) 2241 CmdArgs.push_back("-no-implicit-float"); 2242 2243 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) { 2244 StringRef Value = A->getValue(); 2245 if (Value == "intel" || Value == "att") { 2246 CmdArgs.push_back("-mllvm"); 2247 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value)); 2248 } else { 2249 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument) 2250 << A->getOption().getName() << Value; 2251 } 2252 } 2253 2254 // Set flags to support MCU ABI. 2255 if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) { 2256 CmdArgs.push_back("-mfloat-abi"); 2257 CmdArgs.push_back("soft"); 2258 CmdArgs.push_back("-mstack-alignment=4"); 2259 } 2260 } 2261 2262 void Clang::AddHexagonTargetArgs(const ArgList &Args, 2263 ArgStringList &CmdArgs) const { 2264 CmdArgs.push_back("-mqdsp6-compat"); 2265 CmdArgs.push_back("-Wreturn-type"); 2266 2267 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { 2268 std::string N = llvm::utostr(G.getValue()); 2269 std::string Opt = std::string("-hexagon-small-data-threshold=") + N; 2270 CmdArgs.push_back("-mllvm"); 2271 CmdArgs.push_back(Args.MakeArgString(Opt)); 2272 } 2273 2274 if (!Args.hasArg(options::OPT_fno_short_enums)) 2275 CmdArgs.push_back("-fshort-enums"); 2276 if (Args.getLastArg(options::OPT_mieee_rnd_near)) { 2277 CmdArgs.push_back("-mllvm"); 2278 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near"); 2279 } 2280 CmdArgs.push_back("-mllvm"); 2281 CmdArgs.push_back("-machine-sink-split=0"); 2282 } 2283 2284 void Clang::AddLanaiTargetArgs(const ArgList &Args, 2285 ArgStringList &CmdArgs) const { 2286 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 2287 StringRef CPUName = A->getValue(); 2288 2289 CmdArgs.push_back("-target-cpu"); 2290 CmdArgs.push_back(Args.MakeArgString(CPUName)); 2291 } 2292 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { 2293 StringRef Value = A->getValue(); 2294 // Only support mregparm=4 to support old usage. Report error for all other 2295 // cases. 2296 int Mregparm; 2297 if (Value.getAsInteger(10, Mregparm)) { 2298 if (Mregparm != 4) { 2299 getToolChain().getDriver().Diag( 2300 diag::err_drv_unsupported_option_argument) 2301 << A->getOption().getName() << Value; 2302 } 2303 } 2304 } 2305 } 2306 2307 void Clang::AddWebAssemblyTargetArgs(const ArgList &Args, 2308 ArgStringList &CmdArgs) const { 2309 // Default to "hidden" visibility. 2310 if (!Args.hasArg(options::OPT_fvisibility_EQ, 2311 options::OPT_fvisibility_ms_compat)) { 2312 CmdArgs.push_back("-fvisibility"); 2313 CmdArgs.push_back("hidden"); 2314 } 2315 } 2316 2317 // Decode AArch64 features from string like +[no]featureA+[no]featureB+... 2318 static bool DecodeAArch64Features(const Driver &D, StringRef text, 2319 std::vector<const char *> &Features) { 2320 SmallVector<StringRef, 8> Split; 2321 text.split(Split, StringRef("+"), -1, false); 2322 2323 for (StringRef Feature : Split) { 2324 const char *result = llvm::StringSwitch<const char *>(Feature) 2325 .Case("fp", "+fp-armv8") 2326 .Case("simd", "+neon") 2327 .Case("crc", "+crc") 2328 .Case("crypto", "+crypto") 2329 .Case("fp16", "+fullfp16") 2330 .Case("profile", "+spe") 2331 .Case("ras", "+ras") 2332 .Case("nofp", "-fp-armv8") 2333 .Case("nosimd", "-neon") 2334 .Case("nocrc", "-crc") 2335 .Case("nocrypto", "-crypto") 2336 .Case("nofp16", "-fullfp16") 2337 .Case("noprofile", "-spe") 2338 .Case("noras", "-ras") 2339 .Default(nullptr); 2340 if (result) 2341 Features.push_back(result); 2342 else if (Feature == "neon" || Feature == "noneon") 2343 D.Diag(diag::err_drv_no_neon_modifier); 2344 else 2345 return false; 2346 } 2347 return true; 2348 } 2349 2350 // Check if the CPU name and feature modifiers in -mcpu are legal. If yes, 2351 // decode CPU and feature. 2352 static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU, 2353 std::vector<const char *> &Features) { 2354 std::pair<StringRef, StringRef> Split = Mcpu.split("+"); 2355 CPU = Split.first; 2356 if (CPU == "cortex-a53" || CPU == "cortex-a57" || 2357 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" || 2358 CPU == "kryo" || CPU == "cortex-a73" || CPU == "vulcan") { 2359 Features.push_back("+neon"); 2360 Features.push_back("+crc"); 2361 Features.push_back("+crypto"); 2362 } else if (CPU == "cyclone") { 2363 Features.push_back("+neon"); 2364 Features.push_back("+crypto"); 2365 } else if (CPU == "generic") { 2366 Features.push_back("+neon"); 2367 } else { 2368 return false; 2369 } 2370 2371 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features)) 2372 return false; 2373 2374 return true; 2375 } 2376 2377 static bool 2378 getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March, 2379 const ArgList &Args, 2380 std::vector<const char *> &Features) { 2381 std::string MarchLowerCase = March.lower(); 2382 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+"); 2383 2384 if (Split.first == "armv8-a" || Split.first == "armv8a") { 2385 // ok, no additional features. 2386 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") { 2387 Features.push_back("+v8.1a"); 2388 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) { 2389 Features.push_back("+v8.2a"); 2390 } else { 2391 return false; 2392 } 2393 2394 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features)) 2395 return false; 2396 2397 return true; 2398 } 2399 2400 static bool 2401 getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, 2402 const ArgList &Args, 2403 std::vector<const char *> &Features) { 2404 StringRef CPU; 2405 std::string McpuLowerCase = Mcpu.lower(); 2406 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features)) 2407 return false; 2408 2409 return true; 2410 } 2411 2412 static bool 2413 getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune, 2414 const ArgList &Args, 2415 std::vector<const char *> &Features) { 2416 std::string MtuneLowerCase = Mtune.lower(); 2417 // Handle CPU name is 'native'. 2418 if (MtuneLowerCase == "native") 2419 MtuneLowerCase = llvm::sys::getHostCPUName(); 2420 if (MtuneLowerCase == "cyclone") { 2421 Features.push_back("+zcm"); 2422 Features.push_back("+zcz"); 2423 } 2424 return true; 2425 } 2426 2427 static bool 2428 getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, 2429 const ArgList &Args, 2430 std::vector<const char *> &Features) { 2431 StringRef CPU; 2432 std::vector<const char *> DecodedFeature; 2433 std::string McpuLowerCase = Mcpu.lower(); 2434 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature)) 2435 return false; 2436 2437 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features); 2438 } 2439 2440 static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args, 2441 std::vector<const char *> &Features) { 2442 Arg *A; 2443 bool success = true; 2444 // Enable NEON by default. 2445 Features.push_back("+neon"); 2446 if ((A = Args.getLastArg(options::OPT_march_EQ))) 2447 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features); 2448 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) 2449 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features); 2450 else if (Args.hasArg(options::OPT_arch)) 2451 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args, 2452 Features); 2453 2454 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ))) 2455 success = 2456 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features); 2457 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ))) 2458 success = 2459 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features); 2460 else if (Args.hasArg(options::OPT_arch)) 2461 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), 2462 Args, Features); 2463 2464 if (!success) 2465 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 2466 2467 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) { 2468 Features.push_back("-fp-armv8"); 2469 Features.push_back("-crypto"); 2470 Features.push_back("-neon"); 2471 } 2472 2473 // En/disable crc 2474 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) { 2475 if (A->getOption().matches(options::OPT_mcrc)) 2476 Features.push_back("+crc"); 2477 else 2478 Features.push_back("-crc"); 2479 } 2480 2481 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, 2482 options::OPT_munaligned_access)) 2483 if (A->getOption().matches(options::OPT_mno_unaligned_access)) 2484 Features.push_back("+strict-align"); 2485 2486 if (Args.hasArg(options::OPT_ffixed_x18)) 2487 Features.push_back("+reserve-x18"); 2488 } 2489 2490 static void getHexagonTargetFeatures(const ArgList &Args, 2491 std::vector<const char *> &Features) { 2492 bool HasHVX = false, HasHVXD = false; 2493 2494 // FIXME: This should be able to use handleTargetFeaturesGroup except it is 2495 // doing dependent option handling here rather than in initFeatureMap or a 2496 // similar handler. 2497 for (auto &A : Args) { 2498 auto &Opt = A->getOption(); 2499 if (Opt.matches(options::OPT_mhexagon_hvx)) 2500 HasHVX = true; 2501 else if (Opt.matches(options::OPT_mno_hexagon_hvx)) 2502 HasHVXD = HasHVX = false; 2503 else if (Opt.matches(options::OPT_mhexagon_hvx_double)) 2504 HasHVXD = HasHVX = true; 2505 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double)) 2506 HasHVXD = false; 2507 else 2508 continue; 2509 A->claim(); 2510 } 2511 2512 Features.push_back(HasHVX ? "+hvx" : "-hvx"); 2513 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double"); 2514 } 2515 2516 static void getWebAssemblyTargetFeatures(const ArgList &Args, 2517 std::vector<const char *> &Features) { 2518 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group); 2519 } 2520 2521 static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args, 2522 std::vector<const char *> &Features) { 2523 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) { 2524 StringRef value = dAbi->getValue(); 2525 if (value == "1.0") { 2526 Features.push_back("+amdgpu-debugger-insert-nops"); 2527 Features.push_back("+amdgpu-debugger-reserve-regs"); 2528 Features.push_back("+amdgpu-debugger-emit-prologue"); 2529 } else { 2530 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args); 2531 } 2532 } 2533 2534 handleTargetFeaturesGroup( 2535 Args, Features, options::OPT_m_amdgpu_Features_Group); 2536 } 2537 2538 static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple, 2539 const ArgList &Args, ArgStringList &CmdArgs, 2540 bool ForAS) { 2541 const Driver &D = TC.getDriver(); 2542 std::vector<const char *> Features; 2543 switch (Triple.getArch()) { 2544 default: 2545 break; 2546 case llvm::Triple::mips: 2547 case llvm::Triple::mipsel: 2548 case llvm::Triple::mips64: 2549 case llvm::Triple::mips64el: 2550 getMIPSTargetFeatures(D, Triple, Args, Features); 2551 break; 2552 2553 case llvm::Triple::arm: 2554 case llvm::Triple::armeb: 2555 case llvm::Triple::thumb: 2556 case llvm::Triple::thumbeb: 2557 getARMTargetFeatures(TC, Triple, Args, Features, ForAS); 2558 break; 2559 2560 case llvm::Triple::ppc: 2561 case llvm::Triple::ppc64: 2562 case llvm::Triple::ppc64le: 2563 getPPCTargetFeatures(D, Triple, Args, Features); 2564 break; 2565 case llvm::Triple::systemz: 2566 getSystemZTargetFeatures(Args, Features); 2567 break; 2568 case llvm::Triple::aarch64: 2569 case llvm::Triple::aarch64_be: 2570 getAArch64TargetFeatures(D, Args, Features); 2571 break; 2572 case llvm::Triple::x86: 2573 case llvm::Triple::x86_64: 2574 getX86TargetFeatures(D, Triple, Args, Features); 2575 break; 2576 case llvm::Triple::hexagon: 2577 getHexagonTargetFeatures(Args, Features); 2578 break; 2579 case llvm::Triple::wasm32: 2580 case llvm::Triple::wasm64: 2581 getWebAssemblyTargetFeatures(Args, Features); 2582 break; 2583 case llvm::Triple::sparc: 2584 case llvm::Triple::sparcel: 2585 case llvm::Triple::sparcv9: 2586 getSparcTargetFeatures(D, Args, Features); 2587 break; 2588 case llvm::Triple::r600: 2589 case llvm::Triple::amdgcn: 2590 getAMDGPUTargetFeatures(D, Args, Features); 2591 break; 2592 } 2593 2594 // Find the last of each feature. 2595 llvm::StringMap<unsigned> LastOpt; 2596 for (unsigned I = 0, N = Features.size(); I < N; ++I) { 2597 const char *Name = Features[I]; 2598 assert(Name[0] == '-' || Name[0] == '+'); 2599 LastOpt[Name + 1] = I; 2600 } 2601 2602 for (unsigned I = 0, N = Features.size(); I < N; ++I) { 2603 // If this feature was overridden, ignore it. 2604 const char *Name = Features[I]; 2605 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1); 2606 assert(LastI != LastOpt.end()); 2607 unsigned Last = LastI->second; 2608 if (Last != I) 2609 continue; 2610 2611 CmdArgs.push_back("-target-feature"); 2612 CmdArgs.push_back(Name); 2613 } 2614 } 2615 2616 static bool 2617 shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime, 2618 const llvm::Triple &Triple) { 2619 // We use the zero-cost exception tables for Objective-C if the non-fragile 2620 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and 2621 // later. 2622 if (runtime.isNonFragile()) 2623 return true; 2624 2625 if (!Triple.isMacOSX()) 2626 return false; 2627 2628 return (!Triple.isMacOSXVersionLT(10, 5) && 2629 (Triple.getArch() == llvm::Triple::x86_64 || 2630 Triple.getArch() == llvm::Triple::arm)); 2631 } 2632 2633 /// Adds exception related arguments to the driver command arguments. There's a 2634 /// master flag, -fexceptions and also language specific flags to enable/disable 2635 /// C++ and Objective-C exceptions. This makes it possible to for example 2636 /// disable C++ exceptions but enable Objective-C exceptions. 2637 static void addExceptionArgs(const ArgList &Args, types::ID InputType, 2638 const ToolChain &TC, bool KernelOrKext, 2639 const ObjCRuntime &objcRuntime, 2640 ArgStringList &CmdArgs) { 2641 const Driver &D = TC.getDriver(); 2642 const llvm::Triple &Triple = TC.getTriple(); 2643 2644 if (KernelOrKext) { 2645 // -mkernel and -fapple-kext imply no exceptions, so claim exception related 2646 // arguments now to avoid warnings about unused arguments. 2647 Args.ClaimAllArgs(options::OPT_fexceptions); 2648 Args.ClaimAllArgs(options::OPT_fno_exceptions); 2649 Args.ClaimAllArgs(options::OPT_fobjc_exceptions); 2650 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions); 2651 Args.ClaimAllArgs(options::OPT_fcxx_exceptions); 2652 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions); 2653 return; 2654 } 2655 2656 // See if the user explicitly enabled exceptions. 2657 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, 2658 false); 2659 2660 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This 2661 // is not necessarily sensible, but follows GCC. 2662 if (types::isObjC(InputType) && 2663 Args.hasFlag(options::OPT_fobjc_exceptions, 2664 options::OPT_fno_objc_exceptions, true)) { 2665 CmdArgs.push_back("-fobjc-exceptions"); 2666 2667 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple); 2668 } 2669 2670 if (types::isCXX(InputType)) { 2671 // Disable C++ EH by default on XCore and PS4. 2672 bool CXXExceptionsEnabled = 2673 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU(); 2674 Arg *ExceptionArg = Args.getLastArg( 2675 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions, 2676 options::OPT_fexceptions, options::OPT_fno_exceptions); 2677 if (ExceptionArg) 2678 CXXExceptionsEnabled = 2679 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) || 2680 ExceptionArg->getOption().matches(options::OPT_fexceptions); 2681 2682 if (CXXExceptionsEnabled) { 2683 if (Triple.isPS4CPU()) { 2684 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode(); 2685 assert(ExceptionArg && 2686 "On the PS4 exceptions should only be enabled if passing " 2687 "an argument"); 2688 if (RTTIMode == ToolChain::RM_DisabledExplicitly) { 2689 const Arg *RTTIArg = TC.getRTTIArg(); 2690 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!"); 2691 D.Diag(diag::err_drv_argument_not_allowed_with) 2692 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args); 2693 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly) 2694 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions); 2695 } else 2696 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly); 2697 2698 CmdArgs.push_back("-fcxx-exceptions"); 2699 2700 EH = true; 2701 } 2702 } 2703 2704 if (EH) 2705 CmdArgs.push_back("-fexceptions"); 2706 } 2707 2708 static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) { 2709 bool Default = true; 2710 if (TC.getTriple().isOSDarwin()) { 2711 // The native darwin assembler doesn't support the linker_option directives, 2712 // so we disable them if we think the .s file will be passed to it. 2713 Default = TC.useIntegratedAs(); 2714 } 2715 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink, 2716 Default); 2717 } 2718 2719 static bool ShouldDisableDwarfDirectory(const ArgList &Args, 2720 const ToolChain &TC) { 2721 bool UseDwarfDirectory = 2722 Args.hasFlag(options::OPT_fdwarf_directory_asm, 2723 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs()); 2724 return !UseDwarfDirectory; 2725 } 2726 2727 /// \brief Check whether the given input tree contains any compilation actions. 2728 static bool ContainsCompileAction(const Action *A) { 2729 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A)) 2730 return true; 2731 2732 for (const auto &AI : A->inputs()) 2733 if (ContainsCompileAction(AI)) 2734 return true; 2735 2736 return false; 2737 } 2738 2739 /// \brief Check if -relax-all should be passed to the internal assembler. 2740 /// This is done by default when compiling non-assembler source with -O0. 2741 static bool UseRelaxAll(Compilation &C, const ArgList &Args) { 2742 bool RelaxDefault = true; 2743 2744 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 2745 RelaxDefault = A->getOption().matches(options::OPT_O0); 2746 2747 if (RelaxDefault) { 2748 RelaxDefault = false; 2749 for (const auto &Act : C.getActions()) { 2750 if (ContainsCompileAction(Act)) { 2751 RelaxDefault = true; 2752 break; 2753 } 2754 } 2755 } 2756 2757 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all, 2758 RelaxDefault); 2759 } 2760 2761 // Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases 2762 // to the corresponding DebugInfoKind. 2763 static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) { 2764 assert(A.getOption().matches(options::OPT_gN_Group) && 2765 "Not a -g option that specifies a debug-info level"); 2766 if (A.getOption().matches(options::OPT_g0) || 2767 A.getOption().matches(options::OPT_ggdb0)) 2768 return codegenoptions::NoDebugInfo; 2769 if (A.getOption().matches(options::OPT_gline_tables_only) || 2770 A.getOption().matches(options::OPT_ggdb1)) 2771 return codegenoptions::DebugLineTablesOnly; 2772 return codegenoptions::LimitedDebugInfo; 2773 } 2774 2775 // Extract the integer N from a string spelled "-dwarf-N", returning 0 2776 // on mismatch. The StringRef input (rather than an Arg) allows 2777 // for use by the "-Xassembler" option parser. 2778 static unsigned DwarfVersionNum(StringRef ArgValue) { 2779 return llvm::StringSwitch<unsigned>(ArgValue) 2780 .Case("-gdwarf-2", 2) 2781 .Case("-gdwarf-3", 3) 2782 .Case("-gdwarf-4", 4) 2783 .Case("-gdwarf-5", 5) 2784 .Default(0); 2785 } 2786 2787 static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs, 2788 codegenoptions::DebugInfoKind DebugInfoKind, 2789 unsigned DwarfVersion, 2790 llvm::DebuggerKind DebuggerTuning) { 2791 switch (DebugInfoKind) { 2792 case codegenoptions::DebugLineTablesOnly: 2793 CmdArgs.push_back("-debug-info-kind=line-tables-only"); 2794 break; 2795 case codegenoptions::LimitedDebugInfo: 2796 CmdArgs.push_back("-debug-info-kind=limited"); 2797 break; 2798 case codegenoptions::FullDebugInfo: 2799 CmdArgs.push_back("-debug-info-kind=standalone"); 2800 break; 2801 default: 2802 break; 2803 } 2804 if (DwarfVersion > 0) 2805 CmdArgs.push_back( 2806 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion))); 2807 switch (DebuggerTuning) { 2808 case llvm::DebuggerKind::GDB: 2809 CmdArgs.push_back("-debugger-tuning=gdb"); 2810 break; 2811 case llvm::DebuggerKind::LLDB: 2812 CmdArgs.push_back("-debugger-tuning=lldb"); 2813 break; 2814 case llvm::DebuggerKind::SCE: 2815 CmdArgs.push_back("-debugger-tuning=sce"); 2816 break; 2817 default: 2818 break; 2819 } 2820 } 2821 2822 static void CollectArgsForIntegratedAssembler(Compilation &C, 2823 const ArgList &Args, 2824 ArgStringList &CmdArgs, 2825 const Driver &D) { 2826 if (UseRelaxAll(C, Args)) 2827 CmdArgs.push_back("-mrelax-all"); 2828 2829 // Only default to -mincremental-linker-compatible if we think we are 2830 // targeting the MSVC linker. 2831 bool DefaultIncrementalLinkerCompatible = 2832 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment(); 2833 if (Args.hasFlag(options::OPT_mincremental_linker_compatible, 2834 options::OPT_mno_incremental_linker_compatible, 2835 DefaultIncrementalLinkerCompatible)) 2836 CmdArgs.push_back("-mincremental-linker-compatible"); 2837 2838 // When passing -I arguments to the assembler we sometimes need to 2839 // unconditionally take the next argument. For example, when parsing 2840 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the 2841 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo' 2842 // arg after parsing the '-I' arg. 2843 bool TakeNextArg = false; 2844 2845 // When using an integrated assembler, translate -Wa, and -Xassembler 2846 // options. 2847 bool CompressDebugSections = false; 2848 2849 bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS; 2850 const char *MipsTargetFeature = nullptr; 2851 for (const Arg *A : 2852 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { 2853 A->claim(); 2854 2855 for (StringRef Value : A->getValues()) { 2856 if (TakeNextArg) { 2857 CmdArgs.push_back(Value.data()); 2858 TakeNextArg = false; 2859 continue; 2860 } 2861 2862 switch (C.getDefaultToolChain().getArch()) { 2863 default: 2864 break; 2865 case llvm::Triple::mips: 2866 case llvm::Triple::mipsel: 2867 case llvm::Triple::mips64: 2868 case llvm::Triple::mips64el: 2869 if (Value == "--trap") { 2870 CmdArgs.push_back("-target-feature"); 2871 CmdArgs.push_back("+use-tcc-in-div"); 2872 continue; 2873 } 2874 if (Value == "--break") { 2875 CmdArgs.push_back("-target-feature"); 2876 CmdArgs.push_back("-use-tcc-in-div"); 2877 continue; 2878 } 2879 if (Value.startswith("-msoft-float")) { 2880 CmdArgs.push_back("-target-feature"); 2881 CmdArgs.push_back("+soft-float"); 2882 continue; 2883 } 2884 if (Value.startswith("-mhard-float")) { 2885 CmdArgs.push_back("-target-feature"); 2886 CmdArgs.push_back("-soft-float"); 2887 continue; 2888 } 2889 2890 MipsTargetFeature = llvm::StringSwitch<const char *>(Value) 2891 .Case("-mips1", "+mips1") 2892 .Case("-mips2", "+mips2") 2893 .Case("-mips3", "+mips3") 2894 .Case("-mips4", "+mips4") 2895 .Case("-mips5", "+mips5") 2896 .Case("-mips32", "+mips32") 2897 .Case("-mips32r2", "+mips32r2") 2898 .Case("-mips32r3", "+mips32r3") 2899 .Case("-mips32r5", "+mips32r5") 2900 .Case("-mips32r6", "+mips32r6") 2901 .Case("-mips64", "+mips64") 2902 .Case("-mips64r2", "+mips64r2") 2903 .Case("-mips64r3", "+mips64r3") 2904 .Case("-mips64r5", "+mips64r5") 2905 .Case("-mips64r6", "+mips64r6") 2906 .Default(nullptr); 2907 if (MipsTargetFeature) 2908 continue; 2909 } 2910 2911 if (Value == "-force_cpusubtype_ALL") { 2912 // Do nothing, this is the default and we don't support anything else. 2913 } else if (Value == "-L") { 2914 CmdArgs.push_back("-msave-temp-labels"); 2915 } else if (Value == "--fatal-warnings") { 2916 CmdArgs.push_back("-massembler-fatal-warnings"); 2917 } else if (Value == "--noexecstack") { 2918 CmdArgs.push_back("-mnoexecstack"); 2919 } else if (Value == "-compress-debug-sections" || 2920 Value == "--compress-debug-sections") { 2921 CompressDebugSections = true; 2922 } else if (Value == "-nocompress-debug-sections" || 2923 Value == "--nocompress-debug-sections") { 2924 CompressDebugSections = false; 2925 } else if (Value == "-mrelax-relocations=yes" || 2926 Value == "--mrelax-relocations=yes") { 2927 UseRelaxRelocations = true; 2928 } else if (Value == "-mrelax-relocations=no" || 2929 Value == "--mrelax-relocations=no") { 2930 UseRelaxRelocations = false; 2931 } else if (Value.startswith("-I")) { 2932 CmdArgs.push_back(Value.data()); 2933 // We need to consume the next argument if the current arg is a plain 2934 // -I. The next arg will be the include directory. 2935 if (Value == "-I") 2936 TakeNextArg = true; 2937 } else if (Value.startswith("-gdwarf-")) { 2938 // "-gdwarf-N" options are not cc1as options. 2939 unsigned DwarfVersion = DwarfVersionNum(Value); 2940 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain. 2941 CmdArgs.push_back(Value.data()); 2942 } else { 2943 RenderDebugEnablingArgs(Args, CmdArgs, 2944 codegenoptions::LimitedDebugInfo, 2945 DwarfVersion, llvm::DebuggerKind::Default); 2946 } 2947 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") || 2948 Value.startswith("-mhwdiv") || Value.startswith("-march")) { 2949 // Do nothing, we'll validate it later. 2950 } else { 2951 D.Diag(diag::err_drv_unsupported_option_argument) 2952 << A->getOption().getName() << Value; 2953 } 2954 } 2955 } 2956 if (CompressDebugSections) { 2957 if (llvm::zlib::isAvailable()) 2958 CmdArgs.push_back("-compress-debug-sections"); 2959 else 2960 D.Diag(diag::warn_debug_compression_unavailable); 2961 } 2962 if (UseRelaxRelocations) 2963 CmdArgs.push_back("--mrelax-relocations"); 2964 if (MipsTargetFeature != nullptr) { 2965 CmdArgs.push_back("-target-feature"); 2966 CmdArgs.push_back(MipsTargetFeature); 2967 } 2968 } 2969 2970 // This adds the static libclang_rt.builtins-arch.a directly to the command line 2971 // FIXME: Make sure we can also emit shared objects if they're requested 2972 // and available, check for possible errors, etc. 2973 static void addClangRT(const ToolChain &TC, const ArgList &Args, 2974 ArgStringList &CmdArgs) { 2975 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins")); 2976 } 2977 2978 namespace { 2979 enum OpenMPRuntimeKind { 2980 /// An unknown OpenMP runtime. We can't generate effective OpenMP code 2981 /// without knowing what runtime to target. 2982 OMPRT_Unknown, 2983 2984 /// The LLVM OpenMP runtime. When completed and integrated, this will become 2985 /// the default for Clang. 2986 OMPRT_OMP, 2987 2988 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for 2989 /// this runtime but can swallow the pragmas, and find and link against the 2990 /// runtime library itself. 2991 OMPRT_GOMP, 2992 2993 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel 2994 /// OpenMP runtime. We support this mode for users with existing dependencies 2995 /// on this runtime library name. 2996 OMPRT_IOMP5 2997 }; 2998 } 2999 3000 /// Compute the desired OpenMP runtime from the flag provided. 3001 static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC, 3002 const ArgList &Args) { 3003 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME); 3004 3005 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ); 3006 if (A) 3007 RuntimeName = A->getValue(); 3008 3009 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName) 3010 .Case("libomp", OMPRT_OMP) 3011 .Case("libgomp", OMPRT_GOMP) 3012 .Case("libiomp5", OMPRT_IOMP5) 3013 .Default(OMPRT_Unknown); 3014 3015 if (RT == OMPRT_Unknown) { 3016 if (A) 3017 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument) 3018 << A->getOption().getName() << A->getValue(); 3019 else 3020 // FIXME: We could use a nicer diagnostic here. 3021 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp"; 3022 } 3023 3024 return RT; 3025 } 3026 3027 static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, 3028 const ArgList &Args) { 3029 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, 3030 options::OPT_fno_openmp, false)) 3031 return; 3032 3033 switch (getOpenMPRuntime(TC, Args)) { 3034 case OMPRT_OMP: 3035 CmdArgs.push_back("-lomp"); 3036 break; 3037 case OMPRT_GOMP: 3038 CmdArgs.push_back("-lgomp"); 3039 break; 3040 case OMPRT_IOMP5: 3041 CmdArgs.push_back("-liomp5"); 3042 break; 3043 case OMPRT_Unknown: 3044 // Already diagnosed. 3045 break; 3046 } 3047 } 3048 3049 static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, 3050 ArgStringList &CmdArgs, StringRef Sanitizer, 3051 bool IsShared, bool IsWhole) { 3052 // Wrap any static runtimes that must be forced into executable in 3053 // whole-archive. 3054 if (IsWhole) CmdArgs.push_back("-whole-archive"); 3055 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared)); 3056 if (IsWhole) CmdArgs.push_back("-no-whole-archive"); 3057 } 3058 3059 // Tries to use a file with the list of dynamic symbols that need to be exported 3060 // from the runtime library. Returns true if the file was found. 3061 static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, 3062 ArgStringList &CmdArgs, 3063 StringRef Sanitizer) { 3064 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer)); 3065 if (llvm::sys::fs::exists(SanRT + ".syms")) { 3066 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms")); 3067 return true; 3068 } 3069 return false; 3070 } 3071 3072 static void linkSanitizerRuntimeDeps(const ToolChain &TC, 3073 ArgStringList &CmdArgs) { 3074 // Force linking against the system libraries sanitizers depends on 3075 // (see PR15823 why this is necessary). 3076 CmdArgs.push_back("--no-as-needed"); 3077 CmdArgs.push_back("-lpthread"); 3078 CmdArgs.push_back("-lrt"); 3079 CmdArgs.push_back("-lm"); 3080 // There's no libdl on FreeBSD. 3081 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD) 3082 CmdArgs.push_back("-ldl"); 3083 } 3084 3085 static void 3086 collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, 3087 SmallVectorImpl<StringRef> &SharedRuntimes, 3088 SmallVectorImpl<StringRef> &StaticRuntimes, 3089 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes, 3090 SmallVectorImpl<StringRef> &HelperStaticRuntimes, 3091 SmallVectorImpl<StringRef> &RequiredSymbols) { 3092 const SanitizerArgs &SanArgs = TC.getSanitizerArgs(); 3093 // Collect shared runtimes. 3094 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) { 3095 SharedRuntimes.push_back("asan"); 3096 } 3097 // The stats_client library is also statically linked into DSOs. 3098 if (SanArgs.needsStatsRt()) 3099 StaticRuntimes.push_back("stats_client"); 3100 3101 // Collect static runtimes. 3102 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) { 3103 // Don't link static runtimes into DSOs or if compiling for Android. 3104 return; 3105 } 3106 if (SanArgs.needsAsanRt()) { 3107 if (SanArgs.needsSharedAsanRt()) { 3108 HelperStaticRuntimes.push_back("asan-preinit"); 3109 } else { 3110 StaticRuntimes.push_back("asan"); 3111 if (SanArgs.linkCXXRuntimes()) 3112 StaticRuntimes.push_back("asan_cxx"); 3113 } 3114 } 3115 if (SanArgs.needsDfsanRt()) 3116 StaticRuntimes.push_back("dfsan"); 3117 if (SanArgs.needsLsanRt()) 3118 StaticRuntimes.push_back("lsan"); 3119 if (SanArgs.needsMsanRt()) { 3120 StaticRuntimes.push_back("msan"); 3121 if (SanArgs.linkCXXRuntimes()) 3122 StaticRuntimes.push_back("msan_cxx"); 3123 } 3124 if (SanArgs.needsTsanRt()) { 3125 StaticRuntimes.push_back("tsan"); 3126 if (SanArgs.linkCXXRuntimes()) 3127 StaticRuntimes.push_back("tsan_cxx"); 3128 } 3129 if (SanArgs.needsUbsanRt()) { 3130 StaticRuntimes.push_back("ubsan_standalone"); 3131 if (SanArgs.linkCXXRuntimes()) 3132 StaticRuntimes.push_back("ubsan_standalone_cxx"); 3133 } 3134 if (SanArgs.needsSafeStackRt()) 3135 StaticRuntimes.push_back("safestack"); 3136 if (SanArgs.needsCfiRt()) 3137 StaticRuntimes.push_back("cfi"); 3138 if (SanArgs.needsCfiDiagRt()) { 3139 StaticRuntimes.push_back("cfi_diag"); 3140 if (SanArgs.linkCXXRuntimes()) 3141 StaticRuntimes.push_back("ubsan_standalone_cxx"); 3142 } 3143 if (SanArgs.needsStatsRt()) { 3144 NonWholeStaticRuntimes.push_back("stats"); 3145 RequiredSymbols.push_back("__sanitizer_stats_register"); 3146 } 3147 if (SanArgs.needsEsanRt()) 3148 StaticRuntimes.push_back("esan"); 3149 } 3150 3151 // Should be called before we add system libraries (C++ ABI, libstdc++/libc++, 3152 // C runtime, etc). Returns true if sanitizer system deps need to be linked in. 3153 static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, 3154 ArgStringList &CmdArgs) { 3155 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes, 3156 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols; 3157 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes, 3158 NonWholeStaticRuntimes, HelperStaticRuntimes, 3159 RequiredSymbols); 3160 for (auto RT : SharedRuntimes) 3161 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false); 3162 for (auto RT : HelperStaticRuntimes) 3163 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true); 3164 bool AddExportDynamic = false; 3165 for (auto RT : StaticRuntimes) { 3166 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true); 3167 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT); 3168 } 3169 for (auto RT : NonWholeStaticRuntimes) { 3170 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false); 3171 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT); 3172 } 3173 for (auto S : RequiredSymbols) { 3174 CmdArgs.push_back("-u"); 3175 CmdArgs.push_back(Args.MakeArgString(S)); 3176 } 3177 // If there is a static runtime with no dynamic list, force all the symbols 3178 // to be dynamic to be sure we export sanitizer interface functions. 3179 if (AddExportDynamic) 3180 CmdArgs.push_back("-export-dynamic"); 3181 return !StaticRuntimes.empty(); 3182 } 3183 3184 static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args, 3185 ArgStringList &CmdArgs) { 3186 if (Args.hasFlag(options::OPT_fxray_instrument, 3187 options::OPT_fnoxray_instrument, false)) { 3188 CmdArgs.push_back("-whole-archive"); 3189 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false)); 3190 CmdArgs.push_back("-no-whole-archive"); 3191 return true; 3192 } 3193 return false; 3194 } 3195 3196 static void linkXRayRuntimeDeps(const ToolChain &TC, const ArgList &Args, 3197 ArgStringList &CmdArgs) { 3198 CmdArgs.push_back("--no-as-needed"); 3199 CmdArgs.push_back("-lpthread"); 3200 CmdArgs.push_back("-lrt"); 3201 CmdArgs.push_back("-lm"); 3202 CmdArgs.push_back("-latomic"); 3203 if (TC.GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) 3204 CmdArgs.push_back("-lc++"); 3205 else 3206 CmdArgs.push_back("-lstdc++"); 3207 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD) 3208 CmdArgs.push_back("-ldl"); 3209 } 3210 3211 static bool areOptimizationsEnabled(const ArgList &Args) { 3212 // Find the last -O arg and see if it is non-zero. 3213 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 3214 return !A->getOption().matches(options::OPT_O0); 3215 // Defaults to -O0. 3216 return false; 3217 } 3218 3219 static bool shouldUseFramePointerForTarget(const ArgList &Args, 3220 const llvm::Triple &Triple) { 3221 switch (Triple.getArch()) { 3222 case llvm::Triple::xcore: 3223 case llvm::Triple::wasm32: 3224 case llvm::Triple::wasm64: 3225 // XCore never wants frame pointers, regardless of OS. 3226 // WebAssembly never wants frame pointers. 3227 return false; 3228 default: 3229 break; 3230 } 3231 3232 if (Triple.isOSLinux()) { 3233 switch (Triple.getArch()) { 3234 // Don't use a frame pointer on linux if optimizing for certain targets. 3235 case llvm::Triple::mips64: 3236 case llvm::Triple::mips64el: 3237 case llvm::Triple::mips: 3238 case llvm::Triple::mipsel: 3239 case llvm::Triple::systemz: 3240 case llvm::Triple::x86: 3241 case llvm::Triple::x86_64: 3242 return !areOptimizationsEnabled(Args); 3243 default: 3244 return true; 3245 } 3246 } 3247 3248 if (Triple.isOSWindows()) { 3249 switch (Triple.getArch()) { 3250 case llvm::Triple::x86: 3251 return !areOptimizationsEnabled(Args); 3252 case llvm::Triple::x86_64: 3253 return Triple.isOSBinFormatMachO(); 3254 case llvm::Triple::arm: 3255 case llvm::Triple::thumb: 3256 // Windows on ARM builds with FPO disabled to aid fast stack walking 3257 return true; 3258 default: 3259 // All other supported Windows ISAs use xdata unwind information, so frame 3260 // pointers are not generally useful. 3261 return false; 3262 } 3263 } 3264 3265 return true; 3266 } 3267 3268 static bool shouldUseFramePointer(const ArgList &Args, 3269 const llvm::Triple &Triple) { 3270 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer, 3271 options::OPT_fomit_frame_pointer)) 3272 return A->getOption().matches(options::OPT_fno_omit_frame_pointer); 3273 if (Args.hasArg(options::OPT_pg)) 3274 return true; 3275 3276 return shouldUseFramePointerForTarget(Args, Triple); 3277 } 3278 3279 static bool shouldUseLeafFramePointer(const ArgList &Args, 3280 const llvm::Triple &Triple) { 3281 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer, 3282 options::OPT_momit_leaf_frame_pointer)) 3283 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer); 3284 if (Args.hasArg(options::OPT_pg)) 3285 return true; 3286 3287 if (Triple.isPS4CPU()) 3288 return false; 3289 3290 return shouldUseFramePointerForTarget(Args, Triple); 3291 } 3292 3293 /// Add a CC1 option to specify the debug compilation directory. 3294 static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) { 3295 SmallString<128> cwd; 3296 if (!llvm::sys::fs::current_path(cwd)) { 3297 CmdArgs.push_back("-fdebug-compilation-dir"); 3298 CmdArgs.push_back(Args.MakeArgString(cwd)); 3299 } 3300 } 3301 3302 static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) { 3303 Arg *FinalOutput = Args.getLastArg(options::OPT_o); 3304 if (FinalOutput && Args.hasArg(options::OPT_c)) { 3305 SmallString<128> T(FinalOutput->getValue()); 3306 llvm::sys::path::replace_extension(T, "dwo"); 3307 return Args.MakeArgString(T); 3308 } else { 3309 // Use the compilation dir. 3310 SmallString<128> T( 3311 Args.getLastArgValue(options::OPT_fdebug_compilation_dir)); 3312 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput())); 3313 llvm::sys::path::replace_extension(F, "dwo"); 3314 T += F; 3315 return Args.MakeArgString(F); 3316 } 3317 } 3318 3319 static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T, 3320 const JobAction &JA, const ArgList &Args, 3321 const InputInfo &Output, const char *OutFile) { 3322 ArgStringList ExtractArgs; 3323 ExtractArgs.push_back("--extract-dwo"); 3324 3325 ArgStringList StripArgs; 3326 StripArgs.push_back("--strip-dwo"); 3327 3328 // Grabbing the output of the earlier compile step. 3329 StripArgs.push_back(Output.getFilename()); 3330 ExtractArgs.push_back(Output.getFilename()); 3331 ExtractArgs.push_back(OutFile); 3332 3333 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy")); 3334 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename()); 3335 3336 // First extract the dwo sections. 3337 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II)); 3338 3339 // Then remove them from the original .o file. 3340 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II)); 3341 } 3342 3343 /// \brief Vectorize at all optimization levels greater than 1 except for -Oz. 3344 /// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled. 3345 static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) { 3346 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 3347 if (A->getOption().matches(options::OPT_O4) || 3348 A->getOption().matches(options::OPT_Ofast)) 3349 return true; 3350 3351 if (A->getOption().matches(options::OPT_O0)) 3352 return false; 3353 3354 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag"); 3355 3356 // Vectorize -Os. 3357 StringRef S(A->getValue()); 3358 if (S == "s") 3359 return true; 3360 3361 // Don't vectorize -Oz, unless it's the slp vectorizer. 3362 if (S == "z") 3363 return isSlpVec; 3364 3365 unsigned OptLevel = 0; 3366 if (S.getAsInteger(10, OptLevel)) 3367 return false; 3368 3369 return OptLevel > 1; 3370 } 3371 3372 return false; 3373 } 3374 3375 /// Add -x lang to \p CmdArgs for \p Input. 3376 static void addDashXForInput(const ArgList &Args, const InputInfo &Input, 3377 ArgStringList &CmdArgs) { 3378 // When using -verify-pch, we don't want to provide the type 3379 // 'precompiled-header' if it was inferred from the file extension 3380 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH) 3381 return; 3382 3383 CmdArgs.push_back("-x"); 3384 if (Args.hasArg(options::OPT_rewrite_objc)) 3385 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX)); 3386 else 3387 CmdArgs.push_back(types::getTypeName(Input.getType())); 3388 } 3389 3390 static VersionTuple getMSCompatibilityVersion(unsigned Version) { 3391 if (Version < 100) 3392 return VersionTuple(Version); 3393 3394 if (Version < 10000) 3395 return VersionTuple(Version / 100, Version % 100); 3396 3397 unsigned Build = 0, Factor = 1; 3398 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10) 3399 Build = Build + (Version % 10) * Factor; 3400 return VersionTuple(Version / 100, Version % 100, Build); 3401 } 3402 3403 // Claim options we don't want to warn if they are unused. We do this for 3404 // options that build systems might add but are unused when assembling or only 3405 // running the preprocessor for example. 3406 static void claimNoWarnArgs(const ArgList &Args) { 3407 // Don't warn about unused -f(no-)?lto. This can happen when we're 3408 // preprocessing, precompiling or assembling. 3409 Args.ClaimAllArgs(options::OPT_flto_EQ); 3410 Args.ClaimAllArgs(options::OPT_flto); 3411 Args.ClaimAllArgs(options::OPT_fno_lto); 3412 } 3413 3414 static void appendUserToPath(SmallVectorImpl<char> &Result) { 3415 #ifdef LLVM_ON_UNIX 3416 const char *Username = getenv("LOGNAME"); 3417 #else 3418 const char *Username = getenv("USERNAME"); 3419 #endif 3420 if (Username) { 3421 // Validate that LoginName can be used in a path, and get its length. 3422 size_t Len = 0; 3423 for (const char *P = Username; *P; ++P, ++Len) { 3424 if (!isAlphanumeric(*P) && *P != '_') { 3425 Username = nullptr; 3426 break; 3427 } 3428 } 3429 3430 if (Username && Len > 0) { 3431 Result.append(Username, Username + Len); 3432 return; 3433 } 3434 } 3435 3436 // Fallback to user id. 3437 #ifdef LLVM_ON_UNIX 3438 std::string UID = llvm::utostr(getuid()); 3439 #else 3440 // FIXME: Windows seems to have an 'SID' that might work. 3441 std::string UID = "9999"; 3442 #endif 3443 Result.append(UID.begin(), UID.end()); 3444 } 3445 3446 VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC, 3447 const llvm::Triple &Triple, 3448 const llvm::opt::ArgList &Args, 3449 bool IsWindowsMSVC) { 3450 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 3451 IsWindowsMSVC) || 3452 Args.hasArg(options::OPT_fmsc_version) || 3453 Args.hasArg(options::OPT_fms_compatibility_version)) { 3454 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version); 3455 const Arg *MSCompatibilityVersion = 3456 Args.getLastArg(options::OPT_fms_compatibility_version); 3457 3458 if (MSCVersion && MSCompatibilityVersion) { 3459 if (D) 3460 D->Diag(diag::err_drv_argument_not_allowed_with) 3461 << MSCVersion->getAsString(Args) 3462 << MSCompatibilityVersion->getAsString(Args); 3463 return VersionTuple(); 3464 } 3465 3466 if (MSCompatibilityVersion) { 3467 VersionTuple MSVT; 3468 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D) 3469 D->Diag(diag::err_drv_invalid_value) 3470 << MSCompatibilityVersion->getAsString(Args) 3471 << MSCompatibilityVersion->getValue(); 3472 return MSVT; 3473 } 3474 3475 if (MSCVersion) { 3476 unsigned Version = 0; 3477 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D) 3478 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args) 3479 << MSCVersion->getValue(); 3480 return getMSCompatibilityVersion(Version); 3481 } 3482 3483 unsigned Major, Minor, Micro; 3484 Triple.getEnvironmentVersion(Major, Minor, Micro); 3485 if (Major || Minor || Micro) 3486 return VersionTuple(Major, Minor, Micro); 3487 3488 if (IsWindowsMSVC) { 3489 VersionTuple MSVT = TC.getMSVCVersionFromExe(); 3490 if (!MSVT.empty()) 3491 return MSVT; 3492 3493 // FIXME: Consider bumping this to 19 (MSVC2015) soon. 3494 return VersionTuple(18); 3495 } 3496 } 3497 return VersionTuple(); 3498 } 3499 3500 static void addPGOAndCoverageFlags(Compilation &C, const Driver &D, 3501 const InputInfo &Output, const ArgList &Args, 3502 ArgStringList &CmdArgs) { 3503 auto *ProfileGenerateArg = Args.getLastArg( 3504 options::OPT_fprofile_instr_generate, 3505 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate, 3506 options::OPT_fprofile_generate_EQ, 3507 options::OPT_fno_profile_instr_generate); 3508 if (ProfileGenerateArg && 3509 ProfileGenerateArg->getOption().matches( 3510 options::OPT_fno_profile_instr_generate)) 3511 ProfileGenerateArg = nullptr; 3512 3513 auto *ProfileUseArg = Args.getLastArg( 3514 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ, 3515 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ, 3516 options::OPT_fno_profile_instr_use); 3517 if (ProfileUseArg && 3518 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use)) 3519 ProfileUseArg = nullptr; 3520 3521 if (ProfileGenerateArg && ProfileUseArg) 3522 D.Diag(diag::err_drv_argument_not_allowed_with) 3523 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling(); 3524 3525 if (ProfileGenerateArg) { 3526 if (ProfileGenerateArg->getOption().matches( 3527 options::OPT_fprofile_instr_generate_EQ)) 3528 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") + 3529 ProfileGenerateArg->getValue())); 3530 else if (ProfileGenerateArg->getOption().matches( 3531 options::OPT_fprofile_generate_EQ)) { 3532 SmallString<128> Path(ProfileGenerateArg->getValue()); 3533 llvm::sys::path::append(Path, "default.profraw"); 3534 CmdArgs.push_back( 3535 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path)); 3536 } 3537 // The default is to use Clang Instrumentation. 3538 CmdArgs.push_back("-fprofile-instrument=clang"); 3539 } 3540 3541 if (ProfileUseArg) { 3542 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ)) 3543 CmdArgs.push_back(Args.MakeArgString( 3544 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue())); 3545 else if ((ProfileUseArg->getOption().matches( 3546 options::OPT_fprofile_use_EQ) || 3547 ProfileUseArg->getOption().matches( 3548 options::OPT_fprofile_instr_use))) { 3549 SmallString<128> Path( 3550 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue()); 3551 if (Path.empty() || llvm::sys::fs::is_directory(Path)) 3552 llvm::sys::path::append(Path, "default.profdata"); 3553 CmdArgs.push_back( 3554 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path)); 3555 } 3556 } 3557 3558 if (Args.hasArg(options::OPT_ftest_coverage) || 3559 Args.hasArg(options::OPT_coverage)) 3560 CmdArgs.push_back("-femit-coverage-notes"); 3561 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs, 3562 false) || 3563 Args.hasArg(options::OPT_coverage)) 3564 CmdArgs.push_back("-femit-coverage-data"); 3565 3566 if (Args.hasFlag(options::OPT_fcoverage_mapping, 3567 options::OPT_fno_coverage_mapping, false) && 3568 !ProfileGenerateArg) 3569 D.Diag(diag::err_drv_argument_only_allowed_with) 3570 << "-fcoverage-mapping" 3571 << "-fprofile-instr-generate"; 3572 3573 if (Args.hasFlag(options::OPT_fcoverage_mapping, 3574 options::OPT_fno_coverage_mapping, false)) 3575 CmdArgs.push_back("-fcoverage-mapping"); 3576 3577 if (C.getArgs().hasArg(options::OPT_c) || 3578 C.getArgs().hasArg(options::OPT_S)) { 3579 if (Output.isFilename()) { 3580 CmdArgs.push_back("-coverage-file"); 3581 SmallString<128> CoverageFilename; 3582 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) { 3583 CoverageFilename = FinalOutput->getValue(); 3584 } else { 3585 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput()); 3586 } 3587 if (llvm::sys::path::is_relative(CoverageFilename)) { 3588 SmallString<128> Pwd; 3589 if (!llvm::sys::fs::current_path(Pwd)) { 3590 llvm::sys::path::append(Pwd, CoverageFilename); 3591 CoverageFilename.swap(Pwd); 3592 } 3593 } 3594 CmdArgs.push_back(Args.MakeArgString(CoverageFilename)); 3595 } 3596 } 3597 } 3598 3599 static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args, 3600 ArgStringList &CmdArgs) { 3601 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs, 3602 false) || 3603 Args.hasFlag(options::OPT_fprofile_generate, 3604 options::OPT_fno_profile_instr_generate, false) || 3605 Args.hasFlag(options::OPT_fprofile_generate_EQ, 3606 options::OPT_fno_profile_instr_generate, false) || 3607 Args.hasFlag(options::OPT_fprofile_instr_generate, 3608 options::OPT_fno_profile_instr_generate, false) || 3609 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ, 3610 options::OPT_fno_profile_instr_generate, false) || 3611 Args.hasArg(options::OPT_fcreate_profile) || 3612 Args.hasArg(options::OPT_coverage))) 3613 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a"); 3614 } 3615 3616 /// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then, 3617 /// smooshes them together with platform defaults, to decide whether 3618 /// this compile should be using PIC mode or not. Returns a tuple of 3619 /// (RelocationModel, PICLevel, IsPIE). 3620 static std::tuple<llvm::Reloc::Model, unsigned, bool> 3621 ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple, 3622 const ArgList &Args) { 3623 // FIXME: why does this code...and so much everywhere else, use both 3624 // ToolChain.getTriple() and Triple? 3625 bool PIE = ToolChain.isPIEDefault(); 3626 bool PIC = PIE || ToolChain.isPICDefault(); 3627 // The Darwin/MachO default to use PIC does not apply when using -static. 3628 if (ToolChain.getTriple().isOSBinFormatMachO() && 3629 Args.hasArg(options::OPT_static)) 3630 PIE = PIC = false; 3631 bool IsPICLevelTwo = PIC; 3632 3633 bool KernelOrKext = 3634 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); 3635 3636 // Android-specific defaults for PIC/PIE 3637 if (ToolChain.getTriple().isAndroid()) { 3638 switch (ToolChain.getArch()) { 3639 case llvm::Triple::arm: 3640 case llvm::Triple::armeb: 3641 case llvm::Triple::thumb: 3642 case llvm::Triple::thumbeb: 3643 case llvm::Triple::aarch64: 3644 case llvm::Triple::mips: 3645 case llvm::Triple::mipsel: 3646 case llvm::Triple::mips64: 3647 case llvm::Triple::mips64el: 3648 PIC = true; // "-fpic" 3649 break; 3650 3651 case llvm::Triple::x86: 3652 case llvm::Triple::x86_64: 3653 PIC = true; // "-fPIC" 3654 IsPICLevelTwo = true; 3655 break; 3656 3657 default: 3658 break; 3659 } 3660 } 3661 3662 // OpenBSD-specific defaults for PIE 3663 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) { 3664 switch (ToolChain.getArch()) { 3665 case llvm::Triple::mips64: 3666 case llvm::Triple::mips64el: 3667 case llvm::Triple::sparcel: 3668 case llvm::Triple::x86: 3669 case llvm::Triple::x86_64: 3670 IsPICLevelTwo = false; // "-fpie" 3671 break; 3672 3673 case llvm::Triple::ppc: 3674 case llvm::Triple::sparc: 3675 case llvm::Triple::sparcv9: 3676 IsPICLevelTwo = true; // "-fPIE" 3677 break; 3678 3679 default: 3680 break; 3681 } 3682 } 3683 3684 // The last argument relating to either PIC or PIE wins, and no 3685 // other argument is used. If the last argument is any flavor of the 3686 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE 3687 // option implicitly enables PIC at the same level. 3688 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, 3689 options::OPT_fpic, options::OPT_fno_pic, 3690 options::OPT_fPIE, options::OPT_fno_PIE, 3691 options::OPT_fpie, options::OPT_fno_pie); 3692 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness 3693 // is forced, then neither PIC nor PIE flags will have no effect. 3694 if (!ToolChain.isPICDefaultForced()) { 3695 if (LastPICArg) { 3696 Option O = LastPICArg->getOption(); 3697 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) || 3698 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) { 3699 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie); 3700 PIC = 3701 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic); 3702 IsPICLevelTwo = 3703 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC); 3704 } else { 3705 PIE = PIC = false; 3706 if (Triple.isPS4CPU()) { 3707 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ); 3708 StringRef Model = ModelArg ? ModelArg->getValue() : ""; 3709 if (Model != "kernel") { 3710 PIC = true; 3711 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic) 3712 << LastPICArg->getSpelling(); 3713 } 3714 } 3715 } 3716 } 3717 } 3718 3719 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the 3720 // PIC level would've been set to level 1, force it back to level 2 PIC 3721 // instead. 3722 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU())) 3723 IsPICLevelTwo |= ToolChain.isPICDefault(); 3724 3725 // This kernel flags are a trump-card: they will disable PIC/PIE 3726 // generation, independent of the argument order. 3727 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) && 3728 !Triple.isWatchOS())) 3729 PIC = PIE = false; 3730 3731 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) { 3732 // This is a very special mode. It trumps the other modes, almost no one 3733 // uses it, and it isn't even valid on any OS but Darwin. 3734 if (!ToolChain.getTriple().isOSDarwin()) 3735 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target) 3736 << A->getSpelling() << ToolChain.getTriple().str(); 3737 3738 // FIXME: Warn when this flag trumps some other PIC or PIE flag. 3739 3740 // Only a forced PIC mode can cause the actual compile to have PIC defines 3741 // etc., no flags are sufficient. This behavior was selected to closely 3742 // match that of llvm-gcc and Apple GCC before that. 3743 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced(); 3744 3745 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false); 3746 } 3747 3748 if (PIC) 3749 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE); 3750 3751 return std::make_tuple(llvm::Reloc::Static, 0, false); 3752 } 3753 3754 static const char *RelocationModelName(llvm::Reloc::Model Model) { 3755 switch (Model) { 3756 case llvm::Reloc::Static: 3757 return "static"; 3758 case llvm::Reloc::PIC_: 3759 return "pic"; 3760 case llvm::Reloc::DynamicNoPIC: 3761 return "dynamic-no-pic"; 3762 } 3763 llvm_unreachable("Unknown Reloc::Model kind"); 3764 } 3765 3766 static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args, 3767 ArgStringList &CmdArgs) { 3768 llvm::Reloc::Model RelocationModel; 3769 unsigned PICLevel; 3770 bool IsPIE; 3771 std::tie(RelocationModel, PICLevel, IsPIE) = 3772 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args); 3773 3774 if (RelocationModel != llvm::Reloc::Static) 3775 CmdArgs.push_back("-KPIC"); 3776 } 3777 3778 void Clang::ConstructJob(Compilation &C, const JobAction &JA, 3779 const InputInfo &Output, const InputInfoList &Inputs, 3780 const ArgList &Args, const char *LinkingOutput) const { 3781 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 3782 const llvm::Triple Triple(TripleStr); 3783 3784 bool KernelOrKext = 3785 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); 3786 const Driver &D = getToolChain().getDriver(); 3787 ArgStringList CmdArgs; 3788 3789 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment(); 3790 bool IsWindowsCygnus = 3791 getToolChain().getTriple().isWindowsCygwinEnvironment(); 3792 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); 3793 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU(); 3794 bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); 3795 3796 // Check number of inputs for sanity. We need at least one input. 3797 assert(Inputs.size() >= 1 && "Must have at least one input."); 3798 const InputInfo &Input = Inputs[0]; 3799 // CUDA compilation may have multiple inputs (source file + results of 3800 // device-side compilations). All other jobs are expected to have exactly one 3801 // input. 3802 bool IsCuda = types::isCuda(Input.getType()); 3803 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs."); 3804 3805 // C++ is not supported for IAMCU. 3806 if (IsIAMCU && types::isCXX(Input.getType())) 3807 D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; 3808 3809 // Invoke ourselves in -cc1 mode. 3810 // 3811 // FIXME: Implement custom jobs for internal actions. 3812 CmdArgs.push_back("-cc1"); 3813 3814 // Add the "effective" target triple. 3815 CmdArgs.push_back("-triple"); 3816 CmdArgs.push_back(Args.MakeArgString(TripleStr)); 3817 3818 const ToolChain *AuxToolChain = nullptr; 3819 if (IsCuda) { 3820 // FIXME: We need a (better) way to pass information about 3821 // particular compilation pass we're constructing here. For now we 3822 // can check which toolchain we're using and pick the other one to 3823 // extract the triple. 3824 if (&getToolChain() == C.getSingleOffloadToolChain<Action::OFK_Cuda>()) 3825 AuxToolChain = C.getOffloadingHostToolChain(); 3826 else if (&getToolChain() == C.getOffloadingHostToolChain()) 3827 AuxToolChain = C.getSingleOffloadToolChain<Action::OFK_Cuda>(); 3828 else 3829 llvm_unreachable("Can't figure out CUDA compilation mode."); 3830 assert(AuxToolChain != nullptr && "No aux toolchain."); 3831 CmdArgs.push_back("-aux-triple"); 3832 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str())); 3833 } 3834 3835 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm || 3836 Triple.getArch() == llvm::Triple::thumb)) { 3837 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6; 3838 unsigned Version; 3839 Triple.getArchName().substr(Offset).getAsInteger(10, Version); 3840 if (Version < 7) 3841 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() 3842 << TripleStr; 3843 } 3844 3845 // Push all default warning arguments that are specific to 3846 // the given target. These come before user provided warning options 3847 // are provided. 3848 getToolChain().addClangWarningOptions(CmdArgs); 3849 3850 // Select the appropriate action. 3851 RewriteKind rewriteKind = RK_None; 3852 3853 if (isa<AnalyzeJobAction>(JA)) { 3854 assert(JA.getType() == types::TY_Plist && "Invalid output type."); 3855 CmdArgs.push_back("-analyze"); 3856 } else if (isa<MigrateJobAction>(JA)) { 3857 CmdArgs.push_back("-migrate"); 3858 } else if (isa<PreprocessJobAction>(JA)) { 3859 if (Output.getType() == types::TY_Dependencies) 3860 CmdArgs.push_back("-Eonly"); 3861 else { 3862 CmdArgs.push_back("-E"); 3863 if (Args.hasArg(options::OPT_rewrite_objc) && 3864 !Args.hasArg(options::OPT_g_Group)) 3865 CmdArgs.push_back("-P"); 3866 } 3867 } else if (isa<AssembleJobAction>(JA)) { 3868 CmdArgs.push_back("-emit-obj"); 3869 3870 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D); 3871 3872 // Also ignore explicit -force_cpusubtype_ALL option. 3873 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL); 3874 } else if (isa<PrecompileJobAction>(JA)) { 3875 // Use PCH if the user requested it. 3876 bool UsePCH = D.CCCUsePCH; 3877 3878 if (JA.getType() == types::TY_Nothing) 3879 CmdArgs.push_back("-fsyntax-only"); 3880 else if (UsePCH) 3881 CmdArgs.push_back("-emit-pch"); 3882 else 3883 CmdArgs.push_back("-emit-pth"); 3884 } else if (isa<VerifyPCHJobAction>(JA)) { 3885 CmdArgs.push_back("-verify-pch"); 3886 } else { 3887 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) && 3888 "Invalid action for clang tool."); 3889 if (JA.getType() == types::TY_Nothing) { 3890 CmdArgs.push_back("-fsyntax-only"); 3891 } else if (JA.getType() == types::TY_LLVM_IR || 3892 JA.getType() == types::TY_LTO_IR) { 3893 CmdArgs.push_back("-emit-llvm"); 3894 } else if (JA.getType() == types::TY_LLVM_BC || 3895 JA.getType() == types::TY_LTO_BC) { 3896 CmdArgs.push_back("-emit-llvm-bc"); 3897 } else if (JA.getType() == types::TY_PP_Asm) { 3898 CmdArgs.push_back("-S"); 3899 } else if (JA.getType() == types::TY_AST) { 3900 CmdArgs.push_back("-emit-pch"); 3901 } else if (JA.getType() == types::TY_ModuleFile) { 3902 CmdArgs.push_back("-module-file-info"); 3903 } else if (JA.getType() == types::TY_RewrittenObjC) { 3904 CmdArgs.push_back("-rewrite-objc"); 3905 rewriteKind = RK_NonFragile; 3906 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) { 3907 CmdArgs.push_back("-rewrite-objc"); 3908 rewriteKind = RK_Fragile; 3909 } else { 3910 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!"); 3911 } 3912 3913 // Preserve use-list order by default when emitting bitcode, so that 3914 // loading the bitcode up in 'opt' or 'llc' and running passes gives the 3915 // same result as running passes here. For LTO, we don't need to preserve 3916 // the use-list order, since serialization to bitcode is part of the flow. 3917 if (JA.getType() == types::TY_LLVM_BC) 3918 CmdArgs.push_back("-emit-llvm-uselists"); 3919 3920 if (D.isUsingLTO()) 3921 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ); 3922 } 3923 3924 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) { 3925 if (!types::isLLVMIR(Input.getType())) 3926 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) 3927 << "-x ir"; 3928 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ); 3929 } 3930 3931 // Embed-bitcode option. 3932 if (C.getDriver().embedBitcodeEnabled() && 3933 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) { 3934 // Add flags implied by -fembed-bitcode. 3935 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ); 3936 // Disable all llvm IR level optimizations. 3937 CmdArgs.push_back("-disable-llvm-optzns"); 3938 } 3939 if (C.getDriver().embedBitcodeMarkerOnly()) 3940 CmdArgs.push_back("-fembed-bitcode=marker"); 3941 3942 // We normally speed up the clang process a bit by skipping destructors at 3943 // exit, but when we're generating diagnostics we can rely on some of the 3944 // cleanup. 3945 if (!C.isForDiagnostics()) 3946 CmdArgs.push_back("-disable-free"); 3947 3948 // Disable the verification pass in -asserts builds. 3949 #ifdef NDEBUG 3950 CmdArgs.push_back("-disable-llvm-verifier"); 3951 // Discard LLVM value names in -asserts builds. 3952 CmdArgs.push_back("-discard-value-names"); 3953 #endif 3954 3955 // Set the main file name, so that debug info works even with 3956 // -save-temps. 3957 CmdArgs.push_back("-main-file-name"); 3958 CmdArgs.push_back(getBaseInputName(Args, Input)); 3959 3960 // Some flags which affect the language (via preprocessor 3961 // defines). 3962 if (Args.hasArg(options::OPT_static)) 3963 CmdArgs.push_back("-static-define"); 3964 3965 if (isa<AnalyzeJobAction>(JA)) { 3966 // Enable region store model by default. 3967 CmdArgs.push_back("-analyzer-store=region"); 3968 3969 // Treat blocks as analysis entry points. 3970 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 3971 3972 CmdArgs.push_back("-analyzer-eagerly-assume"); 3973 3974 // Add default argument set. 3975 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 3976 CmdArgs.push_back("-analyzer-checker=core"); 3977 3978 if (!IsWindowsMSVC) { 3979 CmdArgs.push_back("-analyzer-checker=unix"); 3980 } else { 3981 // Enable "unix" checkers that also work on Windows. 3982 CmdArgs.push_back("-analyzer-checker=unix.API"); 3983 CmdArgs.push_back("-analyzer-checker=unix.Malloc"); 3984 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof"); 3985 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator"); 3986 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg"); 3987 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg"); 3988 } 3989 3990 // Disable some unix checkers for PS4. 3991 if (IsPS4CPU) { 3992 CmdArgs.push_back("-analyzer-disable-checker=unix.API"); 3993 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork"); 3994 } 3995 3996 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple) 3997 CmdArgs.push_back("-analyzer-checker=osx"); 3998 3999 CmdArgs.push_back("-analyzer-checker=deadcode"); 4000 4001 if (types::isCXX(Input.getType())) 4002 CmdArgs.push_back("-analyzer-checker=cplusplus"); 4003 4004 if (!IsPS4CPU) { 4005 CmdArgs.push_back( 4006 "-analyzer-checker=security.insecureAPI.UncheckedReturn"); 4007 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw"); 4008 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets"); 4009 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp"); 4010 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp"); 4011 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork"); 4012 } 4013 4014 // Default nullability checks. 4015 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull"); 4016 CmdArgs.push_back( 4017 "-analyzer-checker=nullability.NullReturnedFromNonnull"); 4018 } 4019 4020 // Set the output format. The default is plist, for (lame) historical 4021 // reasons. 4022 CmdArgs.push_back("-analyzer-output"); 4023 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 4024 CmdArgs.push_back(A->getValue()); 4025 else 4026 CmdArgs.push_back("plist"); 4027 4028 // Disable the presentation of standard compiler warnings when 4029 // using --analyze. We only want to show static analyzer diagnostics 4030 // or frontend errors. 4031 CmdArgs.push_back("-w"); 4032 4033 // Add -Xanalyzer arguments when running as analyzer. 4034 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 4035 } 4036 4037 CheckCodeGenerationOptions(D, Args); 4038 4039 llvm::Reloc::Model RelocationModel; 4040 unsigned PICLevel; 4041 bool IsPIE; 4042 std::tie(RelocationModel, PICLevel, IsPIE) = 4043 ParsePICArgs(getToolChain(), Triple, Args); 4044 4045 const char *RMName = RelocationModelName(RelocationModel); 4046 if (RMName) { 4047 CmdArgs.push_back("-mrelocation-model"); 4048 CmdArgs.push_back(RMName); 4049 } 4050 if (PICLevel > 0) { 4051 CmdArgs.push_back("-pic-level"); 4052 CmdArgs.push_back(PICLevel == 1 ? "1" : "2"); 4053 if (IsPIE) 4054 CmdArgs.push_back("-pic-is-pie"); 4055 } 4056 4057 if (Arg *A = Args.getLastArg(options::OPT_meabi)) { 4058 CmdArgs.push_back("-meabi"); 4059 CmdArgs.push_back(A->getValue()); 4060 } 4061 4062 CmdArgs.push_back("-mthread-model"); 4063 if (Arg *A = Args.getLastArg(options::OPT_mthread_model)) 4064 CmdArgs.push_back(A->getValue()); 4065 else 4066 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel())); 4067 4068 Args.AddLastArg(CmdArgs, options::OPT_fveclib); 4069 4070 if (!Args.hasFlag(options::OPT_fmerge_all_constants, 4071 options::OPT_fno_merge_all_constants)) 4072 CmdArgs.push_back("-fno-merge-all-constants"); 4073 4074 // LLVM Code Generator Options. 4075 4076 if (Args.hasArg(options::OPT_frewrite_map_file) || 4077 Args.hasArg(options::OPT_frewrite_map_file_EQ)) { 4078 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file, 4079 options::OPT_frewrite_map_file_EQ)) { 4080 CmdArgs.push_back("-frewrite-map-file"); 4081 CmdArgs.push_back(A->getValue()); 4082 A->claim(); 4083 } 4084 } 4085 4086 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) { 4087 StringRef v = A->getValue(); 4088 CmdArgs.push_back("-mllvm"); 4089 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v)); 4090 A->claim(); 4091 } 4092 4093 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables, 4094 true)) 4095 CmdArgs.push_back("-fno-jump-tables"); 4096 4097 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { 4098 CmdArgs.push_back("-mregparm"); 4099 CmdArgs.push_back(A->getValue()); 4100 } 4101 4102 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return, 4103 options::OPT_freg_struct_return)) { 4104 if (getToolChain().getArch() != llvm::Triple::x86) { 4105 D.Diag(diag::err_drv_unsupported_opt_for_target) 4106 << A->getSpelling() << getToolChain().getTriple().str(); 4107 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) { 4108 CmdArgs.push_back("-fpcc-struct-return"); 4109 } else { 4110 assert(A->getOption().matches(options::OPT_freg_struct_return)); 4111 CmdArgs.push_back("-freg-struct-return"); 4112 } 4113 } 4114 4115 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false)) 4116 CmdArgs.push_back("-fdefault-calling-conv=stdcall"); 4117 4118 if (shouldUseFramePointer(Args, getToolChain().getTriple())) 4119 CmdArgs.push_back("-mdisable-fp-elim"); 4120 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 4121 options::OPT_fno_zero_initialized_in_bss)) 4122 CmdArgs.push_back("-mno-zero-initialized-in-bss"); 4123 4124 bool OFastEnabled = isOptimizationLevelFast(Args); 4125 // If -Ofast is the optimization level, then -fstrict-aliasing should be 4126 // enabled. This alias option is being used to simplify the hasFlag logic. 4127 OptSpecifier StrictAliasingAliasOption = 4128 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing; 4129 // We turn strict aliasing off by default if we're in CL mode, since MSVC 4130 // doesn't do any TBAA. 4131 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode(); 4132 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption, 4133 options::OPT_fno_strict_aliasing, TBAAOnByDefault)) 4134 CmdArgs.push_back("-relaxed-aliasing"); 4135 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa, 4136 options::OPT_fno_struct_path_tbaa)) 4137 CmdArgs.push_back("-no-struct-path-tbaa"); 4138 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums, 4139 false)) 4140 CmdArgs.push_back("-fstrict-enums"); 4141 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers, 4142 options::OPT_fno_strict_vtable_pointers, 4143 false)) 4144 CmdArgs.push_back("-fstrict-vtable-pointers"); 4145 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls, 4146 options::OPT_fno_optimize_sibling_calls)) 4147 CmdArgs.push_back("-mdisable-tail-calls"); 4148 4149 // Handle segmented stacks. 4150 if (Args.hasArg(options::OPT_fsplit_stack)) 4151 CmdArgs.push_back("-split-stacks"); 4152 4153 // If -Ofast is the optimization level, then -ffast-math should be enabled. 4154 // This alias option is being used to simplify the getLastArg logic. 4155 OptSpecifier FastMathAliasOption = 4156 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math; 4157 4158 // Handle various floating point optimization flags, mapping them to the 4159 // appropriate LLVM code generation flags. The pattern for all of these is to 4160 // default off the codegen optimizations, and if any flag enables them and no 4161 // flag disables them after the flag enabling them, enable the codegen 4162 // optimization. This is complicated by several "umbrella" flags. 4163 if (Arg *A = Args.getLastArg( 4164 options::OPT_ffast_math, FastMathAliasOption, 4165 options::OPT_fno_fast_math, options::OPT_ffinite_math_only, 4166 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities, 4167 options::OPT_fno_honor_infinities)) 4168 if (A->getOption().getID() != options::OPT_fno_fast_math && 4169 A->getOption().getID() != options::OPT_fno_finite_math_only && 4170 A->getOption().getID() != options::OPT_fhonor_infinities) 4171 CmdArgs.push_back("-menable-no-infs"); 4172 if (Arg *A = Args.getLastArg( 4173 options::OPT_ffast_math, FastMathAliasOption, 4174 options::OPT_fno_fast_math, options::OPT_ffinite_math_only, 4175 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans, 4176 options::OPT_fno_honor_nans)) 4177 if (A->getOption().getID() != options::OPT_fno_fast_math && 4178 A->getOption().getID() != options::OPT_fno_finite_math_only && 4179 A->getOption().getID() != options::OPT_fhonor_nans) 4180 CmdArgs.push_back("-menable-no-nans"); 4181 4182 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes. 4183 bool MathErrno = getToolChain().IsMathErrnoDefault(); 4184 if (Arg *A = 4185 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, 4186 options::OPT_fno_fast_math, options::OPT_fmath_errno, 4187 options::OPT_fno_math_errno)) { 4188 // Turning on -ffast_math (with either flag) removes the need for MathErrno. 4189 // However, turning *off* -ffast_math merely restores the toolchain default 4190 // (which may be false). 4191 if (A->getOption().getID() == options::OPT_fno_math_errno || 4192 A->getOption().getID() == options::OPT_ffast_math || 4193 A->getOption().getID() == options::OPT_Ofast) 4194 MathErrno = false; 4195 else if (A->getOption().getID() == options::OPT_fmath_errno) 4196 MathErrno = true; 4197 } 4198 if (MathErrno) 4199 CmdArgs.push_back("-fmath-errno"); 4200 4201 // There are several flags which require disabling very specific 4202 // optimizations. Any of these being disabled forces us to turn off the 4203 // entire set of LLVM optimizations, so collect them through all the flag 4204 // madness. 4205 bool AssociativeMath = false; 4206 if (Arg *A = Args.getLastArg( 4207 options::OPT_ffast_math, FastMathAliasOption, 4208 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, 4209 options::OPT_fno_unsafe_math_optimizations, 4210 options::OPT_fassociative_math, options::OPT_fno_associative_math)) 4211 if (A->getOption().getID() != options::OPT_fno_fast_math && 4212 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 4213 A->getOption().getID() != options::OPT_fno_associative_math) 4214 AssociativeMath = true; 4215 bool ReciprocalMath = false; 4216 if (Arg *A = Args.getLastArg( 4217 options::OPT_ffast_math, FastMathAliasOption, 4218 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, 4219 options::OPT_fno_unsafe_math_optimizations, 4220 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math)) 4221 if (A->getOption().getID() != options::OPT_fno_fast_math && 4222 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 4223 A->getOption().getID() != options::OPT_fno_reciprocal_math) 4224 ReciprocalMath = true; 4225 bool SignedZeros = true; 4226 if (Arg *A = Args.getLastArg( 4227 options::OPT_ffast_math, FastMathAliasOption, 4228 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, 4229 options::OPT_fno_unsafe_math_optimizations, 4230 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros)) 4231 if (A->getOption().getID() != options::OPT_fno_fast_math && 4232 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 4233 A->getOption().getID() != options::OPT_fsigned_zeros) 4234 SignedZeros = false; 4235 bool TrappingMath = true; 4236 if (Arg *A = Args.getLastArg( 4237 options::OPT_ffast_math, FastMathAliasOption, 4238 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, 4239 options::OPT_fno_unsafe_math_optimizations, 4240 options::OPT_ftrapping_math, options::OPT_fno_trapping_math)) 4241 if (A->getOption().getID() != options::OPT_fno_fast_math && 4242 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 4243 A->getOption().getID() != options::OPT_ftrapping_math) 4244 TrappingMath = false; 4245 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros && 4246 !TrappingMath) 4247 CmdArgs.push_back("-menable-unsafe-fp-math"); 4248 4249 if (!SignedZeros) 4250 CmdArgs.push_back("-fno-signed-zeros"); 4251 4252 if (ReciprocalMath) 4253 CmdArgs.push_back("-freciprocal-math"); 4254 4255 // Validate and pass through -fp-contract option. 4256 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, 4257 options::OPT_fno_fast_math, 4258 options::OPT_ffp_contract)) { 4259 if (A->getOption().getID() == options::OPT_ffp_contract) { 4260 StringRef Val = A->getValue(); 4261 if (Val == "fast" || Val == "on" || Val == "off") { 4262 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val)); 4263 } else { 4264 D.Diag(diag::err_drv_unsupported_option_argument) 4265 << A->getOption().getName() << Val; 4266 } 4267 } else if (A->getOption().matches(options::OPT_ffast_math) || 4268 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) { 4269 // If fast-math is set then set the fp-contract mode to fast. 4270 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast")); 4271 } 4272 } 4273 4274 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs); 4275 4276 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags, 4277 // and if we find them, tell the frontend to provide the appropriate 4278 // preprocessor macros. This is distinct from enabling any optimizations as 4279 // these options induce language changes which must survive serialization 4280 // and deserialization, etc. 4281 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, 4282 options::OPT_fno_fast_math)) 4283 if (!A->getOption().matches(options::OPT_fno_fast_math)) 4284 CmdArgs.push_back("-ffast-math"); 4285 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, 4286 options::OPT_fno_fast_math)) 4287 if (A->getOption().matches(options::OPT_ffinite_math_only)) 4288 CmdArgs.push_back("-ffinite-math-only"); 4289 4290 // Decide whether to use verbose asm. Verbose assembly is the default on 4291 // toolchains which have the integrated assembler on by default. 4292 bool IsIntegratedAssemblerDefault = 4293 getToolChain().IsIntegratedAssemblerDefault(); 4294 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, 4295 IsIntegratedAssemblerDefault) || 4296 Args.hasArg(options::OPT_dA)) 4297 CmdArgs.push_back("-masm-verbose"); 4298 4299 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as, 4300 IsIntegratedAssemblerDefault)) 4301 CmdArgs.push_back("-no-integrated-as"); 4302 4303 if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 4304 CmdArgs.push_back("-mdebug-pass"); 4305 CmdArgs.push_back("Structure"); 4306 } 4307 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 4308 CmdArgs.push_back("-mdebug-pass"); 4309 CmdArgs.push_back("Arguments"); 4310 } 4311 4312 // Enable -mconstructor-aliases except on darwin, where we have to work around 4313 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where 4314 // aliases aren't supported. 4315 if (!getToolChain().getTriple().isOSDarwin() && 4316 !getToolChain().getTriple().isNVPTX()) 4317 CmdArgs.push_back("-mconstructor-aliases"); 4318 4319 // Darwin's kernel doesn't support guard variables; just die if we 4320 // try to use them. 4321 if (KernelOrKext && getToolChain().getTriple().isOSDarwin()) 4322 CmdArgs.push_back("-fforbid-guard-variables"); 4323 4324 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields, 4325 false)) { 4326 CmdArgs.push_back("-mms-bitfields"); 4327 } 4328 4329 // This is a coarse approximation of what llvm-gcc actually does, both 4330 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 4331 // complicated ways. 4332 bool AsynchronousUnwindTables = 4333 Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 4334 options::OPT_fno_asynchronous_unwind_tables, 4335 (getToolChain().IsUnwindTablesDefault() || 4336 getToolChain().getSanitizerArgs().needsUnwindTables()) && 4337 !KernelOrKext); 4338 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 4339 AsynchronousUnwindTables)) 4340 CmdArgs.push_back("-munwind-tables"); 4341 4342 getToolChain().addClangTargetOptions(Args, CmdArgs); 4343 4344 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 4345 CmdArgs.push_back("-mlimit-float-precision"); 4346 CmdArgs.push_back(A->getValue()); 4347 } 4348 4349 // FIXME: Handle -mtune=. 4350 (void)Args.hasArg(options::OPT_mtune_EQ); 4351 4352 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 4353 CmdArgs.push_back("-mcode-model"); 4354 CmdArgs.push_back(A->getValue()); 4355 } 4356 4357 // Add the target cpu 4358 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false); 4359 if (!CPU.empty()) { 4360 CmdArgs.push_back("-target-cpu"); 4361 CmdArgs.push_back(Args.MakeArgString(CPU)); 4362 } 4363 4364 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { 4365 CmdArgs.push_back("-mfpmath"); 4366 CmdArgs.push_back(A->getValue()); 4367 } 4368 4369 // Add the target features 4370 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false); 4371 4372 // Add target specific flags. 4373 switch (getToolChain().getArch()) { 4374 default: 4375 break; 4376 4377 case llvm::Triple::arm: 4378 case llvm::Triple::armeb: 4379 case llvm::Triple::thumb: 4380 case llvm::Triple::thumbeb: 4381 // Use the effective triple, which takes into account the deployment target. 4382 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext); 4383 break; 4384 4385 case llvm::Triple::aarch64: 4386 case llvm::Triple::aarch64_be: 4387 AddAArch64TargetArgs(Args, CmdArgs); 4388 break; 4389 4390 case llvm::Triple::mips: 4391 case llvm::Triple::mipsel: 4392 case llvm::Triple::mips64: 4393 case llvm::Triple::mips64el: 4394 AddMIPSTargetArgs(Args, CmdArgs); 4395 break; 4396 4397 case llvm::Triple::ppc: 4398 case llvm::Triple::ppc64: 4399 case llvm::Triple::ppc64le: 4400 AddPPCTargetArgs(Args, CmdArgs); 4401 break; 4402 4403 case llvm::Triple::sparc: 4404 case llvm::Triple::sparcel: 4405 case llvm::Triple::sparcv9: 4406 AddSparcTargetArgs(Args, CmdArgs); 4407 break; 4408 4409 case llvm::Triple::systemz: 4410 AddSystemZTargetArgs(Args, CmdArgs); 4411 break; 4412 4413 case llvm::Triple::x86: 4414 case llvm::Triple::x86_64: 4415 AddX86TargetArgs(Args, CmdArgs); 4416 break; 4417 4418 case llvm::Triple::lanai: 4419 AddLanaiTargetArgs(Args, CmdArgs); 4420 break; 4421 4422 case llvm::Triple::hexagon: 4423 AddHexagonTargetArgs(Args, CmdArgs); 4424 break; 4425 4426 case llvm::Triple::wasm32: 4427 case llvm::Triple::wasm64: 4428 AddWebAssemblyTargetArgs(Args, CmdArgs); 4429 break; 4430 } 4431 4432 // The 'g' groups options involve a somewhat intricate sequence of decisions 4433 // about what to pass from the driver to the frontend, but by the time they 4434 // reach cc1 they've been factored into three well-defined orthogonal choices: 4435 // * what level of debug info to generate 4436 // * what dwarf version to write 4437 // * what debugger tuning to use 4438 // This avoids having to monkey around further in cc1 other than to disable 4439 // codeview if not running in a Windows environment. Perhaps even that 4440 // decision should be made in the driver as well though. 4441 unsigned DwarfVersion = 0; 4442 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning(); 4443 // These two are potentially updated by AddClangCLArgs. 4444 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo; 4445 bool EmitCodeView = false; 4446 4447 // Add clang-cl arguments. 4448 types::ID InputType = Input.getType(); 4449 if (getToolChain().getDriver().IsCLMode()) 4450 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView); 4451 4452 // Pass the linker version in use. 4453 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 4454 CmdArgs.push_back("-target-linker-version"); 4455 CmdArgs.push_back(A->getValue()); 4456 } 4457 4458 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple())) 4459 CmdArgs.push_back("-momit-leaf-frame-pointer"); 4460 4461 // Explicitly error on some things we know we don't support and can't just 4462 // ignore. 4463 if (!Args.hasArg(options::OPT_fallow_unsupported)) { 4464 Arg *Unsupported; 4465 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() && 4466 getToolChain().getArch() == llvm::Triple::x86) { 4467 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) || 4468 (Unsupported = Args.getLastArg(options::OPT_mkernel))) 4469 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386) 4470 << Unsupported->getOption().getName(); 4471 } 4472 } 4473 4474 Args.AddAllArgs(CmdArgs, options::OPT_v); 4475 Args.AddLastArg(CmdArgs, options::OPT_H); 4476 if (D.CCPrintHeaders && !D.CCGenDiagnostics) { 4477 CmdArgs.push_back("-header-include-file"); 4478 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename 4479 : "-"); 4480 } 4481 Args.AddLastArg(CmdArgs, options::OPT_P); 4482 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 4483 4484 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) { 4485 CmdArgs.push_back("-diagnostic-log-file"); 4486 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename 4487 : "-"); 4488 } 4489 4490 Args.ClaimAllArgs(options::OPT_g_Group); 4491 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf); 4492 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { 4493 // If the last option explicitly specified a debug-info level, use it. 4494 if (A->getOption().matches(options::OPT_gN_Group)) { 4495 DebugInfoKind = DebugLevelToInfoKind(*A); 4496 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses. 4497 // But -gsplit-dwarf is not a g_group option, hence we have to check the 4498 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.) 4499 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo && 4500 A->getIndex() > SplitDwarfArg->getIndex()) 4501 SplitDwarfArg = nullptr; 4502 } else 4503 // For any other 'g' option, use Limited. 4504 DebugInfoKind = codegenoptions::LimitedDebugInfo; 4505 } 4506 4507 // If a debugger tuning argument appeared, remember it. 4508 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group, 4509 options::OPT_ggdbN_Group)) { 4510 if (A->getOption().matches(options::OPT_glldb)) 4511 DebuggerTuning = llvm::DebuggerKind::LLDB; 4512 else if (A->getOption().matches(options::OPT_gsce)) 4513 DebuggerTuning = llvm::DebuggerKind::SCE; 4514 else 4515 DebuggerTuning = llvm::DebuggerKind::GDB; 4516 } 4517 4518 // If a -gdwarf argument appeared, remember it. 4519 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3, 4520 options::OPT_gdwarf_4, options::OPT_gdwarf_5)) 4521 DwarfVersion = DwarfVersionNum(A->getSpelling()); 4522 4523 // Forward -gcodeview. 4524 // 'EmitCodeView might have been set by CL-compatibility argument parsing. 4525 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) { 4526 // DwarfVersion remains at 0 if no explicit choice was made. 4527 CmdArgs.push_back("-gcodeview"); 4528 } else if (DwarfVersion == 0 && 4529 DebugInfoKind != codegenoptions::NoDebugInfo) { 4530 DwarfVersion = getToolChain().GetDefaultDwarfVersion(); 4531 } 4532 4533 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now. 4534 Args.ClaimAllArgs(options::OPT_g_flags_Group); 4535 4536 // PS4 defaults to no column info 4537 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info, 4538 /*Default=*/ !IsPS4CPU)) 4539 CmdArgs.push_back("-dwarf-column-info"); 4540 4541 // FIXME: Move backend command line options to the module. 4542 if (Args.hasArg(options::OPT_gmodules)) { 4543 DebugInfoKind = codegenoptions::LimitedDebugInfo; 4544 CmdArgs.push_back("-dwarf-ext-refs"); 4545 CmdArgs.push_back("-fmodule-format=obj"); 4546 } 4547 4548 // -gsplit-dwarf should turn on -g and enable the backend dwarf 4549 // splitting and extraction. 4550 // FIXME: Currently only works on Linux. 4551 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) { 4552 DebugInfoKind = codegenoptions::LimitedDebugInfo; 4553 CmdArgs.push_back("-backend-option"); 4554 CmdArgs.push_back("-split-dwarf=Enable"); 4555 } 4556 4557 // After we've dealt with all combinations of things that could 4558 // make DebugInfoKind be other than None or DebugLineTablesOnly, 4559 // figure out if we need to "upgrade" it to standalone debug info. 4560 // We parse these two '-f' options whether or not they will be used, 4561 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only" 4562 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug, 4563 options::OPT_fno_standalone_debug, 4564 getToolChain().GetDefaultStandaloneDebug()); 4565 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug) 4566 DebugInfoKind = codegenoptions::FullDebugInfo; 4567 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion, 4568 DebuggerTuning); 4569 4570 // -ggnu-pubnames turns on gnu style pubnames in the backend. 4571 if (Args.hasArg(options::OPT_ggnu_pubnames)) { 4572 CmdArgs.push_back("-backend-option"); 4573 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections"); 4574 } 4575 4576 // -gdwarf-aranges turns on the emission of the aranges section in the 4577 // backend. 4578 // Always enabled on the PS4. 4579 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) { 4580 CmdArgs.push_back("-backend-option"); 4581 CmdArgs.push_back("-generate-arange-section"); 4582 } 4583 4584 if (Args.hasFlag(options::OPT_fdebug_types_section, 4585 options::OPT_fno_debug_types_section, false)) { 4586 CmdArgs.push_back("-backend-option"); 4587 CmdArgs.push_back("-generate-type-units"); 4588 } 4589 4590 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by 4591 // default. 4592 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI || 4593 Triple.getArch() == llvm::Triple::wasm32 || 4594 Triple.getArch() == llvm::Triple::wasm64; 4595 4596 if (Args.hasFlag(options::OPT_ffunction_sections, 4597 options::OPT_fno_function_sections, UseSeparateSections)) { 4598 CmdArgs.push_back("-ffunction-sections"); 4599 } 4600 4601 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections, 4602 UseSeparateSections)) { 4603 CmdArgs.push_back("-fdata-sections"); 4604 } 4605 4606 if (!Args.hasFlag(options::OPT_funique_section_names, 4607 options::OPT_fno_unique_section_names, true)) 4608 CmdArgs.push_back("-fno-unique-section-names"); 4609 4610 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions); 4611 4612 if (Args.hasFlag(options::OPT_fxray_instrument, 4613 options::OPT_fnoxray_instrument, false)) { 4614 CmdArgs.push_back("-fxray-instrument"); 4615 if (Arg *A = Args.getLastArg(options::OPT_fxray_instruction_threshold_, 4616 options::OPT_fxray_instruction_threshold_EQ)) { 4617 CmdArgs.push_back("-fxray-instruction-threshold"); 4618 CmdArgs.push_back(A->getValue()); 4619 } 4620 } 4621 4622 if (Args.hasFlag(options::OPT_fxray_instrument, 4623 options::OPT_fnoxray_instrument, false)) { 4624 CmdArgs.push_back("-fxray-instrument"); 4625 if (const Arg *A = 4626 Args.getLastArg(options::OPT_fxray_instruction_threshold_, 4627 options::OPT_fxray_instruction_threshold_EQ)) { 4628 CmdArgs.push_back("-fxray-instruction-threshold"); 4629 CmdArgs.push_back(A->getValue()); 4630 } 4631 } 4632 4633 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs); 4634 4635 // Add runtime flag for PS4 when PGO or Coverage are enabled. 4636 if (getToolChain().getTriple().isPS4CPU()) 4637 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs); 4638 4639 // Pass options for controlling the default header search paths. 4640 if (Args.hasArg(options::OPT_nostdinc)) { 4641 CmdArgs.push_back("-nostdsysteminc"); 4642 CmdArgs.push_back("-nobuiltininc"); 4643 } else { 4644 if (Args.hasArg(options::OPT_nostdlibinc)) 4645 CmdArgs.push_back("-nostdsysteminc"); 4646 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx); 4647 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 4648 } 4649 4650 // Pass the path to compiler resource files. 4651 CmdArgs.push_back("-resource-dir"); 4652 CmdArgs.push_back(D.ResourceDir.c_str()); 4653 4654 Args.AddLastArg(CmdArgs, options::OPT_working_directory); 4655 4656 bool ARCMTEnabled = false; 4657 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) { 4658 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check, 4659 options::OPT_ccc_arcmt_modify, 4660 options::OPT_ccc_arcmt_migrate)) { 4661 ARCMTEnabled = true; 4662 switch (A->getOption().getID()) { 4663 default: 4664 llvm_unreachable("missed a case"); 4665 case options::OPT_ccc_arcmt_check: 4666 CmdArgs.push_back("-arcmt-check"); 4667 break; 4668 case options::OPT_ccc_arcmt_modify: 4669 CmdArgs.push_back("-arcmt-modify"); 4670 break; 4671 case options::OPT_ccc_arcmt_migrate: 4672 CmdArgs.push_back("-arcmt-migrate"); 4673 CmdArgs.push_back("-mt-migrate-directory"); 4674 CmdArgs.push_back(A->getValue()); 4675 4676 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output); 4677 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors); 4678 break; 4679 } 4680 } 4681 } else { 4682 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check); 4683 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify); 4684 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate); 4685 } 4686 4687 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) { 4688 if (ARCMTEnabled) { 4689 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) 4690 << "-ccc-arcmt-migrate"; 4691 } 4692 CmdArgs.push_back("-mt-migrate-directory"); 4693 CmdArgs.push_back(A->getValue()); 4694 4695 if (!Args.hasArg(options::OPT_objcmt_migrate_literals, 4696 options::OPT_objcmt_migrate_subscripting, 4697 options::OPT_objcmt_migrate_property)) { 4698 // None specified, means enable them all. 4699 CmdArgs.push_back("-objcmt-migrate-literals"); 4700 CmdArgs.push_back("-objcmt-migrate-subscripting"); 4701 CmdArgs.push_back("-objcmt-migrate-property"); 4702 } else { 4703 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals); 4704 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting); 4705 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property); 4706 } 4707 } else { 4708 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals); 4709 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting); 4710 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property); 4711 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all); 4712 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property); 4713 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property); 4714 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax); 4715 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation); 4716 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype); 4717 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros); 4718 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance); 4719 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property); 4720 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property); 4721 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly); 4722 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init); 4723 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path); 4724 } 4725 4726 // Add preprocessing options like -I, -D, etc. if we are using the 4727 // preprocessor. 4728 // 4729 // FIXME: Support -fpreprocessed 4730 if (types::getPreprocessedType(InputType) != types::TY_INVALID) 4731 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs, 4732 AuxToolChain); 4733 4734 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes 4735 // that "The compiler can only warn and ignore the option if not recognized". 4736 // When building with ccache, it will pass -D options to clang even on 4737 // preprocessed inputs and configure concludes that -fPIC is not supported. 4738 Args.ClaimAllArgs(options::OPT_D); 4739 4740 // Manually translate -O4 to -O3; let clang reject others. 4741 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 4742 if (A->getOption().matches(options::OPT_O4)) { 4743 CmdArgs.push_back("-O3"); 4744 D.Diag(diag::warn_O4_is_O3); 4745 } else { 4746 A->render(Args, CmdArgs); 4747 } 4748 } 4749 4750 // Warn about ignored options to clang. 4751 for (const Arg *A : 4752 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) { 4753 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args); 4754 A->claim(); 4755 } 4756 4757 claimNoWarnArgs(Args); 4758 4759 Args.AddAllArgs(CmdArgs, options::OPT_R_Group); 4760 Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 4761 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false)) 4762 CmdArgs.push_back("-pedantic"); 4763 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 4764 Args.AddLastArg(CmdArgs, options::OPT_w); 4765 4766 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 4767 // (-ansi is equivalent to -std=c89 or -std=c++98). 4768 // 4769 // If a std is supplied, only add -trigraphs if it follows the 4770 // option. 4771 bool ImplyVCPPCXXVer = false; 4772 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 4773 if (Std->getOption().matches(options::OPT_ansi)) 4774 if (types::isCXX(InputType)) 4775 CmdArgs.push_back("-std=c++98"); 4776 else 4777 CmdArgs.push_back("-std=c89"); 4778 else 4779 Std->render(Args, CmdArgs); 4780 4781 // If -f(no-)trigraphs appears after the language standard flag, honor it. 4782 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi, 4783 options::OPT_ftrigraphs, 4784 options::OPT_fno_trigraphs)) 4785 if (A != Std) 4786 A->render(Args, CmdArgs); 4787 } else { 4788 // Honor -std-default. 4789 // 4790 // FIXME: Clang doesn't correctly handle -std= when the input language 4791 // doesn't match. For the time being just ignore this for C++ inputs; 4792 // eventually we want to do all the standard defaulting here instead of 4793 // splitting it between the driver and clang -cc1. 4794 if (!types::isCXX(InputType)) 4795 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=", 4796 /*Joined=*/true); 4797 else if (IsWindowsMSVC) 4798 ImplyVCPPCXXVer = true; 4799 4800 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs, 4801 options::OPT_fno_trigraphs); 4802 } 4803 4804 // GCC's behavior for -Wwrite-strings is a bit strange: 4805 // * In C, this "warning flag" changes the types of string literals from 4806 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning 4807 // for the discarded qualifier. 4808 // * In C++, this is just a normal warning flag. 4809 // 4810 // Implementing this warning correctly in C is hard, so we follow GCC's 4811 // behavior for now. FIXME: Directly diagnose uses of a string literal as 4812 // a non-const char* in C, rather than using this crude hack. 4813 if (!types::isCXX(InputType)) { 4814 // FIXME: This should behave just like a warning flag, and thus should also 4815 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on. 4816 Arg *WriteStrings = 4817 Args.getLastArg(options::OPT_Wwrite_strings, 4818 options::OPT_Wno_write_strings, options::OPT_w); 4819 if (WriteStrings && 4820 WriteStrings->getOption().matches(options::OPT_Wwrite_strings)) 4821 CmdArgs.push_back("-fconst-strings"); 4822 } 4823 4824 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active 4825 // during C++ compilation, which it is by default. GCC keeps this define even 4826 // in the presence of '-w', match this behavior bug-for-bug. 4827 if (types::isCXX(InputType) && 4828 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated, 4829 true)) { 4830 CmdArgs.push_back("-fdeprecated-macro"); 4831 } 4832 4833 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'. 4834 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) { 4835 if (Asm->getOption().matches(options::OPT_fasm)) 4836 CmdArgs.push_back("-fgnu-keywords"); 4837 else 4838 CmdArgs.push_back("-fno-gnu-keywords"); 4839 } 4840 4841 if (ShouldDisableDwarfDirectory(Args, getToolChain())) 4842 CmdArgs.push_back("-fno-dwarf-directory-asm"); 4843 4844 if (ShouldDisableAutolink(Args, getToolChain())) 4845 CmdArgs.push_back("-fno-autolink"); 4846 4847 // Add in -fdebug-compilation-dir if necessary. 4848 addDebugCompDirArg(Args, CmdArgs); 4849 4850 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) { 4851 StringRef Map = A->getValue(); 4852 if (Map.find('=') == StringRef::npos) 4853 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map; 4854 else 4855 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map)); 4856 A->claim(); 4857 } 4858 4859 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_, 4860 options::OPT_ftemplate_depth_EQ)) { 4861 CmdArgs.push_back("-ftemplate-depth"); 4862 CmdArgs.push_back(A->getValue()); 4863 } 4864 4865 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) { 4866 CmdArgs.push_back("-foperator-arrow-depth"); 4867 CmdArgs.push_back(A->getValue()); 4868 } 4869 4870 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) { 4871 CmdArgs.push_back("-fconstexpr-depth"); 4872 CmdArgs.push_back(A->getValue()); 4873 } 4874 4875 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) { 4876 CmdArgs.push_back("-fconstexpr-steps"); 4877 CmdArgs.push_back(A->getValue()); 4878 } 4879 4880 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) { 4881 CmdArgs.push_back("-fbracket-depth"); 4882 CmdArgs.push_back(A->getValue()); 4883 } 4884 4885 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ, 4886 options::OPT_Wlarge_by_value_copy_def)) { 4887 if (A->getNumValues()) { 4888 StringRef bytes = A->getValue(); 4889 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes)); 4890 } else 4891 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value 4892 } 4893 4894 if (Args.hasArg(options::OPT_relocatable_pch)) 4895 CmdArgs.push_back("-relocatable-pch"); 4896 4897 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 4898 CmdArgs.push_back("-fconstant-string-class"); 4899 CmdArgs.push_back(A->getValue()); 4900 } 4901 4902 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { 4903 CmdArgs.push_back("-ftabstop"); 4904 CmdArgs.push_back(A->getValue()); 4905 } 4906 4907 CmdArgs.push_back("-ferror-limit"); 4908 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) 4909 CmdArgs.push_back(A->getValue()); 4910 else 4911 CmdArgs.push_back("19"); 4912 4913 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) { 4914 CmdArgs.push_back("-fmacro-backtrace-limit"); 4915 CmdArgs.push_back(A->getValue()); 4916 } 4917 4918 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) { 4919 CmdArgs.push_back("-ftemplate-backtrace-limit"); 4920 CmdArgs.push_back(A->getValue()); 4921 } 4922 4923 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) { 4924 CmdArgs.push_back("-fconstexpr-backtrace-limit"); 4925 CmdArgs.push_back(A->getValue()); 4926 } 4927 4928 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) { 4929 CmdArgs.push_back("-fspell-checking-limit"); 4930 CmdArgs.push_back(A->getValue()); 4931 } 4932 4933 // Pass -fmessage-length=. 4934 CmdArgs.push_back("-fmessage-length"); 4935 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 4936 CmdArgs.push_back(A->getValue()); 4937 } else { 4938 // If -fmessage-length=N was not specified, determine whether this is a 4939 // terminal and, if so, implicitly define -fmessage-length appropriately. 4940 unsigned N = llvm::sys::Process::StandardErrColumns(); 4941 CmdArgs.push_back(Args.MakeArgString(Twine(N))); 4942 } 4943 4944 // -fvisibility= and -fvisibility-ms-compat are of a piece. 4945 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ, 4946 options::OPT_fvisibility_ms_compat)) { 4947 if (A->getOption().matches(options::OPT_fvisibility_EQ)) { 4948 CmdArgs.push_back("-fvisibility"); 4949 CmdArgs.push_back(A->getValue()); 4950 } else { 4951 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat)); 4952 CmdArgs.push_back("-fvisibility"); 4953 CmdArgs.push_back("hidden"); 4954 CmdArgs.push_back("-ftype-visibility"); 4955 CmdArgs.push_back("default"); 4956 } 4957 } 4958 4959 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden); 4960 4961 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ); 4962 4963 // -fhosted is default. 4964 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) || 4965 KernelOrKext) 4966 CmdArgs.push_back("-ffreestanding"); 4967 4968 // Forward -f (flag) options which we can pass directly. 4969 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 4970 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 4971 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); 4972 // Emulated TLS is enabled by default on Android, and can be enabled manually 4973 // with -femulated-tls. 4974 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment(); 4975 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls, 4976 EmulatedTLSDefault)) 4977 CmdArgs.push_back("-femulated-tls"); 4978 // AltiVec-like language extensions aren't relevant for assembling. 4979 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) { 4980 Args.AddLastArg(CmdArgs, options::OPT_faltivec); 4981 Args.AddLastArg(CmdArgs, options::OPT_fzvector); 4982 } 4983 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree); 4984 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type); 4985 4986 // Forward flags for OpenMP 4987 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, 4988 options::OPT_fno_openmp, false)) { 4989 switch (getOpenMPRuntime(getToolChain(), Args)) { 4990 case OMPRT_OMP: 4991 case OMPRT_IOMP5: 4992 // Clang can generate useful OpenMP code for these two runtime libraries. 4993 CmdArgs.push_back("-fopenmp"); 4994 4995 // If no option regarding the use of TLS in OpenMP codegeneration is 4996 // given, decide a default based on the target. Otherwise rely on the 4997 // options and pass the right information to the frontend. 4998 if (!Args.hasFlag(options::OPT_fopenmp_use_tls, 4999 options::OPT_fnoopenmp_use_tls, /*Default=*/true)) 5000 CmdArgs.push_back("-fnoopenmp-use-tls"); 5001 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ); 5002 break; 5003 default: 5004 // By default, if Clang doesn't know how to generate useful OpenMP code 5005 // for a specific runtime library, we just don't pass the '-fopenmp' flag 5006 // down to the actual compilation. 5007 // FIXME: It would be better to have a mode which *only* omits IR 5008 // generation based on the OpenMP support so that we get consistent 5009 // semantic analysis, etc. 5010 break; 5011 } 5012 } 5013 5014 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs(); 5015 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType); 5016 5017 // Report an error for -faltivec on anything other than PowerPC. 5018 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) { 5019 const llvm::Triple::ArchType Arch = getToolChain().getArch(); 5020 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 || 5021 Arch == llvm::Triple::ppc64le)) 5022 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) 5023 << "ppc/ppc64/ppc64le"; 5024 } 5025 5026 // -fzvector is incompatible with -faltivec. 5027 if (Arg *A = Args.getLastArg(options::OPT_fzvector)) 5028 if (Args.hasArg(options::OPT_faltivec)) 5029 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) 5030 << "-faltivec"; 5031 5032 if (getToolChain().SupportsProfiling()) 5033 Args.AddLastArg(CmdArgs, options::OPT_pg); 5034 5035 // -flax-vector-conversions is default. 5036 if (!Args.hasFlag(options::OPT_flax_vector_conversions, 5037 options::OPT_fno_lax_vector_conversions)) 5038 CmdArgs.push_back("-fno-lax-vector-conversions"); 5039 5040 if (Args.getLastArg(options::OPT_fapple_kext) || 5041 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType))) 5042 CmdArgs.push_back("-fapple-kext"); 5043 5044 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 5045 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 5046 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits); 5047 Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 5048 Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 5049 5050 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) { 5051 CmdArgs.push_back("-ftrapv-handler"); 5052 CmdArgs.push_back(A->getValue()); 5053 } 5054 5055 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ); 5056 5057 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but 5058 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv. 5059 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) { 5060 if (A->getOption().matches(options::OPT_fwrapv)) 5061 CmdArgs.push_back("-fwrapv"); 5062 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow, 5063 options::OPT_fno_strict_overflow)) { 5064 if (A->getOption().matches(options::OPT_fno_strict_overflow)) 5065 CmdArgs.push_back("-fwrapv"); 5066 } 5067 5068 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops, 5069 options::OPT_fno_reroll_loops)) 5070 if (A->getOption().matches(options::OPT_freroll_loops)) 5071 CmdArgs.push_back("-freroll-loops"); 5072 5073 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 5074 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops, 5075 options::OPT_fno_unroll_loops); 5076 5077 Args.AddLastArg(CmdArgs, options::OPT_pthread); 5078 5079 // -stack-protector=0 is default. 5080 unsigned StackProtectorLevel = 0; 5081 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 5082 options::OPT_fstack_protector_all, 5083 options::OPT_fstack_protector_strong, 5084 options::OPT_fstack_protector)) { 5085 if (A->getOption().matches(options::OPT_fstack_protector)) { 5086 StackProtectorLevel = std::max<unsigned>( 5087 LangOptions::SSPOn, 5088 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext)); 5089 } else if (A->getOption().matches(options::OPT_fstack_protector_strong)) 5090 StackProtectorLevel = LangOptions::SSPStrong; 5091 else if (A->getOption().matches(options::OPT_fstack_protector_all)) 5092 StackProtectorLevel = LangOptions::SSPReq; 5093 } else { 5094 StackProtectorLevel = 5095 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext); 5096 } 5097 if (StackProtectorLevel) { 5098 CmdArgs.push_back("-stack-protector"); 5099 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel))); 5100 } 5101 5102 // --param ssp-buffer-size= 5103 for (const Arg *A : Args.filtered(options::OPT__param)) { 5104 StringRef Str(A->getValue()); 5105 if (Str.startswith("ssp-buffer-size=")) { 5106 if (StackProtectorLevel) { 5107 CmdArgs.push_back("-stack-protector-buffer-size"); 5108 // FIXME: Verify the argument is a valid integer. 5109 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16))); 5110 } 5111 A->claim(); 5112 } 5113 } 5114 5115 // Translate -mstackrealign 5116 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign, 5117 false)) 5118 CmdArgs.push_back(Args.MakeArgString("-mstackrealign")); 5119 5120 if (Args.hasArg(options::OPT_mstack_alignment)) { 5121 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment); 5122 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment)); 5123 } 5124 5125 if (Args.hasArg(options::OPT_mstack_probe_size)) { 5126 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size); 5127 5128 if (!Size.empty()) 5129 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size)); 5130 else 5131 CmdArgs.push_back("-mstack-probe-size=0"); 5132 } 5133 5134 switch (getToolChain().getArch()) { 5135 case llvm::Triple::aarch64: 5136 case llvm::Triple::aarch64_be: 5137 case llvm::Triple::arm: 5138 case llvm::Triple::armeb: 5139 case llvm::Triple::thumb: 5140 case llvm::Triple::thumbeb: 5141 CmdArgs.push_back("-fallow-half-arguments-and-returns"); 5142 break; 5143 5144 default: 5145 break; 5146 } 5147 5148 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it, 5149 options::OPT_mno_restrict_it)) { 5150 if (A->getOption().matches(options::OPT_mrestrict_it)) { 5151 CmdArgs.push_back("-backend-option"); 5152 CmdArgs.push_back("-arm-restrict-it"); 5153 } else { 5154 CmdArgs.push_back("-backend-option"); 5155 CmdArgs.push_back("-arm-no-restrict-it"); 5156 } 5157 } else if (Triple.isOSWindows() && 5158 (Triple.getArch() == llvm::Triple::arm || 5159 Triple.getArch() == llvm::Triple::thumb)) { 5160 // Windows on ARM expects restricted IT blocks 5161 CmdArgs.push_back("-backend-option"); 5162 CmdArgs.push_back("-arm-restrict-it"); 5163 } 5164 5165 // Forward -cl options to -cc1 5166 if (Args.getLastArg(options::OPT_cl_opt_disable)) { 5167 CmdArgs.push_back("-cl-opt-disable"); 5168 } 5169 if (Args.getLastArg(options::OPT_cl_strict_aliasing)) { 5170 CmdArgs.push_back("-cl-strict-aliasing"); 5171 } 5172 if (Args.getLastArg(options::OPT_cl_single_precision_constant)) { 5173 CmdArgs.push_back("-cl-single-precision-constant"); 5174 } 5175 if (Args.getLastArg(options::OPT_cl_finite_math_only)) { 5176 CmdArgs.push_back("-cl-finite-math-only"); 5177 } 5178 if (Args.getLastArg(options::OPT_cl_kernel_arg_info)) { 5179 CmdArgs.push_back("-cl-kernel-arg-info"); 5180 } 5181 if (Args.getLastArg(options::OPT_cl_unsafe_math_optimizations)) { 5182 CmdArgs.push_back("-cl-unsafe-math-optimizations"); 5183 } 5184 if (Args.getLastArg(options::OPT_cl_fast_relaxed_math)) { 5185 CmdArgs.push_back("-cl-fast-relaxed-math"); 5186 } 5187 if (Args.getLastArg(options::OPT_cl_mad_enable)) { 5188 CmdArgs.push_back("-cl-mad-enable"); 5189 } 5190 if (Args.getLastArg(options::OPT_cl_no_signed_zeros)) { 5191 CmdArgs.push_back("-cl-no-signed-zeros"); 5192 } 5193 if (Arg *A = Args.getLastArg(options::OPT_cl_std_EQ)) { 5194 std::string CLStdStr = "-cl-std="; 5195 CLStdStr += A->getValue(); 5196 CmdArgs.push_back(Args.MakeArgString(CLStdStr)); 5197 } 5198 if (Args.getLastArg(options::OPT_cl_denorms_are_zero)) { 5199 CmdArgs.push_back("-cl-denorms-are-zero"); 5200 } 5201 5202 // Forward -f options with positive and negative forms; we translate 5203 // these by hand. 5204 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) { 5205 StringRef fname = A->getValue(); 5206 if (!llvm::sys::fs::exists(fname)) 5207 D.Diag(diag::err_drv_no_such_file) << fname; 5208 else 5209 A->render(Args, CmdArgs); 5210 } 5211 5212 // -fbuiltin is default unless -mkernel is used. 5213 bool UseBuiltins = 5214 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin, 5215 !Args.hasArg(options::OPT_mkernel)); 5216 if (!UseBuiltins) 5217 CmdArgs.push_back("-fno-builtin"); 5218 5219 // -ffreestanding implies -fno-builtin. 5220 if (Args.hasArg(options::OPT_ffreestanding)) 5221 UseBuiltins = false; 5222 5223 // Process the -fno-builtin-* options. 5224 for (const auto &Arg : Args) { 5225 const Option &O = Arg->getOption(); 5226 if (!O.matches(options::OPT_fno_builtin_)) 5227 continue; 5228 5229 Arg->claim(); 5230 // If -fno-builtin is specified, then there's no need to pass the option to 5231 // the frontend. 5232 if (!UseBuiltins) 5233 continue; 5234 5235 StringRef FuncName = Arg->getValue(); 5236 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName)); 5237 } 5238 5239 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 5240 options::OPT_fno_assume_sane_operator_new)) 5241 CmdArgs.push_back("-fno-assume-sane-operator-new"); 5242 5243 // -fblocks=0 is default. 5244 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 5245 getToolChain().IsBlocksDefault()) || 5246 (Args.hasArg(options::OPT_fgnu_runtime) && 5247 Args.hasArg(options::OPT_fobjc_nonfragile_abi) && 5248 !Args.hasArg(options::OPT_fno_blocks))) { 5249 CmdArgs.push_back("-fblocks"); 5250 5251 if (!Args.hasArg(options::OPT_fgnu_runtime) && 5252 !getToolChain().hasBlocksRuntime()) 5253 CmdArgs.push_back("-fblocks-runtime-optional"); 5254 } 5255 5256 // -fmodules enables the use of precompiled modules (off by default). 5257 // Users can pass -fno-cxx-modules to turn off modules support for 5258 // C++/Objective-C++ programs. 5259 bool HaveModules = false; 5260 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) { 5261 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules, 5262 options::OPT_fno_cxx_modules, true); 5263 if (AllowedInCXX || !types::isCXX(InputType)) { 5264 CmdArgs.push_back("-fmodules"); 5265 HaveModules = true; 5266 } 5267 } 5268 5269 // -fmodule-maps enables implicit reading of module map files. By default, 5270 // this is enabled if we are using precompiled modules. 5271 if (Args.hasFlag(options::OPT_fimplicit_module_maps, 5272 options::OPT_fno_implicit_module_maps, HaveModules)) { 5273 CmdArgs.push_back("-fimplicit-module-maps"); 5274 } 5275 5276 // -fmodules-decluse checks that modules used are declared so (off by 5277 // default). 5278 if (Args.hasFlag(options::OPT_fmodules_decluse, 5279 options::OPT_fno_modules_decluse, false)) { 5280 CmdArgs.push_back("-fmodules-decluse"); 5281 } 5282 5283 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that 5284 // all #included headers are part of modules. 5285 if (Args.hasFlag(options::OPT_fmodules_strict_decluse, 5286 options::OPT_fno_modules_strict_decluse, false)) { 5287 CmdArgs.push_back("-fmodules-strict-decluse"); 5288 } 5289 5290 // -fno-implicit-modules turns off implicitly compiling modules on demand. 5291 if (!Args.hasFlag(options::OPT_fimplicit_modules, 5292 options::OPT_fno_implicit_modules)) { 5293 CmdArgs.push_back("-fno-implicit-modules"); 5294 } else if (HaveModules) { 5295 // -fmodule-cache-path specifies where our implicitly-built module files 5296 // should be written. 5297 SmallString<128> Path; 5298 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) 5299 Path = A->getValue(); 5300 if (C.isForDiagnostics()) { 5301 // When generating crash reports, we want to emit the modules along with 5302 // the reproduction sources, so we ignore any provided module path. 5303 Path = Output.getFilename(); 5304 llvm::sys::path::replace_extension(Path, ".cache"); 5305 llvm::sys::path::append(Path, "modules"); 5306 } else if (Path.empty()) { 5307 // No module path was provided: use the default. 5308 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path); 5309 llvm::sys::path::append(Path, "org.llvm.clang."); 5310 appendUserToPath(Path); 5311 llvm::sys::path::append(Path, "ModuleCache"); 5312 } 5313 const char Arg[] = "-fmodules-cache-path="; 5314 Path.insert(Path.begin(), Arg, Arg + strlen(Arg)); 5315 CmdArgs.push_back(Args.MakeArgString(Path)); 5316 } 5317 5318 // -fmodule-name specifies the module that is currently being built (or 5319 // used for header checking by -fmodule-maps). 5320 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ); 5321 5322 // -fmodule-map-file can be used to specify files containing module 5323 // definitions. 5324 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file); 5325 5326 // -fmodule-file can be used to specify files containing precompiled modules. 5327 if (HaveModules) 5328 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file); 5329 else 5330 Args.ClaimAllArgs(options::OPT_fmodule_file); 5331 5332 // When building modules and generating crashdumps, we need to dump a module 5333 // dependency VFS alongside the output. 5334 if (HaveModules && C.isForDiagnostics()) { 5335 SmallString<128> VFSDir(Output.getFilename()); 5336 llvm::sys::path::replace_extension(VFSDir, ".cache"); 5337 // Add the cache directory as a temp so the crash diagnostics pick it up. 5338 C.addTempFile(Args.MakeArgString(VFSDir)); 5339 5340 llvm::sys::path::append(VFSDir, "vfs"); 5341 CmdArgs.push_back("-module-dependency-dir"); 5342 CmdArgs.push_back(Args.MakeArgString(VFSDir)); 5343 } 5344 5345 if (HaveModules) 5346 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path); 5347 5348 // Pass through all -fmodules-ignore-macro arguments. 5349 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro); 5350 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval); 5351 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after); 5352 5353 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp); 5354 5355 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) { 5356 if (Args.hasArg(options::OPT_fbuild_session_timestamp)) 5357 D.Diag(diag::err_drv_argument_not_allowed_with) 5358 << A->getAsString(Args) << "-fbuild-session-timestamp"; 5359 5360 llvm::sys::fs::file_status Status; 5361 if (llvm::sys::fs::status(A->getValue(), Status)) 5362 D.Diag(diag::err_drv_no_such_file) << A->getValue(); 5363 CmdArgs.push_back(Args.MakeArgString( 5364 "-fbuild-session-timestamp=" + 5365 Twine((uint64_t)Status.getLastModificationTime().toEpochTime()))); 5366 } 5367 5368 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) { 5369 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp, 5370 options::OPT_fbuild_session_file)) 5371 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp); 5372 5373 Args.AddLastArg(CmdArgs, 5374 options::OPT_fmodules_validate_once_per_build_session); 5375 } 5376 5377 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers); 5378 5379 // -faccess-control is default. 5380 if (Args.hasFlag(options::OPT_fno_access_control, 5381 options::OPT_faccess_control, false)) 5382 CmdArgs.push_back("-fno-access-control"); 5383 5384 // -felide-constructors is the default. 5385 if (Args.hasFlag(options::OPT_fno_elide_constructors, 5386 options::OPT_felide_constructors, false)) 5387 CmdArgs.push_back("-fno-elide-constructors"); 5388 5389 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode(); 5390 5391 if (KernelOrKext || (types::isCXX(InputType) && 5392 (RTTIMode == ToolChain::RM_DisabledExplicitly || 5393 RTTIMode == ToolChain::RM_DisabledImplicitly))) 5394 CmdArgs.push_back("-fno-rtti"); 5395 5396 // -fshort-enums=0 is default for all architectures except Hexagon. 5397 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums, 5398 getToolChain().getArch() == llvm::Triple::hexagon)) 5399 CmdArgs.push_back("-fshort-enums"); 5400 5401 // -fsigned-char is default. 5402 if (Arg *A = Args.getLastArg( 5403 options::OPT_fsigned_char, options::OPT_fno_signed_char, 5404 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) { 5405 if (A->getOption().matches(options::OPT_funsigned_char) || 5406 A->getOption().matches(options::OPT_fno_signed_char)) { 5407 CmdArgs.push_back("-fno-signed-char"); 5408 } 5409 } else if (!isSignedCharDefault(getToolChain().getTriple())) { 5410 CmdArgs.push_back("-fno-signed-char"); 5411 } 5412 5413 // -fuse-cxa-atexit is default. 5414 if (!Args.hasFlag( 5415 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit, 5416 !IsWindowsCygnus && !IsWindowsGNU && 5417 getToolChain().getTriple().getOS() != llvm::Triple::Solaris && 5418 getToolChain().getArch() != llvm::Triple::hexagon && 5419 getToolChain().getArch() != llvm::Triple::xcore && 5420 ((getToolChain().getTriple().getVendor() != 5421 llvm::Triple::MipsTechnologies) || 5422 getToolChain().getTriple().hasEnvironment())) || 5423 KernelOrKext) 5424 CmdArgs.push_back("-fno-use-cxa-atexit"); 5425 5426 // -fms-extensions=0 is default. 5427 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 5428 IsWindowsMSVC)) 5429 CmdArgs.push_back("-fms-extensions"); 5430 5431 // -fno-use-line-directives is default. 5432 if (Args.hasFlag(options::OPT_fuse_line_directives, 5433 options::OPT_fno_use_line_directives, false)) 5434 CmdArgs.push_back("-fuse-line-directives"); 5435 5436 // -fms-compatibility=0 is default. 5437 if (Args.hasFlag(options::OPT_fms_compatibility, 5438 options::OPT_fno_ms_compatibility, 5439 (IsWindowsMSVC && 5440 Args.hasFlag(options::OPT_fms_extensions, 5441 options::OPT_fno_ms_extensions, true)))) 5442 CmdArgs.push_back("-fms-compatibility"); 5443 5444 // -fms-compatibility-version=18.00 is default. 5445 VersionTuple MSVT = visualstudio::getMSVCVersion( 5446 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC); 5447 if (!MSVT.empty()) 5448 CmdArgs.push_back( 5449 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString())); 5450 5451 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19; 5452 if (ImplyVCPPCXXVer) { 5453 StringRef LanguageStandard; 5454 if (const Arg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) { 5455 LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue()) 5456 .Case("c++14", "-std=c++14") 5457 .Case("c++latest", "-std=c++1z") 5458 .Default(""); 5459 if (LanguageStandard.empty()) 5460 D.Diag(clang::diag::warn_drv_unused_argument) 5461 << StdArg->getAsString(Args); 5462 } 5463 5464 if (LanguageStandard.empty()) { 5465 if (IsMSVC2015Compatible) 5466 LanguageStandard = "-std=c++14"; 5467 else 5468 LanguageStandard = "-std=c++11"; 5469 } 5470 5471 CmdArgs.push_back(LanguageStandard.data()); 5472 } 5473 5474 // -fno-borland-extensions is default. 5475 if (Args.hasFlag(options::OPT_fborland_extensions, 5476 options::OPT_fno_borland_extensions, false)) 5477 CmdArgs.push_back("-fborland-extensions"); 5478 5479 // -fno-declspec is default, except for PS4. 5480 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec, 5481 getToolChain().getTriple().isPS4())) 5482 CmdArgs.push_back("-fdeclspec"); 5483 else if (Args.hasArg(options::OPT_fno_declspec)) 5484 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec. 5485 5486 // -fthreadsafe-static is default, except for MSVC compatibility versions less 5487 // than 19. 5488 if (!Args.hasFlag(options::OPT_fthreadsafe_statics, 5489 options::OPT_fno_threadsafe_statics, 5490 !IsWindowsMSVC || IsMSVC2015Compatible)) 5491 CmdArgs.push_back("-fno-threadsafe-statics"); 5492 5493 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL 5494 // needs it. 5495 if (Args.hasFlag(options::OPT_fdelayed_template_parsing, 5496 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC)) 5497 CmdArgs.push_back("-fdelayed-template-parsing"); 5498 5499 // -fgnu-keywords default varies depending on language; only pass if 5500 // specified. 5501 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords, 5502 options::OPT_fno_gnu_keywords)) 5503 A->render(Args, CmdArgs); 5504 5505 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline, 5506 false)) 5507 CmdArgs.push_back("-fgnu89-inline"); 5508 5509 if (Args.hasArg(options::OPT_fno_inline)) 5510 CmdArgs.push_back("-fno-inline"); 5511 5512 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions, 5513 options::OPT_finline_hint_functions, 5514 options::OPT_fno_inline_functions)) 5515 InlineArg->render(Args, CmdArgs); 5516 5517 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind); 5518 5519 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and 5520 // legacy is the default. Except for deployment taget of 10.5, 5521 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch 5522 // gets ignored silently. 5523 if (objcRuntime.isNonFragile()) { 5524 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch, 5525 options::OPT_fno_objc_legacy_dispatch, 5526 objcRuntime.isLegacyDispatchDefaultForArch( 5527 getToolChain().getArch()))) { 5528 if (getToolChain().UseObjCMixedDispatch()) 5529 CmdArgs.push_back("-fobjc-dispatch-method=mixed"); 5530 else 5531 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy"); 5532 } 5533 } 5534 5535 // When ObjectiveC legacy runtime is in effect on MacOSX, 5536 // turn on the option to do Array/Dictionary subscripting 5537 // by default. 5538 if (getToolChain().getArch() == llvm::Triple::x86 && 5539 getToolChain().getTriple().isMacOSX() && 5540 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) && 5541 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX && 5542 objcRuntime.isNeXTFamily()) 5543 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime"); 5544 5545 // -fencode-extended-block-signature=1 is default. 5546 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) { 5547 CmdArgs.push_back("-fencode-extended-block-signature"); 5548 } 5549 5550 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc. 5551 // NOTE: This logic is duplicated in ToolChains.cpp. 5552 bool ARC = isObjCAutoRefCount(Args); 5553 if (ARC) { 5554 getToolChain().CheckObjCARC(); 5555 5556 CmdArgs.push_back("-fobjc-arc"); 5557 5558 // FIXME: It seems like this entire block, and several around it should be 5559 // wrapped in isObjC, but for now we just use it here as this is where it 5560 // was being used previously. 5561 if (types::isCXX(InputType) && types::isObjC(InputType)) { 5562 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) 5563 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++"); 5564 else 5565 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++"); 5566 } 5567 5568 // Allow the user to enable full exceptions code emission. 5569 // We define off for Objective-CC, on for Objective-C++. 5570 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions, 5571 options::OPT_fno_objc_arc_exceptions, 5572 /*default*/ types::isCXX(InputType))) 5573 CmdArgs.push_back("-fobjc-arc-exceptions"); 5574 5575 } 5576 5577 // -fobjc-infer-related-result-type is the default, except in the Objective-C 5578 // rewriter. 5579 if (rewriteKind != RK_None) 5580 CmdArgs.push_back("-fno-objc-infer-related-result-type"); 5581 5582 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only 5583 // takes precedence. 5584 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only); 5585 if (!GCArg) 5586 GCArg = Args.getLastArg(options::OPT_fobjc_gc); 5587 if (GCArg) { 5588 if (ARC) { 5589 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args); 5590 } else if (getToolChain().SupportsObjCGC()) { 5591 GCArg->render(Args, CmdArgs); 5592 } else { 5593 // FIXME: We should move this to a hard error. 5594 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args); 5595 } 5596 } 5597 5598 // Pass down -fobjc-weak or -fno-objc-weak if present. 5599 if (types::isObjC(InputType)) { 5600 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak, 5601 options::OPT_fno_objc_weak); 5602 if (!WeakArg) { 5603 // nothing to do 5604 } else if (GCArg) { 5605 if (WeakArg->getOption().matches(options::OPT_fobjc_weak)) 5606 D.Diag(diag::err_objc_weak_with_gc); 5607 } else if (!objcRuntime.allowsWeak()) { 5608 if (WeakArg->getOption().matches(options::OPT_fobjc_weak)) 5609 D.Diag(diag::err_objc_weak_unsupported); 5610 } else { 5611 WeakArg->render(Args, CmdArgs); 5612 } 5613 } 5614 5615 if (Args.hasFlag(options::OPT_fapplication_extension, 5616 options::OPT_fno_application_extension, false)) 5617 CmdArgs.push_back("-fapplication-extension"); 5618 5619 // Handle GCC-style exception args. 5620 if (!C.getDriver().IsCLMode()) 5621 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime, 5622 CmdArgs); 5623 5624 if (Args.hasArg(options::OPT_fsjlj_exceptions) || 5625 getToolChain().UseSjLjExceptions(Args)) 5626 CmdArgs.push_back("-fsjlj-exceptions"); 5627 5628 // C++ "sane" operator new. 5629 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 5630 options::OPT_fno_assume_sane_operator_new)) 5631 CmdArgs.push_back("-fno-assume-sane-operator-new"); 5632 5633 // -fsized-deallocation is off by default, as it is an ABI-breaking change for 5634 // most platforms. 5635 if (Args.hasFlag(options::OPT_fsized_deallocation, 5636 options::OPT_fno_sized_deallocation, false)) 5637 CmdArgs.push_back("-fsized-deallocation"); 5638 5639 // -fconstant-cfstrings is default, and may be subject to argument translation 5640 // on Darwin. 5641 if (!Args.hasFlag(options::OPT_fconstant_cfstrings, 5642 options::OPT_fno_constant_cfstrings) || 5643 !Args.hasFlag(options::OPT_mconstant_cfstrings, 5644 options::OPT_mno_constant_cfstrings)) 5645 CmdArgs.push_back("-fno-constant-cfstrings"); 5646 5647 // -fshort-wchar default varies depending on platform; only 5648 // pass if specified. 5649 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar, 5650 options::OPT_fno_short_wchar)) 5651 A->render(Args, CmdArgs); 5652 5653 // -fno-pascal-strings is default, only pass non-default. 5654 if (Args.hasFlag(options::OPT_fpascal_strings, 5655 options::OPT_fno_pascal_strings, false)) 5656 CmdArgs.push_back("-fpascal-strings"); 5657 5658 // Honor -fpack-struct= and -fpack-struct, if given. Note that 5659 // -fno-pack-struct doesn't apply to -fpack-struct=. 5660 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) { 5661 std::string PackStructStr = "-fpack-struct="; 5662 PackStructStr += A->getValue(); 5663 CmdArgs.push_back(Args.MakeArgString(PackStructStr)); 5664 } else if (Args.hasFlag(options::OPT_fpack_struct, 5665 options::OPT_fno_pack_struct, false)) { 5666 CmdArgs.push_back("-fpack-struct=1"); 5667 } 5668 5669 // Handle -fmax-type-align=N and -fno-type-align 5670 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align); 5671 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) { 5672 if (!SkipMaxTypeAlign) { 5673 std::string MaxTypeAlignStr = "-fmax-type-align="; 5674 MaxTypeAlignStr += A->getValue(); 5675 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr)); 5676 } 5677 } else if (getToolChain().getTriple().isOSDarwin()) { 5678 if (!SkipMaxTypeAlign) { 5679 std::string MaxTypeAlignStr = "-fmax-type-align=16"; 5680 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr)); 5681 } 5682 } 5683 5684 // -fcommon is the default unless compiling kernel code or the target says so 5685 bool NoCommonDefault = 5686 KernelOrKext || isNoCommonDefault(getToolChain().getTriple()); 5687 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common, 5688 !NoCommonDefault)) 5689 CmdArgs.push_back("-fno-common"); 5690 5691 // -fsigned-bitfields is default, and clang doesn't yet support 5692 // -funsigned-bitfields. 5693 if (!Args.hasFlag(options::OPT_fsigned_bitfields, 5694 options::OPT_funsigned_bitfields)) 5695 D.Diag(diag::warn_drv_clang_unsupported) 5696 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 5697 5698 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope. 5699 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope)) 5700 D.Diag(diag::err_drv_clang_unsupported) 5701 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args); 5702 5703 // -finput_charset=UTF-8 is default. Reject others 5704 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) { 5705 StringRef value = inputCharset->getValue(); 5706 if (value != "UTF-8") 5707 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) 5708 << value; 5709 } 5710 5711 // -fexec_charset=UTF-8 is default. Reject others 5712 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) { 5713 StringRef value = execCharset->getValue(); 5714 if (value != "UTF-8") 5715 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) 5716 << value; 5717 } 5718 5719 // -fcaret-diagnostics is default. 5720 if (!Args.hasFlag(options::OPT_fcaret_diagnostics, 5721 options::OPT_fno_caret_diagnostics, true)) 5722 CmdArgs.push_back("-fno-caret-diagnostics"); 5723 5724 // -fdiagnostics-fixit-info is default, only pass non-default. 5725 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 5726 options::OPT_fno_diagnostics_fixit_info)) 5727 CmdArgs.push_back("-fno-diagnostics-fixit-info"); 5728 5729 // Enable -fdiagnostics-show-option by default. 5730 if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 5731 options::OPT_fno_diagnostics_show_option)) 5732 CmdArgs.push_back("-fdiagnostics-show-option"); 5733 5734 if (const Arg *A = 5735 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) { 5736 CmdArgs.push_back("-fdiagnostics-show-category"); 5737 CmdArgs.push_back(A->getValue()); 5738 } 5739 5740 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) { 5741 CmdArgs.push_back("-fdiagnostics-format"); 5742 CmdArgs.push_back(A->getValue()); 5743 } 5744 5745 if (Arg *A = Args.getLastArg( 5746 options::OPT_fdiagnostics_show_note_include_stack, 5747 options::OPT_fno_diagnostics_show_note_include_stack)) { 5748 if (A->getOption().matches( 5749 options::OPT_fdiagnostics_show_note_include_stack)) 5750 CmdArgs.push_back("-fdiagnostics-show-note-include-stack"); 5751 else 5752 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack"); 5753 } 5754 5755 // Color diagnostics are parsed by the driver directly from argv 5756 // and later re-parsed to construct this job; claim any possible 5757 // color diagnostic here to avoid warn_drv_unused_argument and 5758 // diagnose bad OPT_fdiagnostics_color_EQ values. 5759 for (Arg *A : Args) { 5760 const Option &O = A->getOption(); 5761 if (!O.matches(options::OPT_fcolor_diagnostics) && 5762 !O.matches(options::OPT_fdiagnostics_color) && 5763 !O.matches(options::OPT_fno_color_diagnostics) && 5764 !O.matches(options::OPT_fno_diagnostics_color) && 5765 !O.matches(options::OPT_fdiagnostics_color_EQ)) 5766 continue; 5767 if (O.matches(options::OPT_fdiagnostics_color_EQ)) { 5768 StringRef Value(A->getValue()); 5769 if (Value != "always" && Value != "never" && Value != "auto") 5770 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) 5771 << ("-fdiagnostics-color=" + Value).str(); 5772 } 5773 A->claim(); 5774 } 5775 if (D.getDiags().getDiagnosticOptions().ShowColors) 5776 CmdArgs.push_back("-fcolor-diagnostics"); 5777 5778 if (Args.hasArg(options::OPT_fansi_escape_codes)) 5779 CmdArgs.push_back("-fansi-escape-codes"); 5780 5781 if (!Args.hasFlag(options::OPT_fshow_source_location, 5782 options::OPT_fno_show_source_location)) 5783 CmdArgs.push_back("-fno-show-source-location"); 5784 5785 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column, 5786 true)) 5787 CmdArgs.push_back("-fno-show-column"); 5788 5789 if (!Args.hasFlag(options::OPT_fspell_checking, 5790 options::OPT_fno_spell_checking)) 5791 CmdArgs.push_back("-fno-spell-checking"); 5792 5793 // -fno-asm-blocks is default. 5794 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks, 5795 false)) 5796 CmdArgs.push_back("-fasm-blocks"); 5797 5798 // -fgnu-inline-asm is default. 5799 if (!Args.hasFlag(options::OPT_fgnu_inline_asm, 5800 options::OPT_fno_gnu_inline_asm, true)) 5801 CmdArgs.push_back("-fno-gnu-inline-asm"); 5802 5803 // Enable vectorization per default according to the optimization level 5804 // selected. For optimization levels that want vectorization we use the alias 5805 // option to simplify the hasFlag logic. 5806 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false); 5807 OptSpecifier VectorizeAliasOption = 5808 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize; 5809 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption, 5810 options::OPT_fno_vectorize, EnableVec)) 5811 CmdArgs.push_back("-vectorize-loops"); 5812 5813 // -fslp-vectorize is enabled based on the optimization level selected. 5814 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); 5815 OptSpecifier SLPVectAliasOption = 5816 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; 5817 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, 5818 options::OPT_fno_slp_vectorize, EnableSLPVec)) 5819 CmdArgs.push_back("-vectorize-slp"); 5820 5821 // -fno-slp-vectorize-aggressive is default. 5822 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive, 5823 options::OPT_fno_slp_vectorize_aggressive, false)) 5824 CmdArgs.push_back("-vectorize-slp-aggressive"); 5825 5826 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ)) 5827 A->render(Args, CmdArgs); 5828 5829 if (Arg *A = Args.getLastArg( 5830 options::OPT_fsanitize_undefined_strip_path_components_EQ)) 5831 A->render(Args, CmdArgs); 5832 5833 // -fdollars-in-identifiers default varies depending on platform and 5834 // language; only pass if specified. 5835 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 5836 options::OPT_fno_dollars_in_identifiers)) { 5837 if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 5838 CmdArgs.push_back("-fdollars-in-identifiers"); 5839 else 5840 CmdArgs.push_back("-fno-dollars-in-identifiers"); 5841 } 5842 5843 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 5844 // practical purposes. 5845 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 5846 options::OPT_fno_unit_at_a_time)) { 5847 if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 5848 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args); 5849 } 5850 5851 if (Args.hasFlag(options::OPT_fapple_pragma_pack, 5852 options::OPT_fno_apple_pragma_pack, false)) 5853 CmdArgs.push_back("-fapple-pragma-pack"); 5854 5855 // le32-specific flags: 5856 // -fno-math-builtin: clang should not convert math builtins to intrinsics 5857 // by default. 5858 if (getToolChain().getArch() == llvm::Triple::le32) { 5859 CmdArgs.push_back("-fno-math-builtin"); 5860 } 5861 5862 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 5863 // 5864 // FIXME: Now that PR4941 has been fixed this can be enabled. 5865 #if 0 5866 if (getToolChain().getTriple().isOSDarwin() && 5867 (getToolChain().getArch() == llvm::Triple::arm || 5868 getToolChain().getArch() == llvm::Triple::thumb)) { 5869 if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 5870 CmdArgs.push_back("-fno-builtin-strcat"); 5871 if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 5872 CmdArgs.push_back("-fno-builtin-strcpy"); 5873 } 5874 #endif 5875 5876 // Enable rewrite includes if the user's asked for it or if we're generating 5877 // diagnostics. 5878 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be 5879 // nice to enable this when doing a crashdump for modules as well. 5880 if (Args.hasFlag(options::OPT_frewrite_includes, 5881 options::OPT_fno_rewrite_includes, false) || 5882 (C.isForDiagnostics() && !HaveModules)) 5883 CmdArgs.push_back("-frewrite-includes"); 5884 5885 // Only allow -traditional or -traditional-cpp outside in preprocessing modes. 5886 if (Arg *A = Args.getLastArg(options::OPT_traditional, 5887 options::OPT_traditional_cpp)) { 5888 if (isa<PreprocessJobAction>(JA)) 5889 CmdArgs.push_back("-traditional-cpp"); 5890 else 5891 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 5892 } 5893 5894 Args.AddLastArg(CmdArgs, options::OPT_dM); 5895 Args.AddLastArg(CmdArgs, options::OPT_dD); 5896 5897 // Handle serialized diagnostics. 5898 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) { 5899 CmdArgs.push_back("-serialize-diagnostic-file"); 5900 CmdArgs.push_back(Args.MakeArgString(A->getValue())); 5901 } 5902 5903 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers)) 5904 CmdArgs.push_back("-fretain-comments-from-system-headers"); 5905 5906 // Forward -fcomment-block-commands to -cc1. 5907 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands); 5908 // Forward -fparse-all-comments to -cc1. 5909 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments); 5910 5911 // Turn -fplugin=name.so into -load name.so 5912 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) { 5913 CmdArgs.push_back("-load"); 5914 CmdArgs.push_back(A->getValue()); 5915 A->claim(); 5916 } 5917 5918 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option 5919 // parser. 5920 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 5921 for (const Arg *A : Args.filtered(options::OPT_mllvm)) { 5922 A->claim(); 5923 5924 // We translate this by hand to the -cc1 argument, since nightly test uses 5925 // it and developers have been trained to spell it with -mllvm. 5926 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") { 5927 CmdArgs.push_back("-disable-llvm-optzns"); 5928 } else 5929 A->render(Args, CmdArgs); 5930 } 5931 5932 // With -save-temps, we want to save the unoptimized bitcode output from the 5933 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated 5934 // by the frontend. 5935 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it 5936 // has slightly different breakdown between stages. 5937 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of 5938 // pristine IR generated by the frontend. Ideally, a new compile action should 5939 // be added so both IR can be captured. 5940 if (C.getDriver().isSaveTempsEnabled() && 5941 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA)) 5942 CmdArgs.push_back("-disable-llvm-passes"); 5943 5944 if (Output.getType() == types::TY_Dependencies) { 5945 // Handled with other dependency code. 5946 } else if (Output.isFilename()) { 5947 CmdArgs.push_back("-o"); 5948 CmdArgs.push_back(Output.getFilename()); 5949 } else { 5950 assert(Output.isNothing() && "Invalid output."); 5951 } 5952 5953 addDashXForInput(Args, Input, CmdArgs); 5954 5955 if (Input.isFilename()) 5956 CmdArgs.push_back(Input.getFilename()); 5957 else 5958 Input.getInputArg().renderAsInput(Args, CmdArgs); 5959 5960 Args.AddAllArgs(CmdArgs, options::OPT_undef); 5961 5962 const char *Exec = getToolChain().getDriver().getClangProgramPath(); 5963 5964 // Optionally embed the -cc1 level arguments into the debug info, for build 5965 // analysis. 5966 if (getToolChain().UseDwarfDebugFlags()) { 5967 ArgStringList OriginalArgs; 5968 for (const auto &Arg : Args) 5969 Arg->render(Args, OriginalArgs); 5970 5971 SmallString<256> Flags; 5972 Flags += Exec; 5973 for (const char *OriginalArg : OriginalArgs) { 5974 SmallString<128> EscapedArg; 5975 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg); 5976 Flags += " "; 5977 Flags += EscapedArg; 5978 } 5979 CmdArgs.push_back("-dwarf-debug-flags"); 5980 CmdArgs.push_back(Args.MakeArgString(Flags)); 5981 } 5982 5983 // Add the split debug info name to the command lines here so we 5984 // can propagate it to the backend. 5985 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() && 5986 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) || 5987 isa<BackendJobAction>(JA)); 5988 const char *SplitDwarfOut; 5989 if (SplitDwarf) { 5990 CmdArgs.push_back("-split-dwarf-file"); 5991 SplitDwarfOut = SplitDebugName(Args, Input); 5992 CmdArgs.push_back(SplitDwarfOut); 5993 } 5994 5995 // Host-side cuda compilation receives device-side outputs as Inputs[1...]. 5996 // Include them with -fcuda-include-gpubinary. 5997 if (IsCuda && Inputs.size() > 1) 5998 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) { 5999 CmdArgs.push_back("-fcuda-include-gpubinary"); 6000 CmdArgs.push_back(I->getFilename()); 6001 } 6002 6003 bool WholeProgramVTables = 6004 Args.hasFlag(options::OPT_fwhole_program_vtables, 6005 options::OPT_fno_whole_program_vtables, false); 6006 if (WholeProgramVTables) { 6007 if (!D.isUsingLTO()) 6008 D.Diag(diag::err_drv_argument_only_allowed_with) 6009 << "-fwhole-program-vtables" 6010 << "-flto"; 6011 CmdArgs.push_back("-fwhole-program-vtables"); 6012 } 6013 6014 // Finally add the compile command to the compilation. 6015 if (Args.hasArg(options::OPT__SLASH_fallback) && 6016 Output.getType() == types::TY_Object && 6017 (InputType == types::TY_C || InputType == types::TY_CXX)) { 6018 auto CLCommand = 6019 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput); 6020 C.addCommand(llvm::make_unique<FallbackCommand>( 6021 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand))); 6022 } else if (Args.hasArg(options::OPT__SLASH_fallback) && 6023 isa<PrecompileJobAction>(JA)) { 6024 // In /fallback builds, run the main compilation even if the pch generation 6025 // fails, so that the main compilation's fallback to cl.exe runs. 6026 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec, 6027 CmdArgs, Inputs)); 6028 } else { 6029 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 6030 } 6031 6032 // Handle the debug info splitting at object creation time if we're 6033 // creating an object. 6034 // TODO: Currently only works on linux with newer objcopy. 6035 if (SplitDwarf && Output.getType() == types::TY_Object) 6036 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut); 6037 6038 if (Arg *A = Args.getLastArg(options::OPT_pg)) 6039 if (Args.hasArg(options::OPT_fomit_frame_pointer)) 6040 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer" 6041 << A->getAsString(Args); 6042 6043 // Claim some arguments which clang supports automatically. 6044 6045 // -fpch-preprocess is used with gcc to add a special marker in the output to 6046 // include the PCH file. Clang's PTH solution is completely transparent, so we 6047 // do not need to deal with it at all. 6048 Args.ClaimAllArgs(options::OPT_fpch_preprocess); 6049 6050 // Claim some arguments which clang doesn't support, but we don't 6051 // care to warn the user about. 6052 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 6053 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 6054 6055 // Disable warnings for clang -E -emit-llvm foo.c 6056 Args.ClaimAllArgs(options::OPT_emit_llvm); 6057 } 6058 6059 /// Add options related to the Objective-C runtime/ABI. 6060 /// 6061 /// Returns true if the runtime is non-fragile. 6062 ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args, 6063 ArgStringList &cmdArgs, 6064 RewriteKind rewriteKind) const { 6065 // Look for the controlling runtime option. 6066 Arg *runtimeArg = 6067 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, 6068 options::OPT_fobjc_runtime_EQ); 6069 6070 // Just forward -fobjc-runtime= to the frontend. This supercedes 6071 // options about fragility. 6072 if (runtimeArg && 6073 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) { 6074 ObjCRuntime runtime; 6075 StringRef value = runtimeArg->getValue(); 6076 if (runtime.tryParse(value)) { 6077 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime) 6078 << value; 6079 } 6080 6081 runtimeArg->render(args, cmdArgs); 6082 return runtime; 6083 } 6084 6085 // Otherwise, we'll need the ABI "version". Version numbers are 6086 // slightly confusing for historical reasons: 6087 // 1 - Traditional "fragile" ABI 6088 // 2 - Non-fragile ABI, version 1 6089 // 3 - Non-fragile ABI, version 2 6090 unsigned objcABIVersion = 1; 6091 // If -fobjc-abi-version= is present, use that to set the version. 6092 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) { 6093 StringRef value = abiArg->getValue(); 6094 if (value == "1") 6095 objcABIVersion = 1; 6096 else if (value == "2") 6097 objcABIVersion = 2; 6098 else if (value == "3") 6099 objcABIVersion = 3; 6100 else 6101 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value; 6102 } else { 6103 // Otherwise, determine if we are using the non-fragile ABI. 6104 bool nonFragileABIIsDefault = 6105 (rewriteKind == RK_NonFragile || 6106 (rewriteKind == RK_None && 6107 getToolChain().IsObjCNonFragileABIDefault())); 6108 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi, 6109 options::OPT_fno_objc_nonfragile_abi, 6110 nonFragileABIIsDefault)) { 6111 // Determine the non-fragile ABI version to use. 6112 #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO 6113 unsigned nonFragileABIVersion = 1; 6114 #else 6115 unsigned nonFragileABIVersion = 2; 6116 #endif 6117 6118 if (Arg *abiArg = 6119 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) { 6120 StringRef value = abiArg->getValue(); 6121 if (value == "1") 6122 nonFragileABIVersion = 1; 6123 else if (value == "2") 6124 nonFragileABIVersion = 2; 6125 else 6126 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) 6127 << value; 6128 } 6129 6130 objcABIVersion = 1 + nonFragileABIVersion; 6131 } else { 6132 objcABIVersion = 1; 6133 } 6134 } 6135 6136 // We don't actually care about the ABI version other than whether 6137 // it's non-fragile. 6138 bool isNonFragile = objcABIVersion != 1; 6139 6140 // If we have no runtime argument, ask the toolchain for its default runtime. 6141 // However, the rewriter only really supports the Mac runtime, so assume that. 6142 ObjCRuntime runtime; 6143 if (!runtimeArg) { 6144 switch (rewriteKind) { 6145 case RK_None: 6146 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile); 6147 break; 6148 case RK_Fragile: 6149 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple()); 6150 break; 6151 case RK_NonFragile: 6152 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple()); 6153 break; 6154 } 6155 6156 // -fnext-runtime 6157 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) { 6158 // On Darwin, make this use the default behavior for the toolchain. 6159 if (getToolChain().getTriple().isOSDarwin()) { 6160 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile); 6161 6162 // Otherwise, build for a generic macosx port. 6163 } else { 6164 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple()); 6165 } 6166 6167 // -fgnu-runtime 6168 } else { 6169 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime)); 6170 // Legacy behaviour is to target the gnustep runtime if we are in 6171 // non-fragile mode or the GCC runtime in fragile mode. 6172 if (isNonFragile) 6173 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6)); 6174 else 6175 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple()); 6176 } 6177 6178 cmdArgs.push_back( 6179 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString())); 6180 return runtime; 6181 } 6182 6183 static bool maybeConsumeDash(const std::string &EH, size_t &I) { 6184 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-'); 6185 I += HaveDash; 6186 return !HaveDash; 6187 } 6188 6189 namespace { 6190 struct EHFlags { 6191 bool Synch = false; 6192 bool Asynch = false; 6193 bool NoUnwindC = false; 6194 }; 6195 } // end anonymous namespace 6196 6197 /// /EH controls whether to run destructor cleanups when exceptions are 6198 /// thrown. There are three modifiers: 6199 /// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions. 6200 /// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions. 6201 /// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR. 6202 /// - c: Assume that extern "C" functions are implicitly nounwind. 6203 /// The default is /EHs-c-, meaning cleanups are disabled. 6204 static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) { 6205 EHFlags EH; 6206 6207 std::vector<std::string> EHArgs = 6208 Args.getAllArgValues(options::OPT__SLASH_EH); 6209 for (auto EHVal : EHArgs) { 6210 for (size_t I = 0, E = EHVal.size(); I != E; ++I) { 6211 switch (EHVal[I]) { 6212 case 'a': 6213 EH.Asynch = maybeConsumeDash(EHVal, I); 6214 if (EH.Asynch) 6215 EH.Synch = false; 6216 continue; 6217 case 'c': 6218 EH.NoUnwindC = maybeConsumeDash(EHVal, I); 6219 continue; 6220 case 's': 6221 EH.Synch = maybeConsumeDash(EHVal, I); 6222 if (EH.Synch) 6223 EH.Asynch = false; 6224 continue; 6225 default: 6226 break; 6227 } 6228 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal; 6229 break; 6230 } 6231 } 6232 // The /GX, /GX- flags are only processed if there are not /EH flags. 6233 // The default is that /GX is not specified. 6234 if (EHArgs.empty() && 6235 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_, 6236 /*default=*/false)) { 6237 EH.Synch = true; 6238 EH.NoUnwindC = true; 6239 } 6240 6241 return EH; 6242 } 6243 6244 void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, 6245 ArgStringList &CmdArgs, 6246 codegenoptions::DebugInfoKind *DebugInfoKind, 6247 bool *EmitCodeView) const { 6248 unsigned RTOptionID = options::OPT__SLASH_MT; 6249 6250 if (Args.hasArg(options::OPT__SLASH_LDd)) 6251 // The /LDd option implies /MTd. The dependent lib part can be overridden, 6252 // but defining _DEBUG is sticky. 6253 RTOptionID = options::OPT__SLASH_MTd; 6254 6255 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) 6256 RTOptionID = A->getOption().getID(); 6257 6258 StringRef FlagForCRT; 6259 switch (RTOptionID) { 6260 case options::OPT__SLASH_MD: 6261 if (Args.hasArg(options::OPT__SLASH_LDd)) 6262 CmdArgs.push_back("-D_DEBUG"); 6263 CmdArgs.push_back("-D_MT"); 6264 CmdArgs.push_back("-D_DLL"); 6265 FlagForCRT = "--dependent-lib=msvcrt"; 6266 break; 6267 case options::OPT__SLASH_MDd: 6268 CmdArgs.push_back("-D_DEBUG"); 6269 CmdArgs.push_back("-D_MT"); 6270 CmdArgs.push_back("-D_DLL"); 6271 FlagForCRT = "--dependent-lib=msvcrtd"; 6272 break; 6273 case options::OPT__SLASH_MT: 6274 if (Args.hasArg(options::OPT__SLASH_LDd)) 6275 CmdArgs.push_back("-D_DEBUG"); 6276 CmdArgs.push_back("-D_MT"); 6277 CmdArgs.push_back("-flto-visibility-public-std"); 6278 FlagForCRT = "--dependent-lib=libcmt"; 6279 break; 6280 case options::OPT__SLASH_MTd: 6281 CmdArgs.push_back("-D_DEBUG"); 6282 CmdArgs.push_back("-D_MT"); 6283 CmdArgs.push_back("-flto-visibility-public-std"); 6284 FlagForCRT = "--dependent-lib=libcmtd"; 6285 break; 6286 default: 6287 llvm_unreachable("Unexpected option ID."); 6288 } 6289 6290 if (Args.hasArg(options::OPT__SLASH_Zl)) { 6291 CmdArgs.push_back("-D_VC_NODEFAULTLIB"); 6292 } else { 6293 CmdArgs.push_back(FlagForCRT.data()); 6294 6295 // This provides POSIX compatibility (maps 'open' to '_open'), which most 6296 // users want. The /Za flag to cl.exe turns this off, but it's not 6297 // implemented in clang. 6298 CmdArgs.push_back("--dependent-lib=oldnames"); 6299 } 6300 6301 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both 6302 // would produce interleaved output, so ignore /showIncludes in such cases. 6303 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP)) 6304 if (Arg *A = Args.getLastArg(options::OPT_show_includes)) 6305 A->render(Args, CmdArgs); 6306 6307 // This controls whether or not we emit RTTI data for polymorphic types. 6308 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR, 6309 /*default=*/false)) 6310 CmdArgs.push_back("-fno-rtti-data"); 6311 6312 // This controls whether or not we emit stack-protector instrumentation. 6313 // In MSVC, Buffer Security Check (/GS) is on by default. 6314 if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_, 6315 /*default=*/true)) { 6316 CmdArgs.push_back("-stack-protector"); 6317 CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong))); 6318 } 6319 6320 // Emit CodeView if -Z7 or -Zd are present. 6321 if (Arg *DebugInfoArg = 6322 Args.getLastArg(options::OPT__SLASH_Z7, options::OPT__SLASH_Zd)) { 6323 *EmitCodeView = true; 6324 if (DebugInfoArg->getOption().matches(options::OPT__SLASH_Z7)) 6325 *DebugInfoKind = codegenoptions::LimitedDebugInfo; 6326 else 6327 *DebugInfoKind = codegenoptions::DebugLineTablesOnly; 6328 CmdArgs.push_back("-gcodeview"); 6329 } else { 6330 *EmitCodeView = false; 6331 } 6332 6333 const Driver &D = getToolChain().getDriver(); 6334 EHFlags EH = parseClangCLEHFlags(D, Args); 6335 if (EH.Synch || EH.Asynch) { 6336 if (types::isCXX(InputType)) 6337 CmdArgs.push_back("-fcxx-exceptions"); 6338 CmdArgs.push_back("-fexceptions"); 6339 } 6340 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC) 6341 CmdArgs.push_back("-fexternc-nounwind"); 6342 6343 // /EP should expand to -E -P. 6344 if (Args.hasArg(options::OPT__SLASH_EP)) { 6345 CmdArgs.push_back("-E"); 6346 CmdArgs.push_back("-P"); 6347 } 6348 6349 unsigned VolatileOptionID; 6350 if (getToolChain().getArch() == llvm::Triple::x86_64 || 6351 getToolChain().getArch() == llvm::Triple::x86) 6352 VolatileOptionID = options::OPT__SLASH_volatile_ms; 6353 else 6354 VolatileOptionID = options::OPT__SLASH_volatile_iso; 6355 6356 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group)) 6357 VolatileOptionID = A->getOption().getID(); 6358 6359 if (VolatileOptionID == options::OPT__SLASH_volatile_ms) 6360 CmdArgs.push_back("-fms-volatile"); 6361 6362 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg); 6363 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb); 6364 if (MostGeneralArg && BestCaseArg) 6365 D.Diag(clang::diag::err_drv_argument_not_allowed_with) 6366 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args); 6367 6368 if (MostGeneralArg) { 6369 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms); 6370 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm); 6371 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv); 6372 6373 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg; 6374 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg; 6375 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict) 6376 D.Diag(clang::diag::err_drv_argument_not_allowed_with) 6377 << FirstConflict->getAsString(Args) 6378 << SecondConflict->getAsString(Args); 6379 6380 if (SingleArg) 6381 CmdArgs.push_back("-fms-memptr-rep=single"); 6382 else if (MultipleArg) 6383 CmdArgs.push_back("-fms-memptr-rep=multiple"); 6384 else 6385 CmdArgs.push_back("-fms-memptr-rep=virtual"); 6386 } 6387 6388 if (Args.getLastArg(options::OPT__SLASH_Gd)) 6389 CmdArgs.push_back("-fdefault-calling-conv=cdecl"); 6390 else if (Args.getLastArg(options::OPT__SLASH_Gr)) 6391 CmdArgs.push_back("-fdefault-calling-conv=fastcall"); 6392 else if (Args.getLastArg(options::OPT__SLASH_Gz)) 6393 CmdArgs.push_back("-fdefault-calling-conv=stdcall"); 6394 else if (Args.getLastArg(options::OPT__SLASH_Gv)) 6395 CmdArgs.push_back("-fdefault-calling-conv=vectorcall"); 6396 6397 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ)) 6398 A->render(Args, CmdArgs); 6399 6400 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) { 6401 CmdArgs.push_back("-fdiagnostics-format"); 6402 if (Args.hasArg(options::OPT__SLASH_fallback)) 6403 CmdArgs.push_back("msvc-fallback"); 6404 else 6405 CmdArgs.push_back("msvc"); 6406 } 6407 } 6408 6409 visualstudio::Compiler *Clang::getCLFallback() const { 6410 if (!CLFallback) 6411 CLFallback.reset(new visualstudio::Compiler(getToolChain())); 6412 return CLFallback.get(); 6413 } 6414 6415 void ClangAs::AddMIPSTargetArgs(const ArgList &Args, 6416 ArgStringList &CmdArgs) const { 6417 StringRef CPUName; 6418 StringRef ABIName; 6419 const llvm::Triple &Triple = getToolChain().getTriple(); 6420 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); 6421 6422 CmdArgs.push_back("-target-abi"); 6423 CmdArgs.push_back(ABIName.data()); 6424 } 6425 6426 void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, 6427 const InputInfo &Output, const InputInfoList &Inputs, 6428 const ArgList &Args, 6429 const char *LinkingOutput) const { 6430 ArgStringList CmdArgs; 6431 6432 assert(Inputs.size() == 1 && "Unexpected number of inputs."); 6433 const InputInfo &Input = Inputs[0]; 6434 6435 std::string TripleStr = 6436 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType()); 6437 const llvm::Triple Triple(TripleStr); 6438 6439 // Don't warn about "clang -w -c foo.s" 6440 Args.ClaimAllArgs(options::OPT_w); 6441 // and "clang -emit-llvm -c foo.s" 6442 Args.ClaimAllArgs(options::OPT_emit_llvm); 6443 6444 claimNoWarnArgs(Args); 6445 6446 // Invoke ourselves in -cc1as mode. 6447 // 6448 // FIXME: Implement custom jobs for internal actions. 6449 CmdArgs.push_back("-cc1as"); 6450 6451 // Add the "effective" target triple. 6452 CmdArgs.push_back("-triple"); 6453 CmdArgs.push_back(Args.MakeArgString(TripleStr)); 6454 6455 // Set the output mode, we currently only expect to be used as a real 6456 // assembler. 6457 CmdArgs.push_back("-filetype"); 6458 CmdArgs.push_back("obj"); 6459 6460 // Set the main file name, so that debug info works even with 6461 // -save-temps or preprocessed assembly. 6462 CmdArgs.push_back("-main-file-name"); 6463 CmdArgs.push_back(Clang::getBaseInputName(Args, Input)); 6464 6465 // Add the target cpu 6466 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true); 6467 if (!CPU.empty()) { 6468 CmdArgs.push_back("-target-cpu"); 6469 CmdArgs.push_back(Args.MakeArgString(CPU)); 6470 } 6471 6472 // Add the target features 6473 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true); 6474 6475 // Ignore explicit -force_cpusubtype_ALL option. 6476 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL); 6477 6478 // Pass along any -I options so we get proper .include search paths. 6479 Args.AddAllArgs(CmdArgs, options::OPT_I_Group); 6480 6481 // Determine the original source input. 6482 const Action *SourceAction = &JA; 6483 while (SourceAction->getKind() != Action::InputClass) { 6484 assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 6485 SourceAction = SourceAction->getInputs()[0]; 6486 } 6487 6488 // Forward -g and handle debug info related flags, assuming we are dealing 6489 // with an actual assembly file. 6490 bool WantDebug = false; 6491 unsigned DwarfVersion = 0; 6492 Args.ClaimAllArgs(options::OPT_g_Group); 6493 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { 6494 WantDebug = !A->getOption().matches(options::OPT_g0) && 6495 !A->getOption().matches(options::OPT_ggdb0); 6496 if (WantDebug) 6497 DwarfVersion = DwarfVersionNum(A->getSpelling()); 6498 } 6499 if (DwarfVersion == 0) 6500 DwarfVersion = getToolChain().GetDefaultDwarfVersion(); 6501 6502 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo; 6503 6504 if (SourceAction->getType() == types::TY_Asm || 6505 SourceAction->getType() == types::TY_PP_Asm) { 6506 // You might think that it would be ok to set DebugInfoKind outside of 6507 // the guard for source type, however there is a test which asserts 6508 // that some assembler invocation receives no -debug-info-kind, 6509 // and it's not clear whether that test is just overly restrictive. 6510 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo 6511 : codegenoptions::NoDebugInfo); 6512 // Add the -fdebug-compilation-dir flag if needed. 6513 addDebugCompDirArg(Args, CmdArgs); 6514 6515 // Set the AT_producer to the clang version when using the integrated 6516 // assembler on assembly source files. 6517 CmdArgs.push_back("-dwarf-debug-producer"); 6518 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion())); 6519 6520 // And pass along -I options 6521 Args.AddAllArgs(CmdArgs, options::OPT_I); 6522 } 6523 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion, 6524 llvm::DebuggerKind::Default); 6525 6526 // Handle -fPIC et al -- the relocation-model affects the assembler 6527 // for some targets. 6528 llvm::Reloc::Model RelocationModel; 6529 unsigned PICLevel; 6530 bool IsPIE; 6531 std::tie(RelocationModel, PICLevel, IsPIE) = 6532 ParsePICArgs(getToolChain(), Triple, Args); 6533 6534 const char *RMName = RelocationModelName(RelocationModel); 6535 if (RMName) { 6536 CmdArgs.push_back("-mrelocation-model"); 6537 CmdArgs.push_back(RMName); 6538 } 6539 6540 // Optionally embed the -cc1as level arguments into the debug info, for build 6541 // analysis. 6542 if (getToolChain().UseDwarfDebugFlags()) { 6543 ArgStringList OriginalArgs; 6544 for (const auto &Arg : Args) 6545 Arg->render(Args, OriginalArgs); 6546 6547 SmallString<256> Flags; 6548 const char *Exec = getToolChain().getDriver().getClangProgramPath(); 6549 Flags += Exec; 6550 for (const char *OriginalArg : OriginalArgs) { 6551 SmallString<128> EscapedArg; 6552 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg); 6553 Flags += " "; 6554 Flags += EscapedArg; 6555 } 6556 CmdArgs.push_back("-dwarf-debug-flags"); 6557 CmdArgs.push_back(Args.MakeArgString(Flags)); 6558 } 6559 6560 // FIXME: Add -static support, once we have it. 6561 6562 // Add target specific flags. 6563 switch (getToolChain().getArch()) { 6564 default: 6565 break; 6566 6567 case llvm::Triple::mips: 6568 case llvm::Triple::mipsel: 6569 case llvm::Triple::mips64: 6570 case llvm::Triple::mips64el: 6571 AddMIPSTargetArgs(Args, CmdArgs); 6572 break; 6573 } 6574 6575 // Consume all the warning flags. Usually this would be handled more 6576 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as 6577 // doesn't handle that so rather than warning about unused flags that are 6578 // actually used, we'll lie by omission instead. 6579 // FIXME: Stop lying and consume only the appropriate driver flags 6580 Args.ClaimAllArgs(options::OPT_W_Group); 6581 6582 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, 6583 getToolChain().getDriver()); 6584 6585 Args.AddAllArgs(CmdArgs, options::OPT_mllvm); 6586 6587 assert(Output.isFilename() && "Unexpected lipo output."); 6588 CmdArgs.push_back("-o"); 6589 CmdArgs.push_back(Output.getFilename()); 6590 6591 assert(Input.isFilename() && "Invalid input."); 6592 CmdArgs.push_back(Input.getFilename()); 6593 6594 const char *Exec = getToolChain().getDriver().getClangProgramPath(); 6595 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 6596 6597 // Handle the debug info splitting at object creation time if we're 6598 // creating an object. 6599 // TODO: Currently only works on linux with newer objcopy. 6600 if (Args.hasArg(options::OPT_gsplit_dwarf) && 6601 getToolChain().getTriple().isOSLinux()) 6602 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, 6603 SplitDebugName(Args, Input)); 6604 } 6605 6606 void GnuTool::anchor() {} 6607 6608 void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 6609 const InputInfo &Output, 6610 const InputInfoList &Inputs, const ArgList &Args, 6611 const char *LinkingOutput) const { 6612 const Driver &D = getToolChain().getDriver(); 6613 ArgStringList CmdArgs; 6614 6615 for (const auto &A : Args) { 6616 if (forwardToGCC(A->getOption())) { 6617 // It is unfortunate that we have to claim here, as this means 6618 // we will basically never report anything interesting for 6619 // platforms using a generic gcc, even if we are just using gcc 6620 // to get to the assembler. 6621 A->claim(); 6622 6623 // Don't forward any -g arguments to assembly steps. 6624 if (isa<AssembleJobAction>(JA) && 6625 A->getOption().matches(options::OPT_g_Group)) 6626 continue; 6627 6628 // Don't forward any -W arguments to assembly and link steps. 6629 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) && 6630 A->getOption().matches(options::OPT_W_Group)) 6631 continue; 6632 6633 A->render(Args, CmdArgs); 6634 } 6635 } 6636 6637 RenderExtraToolArgs(JA, CmdArgs); 6638 6639 // If using a driver driver, force the arch. 6640 if (getToolChain().getTriple().isOSDarwin()) { 6641 CmdArgs.push_back("-arch"); 6642 CmdArgs.push_back( 6643 Args.MakeArgString(getToolChain().getDefaultUniversalArchName())); 6644 } 6645 6646 // Try to force gcc to match the tool chain we want, if we recognize 6647 // the arch. 6648 // 6649 // FIXME: The triple class should directly provide the information we want 6650 // here. 6651 switch (getToolChain().getArch()) { 6652 default: 6653 break; 6654 case llvm::Triple::x86: 6655 case llvm::Triple::ppc: 6656 CmdArgs.push_back("-m32"); 6657 break; 6658 case llvm::Triple::x86_64: 6659 case llvm::Triple::ppc64: 6660 case llvm::Triple::ppc64le: 6661 CmdArgs.push_back("-m64"); 6662 break; 6663 case llvm::Triple::sparcel: 6664 CmdArgs.push_back("-EL"); 6665 break; 6666 } 6667 6668 if (Output.isFilename()) { 6669 CmdArgs.push_back("-o"); 6670 CmdArgs.push_back(Output.getFilename()); 6671 } else { 6672 assert(Output.isNothing() && "Unexpected output"); 6673 CmdArgs.push_back("-fsyntax-only"); 6674 } 6675 6676 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 6677 6678 // Only pass -x if gcc will understand it; otherwise hope gcc 6679 // understands the suffix correctly. The main use case this would go 6680 // wrong in is for linker inputs if they happened to have an odd 6681 // suffix; really the only way to get this to happen is a command 6682 // like '-x foobar a.c' which will treat a.c like a linker input. 6683 // 6684 // FIXME: For the linker case specifically, can we safely convert 6685 // inputs into '-Wl,' options? 6686 for (const auto &II : Inputs) { 6687 // Don't try to pass LLVM or AST inputs to a generic gcc. 6688 if (types::isLLVMIR(II.getType())) 6689 D.Diag(diag::err_drv_no_linker_llvm_support) 6690 << getToolChain().getTripleString(); 6691 else if (II.getType() == types::TY_AST) 6692 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString(); 6693 else if (II.getType() == types::TY_ModuleFile) 6694 D.Diag(diag::err_drv_no_module_support) 6695 << getToolChain().getTripleString(); 6696 6697 if (types::canTypeBeUserSpecified(II.getType())) { 6698 CmdArgs.push_back("-x"); 6699 CmdArgs.push_back(types::getTypeName(II.getType())); 6700 } 6701 6702 if (II.isFilename()) 6703 CmdArgs.push_back(II.getFilename()); 6704 else { 6705 const Arg &A = II.getInputArg(); 6706 6707 // Reverse translate some rewritten options. 6708 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 6709 CmdArgs.push_back("-lstdc++"); 6710 continue; 6711 } 6712 6713 // Don't render as input, we need gcc to do the translations. 6714 A.render(Args, CmdArgs); 6715 } 6716 } 6717 6718 const std::string &customGCCName = D.getCCCGenericGCCName(); 6719 const char *GCCName; 6720 if (!customGCCName.empty()) 6721 GCCName = customGCCName.c_str(); 6722 else if (D.CCCIsCXX()) { 6723 GCCName = "g++"; 6724 } else 6725 GCCName = "gcc"; 6726 6727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 6728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 6729 } 6730 6731 void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA, 6732 ArgStringList &CmdArgs) const { 6733 CmdArgs.push_back("-E"); 6734 } 6735 6736 void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA, 6737 ArgStringList &CmdArgs) const { 6738 const Driver &D = getToolChain().getDriver(); 6739 6740 switch (JA.getType()) { 6741 // If -flto, etc. are present then make sure not to force assembly output. 6742 case types::TY_LLVM_IR: 6743 case types::TY_LTO_IR: 6744 case types::TY_LLVM_BC: 6745 case types::TY_LTO_BC: 6746 CmdArgs.push_back("-c"); 6747 break; 6748 // We assume we've got an "integrated" assembler in that gcc will produce an 6749 // object file itself. 6750 case types::TY_Object: 6751 CmdArgs.push_back("-c"); 6752 break; 6753 case types::TY_PP_Asm: 6754 CmdArgs.push_back("-S"); 6755 break; 6756 case types::TY_Nothing: 6757 CmdArgs.push_back("-fsyntax-only"); 6758 break; 6759 default: 6760 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType()); 6761 } 6762 } 6763 6764 void gcc::Linker::RenderExtraToolArgs(const JobAction &JA, 6765 ArgStringList &CmdArgs) const { 6766 // The types are (hopefully) good enough. 6767 } 6768 6769 // Hexagon tools start. 6770 void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA, 6771 ArgStringList &CmdArgs) const { 6772 } 6773 6774 void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 6775 const InputInfo &Output, 6776 const InputInfoList &Inputs, 6777 const ArgList &Args, 6778 const char *LinkingOutput) const { 6779 claimNoWarnArgs(Args); 6780 6781 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain()); 6782 const Driver &D = HTC.getDriver(); 6783 ArgStringList CmdArgs; 6784 6785 std::string MArchString = "-march=hexagon"; 6786 CmdArgs.push_back(Args.MakeArgString(MArchString)); 6787 6788 RenderExtraToolArgs(JA, CmdArgs); 6789 6790 std::string AsName = "hexagon-llvm-mc"; 6791 std::string MCpuString = "-mcpu=hexagon" + 6792 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); 6793 CmdArgs.push_back("-filetype=obj"); 6794 CmdArgs.push_back(Args.MakeArgString(MCpuString)); 6795 6796 if (Output.isFilename()) { 6797 CmdArgs.push_back("-o"); 6798 CmdArgs.push_back(Output.getFilename()); 6799 } else { 6800 assert(Output.isNothing() && "Unexpected output"); 6801 CmdArgs.push_back("-fsyntax-only"); 6802 } 6803 6804 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { 6805 std::string N = llvm::utostr(G.getValue()); 6806 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N)); 6807 } 6808 6809 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 6810 6811 // Only pass -x if gcc will understand it; otherwise hope gcc 6812 // understands the suffix correctly. The main use case this would go 6813 // wrong in is for linker inputs if they happened to have an odd 6814 // suffix; really the only way to get this to happen is a command 6815 // like '-x foobar a.c' which will treat a.c like a linker input. 6816 // 6817 // FIXME: For the linker case specifically, can we safely convert 6818 // inputs into '-Wl,' options? 6819 for (const auto &II : Inputs) { 6820 // Don't try to pass LLVM or AST inputs to a generic gcc. 6821 if (types::isLLVMIR(II.getType())) 6822 D.Diag(clang::diag::err_drv_no_linker_llvm_support) 6823 << HTC.getTripleString(); 6824 else if (II.getType() == types::TY_AST) 6825 D.Diag(clang::diag::err_drv_no_ast_support) 6826 << HTC.getTripleString(); 6827 else if (II.getType() == types::TY_ModuleFile) 6828 D.Diag(diag::err_drv_no_module_support) 6829 << HTC.getTripleString(); 6830 6831 if (II.isFilename()) 6832 CmdArgs.push_back(II.getFilename()); 6833 else 6834 // Don't render as input, we need gcc to do the translations. 6835 // FIXME: What is this? 6836 II.getInputArg().render(Args, CmdArgs); 6837 } 6838 6839 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str())); 6840 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 6841 } 6842 6843 void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA, 6844 ArgStringList &CmdArgs) const { 6845 } 6846 6847 static void 6848 constructHexagonLinkArgs(Compilation &C, const JobAction &JA, 6849 const toolchains::HexagonToolChain &HTC, 6850 const InputInfo &Output, const InputInfoList &Inputs, 6851 const ArgList &Args, ArgStringList &CmdArgs, 6852 const char *LinkingOutput) { 6853 6854 const Driver &D = HTC.getDriver(); 6855 6856 //---------------------------------------------------------------------------- 6857 // 6858 //---------------------------------------------------------------------------- 6859 bool IsStatic = Args.hasArg(options::OPT_static); 6860 bool IsShared = Args.hasArg(options::OPT_shared); 6861 bool IsPIE = Args.hasArg(options::OPT_pie); 6862 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib); 6863 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles); 6864 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs); 6865 bool UseG0 = false; 6866 bool UseShared = IsShared && !IsStatic; 6867 6868 //---------------------------------------------------------------------------- 6869 // Silence warnings for various options 6870 //---------------------------------------------------------------------------- 6871 Args.ClaimAllArgs(options::OPT_g_Group); 6872 Args.ClaimAllArgs(options::OPT_emit_llvm); 6873 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already 6874 // handled somewhere else. 6875 Args.ClaimAllArgs(options::OPT_static_libgcc); 6876 6877 //---------------------------------------------------------------------------- 6878 // 6879 //---------------------------------------------------------------------------- 6880 if (Args.hasArg(options::OPT_s)) 6881 CmdArgs.push_back("-s"); 6882 6883 if (Args.hasArg(options::OPT_r)) 6884 CmdArgs.push_back("-r"); 6885 6886 for (const auto &Opt : HTC.ExtraOpts) 6887 CmdArgs.push_back(Opt.c_str()); 6888 6889 CmdArgs.push_back("-march=hexagon"); 6890 std::string CpuVer = 6891 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); 6892 std::string MCpuString = "-mcpu=hexagon" + CpuVer; 6893 CmdArgs.push_back(Args.MakeArgString(MCpuString)); 6894 6895 if (IsShared) { 6896 CmdArgs.push_back("-shared"); 6897 // The following should be the default, but doing as hexagon-gcc does. 6898 CmdArgs.push_back("-call_shared"); 6899 } 6900 6901 if (IsStatic) 6902 CmdArgs.push_back("-static"); 6903 6904 if (IsPIE && !IsShared) 6905 CmdArgs.push_back("-pie"); 6906 6907 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { 6908 std::string N = llvm::utostr(G.getValue()); 6909 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N)); 6910 UseG0 = G.getValue() == 0; 6911 } 6912 6913 //---------------------------------------------------------------------------- 6914 // 6915 //---------------------------------------------------------------------------- 6916 CmdArgs.push_back("-o"); 6917 CmdArgs.push_back(Output.getFilename()); 6918 6919 //---------------------------------------------------------------------------- 6920 // moslib 6921 //---------------------------------------------------------------------------- 6922 std::vector<std::string> OsLibs; 6923 bool HasStandalone = false; 6924 6925 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) { 6926 A->claim(); 6927 OsLibs.emplace_back(A->getValue()); 6928 HasStandalone = HasStandalone || (OsLibs.back() == "standalone"); 6929 } 6930 if (OsLibs.empty()) { 6931 OsLibs.push_back("standalone"); 6932 HasStandalone = true; 6933 } 6934 6935 //---------------------------------------------------------------------------- 6936 // Start Files 6937 //---------------------------------------------------------------------------- 6938 const std::string MCpuSuffix = "/" + CpuVer; 6939 const std::string MCpuG0Suffix = MCpuSuffix + "/G0"; 6940 const std::string RootDir = 6941 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/"; 6942 const std::string StartSubDir = 6943 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix); 6944 6945 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir, 6946 const char *Name) -> std::string { 6947 std::string RelName = SubDir + Name; 6948 std::string P = HTC.GetFilePath(RelName.c_str()); 6949 if (llvm::sys::fs::exists(P)) 6950 return P; 6951 return RootDir + RelName; 6952 }; 6953 6954 if (IncStdLib && IncStartFiles) { 6955 if (!IsShared) { 6956 if (HasStandalone) { 6957 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o"); 6958 CmdArgs.push_back(Args.MakeArgString(Crt0SA)); 6959 } 6960 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o"); 6961 CmdArgs.push_back(Args.MakeArgString(Crt0)); 6962 } 6963 std::string Init = UseShared 6964 ? Find(RootDir, StartSubDir + "/pic", "/initS.o") 6965 : Find(RootDir, StartSubDir, "/init.o"); 6966 CmdArgs.push_back(Args.MakeArgString(Init)); 6967 } 6968 6969 //---------------------------------------------------------------------------- 6970 // Library Search Paths 6971 //---------------------------------------------------------------------------- 6972 const ToolChain::path_list &LibPaths = HTC.getFilePaths(); 6973 for (const auto &LibPath : LibPaths) 6974 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath)); 6975 6976 //---------------------------------------------------------------------------- 6977 // 6978 //---------------------------------------------------------------------------- 6979 Args.AddAllArgs(CmdArgs, 6980 {options::OPT_T_Group, options::OPT_e, options::OPT_s, 6981 options::OPT_t, options::OPT_u_Group}); 6982 6983 AddLinkerInputs(HTC, Inputs, Args, CmdArgs); 6984 6985 //---------------------------------------------------------------------------- 6986 // Libraries 6987 //---------------------------------------------------------------------------- 6988 if (IncStdLib && IncDefLibs) { 6989 if (D.CCCIsCXX()) { 6990 HTC.AddCXXStdlibLibArgs(Args, CmdArgs); 6991 CmdArgs.push_back("-lm"); 6992 } 6993 6994 CmdArgs.push_back("--start-group"); 6995 6996 if (!IsShared) { 6997 for (const std::string &Lib : OsLibs) 6998 CmdArgs.push_back(Args.MakeArgString("-l" + Lib)); 6999 CmdArgs.push_back("-lc"); 7000 } 7001 CmdArgs.push_back("-lgcc"); 7002 7003 CmdArgs.push_back("--end-group"); 7004 } 7005 7006 //---------------------------------------------------------------------------- 7007 // End files 7008 //---------------------------------------------------------------------------- 7009 if (IncStdLib && IncStartFiles) { 7010 std::string Fini = UseShared 7011 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o") 7012 : Find(RootDir, StartSubDir, "/fini.o"); 7013 CmdArgs.push_back(Args.MakeArgString(Fini)); 7014 } 7015 } 7016 7017 void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA, 7018 const InputInfo &Output, 7019 const InputInfoList &Inputs, 7020 const ArgList &Args, 7021 const char *LinkingOutput) const { 7022 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain()); 7023 7024 ArgStringList CmdArgs; 7025 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs, 7026 LinkingOutput); 7027 7028 std::string Linker = HTC.GetProgramPath("hexagon-link"); 7029 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), 7030 CmdArgs, Inputs)); 7031 } 7032 // Hexagon tools end. 7033 7034 void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA, 7035 const InputInfo &Output, 7036 const InputInfoList &Inputs, 7037 const ArgList &Args, 7038 const char *LinkingOutput) const { 7039 7040 std::string Linker = getToolChain().GetProgramPath(getShortName()); 7041 ArgStringList CmdArgs; 7042 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 7043 CmdArgs.push_back("-shared"); 7044 CmdArgs.push_back("-o"); 7045 CmdArgs.push_back(Output.getFilename()); 7046 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), 7047 CmdArgs, Inputs)); 7048 } 7049 // AMDGPU tools end. 7050 7051 wasm::Linker::Linker(const ToolChain &TC) 7052 : GnuTool("wasm::Linker", "lld", TC) {} 7053 7054 bool wasm::Linker::isLinkJob() const { 7055 return true; 7056 } 7057 7058 bool wasm::Linker::hasIntegratedCPP() const { 7059 return false; 7060 } 7061 7062 void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA, 7063 const InputInfo &Output, 7064 const InputInfoList &Inputs, 7065 const ArgList &Args, 7066 const char *LinkingOutput) const { 7067 7068 const ToolChain &ToolChain = getToolChain(); 7069 const Driver &D = ToolChain.getDriver(); 7070 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath()); 7071 ArgStringList CmdArgs; 7072 CmdArgs.push_back("-flavor"); 7073 CmdArgs.push_back("ld"); 7074 7075 // Enable garbage collection of unused input sections by default, since code 7076 // size is of particular importance. This is significantly facilitated by 7077 // the enabling of -ffunction-sections and -fdata-sections in 7078 // Clang::ConstructJob. 7079 if (areOptimizationsEnabled(Args)) 7080 CmdArgs.push_back("--gc-sections"); 7081 7082 if (Args.hasArg(options::OPT_rdynamic)) 7083 CmdArgs.push_back("-export-dynamic"); 7084 if (Args.hasArg(options::OPT_s)) 7085 CmdArgs.push_back("--strip-all"); 7086 if (Args.hasArg(options::OPT_shared)) 7087 CmdArgs.push_back("-shared"); 7088 if (Args.hasArg(options::OPT_static)) 7089 CmdArgs.push_back("-Bstatic"); 7090 7091 Args.AddAllArgs(CmdArgs, options::OPT_L); 7092 ToolChain.AddFilePathLibArgs(Args, CmdArgs); 7093 7094 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 7095 if (Args.hasArg(options::OPT_shared)) 7096 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o"))); 7097 else if (Args.hasArg(options::OPT_pie)) 7098 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o"))); 7099 else 7100 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); 7101 7102 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 7103 } 7104 7105 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 7106 7107 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 7108 if (D.CCCIsCXX()) 7109 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 7110 7111 if (Args.hasArg(options::OPT_pthread)) 7112 CmdArgs.push_back("-lpthread"); 7113 7114 CmdArgs.push_back("-lc"); 7115 CmdArgs.push_back("-lcompiler_rt"); 7116 } 7117 7118 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) 7119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 7120 7121 CmdArgs.push_back("-o"); 7122 CmdArgs.push_back(Output.getFilename()); 7123 7124 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs)); 7125 } 7126 7127 const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) { 7128 std::string MArch; 7129 if (!Arch.empty()) 7130 MArch = Arch; 7131 else 7132 MArch = Triple.getArchName(); 7133 MArch = StringRef(MArch).split("+").first.lower(); 7134 7135 // Handle -march=native. 7136 if (MArch == "native") { 7137 std::string CPU = llvm::sys::getHostCPUName(); 7138 if (CPU != "generic") { 7139 // Translate the native cpu into the architecture suffix for that CPU. 7140 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); 7141 // If there is no valid architecture suffix for this CPU we don't know how 7142 // to handle it, so return no architecture. 7143 if (Suffix.empty()) 7144 MArch = ""; 7145 else 7146 MArch = std::string("arm") + Suffix.str(); 7147 } 7148 } 7149 7150 return MArch; 7151 } 7152 7153 /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting. 7154 StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) { 7155 std::string MArch = getARMArch(Arch, Triple); 7156 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch 7157 // here means an -march=native that we can't handle, so instead return no CPU. 7158 if (MArch.empty()) 7159 return StringRef(); 7160 7161 // We need to return an empty string here on invalid MArch values as the 7162 // various places that call this function can't cope with a null result. 7163 return Triple.getARMCPUForArch(MArch); 7164 } 7165 7166 /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. 7167 std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch, 7168 const llvm::Triple &Triple) { 7169 // FIXME: Warn on inconsistent use of -mcpu and -march. 7170 // If we have -mcpu=, use that. 7171 if (!CPU.empty()) { 7172 std::string MCPU = StringRef(CPU).split("+").first.lower(); 7173 // Handle -mcpu=native. 7174 if (MCPU == "native") 7175 return llvm::sys::getHostCPUName(); 7176 else 7177 return MCPU; 7178 } 7179 7180 return getARMCPUForMArch(Arch, Triple); 7181 } 7182 7183 /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 7184 /// CPU (or Arch, if CPU is generic). 7185 // FIXME: This is redundant with -mcpu, why does LLVM use this. 7186 StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch, 7187 const llvm::Triple &Triple) { 7188 unsigned ArchKind; 7189 if (CPU == "generic") { 7190 std::string ARMArch = tools::arm::getARMArch(Arch, Triple); 7191 ArchKind = llvm::ARM::parseArch(ARMArch); 7192 if (ArchKind == llvm::ARM::AK_INVALID) 7193 // In case of generic Arch, i.e. "arm", 7194 // extract arch from default cpu of the Triple 7195 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch)); 7196 } else { 7197 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an 7198 // armv7k triple if it's actually been specified via "-arch armv7k". 7199 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k") 7200 ? (unsigned)llvm::ARM::AK_ARMV7K 7201 : llvm::ARM::parseCPUArch(CPU); 7202 } 7203 if (ArchKind == llvm::ARM::AK_INVALID) 7204 return ""; 7205 return llvm::ARM::getSubArch(ArchKind); 7206 } 7207 7208 void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, 7209 const llvm::Triple &Triple) { 7210 if (Args.hasArg(options::OPT_r)) 7211 return; 7212 7213 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker 7214 // to generate BE-8 executables. 7215 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple)) 7216 CmdArgs.push_back("--be8"); 7217 } 7218 7219 mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) { 7220 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008 7221 // was first introduced in Release 3. However, other compilers have 7222 // traditionally allowed it for Release 2 so we should do the same. 7223 return (NanEncoding)llvm::StringSwitch<int>(CPU) 7224 .Case("mips1", NanLegacy) 7225 .Case("mips2", NanLegacy) 7226 .Case("mips3", NanLegacy) 7227 .Case("mips4", NanLegacy) 7228 .Case("mips5", NanLegacy) 7229 .Case("mips32", NanLegacy) 7230 .Case("mips32r2", NanLegacy | Nan2008) 7231 .Case("mips32r3", NanLegacy | Nan2008) 7232 .Case("mips32r5", NanLegacy | Nan2008) 7233 .Case("mips32r6", Nan2008) 7234 .Case("mips64", NanLegacy) 7235 .Case("mips64r2", NanLegacy | Nan2008) 7236 .Case("mips64r3", NanLegacy | Nan2008) 7237 .Case("mips64r5", NanLegacy | Nan2008) 7238 .Case("mips64r6", Nan2008) 7239 .Default(NanLegacy); 7240 } 7241 7242 bool mips::hasCompactBranches(StringRef &CPU) { 7243 // mips32r6 and mips64r6 have compact branches. 7244 return llvm::StringSwitch<bool>(CPU) 7245 .Case("mips32r6", true) 7246 .Case("mips64r6", true) 7247 .Default(false); 7248 } 7249 7250 bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) { 7251 Arg *A = Args.getLastArg(options::OPT_mabi_EQ); 7252 return A && (A->getValue() == StringRef(Value)); 7253 } 7254 7255 bool mips::isUCLibc(const ArgList &Args) { 7256 Arg *A = Args.getLastArg(options::OPT_m_libc_Group); 7257 return A && A->getOption().matches(options::OPT_muclibc); 7258 } 7259 7260 bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) { 7261 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ)) 7262 return llvm::StringSwitch<bool>(NaNArg->getValue()) 7263 .Case("2008", true) 7264 .Case("legacy", false) 7265 .Default(false); 7266 7267 // NaN2008 is the default for MIPS32r6/MIPS64r6. 7268 return llvm::StringSwitch<bool>(getCPUName(Args, Triple)) 7269 .Cases("mips32r6", "mips64r6", true) 7270 .Default(false); 7271 7272 return false; 7273 } 7274 7275 bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) { 7276 if (!Triple.isAndroid()) 7277 return false; 7278 7279 // Android MIPS32R6 defaults to FP64A. 7280 return llvm::StringSwitch<bool>(CPUName) 7281 .Case("mips32r6", true) 7282 .Default(false); 7283 } 7284 7285 bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, 7286 StringRef ABIName, mips::FloatABI FloatABI) { 7287 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies && 7288 Triple.getVendor() != llvm::Triple::MipsTechnologies && 7289 !Triple.isAndroid()) 7290 return false; 7291 7292 if (ABIName != "32") 7293 return false; 7294 7295 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is 7296 // present. 7297 if (FloatABI == mips::FloatABI::Soft) 7298 return false; 7299 7300 return llvm::StringSwitch<bool>(CPUName) 7301 .Cases("mips2", "mips3", "mips4", "mips5", true) 7302 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true) 7303 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true) 7304 .Default(false); 7305 } 7306 7307 bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple, 7308 StringRef CPUName, StringRef ABIName, 7309 mips::FloatABI FloatABI) { 7310 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI); 7311 7312 // FPXX shouldn't be used if -msingle-float is present. 7313 if (Arg *A = Args.getLastArg(options::OPT_msingle_float, 7314 options::OPT_mdouble_float)) 7315 if (A->getOption().matches(options::OPT_msingle_float)) 7316 UseFPXX = false; 7317 7318 return UseFPXX; 7319 } 7320 7321 llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) { 7322 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 7323 // archs which Darwin doesn't use. 7324 7325 // The matching this routine does is fairly pointless, since it is neither the 7326 // complete architecture list, nor a reasonable subset. The problem is that 7327 // historically the driver driver accepts this and also ties its -march= 7328 // handling to the architecture name, so we need to be careful before removing 7329 // support for it. 7330 7331 // This code must be kept in sync with Clang's Darwin specific argument 7332 // translation. 7333 7334 return llvm::StringSwitch<llvm::Triple::ArchType>(Str) 7335 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc) 7336 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc) 7337 .Case("ppc64", llvm::Triple::ppc64) 7338 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86) 7339 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4", 7340 llvm::Triple::x86) 7341 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64) 7342 // This is derived from the driver driver. 7343 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm) 7344 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm) 7345 .Cases("armv7s", "xscale", llvm::Triple::arm) 7346 .Case("arm64", llvm::Triple::aarch64) 7347 .Case("r600", llvm::Triple::r600) 7348 .Case("amdgcn", llvm::Triple::amdgcn) 7349 .Case("nvptx", llvm::Triple::nvptx) 7350 .Case("nvptx64", llvm::Triple::nvptx64) 7351 .Case("amdil", llvm::Triple::amdil) 7352 .Case("spir", llvm::Triple::spir) 7353 .Default(llvm::Triple::UnknownArch); 7354 } 7355 7356 void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) { 7357 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str); 7358 T.setArch(Arch); 7359 7360 if (Str == "x86_64h") 7361 T.setArchName(Str); 7362 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") { 7363 T.setOS(llvm::Triple::UnknownOS); 7364 T.setObjectFormat(llvm::Triple::MachO); 7365 } 7366 } 7367 7368 const char *Clang::getBaseInputName(const ArgList &Args, 7369 const InputInfo &Input) { 7370 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput())); 7371 } 7372 7373 const char *Clang::getBaseInputStem(const ArgList &Args, 7374 const InputInfoList &Inputs) { 7375 const char *Str = getBaseInputName(Args, Inputs[0]); 7376 7377 if (const char *End = strrchr(Str, '.')) 7378 return Args.MakeArgString(std::string(Str, End)); 7379 7380 return Str; 7381 } 7382 7383 const char *Clang::getDependencyFileName(const ArgList &Args, 7384 const InputInfoList &Inputs) { 7385 // FIXME: Think about this more. 7386 std::string Res; 7387 7388 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 7389 std::string Str(OutputOpt->getValue()); 7390 Res = Str.substr(0, Str.rfind('.')); 7391 } else { 7392 Res = getBaseInputStem(Args, Inputs); 7393 } 7394 return Args.MakeArgString(Res + ".d"); 7395 } 7396 7397 void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA, 7398 const InputInfo &Output, 7399 const InputInfoList &Inputs, 7400 const ArgList &Args, 7401 const char *LinkingOutput) const { 7402 const ToolChain &ToolChain = getToolChain(); 7403 const Driver &D = ToolChain.getDriver(); 7404 ArgStringList CmdArgs; 7405 7406 // Silence warning for "clang -g foo.o -o foo" 7407 Args.ClaimAllArgs(options::OPT_g_Group); 7408 // and "clang -emit-llvm foo.o -o foo" 7409 Args.ClaimAllArgs(options::OPT_emit_llvm); 7410 // and for "clang -w foo.o -o foo". Other warning options are already 7411 // handled somewhere else. 7412 Args.ClaimAllArgs(options::OPT_w); 7413 7414 if (!D.SysRoot.empty()) 7415 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 7416 7417 // CloudABI only supports static linkage. 7418 CmdArgs.push_back("-Bstatic"); 7419 7420 // CloudABI uses Position Independent Executables exclusively. 7421 CmdArgs.push_back("-pie"); 7422 CmdArgs.push_back("--no-dynamic-linker"); 7423 CmdArgs.push_back("-zrelro"); 7424 7425 CmdArgs.push_back("--eh-frame-hdr"); 7426 CmdArgs.push_back("--gc-sections"); 7427 7428 if (Output.isFilename()) { 7429 CmdArgs.push_back("-o"); 7430 CmdArgs.push_back(Output.getFilename()); 7431 } else { 7432 assert(Output.isNothing() && "Invalid output."); 7433 } 7434 7435 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 7436 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); 7437 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); 7438 } 7439 7440 Args.AddAllArgs(CmdArgs, options::OPT_L); 7441 ToolChain.AddFilePathLibArgs(Args, CmdArgs); 7442 Args.AddAllArgs(CmdArgs, 7443 {options::OPT_T_Group, options::OPT_e, options::OPT_s, 7444 options::OPT_t, options::OPT_Z_Flag, options::OPT_r}); 7445 7446 if (D.isUsingLTO()) 7447 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin); 7448 7449 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 7450 7451 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 7452 if (D.CCCIsCXX()) 7453 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 7454 CmdArgs.push_back("-lc"); 7455 CmdArgs.push_back("-lcompiler_rt"); 7456 } 7457 7458 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) 7459 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); 7460 7461 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); 7462 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 7463 } 7464 7465 void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 7466 const InputInfo &Output, 7467 const InputInfoList &Inputs, 7468 const ArgList &Args, 7469 const char *LinkingOutput) const { 7470 ArgStringList CmdArgs; 7471 7472 assert(Inputs.size() == 1 && "Unexpected number of inputs."); 7473 const InputInfo &Input = Inputs[0]; 7474 7475 // Determine the original source input. 7476 const Action *SourceAction = &JA; 7477 while (SourceAction->getKind() != Action::InputClass) { 7478 assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 7479 SourceAction = SourceAction->getInputs()[0]; 7480 } 7481 7482 // If -fno-integrated-as is used add -Q to the darwin assember driver to make 7483 // sure it runs its system assembler not clang's integrated assembler. 7484 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as. 7485 // FIXME: at run-time detect assembler capabilities or rely on version 7486 // information forwarded by -target-assembler-version. 7487 if (Args.hasArg(options::OPT_fno_integrated_as)) { 7488 const llvm::Triple &T(getToolChain().getTriple()); 7489 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7))) 7490 CmdArgs.push_back("-Q"); 7491 } 7492 7493 // Forward -g, assuming we are dealing with an actual assembly file. 7494 if (SourceAction->getType() == types::TY_Asm || 7495 SourceAction->getType() == types::TY_PP_Asm) { 7496 if (Args.hasArg(options::OPT_gstabs)) 7497 CmdArgs.push_back("--gstabs"); 7498 else if (Args.hasArg(options::OPT_g_Group)) 7499 CmdArgs.push_back("-g"); 7500 } 7501 7502 // Derived from asm spec. 7503 AddMachOArch(Args, CmdArgs); 7504 7505 // Use -force_cpusubtype_ALL on x86 by default. 7506 if (getToolChain().getArch() == llvm::Triple::x86 || 7507 getToolChain().getArch() == llvm::Triple::x86_64 || 7508 Args.hasArg(options::OPT_force__cpusubtype__ALL)) 7509 CmdArgs.push_back("-force_cpusubtype_ALL"); 7510 7511 if (getToolChain().getArch() != llvm::Triple::x86_64 && 7512 (((Args.hasArg(options::OPT_mkernel) || 7513 Args.hasArg(options::OPT_fapple_kext)) && 7514 getMachOToolChain().isKernelStatic()) || 7515 Args.hasArg(options::OPT_static))) 7516 CmdArgs.push_back("-static"); 7517 7518 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 7519 7520 assert(Output.isFilename() && "Unexpected lipo output."); 7521 CmdArgs.push_back("-o"); 7522 CmdArgs.push_back(Output.getFilename()); 7523 7524 assert(Input.isFilename() && "Invalid input."); 7525 CmdArgs.push_back(Input.getFilename()); 7526 7527 // asm_final spec is empty. 7528 7529 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 7530 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 7531 } 7532 7533 void darwin::MachOTool::anchor() {} 7534 7535 void darwin::MachOTool::AddMachOArch(const ArgList &Args, 7536 ArgStringList &CmdArgs) const { 7537 StringRef ArchName = getMachOToolChain().getMachOArchName(Args); 7538 7539 // Derived from darwin_arch spec. 7540 CmdArgs.push_back("-arch"); 7541 CmdArgs.push_back(Args.MakeArgString(ArchName)); 7542 7543 // FIXME: Is this needed anymore? 7544 if (ArchName == "arm") 7545 CmdArgs.push_back("-force_cpusubtype_ALL"); 7546 } 7547 7548 bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const { 7549 // We only need to generate a temp path for LTO if we aren't compiling object 7550 // files. When compiling source files, we run 'dsymutil' after linking. We 7551 // don't run 'dsymutil' when compiling object files. 7552 for (const auto &Input : Inputs) 7553 if (Input.getType() != types::TY_Object) 7554 return true; 7555 7556 return false; 7557 } 7558 7559 void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args, 7560 ArgStringList &CmdArgs, 7561 const InputInfoList &Inputs) const { 7562 const Driver &D = getToolChain().getDriver(); 7563 const toolchains::MachO &MachOTC = getMachOToolChain(); 7564 7565 unsigned Version[5] = {0, 0, 0, 0, 0}; 7566 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 7567 if (!Driver::GetReleaseVersion(A->getValue(), Version)) 7568 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args); 7569 } 7570 7571 // Newer linkers support -demangle. Pass it if supported and not disabled by 7572 // the user. 7573 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 7574 CmdArgs.push_back("-demangle"); 7575 7576 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137) 7577 CmdArgs.push_back("-export_dynamic"); 7578 7579 // If we are using App Extension restrictions, pass a flag to the linker 7580 // telling it that the compiled code has been audited. 7581 if (Args.hasFlag(options::OPT_fapplication_extension, 7582 options::OPT_fno_application_extension, false)) 7583 CmdArgs.push_back("-application_extension"); 7584 7585 if (D.isUsingLTO()) { 7586 // If we are using LTO, then automatically create a temporary file path for 7587 // the linker to use, so that it's lifetime will extend past a possible 7588 // dsymutil step. 7589 if (Version[0] >= 116 && NeedsTempPath(Inputs)) { 7590 const char *TmpPath = C.getArgs().MakeArgString( 7591 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object))); 7592 C.addTempFile(TmpPath); 7593 CmdArgs.push_back("-object_path_lto"); 7594 CmdArgs.push_back(TmpPath); 7595 } 7596 7597 // Use -lto_library option to specify the libLTO.dylib path. Try to find 7598 // it in clang installed libraries. If not found, the option is not used 7599 // and 'ld' will use its default mechanism to search for libLTO.dylib. 7600 if (Version[0] >= 133) { 7601 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib 7602 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir()); 7603 SmallString<128> LibLTOPath(P); 7604 llvm::sys::path::append(LibLTOPath, "lib"); 7605 llvm::sys::path::append(LibLTOPath, "libLTO.dylib"); 7606 if (llvm::sys::fs::exists(LibLTOPath)) { 7607 CmdArgs.push_back("-lto_library"); 7608 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath)); 7609 } else { 7610 D.Diag(diag::warn_drv_lto_libpath); 7611 } 7612 } 7613 } 7614 7615 // Derived from the "link" spec. 7616 Args.AddAllArgs(CmdArgs, options::OPT_static); 7617 if (!Args.hasArg(options::OPT_static)) 7618 CmdArgs.push_back("-dynamic"); 7619 if (Args.hasArg(options::OPT_fgnu_runtime)) { 7620 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 7621 // here. How do we wish to handle such things? 7622 } 7623 7624 if (!Args.hasArg(options::OPT_dynamiclib)) { 7625 AddMachOArch(Args, CmdArgs); 7626 // FIXME: Why do this only on this path? 7627 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 7628 7629 Args.AddLastArg(CmdArgs, options::OPT_bundle); 7630 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 7631 Args.AddAllArgs(CmdArgs, options::OPT_client__name); 7632 7633 Arg *A; 7634 if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 7635 (A = Args.getLastArg(options::OPT_current__version)) || 7636 (A = Args.getLastArg(options::OPT_install__name))) 7637 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) 7638 << "-dynamiclib"; 7639 7640 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 7641 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 7642 Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 7643 } else { 7644 CmdArgs.push_back("-dylib"); 7645 7646 Arg *A; 7647 if ((A = Args.getLastArg(options::OPT_bundle)) || 7648 (A = Args.getLastArg(options::OPT_bundle__loader)) || 7649 (A = Args.getLastArg(options::OPT_client__name)) || 7650 (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 7651 (A = Args.getLastArg(options::OPT_keep__private__externs)) || 7652 (A = Args.getLastArg(options::OPT_private__bundle))) 7653 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) 7654 << "-dynamiclib"; 7655 7656 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 7657 "-dylib_compatibility_version"); 7658 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 7659 "-dylib_current_version"); 7660 7661 AddMachOArch(Args, CmdArgs); 7662 7663 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 7664 "-dylib_install_name"); 7665 } 7666 7667 Args.AddLastArg(CmdArgs, options::OPT_all__load); 7668 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 7669 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 7670 if (MachOTC.isTargetIOSBased()) 7671 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 7672 Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 7673 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 7674 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 7675 Args.AddLastArg(CmdArgs, options::OPT_dynamic); 7676 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 7677 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 7678 Args.AddAllArgs(CmdArgs, options::OPT_force__load); 7679 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 7680 Args.AddAllArgs(CmdArgs, options::OPT_image__base); 7681 Args.AddAllArgs(CmdArgs, options::OPT_init); 7682 7683 // Add the deployment target. 7684 MachOTC.addMinVersionArgs(Args, CmdArgs); 7685 7686 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 7687 Args.AddLastArg(CmdArgs, options::OPT_multi__module); 7688 Args.AddLastArg(CmdArgs, options::OPT_single__module); 7689 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 7690 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 7691 7692 if (const Arg *A = 7693 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, 7694 options::OPT_fno_pie, options::OPT_fno_PIE)) { 7695 if (A->getOption().matches(options::OPT_fpie) || 7696 A->getOption().matches(options::OPT_fPIE)) 7697 CmdArgs.push_back("-pie"); 7698 else 7699 CmdArgs.push_back("-no_pie"); 7700 } 7701 // for embed-bitcode, use -bitcode_bundle in linker command 7702 if (C.getDriver().embedBitcodeEnabled() || 7703 C.getDriver().embedBitcodeMarkerOnly()) { 7704 // Check if the toolchain supports bitcode build flow. 7705 if (MachOTC.SupportsEmbeddedBitcode()) 7706 CmdArgs.push_back("-bitcode_bundle"); 7707 else 7708 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain); 7709 } 7710 7711 Args.AddLastArg(CmdArgs, options::OPT_prebind); 7712 Args.AddLastArg(CmdArgs, options::OPT_noprebind); 7713 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 7714 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 7715 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 7716 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 7717 Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 7718 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 7719 Args.AddAllArgs(CmdArgs, options::OPT_segprot); 7720 Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 7721 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 7722 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 7723 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 7724 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 7725 Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 7726 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 7727 7728 // Give --sysroot= preference, over the Apple specific behavior to also use 7729 // --isysroot as the syslibroot. 7730 StringRef sysroot = C.getSysRoot(); 7731 if (sysroot != "") { 7732 CmdArgs.push_back("-syslibroot"); 7733 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 7734 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 7735 CmdArgs.push_back("-syslibroot"); 7736 CmdArgs.push_back(A->getValue()); 7737 } 7738 7739 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 7740 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 7741 Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 7742 Args.AddAllArgs(CmdArgs, options::OPT_undefined); 7743 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 7744 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 7745 Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 7746 Args.AddAllArgs(CmdArgs, options::OPT_y); 7747 Args.AddLastArg(CmdArgs, options::OPT_w); 7748 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 7749 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 7750 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 7751 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 7752 Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 7753 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 7754 Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 7755 Args.AddLastArg(CmdArgs, options::OPT_whyload); 7756 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 7757 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 7758 Args.AddLastArg(CmdArgs, options::OPT_dylinker); 7759 Args.AddLastArg(CmdArgs, options::OPT_Mach); 7760 } 7761 7762 void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, 7763 const InputInfo &Output, 7764 const InputInfoList &Inputs, 7765 const ArgList &Args, 7766 const char *LinkingOutput) const { 7767 assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 7768 7769 // If the number of arguments surpasses the system limits, we will encode the 7770 // input files in a separate file, shortening the command line. To this end, 7771 // build a list of input file names that can be passed via a file with the 7772 // -filelist linker option. 7773 llvm::opt::ArgStringList InputFileList; 7774 7775 // The logic here is derived from gcc's behavior; most of which 7776 // comes from specs (starting with link_command). Consult gcc for 7777 // more information. 7778 ArgStringList CmdArgs; 7779 7780 /// Hack(tm) to ignore linking errors when we are doing ARC migration. 7781 if (Args.hasArg(options::OPT_ccc_arcmt_check, 7782 options::OPT_ccc_arcmt_migrate)) { 7783 for (const auto &Arg : Args) 7784 Arg->claim(); 7785 const char *Exec = 7786 Args.MakeArgString(getToolChain().GetProgramPath("touch")); 7787 CmdArgs.push_back(Output.getFilename()); 7788 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None)); 7789 return; 7790 } 7791 7792 // I'm not sure why this particular decomposition exists in gcc, but 7793 // we follow suite for ease of comparison. 7794 AddLinkArgs(C, Args, CmdArgs, Inputs); 7795 7796 // It seems that the 'e' option is completely ignored for dynamic executables 7797 // (the default), and with static executables, the last one wins, as expected. 7798 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t, 7799 options::OPT_Z_Flag, options::OPT_u_Group, 7800 options::OPT_e, options::OPT_r}); 7801 7802 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading 7803 // members of static archive libraries which implement Objective-C classes or 7804 // categories. 7805 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX)) 7806 CmdArgs.push_back("-ObjC"); 7807 7808 CmdArgs.push_back("-o"); 7809 CmdArgs.push_back(Output.getFilename()); 7810 7811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) 7812 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs); 7813 7814 // SafeStack requires its own runtime libraries 7815 // These libraries should be linked first, to make sure the 7816 // __safestack_init constructor executes before everything else 7817 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) { 7818 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs, 7819 "libclang_rt.safestack_osx.a", 7820 /*AlwaysLink=*/true); 7821 } 7822 7823 Args.AddAllArgs(CmdArgs, options::OPT_L); 7824 7825 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 7826 // Build the input file for -filelist (list of linker input files) in case we 7827 // need it later 7828 for (const auto &II : Inputs) { 7829 if (!II.isFilename()) { 7830 // This is a linker input argument. 7831 // We cannot mix input arguments and file names in a -filelist input, thus 7832 // we prematurely stop our list (remaining files shall be passed as 7833 // arguments). 7834 if (InputFileList.size() > 0) 7835 break; 7836 7837 continue; 7838 } 7839 7840 InputFileList.push_back(II.getFilename()); 7841 } 7842 7843 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) 7844 addOpenMPRuntime(CmdArgs, getToolChain(), Args); 7845 7846 if (isObjCRuntimeLinked(Args) && 7847 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 7848 // We use arclite library for both ARC and subscripting support. 7849 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs); 7850 7851 CmdArgs.push_back("-framework"); 7852 CmdArgs.push_back("Foundation"); 7853 // Link libobj. 7854 CmdArgs.push_back("-lobjc"); 7855 } 7856 7857 if (LinkingOutput) { 7858 CmdArgs.push_back("-arch_multiple"); 7859 CmdArgs.push_back("-final_output"); 7860 CmdArgs.push_back(LinkingOutput); 7861 } 7862 7863 if (Args.hasArg(options::OPT_fnested_functions)) 7864 CmdArgs.push_back("-allow_stack_execute"); 7865 7866 getMachOToolChain().addProfileRTLibs(Args, CmdArgs); 7867 7868 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 7869 if (getToolChain().getDriver().CCCIsCXX()) 7870 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 7871 7872 // link_ssp spec is empty. 7873 7874 // Let the tool chain choose which runtime library to link. 7875 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 7876 } 7877 7878 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 7879 // endfile_spec is empty. 7880 } 7881 7882 Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 7883 Args.AddAllArgs(CmdArgs, options::OPT_F); 7884 7885 // -iframework should be forwarded as -F. 7886 for (const Arg *A : Args.filtered(options::OPT_iframework)) 7887 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue())); 7888 7889 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 7890 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) { 7891 if (A->getValue() == StringRef("Accelerate")) { 7892 CmdArgs.push_back("-framework"); 7893 CmdArgs.push_back("Accelerate"); 7894 } 7895 } 7896 } 7897 7898 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 7899 std::unique_ptr<Command> Cmd = 7900 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs); 7901 Cmd->setInputFileList(std::move(InputFileList)); 7902 C.addCommand(std::move(Cmd)); 7903 } 7904 7905 void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 7906 const InputInfo &Output, 7907 const InputInfoList &Inputs, 7908 const ArgList &Args, 7909 const char *LinkingOutput) const { 7910 ArgStringList CmdArgs; 7911 7912 CmdArgs.push_back("-create"); 7913 assert(Output.isFilename() && "Unexpected lipo output."); 7914 7915 CmdArgs.push_back("-output"); 7916 CmdArgs.push_back(Output.getFilename()); 7917 7918 for (const auto &II : Inputs) { 7919 assert(II.isFilename() && "Unexpected lipo input."); 7920 CmdArgs.push_back(II.getFilename()); 7921 } 7922 7923 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo")); 7924 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 7925 } 7926 7927 void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, 7928 const InputInfo &Output, 7929 const InputInfoList &Inputs, 7930 const ArgList &Args, 7931 const char *LinkingOutput) const { 7932 ArgStringList CmdArgs; 7933 7934 CmdArgs.push_back("-o"); 7935 CmdArgs.push_back(Output.getFilename()); 7936 7937 assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 7938 const InputInfo &Input = Inputs[0]; 7939 assert(Input.isFilename() && "Unexpected dsymutil input."); 7940 CmdArgs.push_back(Input.getFilename()); 7941 7942 const char *Exec = 7943 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); 7944 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 7945 } 7946 7947 void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA, 7948 const InputInfo &Output, 7949 const InputInfoList &Inputs, 7950 const ArgList &Args, 7951 const char *LinkingOutput) const { 7952 ArgStringList CmdArgs; 7953 CmdArgs.push_back("--verify"); 7954 CmdArgs.push_back("--debug-info"); 7955 CmdArgs.push_back("--eh-frame"); 7956 CmdArgs.push_back("--quiet"); 7957 7958 assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 7959 const InputInfo &Input = Inputs[0]; 7960 assert(Input.isFilename() && "Unexpected verify input"); 7961 7962 // Grabbing the output of the earlier dsymutil run. 7963 CmdArgs.push_back(Input.getFilename()); 7964 7965 const char *Exec = 7966 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump")); 7967 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 7968 } 7969 7970 void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 7971 const InputInfo &Output, 7972 const InputInfoList &Inputs, 7973 const ArgList &Args, 7974 const char *LinkingOutput) const { 7975 claimNoWarnArgs(Args); 7976 ArgStringList CmdArgs; 7977 7978 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 7979 7980 CmdArgs.push_back("-o"); 7981 CmdArgs.push_back(Output.getFilename()); 7982 7983 for (const auto &II : Inputs) 7984 CmdArgs.push_back(II.getFilename()); 7985 7986 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 7987 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 7988 } 7989 7990 void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA, 7991 const InputInfo &Output, 7992 const InputInfoList &Inputs, 7993 const ArgList &Args, 7994 const char *LinkingOutput) const { 7995 ArgStringList CmdArgs; 7996 7997 // Demangle C++ names in errors 7998 CmdArgs.push_back("-C"); 7999 8000 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { 8001 CmdArgs.push_back("-e"); 8002 CmdArgs.push_back("_start"); 8003 } 8004 8005 if (Args.hasArg(options::OPT_static)) { 8006 CmdArgs.push_back("-Bstatic"); 8007 CmdArgs.push_back("-dn"); 8008 } else { 8009 CmdArgs.push_back("-Bdynamic"); 8010 if (Args.hasArg(options::OPT_shared)) { 8011 CmdArgs.push_back("-shared"); 8012 } else { 8013 CmdArgs.push_back("--dynamic-linker"); 8014 CmdArgs.push_back( 8015 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1"))); 8016 } 8017 } 8018 8019 if (Output.isFilename()) { 8020 CmdArgs.push_back("-o"); 8021 CmdArgs.push_back(Output.getFilename()); 8022 } else { 8023 assert(Output.isNothing() && "Invalid output."); 8024 } 8025 8026 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8027 if (!Args.hasArg(options::OPT_shared)) 8028 CmdArgs.push_back( 8029 Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 8030 8031 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 8032 CmdArgs.push_back( 8033 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o"))); 8034 CmdArgs.push_back( 8035 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 8036 } 8037 8038 getToolChain().AddFilePathLibArgs(Args, CmdArgs); 8039 8040 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, 8041 options::OPT_e, options::OPT_r}); 8042 8043 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 8044 8045 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 8046 if (getToolChain().getDriver().CCCIsCXX()) 8047 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 8048 CmdArgs.push_back("-lgcc_s"); 8049 CmdArgs.push_back("-lc"); 8050 if (!Args.hasArg(options::OPT_shared)) { 8051 CmdArgs.push_back("-lgcc"); 8052 CmdArgs.push_back("-lm"); 8053 } 8054 } 8055 8056 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8057 CmdArgs.push_back( 8058 Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 8059 } 8060 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); 8061 8062 getToolChain().addProfileRTLibs(Args, CmdArgs); 8063 8064 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 8065 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8066 } 8067 8068 void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 8069 const InputInfo &Output, 8070 const InputInfoList &Inputs, 8071 const ArgList &Args, 8072 const char *LinkingOutput) const { 8073 claimNoWarnArgs(Args); 8074 ArgStringList CmdArgs; 8075 8076 switch (getToolChain().getArch()) { 8077 case llvm::Triple::x86: 8078 // When building 32-bit code on OpenBSD/amd64, we have to explicitly 8079 // instruct as in the base system to assemble 32-bit code. 8080 CmdArgs.push_back("--32"); 8081 break; 8082 8083 case llvm::Triple::ppc: 8084 CmdArgs.push_back("-mppc"); 8085 CmdArgs.push_back("-many"); 8086 break; 8087 8088 case llvm::Triple::sparc: 8089 case llvm::Triple::sparcel: { 8090 CmdArgs.push_back("-32"); 8091 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 8092 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 8093 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8094 break; 8095 } 8096 8097 case llvm::Triple::sparcv9: { 8098 CmdArgs.push_back("-64"); 8099 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 8100 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 8101 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8102 break; 8103 } 8104 8105 case llvm::Triple::mips64: 8106 case llvm::Triple::mips64el: { 8107 StringRef CPUName; 8108 StringRef ABIName; 8109 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); 8110 8111 CmdArgs.push_back("-mabi"); 8112 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); 8113 8114 if (getToolChain().getArch() == llvm::Triple::mips64) 8115 CmdArgs.push_back("-EB"); 8116 else 8117 CmdArgs.push_back("-EL"); 8118 8119 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8120 break; 8121 } 8122 8123 default: 8124 break; 8125 } 8126 8127 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 8128 8129 CmdArgs.push_back("-o"); 8130 CmdArgs.push_back(Output.getFilename()); 8131 8132 for (const auto &II : Inputs) 8133 CmdArgs.push_back(II.getFilename()); 8134 8135 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 8136 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8137 } 8138 8139 void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, 8140 const InputInfo &Output, 8141 const InputInfoList &Inputs, 8142 const ArgList &Args, 8143 const char *LinkingOutput) const { 8144 const Driver &D = getToolChain().getDriver(); 8145 ArgStringList CmdArgs; 8146 8147 // Silence warning for "clang -g foo.o -o foo" 8148 Args.ClaimAllArgs(options::OPT_g_Group); 8149 // and "clang -emit-llvm foo.o -o foo" 8150 Args.ClaimAllArgs(options::OPT_emit_llvm); 8151 // and for "clang -w foo.o -o foo". Other warning options are already 8152 // handled somewhere else. 8153 Args.ClaimAllArgs(options::OPT_w); 8154 8155 if (getToolChain().getArch() == llvm::Triple::mips64) 8156 CmdArgs.push_back("-EB"); 8157 else if (getToolChain().getArch() == llvm::Triple::mips64el) 8158 CmdArgs.push_back("-EL"); 8159 8160 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { 8161 CmdArgs.push_back("-e"); 8162 CmdArgs.push_back("__start"); 8163 } 8164 8165 if (Args.hasArg(options::OPT_static)) { 8166 CmdArgs.push_back("-Bstatic"); 8167 } else { 8168 if (Args.hasArg(options::OPT_rdynamic)) 8169 CmdArgs.push_back("-export-dynamic"); 8170 CmdArgs.push_back("--eh-frame-hdr"); 8171 CmdArgs.push_back("-Bdynamic"); 8172 if (Args.hasArg(options::OPT_shared)) { 8173 CmdArgs.push_back("-shared"); 8174 } else { 8175 CmdArgs.push_back("-dynamic-linker"); 8176 CmdArgs.push_back("/usr/libexec/ld.so"); 8177 } 8178 } 8179 8180 if (Args.hasArg(options::OPT_nopie)) 8181 CmdArgs.push_back("-nopie"); 8182 8183 if (Output.isFilename()) { 8184 CmdArgs.push_back("-o"); 8185 CmdArgs.push_back(Output.getFilename()); 8186 } else { 8187 assert(Output.isNothing() && "Invalid output."); 8188 } 8189 8190 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8191 if (!Args.hasArg(options::OPT_shared)) { 8192 if (Args.hasArg(options::OPT_pg)) 8193 CmdArgs.push_back( 8194 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); 8195 else 8196 CmdArgs.push_back( 8197 Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); 8198 CmdArgs.push_back( 8199 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 8200 } else { 8201 CmdArgs.push_back( 8202 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 8203 } 8204 } 8205 8206 std::string Triple = getToolChain().getTripleString(); 8207 if (Triple.substr(0, 6) == "x86_64") 8208 Triple.replace(0, 6, "amd64"); 8209 CmdArgs.push_back( 8210 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1")); 8211 8212 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, 8213 options::OPT_e, options::OPT_s, options::OPT_t, 8214 options::OPT_Z_Flag, options::OPT_r}); 8215 8216 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 8217 8218 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 8219 if (D.CCCIsCXX()) { 8220 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 8221 if (Args.hasArg(options::OPT_pg)) 8222 CmdArgs.push_back("-lm_p"); 8223 else 8224 CmdArgs.push_back("-lm"); 8225 } 8226 8227 // FIXME: For some reason GCC passes -lgcc before adding 8228 // the default system libraries. Just mimic this for now. 8229 CmdArgs.push_back("-lgcc"); 8230 8231 if (Args.hasArg(options::OPT_pthread)) { 8232 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg)) 8233 CmdArgs.push_back("-lpthread_p"); 8234 else 8235 CmdArgs.push_back("-lpthread"); 8236 } 8237 8238 if (!Args.hasArg(options::OPT_shared)) { 8239 if (Args.hasArg(options::OPT_pg)) 8240 CmdArgs.push_back("-lc_p"); 8241 else 8242 CmdArgs.push_back("-lc"); 8243 } 8244 8245 CmdArgs.push_back("-lgcc"); 8246 } 8247 8248 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8249 if (!Args.hasArg(options::OPT_shared)) 8250 CmdArgs.push_back( 8251 Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 8252 else 8253 CmdArgs.push_back( 8254 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); 8255 } 8256 8257 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 8258 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8259 } 8260 8261 void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 8262 const InputInfo &Output, 8263 const InputInfoList &Inputs, 8264 const ArgList &Args, 8265 const char *LinkingOutput) const { 8266 claimNoWarnArgs(Args); 8267 ArgStringList CmdArgs; 8268 8269 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 8270 8271 CmdArgs.push_back("-o"); 8272 CmdArgs.push_back(Output.getFilename()); 8273 8274 for (const auto &II : Inputs) 8275 CmdArgs.push_back(II.getFilename()); 8276 8277 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 8278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8279 } 8280 8281 void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA, 8282 const InputInfo &Output, 8283 const InputInfoList &Inputs, 8284 const ArgList &Args, 8285 const char *LinkingOutput) const { 8286 const Driver &D = getToolChain().getDriver(); 8287 ArgStringList CmdArgs; 8288 8289 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { 8290 CmdArgs.push_back("-e"); 8291 CmdArgs.push_back("__start"); 8292 } 8293 8294 if (Args.hasArg(options::OPT_static)) { 8295 CmdArgs.push_back("-Bstatic"); 8296 } else { 8297 if (Args.hasArg(options::OPT_rdynamic)) 8298 CmdArgs.push_back("-export-dynamic"); 8299 CmdArgs.push_back("--eh-frame-hdr"); 8300 CmdArgs.push_back("-Bdynamic"); 8301 if (Args.hasArg(options::OPT_shared)) { 8302 CmdArgs.push_back("-shared"); 8303 } else { 8304 CmdArgs.push_back("-dynamic-linker"); 8305 CmdArgs.push_back("/usr/libexec/ld.so"); 8306 } 8307 } 8308 8309 if (Output.isFilename()) { 8310 CmdArgs.push_back("-o"); 8311 CmdArgs.push_back(Output.getFilename()); 8312 } else { 8313 assert(Output.isNothing() && "Invalid output."); 8314 } 8315 8316 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8317 if (!Args.hasArg(options::OPT_shared)) { 8318 if (Args.hasArg(options::OPT_pg)) 8319 CmdArgs.push_back( 8320 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); 8321 else 8322 CmdArgs.push_back( 8323 Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); 8324 CmdArgs.push_back( 8325 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 8326 } else { 8327 CmdArgs.push_back( 8328 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 8329 } 8330 } 8331 8332 Args.AddAllArgs(CmdArgs, 8333 {options::OPT_L, options::OPT_T_Group, options::OPT_e}); 8334 8335 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 8336 8337 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 8338 if (D.CCCIsCXX()) { 8339 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 8340 if (Args.hasArg(options::OPT_pg)) 8341 CmdArgs.push_back("-lm_p"); 8342 else 8343 CmdArgs.push_back("-lm"); 8344 } 8345 8346 if (Args.hasArg(options::OPT_pthread)) { 8347 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg)) 8348 CmdArgs.push_back("-lpthread_p"); 8349 else 8350 CmdArgs.push_back("-lpthread"); 8351 } 8352 8353 if (!Args.hasArg(options::OPT_shared)) { 8354 if (Args.hasArg(options::OPT_pg)) 8355 CmdArgs.push_back("-lc_p"); 8356 else 8357 CmdArgs.push_back("-lc"); 8358 } 8359 8360 StringRef MyArch; 8361 switch (getToolChain().getArch()) { 8362 case llvm::Triple::arm: 8363 MyArch = "arm"; 8364 break; 8365 case llvm::Triple::x86: 8366 MyArch = "i386"; 8367 break; 8368 case llvm::Triple::x86_64: 8369 MyArch = "amd64"; 8370 break; 8371 default: 8372 llvm_unreachable("Unsupported architecture"); 8373 } 8374 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch)); 8375 } 8376 8377 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8378 if (!Args.hasArg(options::OPT_shared)) 8379 CmdArgs.push_back( 8380 Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 8381 else 8382 CmdArgs.push_back( 8383 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); 8384 } 8385 8386 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 8387 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8388 } 8389 8390 void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 8391 const InputInfo &Output, 8392 const InputInfoList &Inputs, 8393 const ArgList &Args, 8394 const char *LinkingOutput) const { 8395 claimNoWarnArgs(Args); 8396 ArgStringList CmdArgs; 8397 8398 // When building 32-bit code on FreeBSD/amd64, we have to explicitly 8399 // instruct as in the base system to assemble 32-bit code. 8400 switch (getToolChain().getArch()) { 8401 default: 8402 break; 8403 case llvm::Triple::x86: 8404 CmdArgs.push_back("--32"); 8405 break; 8406 case llvm::Triple::ppc: 8407 CmdArgs.push_back("-a32"); 8408 break; 8409 case llvm::Triple::mips: 8410 case llvm::Triple::mipsel: 8411 case llvm::Triple::mips64: 8412 case llvm::Triple::mips64el: { 8413 StringRef CPUName; 8414 StringRef ABIName; 8415 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); 8416 8417 CmdArgs.push_back("-march"); 8418 CmdArgs.push_back(CPUName.data()); 8419 8420 CmdArgs.push_back("-mabi"); 8421 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); 8422 8423 if (getToolChain().getArch() == llvm::Triple::mips || 8424 getToolChain().getArch() == llvm::Triple::mips64) 8425 CmdArgs.push_back("-EB"); 8426 else 8427 CmdArgs.push_back("-EL"); 8428 8429 if (Arg *A = Args.getLastArg(options::OPT_G)) { 8430 StringRef v = A->getValue(); 8431 CmdArgs.push_back(Args.MakeArgString("-G" + v)); 8432 A->claim(); 8433 } 8434 8435 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8436 break; 8437 } 8438 case llvm::Triple::arm: 8439 case llvm::Triple::armeb: 8440 case llvm::Triple::thumb: 8441 case llvm::Triple::thumbeb: { 8442 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args); 8443 8444 if (ABI == arm::FloatABI::Hard) 8445 CmdArgs.push_back("-mfpu=vfp"); 8446 else 8447 CmdArgs.push_back("-mfpu=softvfp"); 8448 8449 switch (getToolChain().getTriple().getEnvironment()) { 8450 case llvm::Triple::GNUEABIHF: 8451 case llvm::Triple::GNUEABI: 8452 case llvm::Triple::EABI: 8453 CmdArgs.push_back("-meabi=5"); 8454 break; 8455 8456 default: 8457 CmdArgs.push_back("-matpcs"); 8458 } 8459 break; 8460 } 8461 case llvm::Triple::sparc: 8462 case llvm::Triple::sparcel: 8463 case llvm::Triple::sparcv9: { 8464 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 8465 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 8466 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8467 break; 8468 } 8469 } 8470 8471 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 8472 8473 CmdArgs.push_back("-o"); 8474 CmdArgs.push_back(Output.getFilename()); 8475 8476 for (const auto &II : Inputs) 8477 CmdArgs.push_back(II.getFilename()); 8478 8479 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 8480 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8481 } 8482 8483 void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, 8484 const InputInfo &Output, 8485 const InputInfoList &Inputs, 8486 const ArgList &Args, 8487 const char *LinkingOutput) const { 8488 const toolchains::FreeBSD &ToolChain = 8489 static_cast<const toolchains::FreeBSD &>(getToolChain()); 8490 const Driver &D = ToolChain.getDriver(); 8491 const llvm::Triple::ArchType Arch = ToolChain.getArch(); 8492 const bool IsPIE = 8493 !Args.hasArg(options::OPT_shared) && 8494 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault()); 8495 ArgStringList CmdArgs; 8496 8497 // Silence warning for "clang -g foo.o -o foo" 8498 Args.ClaimAllArgs(options::OPT_g_Group); 8499 // and "clang -emit-llvm foo.o -o foo" 8500 Args.ClaimAllArgs(options::OPT_emit_llvm); 8501 // and for "clang -w foo.o -o foo". Other warning options are already 8502 // handled somewhere else. 8503 Args.ClaimAllArgs(options::OPT_w); 8504 8505 if (!D.SysRoot.empty()) 8506 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 8507 8508 if (IsPIE) 8509 CmdArgs.push_back("-pie"); 8510 8511 CmdArgs.push_back("--eh-frame-hdr"); 8512 if (Args.hasArg(options::OPT_static)) { 8513 CmdArgs.push_back("-Bstatic"); 8514 } else { 8515 if (Args.hasArg(options::OPT_rdynamic)) 8516 CmdArgs.push_back("-export-dynamic"); 8517 if (Args.hasArg(options::OPT_shared)) { 8518 CmdArgs.push_back("-Bshareable"); 8519 } else { 8520 CmdArgs.push_back("-dynamic-linker"); 8521 CmdArgs.push_back("/libexec/ld-elf.so.1"); 8522 } 8523 if (ToolChain.getTriple().getOSMajorVersion() >= 9) { 8524 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc || 8525 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) { 8526 CmdArgs.push_back("--hash-style=both"); 8527 } 8528 } 8529 CmdArgs.push_back("--enable-new-dtags"); 8530 } 8531 8532 // When building 32-bit code on FreeBSD/amd64, we have to explicitly 8533 // instruct ld in the base system to link 32-bit code. 8534 if (Arch == llvm::Triple::x86) { 8535 CmdArgs.push_back("-m"); 8536 CmdArgs.push_back("elf_i386_fbsd"); 8537 } 8538 8539 if (Arch == llvm::Triple::ppc) { 8540 CmdArgs.push_back("-m"); 8541 CmdArgs.push_back("elf32ppc_fbsd"); 8542 } 8543 8544 if (Arg *A = Args.getLastArg(options::OPT_G)) { 8545 if (ToolChain.getArch() == llvm::Triple::mips || 8546 ToolChain.getArch() == llvm::Triple::mipsel || 8547 ToolChain.getArch() == llvm::Triple::mips64 || 8548 ToolChain.getArch() == llvm::Triple::mips64el) { 8549 StringRef v = A->getValue(); 8550 CmdArgs.push_back(Args.MakeArgString("-G" + v)); 8551 A->claim(); 8552 } 8553 } 8554 8555 if (Output.isFilename()) { 8556 CmdArgs.push_back("-o"); 8557 CmdArgs.push_back(Output.getFilename()); 8558 } else { 8559 assert(Output.isNothing() && "Invalid output."); 8560 } 8561 8562 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8563 const char *crt1 = nullptr; 8564 if (!Args.hasArg(options::OPT_shared)) { 8565 if (Args.hasArg(options::OPT_pg)) 8566 crt1 = "gcrt1.o"; 8567 else if (IsPIE) 8568 crt1 = "Scrt1.o"; 8569 else 8570 crt1 = "crt1.o"; 8571 } 8572 if (crt1) 8573 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 8574 8575 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 8576 8577 const char *crtbegin = nullptr; 8578 if (Args.hasArg(options::OPT_static)) 8579 crtbegin = "crtbeginT.o"; 8580 else if (Args.hasArg(options::OPT_shared) || IsPIE) 8581 crtbegin = "crtbeginS.o"; 8582 else 8583 crtbegin = "crtbegin.o"; 8584 8585 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 8586 } 8587 8588 Args.AddAllArgs(CmdArgs, options::OPT_L); 8589 ToolChain.AddFilePathLibArgs(Args, CmdArgs); 8590 Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 8591 Args.AddAllArgs(CmdArgs, options::OPT_e); 8592 Args.AddAllArgs(CmdArgs, options::OPT_s); 8593 Args.AddAllArgs(CmdArgs, options::OPT_t); 8594 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 8595 Args.AddAllArgs(CmdArgs, options::OPT_r); 8596 8597 if (D.isUsingLTO()) 8598 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin); 8599 8600 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); 8601 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 8602 8603 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 8604 addOpenMPRuntime(CmdArgs, ToolChain, Args); 8605 if (D.CCCIsCXX()) { 8606 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 8607 if (Args.hasArg(options::OPT_pg)) 8608 CmdArgs.push_back("-lm_p"); 8609 else 8610 CmdArgs.push_back("-lm"); 8611 } 8612 if (NeedsSanitizerDeps) 8613 linkSanitizerRuntimeDeps(ToolChain, CmdArgs); 8614 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 8615 // the default system libraries. Just mimic this for now. 8616 if (Args.hasArg(options::OPT_pg)) 8617 CmdArgs.push_back("-lgcc_p"); 8618 else 8619 CmdArgs.push_back("-lgcc"); 8620 if (Args.hasArg(options::OPT_static)) { 8621 CmdArgs.push_back("-lgcc_eh"); 8622 } else if (Args.hasArg(options::OPT_pg)) { 8623 CmdArgs.push_back("-lgcc_eh_p"); 8624 } else { 8625 CmdArgs.push_back("--as-needed"); 8626 CmdArgs.push_back("-lgcc_s"); 8627 CmdArgs.push_back("--no-as-needed"); 8628 } 8629 8630 if (Args.hasArg(options::OPT_pthread)) { 8631 if (Args.hasArg(options::OPT_pg)) 8632 CmdArgs.push_back("-lpthread_p"); 8633 else 8634 CmdArgs.push_back("-lpthread"); 8635 } 8636 8637 if (Args.hasArg(options::OPT_pg)) { 8638 if (Args.hasArg(options::OPT_shared)) 8639 CmdArgs.push_back("-lc"); 8640 else 8641 CmdArgs.push_back("-lc_p"); 8642 CmdArgs.push_back("-lgcc_p"); 8643 } else { 8644 CmdArgs.push_back("-lc"); 8645 CmdArgs.push_back("-lgcc"); 8646 } 8647 8648 if (Args.hasArg(options::OPT_static)) { 8649 CmdArgs.push_back("-lgcc_eh"); 8650 } else if (Args.hasArg(options::OPT_pg)) { 8651 CmdArgs.push_back("-lgcc_eh_p"); 8652 } else { 8653 CmdArgs.push_back("--as-needed"); 8654 CmdArgs.push_back("-lgcc_s"); 8655 CmdArgs.push_back("--no-as-needed"); 8656 } 8657 } 8658 8659 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8660 if (Args.hasArg(options::OPT_shared) || IsPIE) 8661 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); 8662 else 8663 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); 8664 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 8665 } 8666 8667 ToolChain.addProfileRTLibs(Args, CmdArgs); 8668 8669 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 8670 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8671 } 8672 8673 void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 8674 const InputInfo &Output, 8675 const InputInfoList &Inputs, 8676 const ArgList &Args, 8677 const char *LinkingOutput) const { 8678 claimNoWarnArgs(Args); 8679 ArgStringList CmdArgs; 8680 8681 // GNU as needs different flags for creating the correct output format 8682 // on architectures with different ABIs or optional feature sets. 8683 switch (getToolChain().getArch()) { 8684 case llvm::Triple::x86: 8685 CmdArgs.push_back("--32"); 8686 break; 8687 case llvm::Triple::arm: 8688 case llvm::Triple::armeb: 8689 case llvm::Triple::thumb: 8690 case llvm::Triple::thumbeb: { 8691 StringRef MArch, MCPU; 8692 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true); 8693 std::string Arch = 8694 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple()); 8695 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch)); 8696 break; 8697 } 8698 8699 case llvm::Triple::mips: 8700 case llvm::Triple::mipsel: 8701 case llvm::Triple::mips64: 8702 case llvm::Triple::mips64el: { 8703 StringRef CPUName; 8704 StringRef ABIName; 8705 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); 8706 8707 CmdArgs.push_back("-march"); 8708 CmdArgs.push_back(CPUName.data()); 8709 8710 CmdArgs.push_back("-mabi"); 8711 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); 8712 8713 if (getToolChain().getArch() == llvm::Triple::mips || 8714 getToolChain().getArch() == llvm::Triple::mips64) 8715 CmdArgs.push_back("-EB"); 8716 else 8717 CmdArgs.push_back("-EL"); 8718 8719 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8720 break; 8721 } 8722 8723 case llvm::Triple::sparc: 8724 case llvm::Triple::sparcel: { 8725 CmdArgs.push_back("-32"); 8726 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 8727 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 8728 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8729 break; 8730 } 8731 8732 case llvm::Triple::sparcv9: { 8733 CmdArgs.push_back("-64"); 8734 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 8735 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 8736 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 8737 break; 8738 } 8739 8740 default: 8741 break; 8742 } 8743 8744 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 8745 8746 CmdArgs.push_back("-o"); 8747 CmdArgs.push_back(Output.getFilename()); 8748 8749 for (const auto &II : Inputs) 8750 CmdArgs.push_back(II.getFilename()); 8751 8752 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as"))); 8753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8754 } 8755 8756 void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, 8757 const InputInfo &Output, 8758 const InputInfoList &Inputs, 8759 const ArgList &Args, 8760 const char *LinkingOutput) const { 8761 const Driver &D = getToolChain().getDriver(); 8762 ArgStringList CmdArgs; 8763 8764 if (!D.SysRoot.empty()) 8765 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 8766 8767 CmdArgs.push_back("--eh-frame-hdr"); 8768 if (Args.hasArg(options::OPT_static)) { 8769 CmdArgs.push_back("-Bstatic"); 8770 } else { 8771 if (Args.hasArg(options::OPT_rdynamic)) 8772 CmdArgs.push_back("-export-dynamic"); 8773 if (Args.hasArg(options::OPT_shared)) { 8774 CmdArgs.push_back("-Bshareable"); 8775 } else { 8776 Args.AddAllArgs(CmdArgs, options::OPT_pie); 8777 CmdArgs.push_back("-dynamic-linker"); 8778 CmdArgs.push_back("/libexec/ld.elf_so"); 8779 } 8780 } 8781 8782 // Many NetBSD architectures support more than one ABI. 8783 // Determine the correct emulation for ld. 8784 switch (getToolChain().getArch()) { 8785 case llvm::Triple::x86: 8786 CmdArgs.push_back("-m"); 8787 CmdArgs.push_back("elf_i386"); 8788 break; 8789 case llvm::Triple::arm: 8790 case llvm::Triple::thumb: 8791 CmdArgs.push_back("-m"); 8792 switch (getToolChain().getTriple().getEnvironment()) { 8793 case llvm::Triple::EABI: 8794 case llvm::Triple::GNUEABI: 8795 CmdArgs.push_back("armelf_nbsd_eabi"); 8796 break; 8797 case llvm::Triple::EABIHF: 8798 case llvm::Triple::GNUEABIHF: 8799 CmdArgs.push_back("armelf_nbsd_eabihf"); 8800 break; 8801 default: 8802 CmdArgs.push_back("armelf_nbsd"); 8803 break; 8804 } 8805 break; 8806 case llvm::Triple::armeb: 8807 case llvm::Triple::thumbeb: 8808 arm::appendEBLinkFlags( 8809 Args, CmdArgs, 8810 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args))); 8811 CmdArgs.push_back("-m"); 8812 switch (getToolChain().getTriple().getEnvironment()) { 8813 case llvm::Triple::EABI: 8814 case llvm::Triple::GNUEABI: 8815 CmdArgs.push_back("armelfb_nbsd_eabi"); 8816 break; 8817 case llvm::Triple::EABIHF: 8818 case llvm::Triple::GNUEABIHF: 8819 CmdArgs.push_back("armelfb_nbsd_eabihf"); 8820 break; 8821 default: 8822 CmdArgs.push_back("armelfb_nbsd"); 8823 break; 8824 } 8825 break; 8826 case llvm::Triple::mips64: 8827 case llvm::Triple::mips64el: 8828 if (mips::hasMipsAbiArg(Args, "32")) { 8829 CmdArgs.push_back("-m"); 8830 if (getToolChain().getArch() == llvm::Triple::mips64) 8831 CmdArgs.push_back("elf32btsmip"); 8832 else 8833 CmdArgs.push_back("elf32ltsmip"); 8834 } else if (mips::hasMipsAbiArg(Args, "64")) { 8835 CmdArgs.push_back("-m"); 8836 if (getToolChain().getArch() == llvm::Triple::mips64) 8837 CmdArgs.push_back("elf64btsmip"); 8838 else 8839 CmdArgs.push_back("elf64ltsmip"); 8840 } 8841 break; 8842 case llvm::Triple::ppc: 8843 CmdArgs.push_back("-m"); 8844 CmdArgs.push_back("elf32ppc_nbsd"); 8845 break; 8846 8847 case llvm::Triple::ppc64: 8848 case llvm::Triple::ppc64le: 8849 CmdArgs.push_back("-m"); 8850 CmdArgs.push_back("elf64ppc"); 8851 break; 8852 8853 case llvm::Triple::sparc: 8854 CmdArgs.push_back("-m"); 8855 CmdArgs.push_back("elf32_sparc"); 8856 break; 8857 8858 case llvm::Triple::sparcv9: 8859 CmdArgs.push_back("-m"); 8860 CmdArgs.push_back("elf64_sparc"); 8861 break; 8862 8863 default: 8864 break; 8865 } 8866 8867 if (Output.isFilename()) { 8868 CmdArgs.push_back("-o"); 8869 CmdArgs.push_back(Output.getFilename()); 8870 } else { 8871 assert(Output.isNothing() && "Invalid output."); 8872 } 8873 8874 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8875 if (!Args.hasArg(options::OPT_shared)) { 8876 CmdArgs.push_back( 8877 Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); 8878 } 8879 CmdArgs.push_back( 8880 Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 8881 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) { 8882 CmdArgs.push_back( 8883 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 8884 } else { 8885 CmdArgs.push_back( 8886 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 8887 } 8888 } 8889 8890 Args.AddAllArgs(CmdArgs, options::OPT_L); 8891 Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 8892 Args.AddAllArgs(CmdArgs, options::OPT_e); 8893 Args.AddAllArgs(CmdArgs, options::OPT_s); 8894 Args.AddAllArgs(CmdArgs, options::OPT_t); 8895 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 8896 Args.AddAllArgs(CmdArgs, options::OPT_r); 8897 8898 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 8899 8900 unsigned Major, Minor, Micro; 8901 getToolChain().getTriple().getOSVersion(Major, Minor, Micro); 8902 bool useLibgcc = true; 8903 if (Major >= 7 || Major == 0) { 8904 switch (getToolChain().getArch()) { 8905 case llvm::Triple::aarch64: 8906 case llvm::Triple::arm: 8907 case llvm::Triple::armeb: 8908 case llvm::Triple::thumb: 8909 case llvm::Triple::thumbeb: 8910 case llvm::Triple::ppc: 8911 case llvm::Triple::ppc64: 8912 case llvm::Triple::ppc64le: 8913 case llvm::Triple::sparc: 8914 case llvm::Triple::sparcv9: 8915 case llvm::Triple::x86: 8916 case llvm::Triple::x86_64: 8917 useLibgcc = false; 8918 break; 8919 default: 8920 break; 8921 } 8922 } 8923 8924 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 8925 addOpenMPRuntime(CmdArgs, getToolChain(), Args); 8926 if (D.CCCIsCXX()) { 8927 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 8928 CmdArgs.push_back("-lm"); 8929 } 8930 if (Args.hasArg(options::OPT_pthread)) 8931 CmdArgs.push_back("-lpthread"); 8932 CmdArgs.push_back("-lc"); 8933 8934 if (useLibgcc) { 8935 if (Args.hasArg(options::OPT_static)) { 8936 // libgcc_eh depends on libc, so resolve as much as possible, 8937 // pull in any new requirements from libc and then get the rest 8938 // of libgcc. 8939 CmdArgs.push_back("-lgcc_eh"); 8940 CmdArgs.push_back("-lc"); 8941 CmdArgs.push_back("-lgcc"); 8942 } else { 8943 CmdArgs.push_back("-lgcc"); 8944 CmdArgs.push_back("--as-needed"); 8945 CmdArgs.push_back("-lgcc_s"); 8946 CmdArgs.push_back("--no-as-needed"); 8947 } 8948 } 8949 } 8950 8951 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 8952 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 8953 CmdArgs.push_back( 8954 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); 8955 else 8956 CmdArgs.push_back( 8957 Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 8958 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); 8959 } 8960 8961 getToolChain().addProfileRTLibs(Args, CmdArgs); 8962 8963 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 8964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 8965 } 8966 8967 void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 8968 const InputInfo &Output, 8969 const InputInfoList &Inputs, 8970 const ArgList &Args, 8971 const char *LinkingOutput) const { 8972 claimNoWarnArgs(Args); 8973 8974 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 8975 llvm::Triple Triple = llvm::Triple(TripleStr); 8976 8977 ArgStringList CmdArgs; 8978 8979 llvm::Reloc::Model RelocationModel; 8980 unsigned PICLevel; 8981 bool IsPIE; 8982 std::tie(RelocationModel, PICLevel, IsPIE) = 8983 ParsePICArgs(getToolChain(), Triple, Args); 8984 8985 switch (getToolChain().getArch()) { 8986 default: 8987 break; 8988 // Add --32/--64 to make sure we get the format we want. 8989 // This is incomplete 8990 case llvm::Triple::x86: 8991 CmdArgs.push_back("--32"); 8992 break; 8993 case llvm::Triple::x86_64: 8994 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32) 8995 CmdArgs.push_back("--x32"); 8996 else 8997 CmdArgs.push_back("--64"); 8998 break; 8999 case llvm::Triple::ppc: 9000 CmdArgs.push_back("-a32"); 9001 CmdArgs.push_back("-mppc"); 9002 CmdArgs.push_back("-many"); 9003 break; 9004 case llvm::Triple::ppc64: 9005 CmdArgs.push_back("-a64"); 9006 CmdArgs.push_back("-mppc64"); 9007 CmdArgs.push_back("-many"); 9008 break; 9009 case llvm::Triple::ppc64le: 9010 CmdArgs.push_back("-a64"); 9011 CmdArgs.push_back("-mppc64"); 9012 CmdArgs.push_back("-many"); 9013 CmdArgs.push_back("-mlittle-endian"); 9014 break; 9015 case llvm::Triple::sparc: 9016 case llvm::Triple::sparcel: { 9017 CmdArgs.push_back("-32"); 9018 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 9019 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 9020 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 9021 break; 9022 } 9023 case llvm::Triple::sparcv9: { 9024 CmdArgs.push_back("-64"); 9025 std::string CPU = getCPUName(Args, getToolChain().getTriple()); 9026 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); 9027 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 9028 break; 9029 } 9030 case llvm::Triple::arm: 9031 case llvm::Triple::armeb: 9032 case llvm::Triple::thumb: 9033 case llvm::Triple::thumbeb: { 9034 const llvm::Triple &Triple2 = getToolChain().getTriple(); 9035 switch (Triple2.getSubArch()) { 9036 case llvm::Triple::ARMSubArch_v7: 9037 CmdArgs.push_back("-mfpu=neon"); 9038 break; 9039 case llvm::Triple::ARMSubArch_v8: 9040 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8"); 9041 break; 9042 default: 9043 break; 9044 } 9045 9046 switch (arm::getARMFloatABI(getToolChain(), Args)) { 9047 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!"); 9048 case arm::FloatABI::Soft: 9049 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft")); 9050 break; 9051 case arm::FloatABI::SoftFP: 9052 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp")); 9053 break; 9054 case arm::FloatABI::Hard: 9055 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard")); 9056 break; 9057 } 9058 9059 Args.AddLastArg(CmdArgs, options::OPT_march_EQ); 9060 9061 // FIXME: remove krait check when GNU tools support krait cpu 9062 // for now replace it with -mcpu=cortex-a15 to avoid a lower 9063 // march from being picked in the absence of a cpu flag. 9064 Arg *A; 9065 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) && 9066 StringRef(A->getValue()).lower() == "krait") 9067 CmdArgs.push_back("-mcpu=cortex-a15"); 9068 else 9069 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ); 9070 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ); 9071 break; 9072 } 9073 case llvm::Triple::mips: 9074 case llvm::Triple::mipsel: 9075 case llvm::Triple::mips64: 9076 case llvm::Triple::mips64el: { 9077 StringRef CPUName; 9078 StringRef ABIName; 9079 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); 9080 ABIName = getGnuCompatibleMipsABIName(ABIName); 9081 9082 CmdArgs.push_back("-march"); 9083 CmdArgs.push_back(CPUName.data()); 9084 9085 CmdArgs.push_back("-mabi"); 9086 CmdArgs.push_back(ABIName.data()); 9087 9088 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE, 9089 // or -mshared (not implemented) is in effect. 9090 if (RelocationModel == llvm::Reloc::Static) 9091 CmdArgs.push_back("-mno-shared"); 9092 9093 // LLVM doesn't support -mplt yet and acts as if it is always given. 9094 // However, -mplt has no effect with the N64 ABI. 9095 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic"); 9096 9097 if (getToolChain().getArch() == llvm::Triple::mips || 9098 getToolChain().getArch() == llvm::Triple::mips64) 9099 CmdArgs.push_back("-EB"); 9100 else 9101 CmdArgs.push_back("-EL"); 9102 9103 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) { 9104 if (StringRef(A->getValue()) == "2008") 9105 CmdArgs.push_back(Args.MakeArgString("-mnan=2008")); 9106 } 9107 9108 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default. 9109 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx, 9110 options::OPT_mfp64)) { 9111 A->claim(); 9112 A->render(Args, CmdArgs); 9113 } else if (mips::shouldUseFPXX( 9114 Args, getToolChain().getTriple(), CPUName, ABIName, 9115 getMipsFloatABI(getToolChain().getDriver(), Args))) 9116 CmdArgs.push_back("-mfpxx"); 9117 9118 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of 9119 // -mno-mips16 is actually -no-mips16. 9120 if (Arg *A = 9121 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) { 9122 if (A->getOption().matches(options::OPT_mips16)) { 9123 A->claim(); 9124 A->render(Args, CmdArgs); 9125 } else { 9126 A->claim(); 9127 CmdArgs.push_back("-no-mips16"); 9128 } 9129 } 9130 9131 Args.AddLastArg(CmdArgs, options::OPT_mmicromips, 9132 options::OPT_mno_micromips); 9133 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp); 9134 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2); 9135 9136 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) { 9137 // Do not use AddLastArg because not all versions of MIPS assembler 9138 // support -mmsa / -mno-msa options. 9139 if (A->getOption().matches(options::OPT_mmsa)) 9140 CmdArgs.push_back(Args.MakeArgString("-mmsa")); 9141 } 9142 9143 Args.AddLastArg(CmdArgs, options::OPT_mhard_float, 9144 options::OPT_msoft_float); 9145 9146 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float, 9147 options::OPT_msingle_float); 9148 9149 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg, 9150 options::OPT_mno_odd_spreg); 9151 9152 AddAssemblerKPIC(getToolChain(), Args, CmdArgs); 9153 break; 9154 } 9155 case llvm::Triple::systemz: { 9156 // Always pass an -march option, since our default of z10 is later 9157 // than the GNU assembler's default. 9158 StringRef CPUName = getSystemZTargetCPU(Args); 9159 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName)); 9160 break; 9161 } 9162 } 9163 9164 Args.AddAllArgs(CmdArgs, options::OPT_I); 9165 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 9166 9167 CmdArgs.push_back("-o"); 9168 CmdArgs.push_back(Output.getFilename()); 9169 9170 for (const auto &II : Inputs) 9171 CmdArgs.push_back(II.getFilename()); 9172 9173 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 9174 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9175 9176 // Handle the debug info splitting at object creation time if we're 9177 // creating an object. 9178 // TODO: Currently only works on linux with newer objcopy. 9179 if (Args.hasArg(options::OPT_gsplit_dwarf) && 9180 getToolChain().getTriple().isOSLinux()) 9181 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, 9182 SplitDebugName(Args, Inputs[0])); 9183 } 9184 9185 static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, 9186 ArgStringList &CmdArgs, const ArgList &Args) { 9187 bool isAndroid = Triple.isAndroid(); 9188 bool isCygMing = Triple.isOSCygMing(); 9189 bool IsIAMCU = Triple.isOSIAMCU(); 9190 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || 9191 Args.hasArg(options::OPT_static); 9192 if (!D.CCCIsCXX()) 9193 CmdArgs.push_back("-lgcc"); 9194 9195 if (StaticLibgcc || isAndroid) { 9196 if (D.CCCIsCXX()) 9197 CmdArgs.push_back("-lgcc"); 9198 } else { 9199 if (!D.CCCIsCXX() && !isCygMing) 9200 CmdArgs.push_back("--as-needed"); 9201 CmdArgs.push_back("-lgcc_s"); 9202 if (!D.CCCIsCXX() && !isCygMing) 9203 CmdArgs.push_back("--no-as-needed"); 9204 } 9205 9206 if (StaticLibgcc && !isAndroid && !IsIAMCU) 9207 CmdArgs.push_back("-lgcc_eh"); 9208 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX()) 9209 CmdArgs.push_back("-lgcc"); 9210 9211 // According to Android ABI, we have to link with libdl if we are 9212 // linking with non-static libgcc. 9213 // 9214 // NOTE: This fixes a link error on Android MIPS as well. The non-static 9215 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl. 9216 if (isAndroid && !StaticLibgcc) 9217 CmdArgs.push_back("-ldl"); 9218 } 9219 9220 static void AddRunTimeLibs(const ToolChain &TC, const Driver &D, 9221 ArgStringList &CmdArgs, const ArgList &Args) { 9222 // Make use of compiler-rt if --rtlib option is used 9223 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args); 9224 9225 switch (RLT) { 9226 case ToolChain::RLT_CompilerRT: 9227 switch (TC.getTriple().getOS()) { 9228 default: 9229 llvm_unreachable("unsupported OS"); 9230 case llvm::Triple::Win32: 9231 case llvm::Triple::Linux: 9232 addClangRT(TC, Args, CmdArgs); 9233 break; 9234 } 9235 break; 9236 case ToolChain::RLT_Libgcc: 9237 // Make sure libgcc is not used under MSVC environment by default 9238 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { 9239 // Issue error diagnostic if libgcc is explicitly specified 9240 // through command line as --rtlib option argument. 9241 if (Args.hasArg(options::OPT_rtlib_EQ)) { 9242 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) 9243 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC"; 9244 } 9245 } else 9246 AddLibgcc(TC.getTriple(), D, CmdArgs, Args); 9247 break; 9248 } 9249 } 9250 9251 static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { 9252 switch (T.getArch()) { 9253 case llvm::Triple::x86: 9254 if (T.isOSIAMCU()) 9255 return "elf_iamcu"; 9256 return "elf_i386"; 9257 case llvm::Triple::aarch64: 9258 return "aarch64linux"; 9259 case llvm::Triple::aarch64_be: 9260 return "aarch64_be_linux"; 9261 case llvm::Triple::arm: 9262 case llvm::Triple::thumb: 9263 return "armelf_linux_eabi"; 9264 case llvm::Triple::armeb: 9265 case llvm::Triple::thumbeb: 9266 return "armelfb_linux_eabi"; 9267 case llvm::Triple::ppc: 9268 return "elf32ppclinux"; 9269 case llvm::Triple::ppc64: 9270 return "elf64ppc"; 9271 case llvm::Triple::ppc64le: 9272 return "elf64lppc"; 9273 case llvm::Triple::sparc: 9274 case llvm::Triple::sparcel: 9275 return "elf32_sparc"; 9276 case llvm::Triple::sparcv9: 9277 return "elf64_sparc"; 9278 case llvm::Triple::mips: 9279 return "elf32btsmip"; 9280 case llvm::Triple::mipsel: 9281 return "elf32ltsmip"; 9282 case llvm::Triple::mips64: 9283 if (mips::hasMipsAbiArg(Args, "n32")) 9284 return "elf32btsmipn32"; 9285 return "elf64btsmip"; 9286 case llvm::Triple::mips64el: 9287 if (mips::hasMipsAbiArg(Args, "n32")) 9288 return "elf32ltsmipn32"; 9289 return "elf64ltsmip"; 9290 case llvm::Triple::systemz: 9291 return "elf64_s390"; 9292 case llvm::Triple::x86_64: 9293 if (T.getEnvironment() == llvm::Triple::GNUX32) 9294 return "elf32_x86_64"; 9295 return "elf_x86_64"; 9296 default: 9297 llvm_unreachable("Unexpected arch"); 9298 } 9299 } 9300 9301 void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 9302 const InputInfo &Output, 9303 const InputInfoList &Inputs, 9304 const ArgList &Args, 9305 const char *LinkingOutput) const { 9306 const toolchains::Linux &ToolChain = 9307 static_cast<const toolchains::Linux &>(getToolChain()); 9308 const Driver &D = ToolChain.getDriver(); 9309 9310 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 9311 llvm::Triple Triple = llvm::Triple(TripleStr); 9312 9313 const llvm::Triple::ArchType Arch = ToolChain.getArch(); 9314 const bool isAndroid = ToolChain.getTriple().isAndroid(); 9315 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU(); 9316 const bool IsPIE = 9317 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) && 9318 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault()); 9319 const bool HasCRTBeginEndFiles = 9320 ToolChain.getTriple().hasEnvironment() || 9321 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies); 9322 9323 ArgStringList CmdArgs; 9324 9325 // Silence warning for "clang -g foo.o -o foo" 9326 Args.ClaimAllArgs(options::OPT_g_Group); 9327 // and "clang -emit-llvm foo.o -o foo" 9328 Args.ClaimAllArgs(options::OPT_emit_llvm); 9329 // and for "clang -w foo.o -o foo". Other warning options are already 9330 // handled somewhere else. 9331 Args.ClaimAllArgs(options::OPT_w); 9332 9333 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); 9334 if (llvm::sys::path::filename(Exec) == "lld") { 9335 CmdArgs.push_back("-flavor"); 9336 CmdArgs.push_back("old-gnu"); 9337 CmdArgs.push_back("-target"); 9338 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString())); 9339 } 9340 9341 if (!D.SysRoot.empty()) 9342 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 9343 9344 if (IsPIE) 9345 CmdArgs.push_back("-pie"); 9346 9347 if (Args.hasArg(options::OPT_rdynamic)) 9348 CmdArgs.push_back("-export-dynamic"); 9349 9350 if (Args.hasArg(options::OPT_s)) 9351 CmdArgs.push_back("-s"); 9352 9353 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) 9354 arm::appendEBLinkFlags(Args, CmdArgs, Triple); 9355 9356 for (const auto &Opt : ToolChain.ExtraOpts) 9357 CmdArgs.push_back(Opt.c_str()); 9358 9359 if (!Args.hasArg(options::OPT_static)) { 9360 CmdArgs.push_back("--eh-frame-hdr"); 9361 } 9362 9363 CmdArgs.push_back("-m"); 9364 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args)); 9365 9366 if (Args.hasArg(options::OPT_static)) { 9367 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb || 9368 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb) 9369 CmdArgs.push_back("-Bstatic"); 9370 else 9371 CmdArgs.push_back("-static"); 9372 } else if (Args.hasArg(options::OPT_shared)) { 9373 CmdArgs.push_back("-shared"); 9374 } 9375 9376 if (!Args.hasArg(options::OPT_static)) { 9377 if (Args.hasArg(options::OPT_rdynamic)) 9378 CmdArgs.push_back("-export-dynamic"); 9379 9380 if (!Args.hasArg(options::OPT_shared)) { 9381 const std::string Loader = 9382 D.DyldPrefix + ToolChain.getDynamicLinker(Args); 9383 CmdArgs.push_back("-dynamic-linker"); 9384 CmdArgs.push_back(Args.MakeArgString(Loader)); 9385 } 9386 } 9387 9388 CmdArgs.push_back("-o"); 9389 CmdArgs.push_back(Output.getFilename()); 9390 9391 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 9392 if (!isAndroid && !IsIAMCU) { 9393 const char *crt1 = nullptr; 9394 if (!Args.hasArg(options::OPT_shared)) { 9395 if (Args.hasArg(options::OPT_pg)) 9396 crt1 = "gcrt1.o"; 9397 else if (IsPIE) 9398 crt1 = "Scrt1.o"; 9399 else 9400 crt1 = "crt1.o"; 9401 } 9402 if (crt1) 9403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 9404 9405 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 9406 } 9407 9408 if (IsIAMCU) 9409 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); 9410 else { 9411 const char *crtbegin; 9412 if (Args.hasArg(options::OPT_static)) 9413 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o"; 9414 else if (Args.hasArg(options::OPT_shared)) 9415 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o"; 9416 else if (IsPIE) 9417 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o"; 9418 else 9419 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o"; 9420 9421 if (HasCRTBeginEndFiles) 9422 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 9423 } 9424 9425 // Add crtfastmath.o if available and fast math is enabled. 9426 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs); 9427 } 9428 9429 Args.AddAllArgs(CmdArgs, options::OPT_L); 9430 Args.AddAllArgs(CmdArgs, options::OPT_u); 9431 9432 ToolChain.AddFilePathLibArgs(Args, CmdArgs); 9433 9434 if (D.isUsingLTO()) 9435 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin); 9436 9437 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 9438 CmdArgs.push_back("--no-demangle"); 9439 9440 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); 9441 bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs); 9442 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 9443 // The profile runtime also needs access to system libraries. 9444 getToolChain().addProfileRTLibs(Args, CmdArgs); 9445 9446 if (D.CCCIsCXX() && 9447 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 9448 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) && 9449 !Args.hasArg(options::OPT_static); 9450 if (OnlyLibstdcxxStatic) 9451 CmdArgs.push_back("-Bstatic"); 9452 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 9453 if (OnlyLibstdcxxStatic) 9454 CmdArgs.push_back("-Bdynamic"); 9455 CmdArgs.push_back("-lm"); 9456 } 9457 // Silence warnings when linking C code with a C++ '-stdlib' argument. 9458 Args.ClaimAllArgs(options::OPT_stdlib_EQ); 9459 9460 if (!Args.hasArg(options::OPT_nostdlib)) { 9461 if (!Args.hasArg(options::OPT_nodefaultlibs)) { 9462 if (Args.hasArg(options::OPT_static)) 9463 CmdArgs.push_back("--start-group"); 9464 9465 if (NeedsSanitizerDeps) 9466 linkSanitizerRuntimeDeps(ToolChain, CmdArgs); 9467 9468 if (NeedsXRayDeps) 9469 linkXRayRuntimeDeps(ToolChain, Args, CmdArgs); 9470 9471 bool WantPthread = Args.hasArg(options::OPT_pthread) || 9472 Args.hasArg(options::OPT_pthreads); 9473 9474 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, 9475 options::OPT_fno_openmp, false)) { 9476 // OpenMP runtimes implies pthreads when using the GNU toolchain. 9477 // FIXME: Does this really make sense for all GNU toolchains? 9478 WantPthread = true; 9479 9480 // Also link the particular OpenMP runtimes. 9481 switch (getOpenMPRuntime(ToolChain, Args)) { 9482 case OMPRT_OMP: 9483 CmdArgs.push_back("-lomp"); 9484 break; 9485 case OMPRT_GOMP: 9486 CmdArgs.push_back("-lgomp"); 9487 9488 // FIXME: Exclude this for platforms with libgomp that don't require 9489 // librt. Most modern Linux platforms require it, but some may not. 9490 CmdArgs.push_back("-lrt"); 9491 break; 9492 case OMPRT_IOMP5: 9493 CmdArgs.push_back("-liomp5"); 9494 break; 9495 case OMPRT_Unknown: 9496 // Already diagnosed. 9497 break; 9498 } 9499 } 9500 9501 AddRunTimeLibs(ToolChain, D, CmdArgs, Args); 9502 9503 if (WantPthread && !isAndroid) 9504 CmdArgs.push_back("-lpthread"); 9505 9506 if (Args.hasArg(options::OPT_fsplit_stack)) 9507 CmdArgs.push_back("--wrap=pthread_create"); 9508 9509 CmdArgs.push_back("-lc"); 9510 9511 // Add IAMCU specific libs, if needed. 9512 if (IsIAMCU) 9513 CmdArgs.push_back("-lgloss"); 9514 9515 if (Args.hasArg(options::OPT_static)) 9516 CmdArgs.push_back("--end-group"); 9517 else 9518 AddRunTimeLibs(ToolChain, D, CmdArgs, Args); 9519 9520 // Add IAMCU specific libs (outside the group), if needed. 9521 if (IsIAMCU) { 9522 CmdArgs.push_back("--as-needed"); 9523 CmdArgs.push_back("-lsoftfp"); 9524 CmdArgs.push_back("--no-as-needed"); 9525 } 9526 } 9527 9528 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) { 9529 const char *crtend; 9530 if (Args.hasArg(options::OPT_shared)) 9531 crtend = isAndroid ? "crtend_so.o" : "crtendS.o"; 9532 else if (IsPIE) 9533 crtend = isAndroid ? "crtend_android.o" : "crtendS.o"; 9534 else 9535 crtend = isAndroid ? "crtend_android.o" : "crtend.o"; 9536 9537 if (HasCRTBeginEndFiles) 9538 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); 9539 if (!isAndroid) 9540 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 9541 } 9542 } 9543 9544 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9545 } 9546 9547 // NaCl ARM assembly (inline or standalone) can be written with a set of macros 9548 // for the various SFI requirements like register masking. The assembly tool 9549 // inserts the file containing the macros as an input into all the assembly 9550 // jobs. 9551 void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA, 9552 const InputInfo &Output, 9553 const InputInfoList &Inputs, 9554 const ArgList &Args, 9555 const char *LinkingOutput) const { 9556 const toolchains::NaClToolChain &ToolChain = 9557 static_cast<const toolchains::NaClToolChain &>(getToolChain()); 9558 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(), 9559 "nacl-arm-macros.s"); 9560 InputInfoList NewInputs; 9561 NewInputs.push_back(NaClMacros); 9562 NewInputs.append(Inputs.begin(), Inputs.end()); 9563 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args, 9564 LinkingOutput); 9565 } 9566 9567 // This is quite similar to gnutools::Linker::ConstructJob with changes that 9568 // we use static by default, do not yet support sanitizers or LTO, and a few 9569 // others. Eventually we can support more of that and hopefully migrate back 9570 // to gnutools::Linker. 9571 void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 9572 const InputInfo &Output, 9573 const InputInfoList &Inputs, 9574 const ArgList &Args, 9575 const char *LinkingOutput) const { 9576 9577 const toolchains::NaClToolChain &ToolChain = 9578 static_cast<const toolchains::NaClToolChain &>(getToolChain()); 9579 const Driver &D = ToolChain.getDriver(); 9580 const llvm::Triple::ArchType Arch = ToolChain.getArch(); 9581 const bool IsStatic = 9582 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared); 9583 9584 ArgStringList CmdArgs; 9585 9586 // Silence warning for "clang -g foo.o -o foo" 9587 Args.ClaimAllArgs(options::OPT_g_Group); 9588 // and "clang -emit-llvm foo.o -o foo" 9589 Args.ClaimAllArgs(options::OPT_emit_llvm); 9590 // and for "clang -w foo.o -o foo". Other warning options are already 9591 // handled somewhere else. 9592 Args.ClaimAllArgs(options::OPT_w); 9593 9594 if (!D.SysRoot.empty()) 9595 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 9596 9597 if (Args.hasArg(options::OPT_rdynamic)) 9598 CmdArgs.push_back("-export-dynamic"); 9599 9600 if (Args.hasArg(options::OPT_s)) 9601 CmdArgs.push_back("-s"); 9602 9603 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag 9604 // from there is --build-id, which we do want. 9605 CmdArgs.push_back("--build-id"); 9606 9607 if (!IsStatic) 9608 CmdArgs.push_back("--eh-frame-hdr"); 9609 9610 CmdArgs.push_back("-m"); 9611 if (Arch == llvm::Triple::x86) 9612 CmdArgs.push_back("elf_i386_nacl"); 9613 else if (Arch == llvm::Triple::arm) 9614 CmdArgs.push_back("armelf_nacl"); 9615 else if (Arch == llvm::Triple::x86_64) 9616 CmdArgs.push_back("elf_x86_64_nacl"); 9617 else if (Arch == llvm::Triple::mipsel) 9618 CmdArgs.push_back("mipselelf_nacl"); 9619 else 9620 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() 9621 << "Native Client"; 9622 9623 if (IsStatic) 9624 CmdArgs.push_back("-static"); 9625 else if (Args.hasArg(options::OPT_shared)) 9626 CmdArgs.push_back("-shared"); 9627 9628 CmdArgs.push_back("-o"); 9629 CmdArgs.push_back(Output.getFilename()); 9630 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 9631 if (!Args.hasArg(options::OPT_shared)) 9632 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); 9633 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 9634 9635 const char *crtbegin; 9636 if (IsStatic) 9637 crtbegin = "crtbeginT.o"; 9638 else if (Args.hasArg(options::OPT_shared)) 9639 crtbegin = "crtbeginS.o"; 9640 else 9641 crtbegin = "crtbegin.o"; 9642 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 9643 } 9644 9645 Args.AddAllArgs(CmdArgs, options::OPT_L); 9646 Args.AddAllArgs(CmdArgs, options::OPT_u); 9647 9648 ToolChain.AddFilePathLibArgs(Args, CmdArgs); 9649 9650 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 9651 CmdArgs.push_back("--no-demangle"); 9652 9653 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 9654 9655 if (D.CCCIsCXX() && 9656 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 9657 bool OnlyLibstdcxxStatic = 9658 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic; 9659 if (OnlyLibstdcxxStatic) 9660 CmdArgs.push_back("-Bstatic"); 9661 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 9662 if (OnlyLibstdcxxStatic) 9663 CmdArgs.push_back("-Bdynamic"); 9664 CmdArgs.push_back("-lm"); 9665 } 9666 9667 if (!Args.hasArg(options::OPT_nostdlib)) { 9668 if (!Args.hasArg(options::OPT_nodefaultlibs)) { 9669 // Always use groups, since it has no effect on dynamic libraries. 9670 CmdArgs.push_back("--start-group"); 9671 CmdArgs.push_back("-lc"); 9672 // NaCl's libc++ currently requires libpthread, so just always include it 9673 // in the group for C++. 9674 if (Args.hasArg(options::OPT_pthread) || 9675 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) { 9676 // Gold, used by Mips, handles nested groups differently than ld, and 9677 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a, 9678 // which is not a desired behaviour here. 9679 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html 9680 if (getToolChain().getArch() == llvm::Triple::mipsel) 9681 CmdArgs.push_back("-lnacl"); 9682 9683 CmdArgs.push_back("-lpthread"); 9684 } 9685 9686 CmdArgs.push_back("-lgcc"); 9687 CmdArgs.push_back("--as-needed"); 9688 if (IsStatic) 9689 CmdArgs.push_back("-lgcc_eh"); 9690 else 9691 CmdArgs.push_back("-lgcc_s"); 9692 CmdArgs.push_back("--no-as-needed"); 9693 9694 // Mips needs to create and use pnacl_legacy library that contains 9695 // definitions from bitcode/pnaclmm.c and definitions for 9696 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset(). 9697 if (getToolChain().getArch() == llvm::Triple::mipsel) 9698 CmdArgs.push_back("-lpnacl_legacy"); 9699 9700 CmdArgs.push_back("--end-group"); 9701 } 9702 9703 if (!Args.hasArg(options::OPT_nostartfiles)) { 9704 const char *crtend; 9705 if (Args.hasArg(options::OPT_shared)) 9706 crtend = "crtendS.o"; 9707 else 9708 crtend = "crtend.o"; 9709 9710 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); 9711 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 9712 } 9713 } 9714 9715 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); 9716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9717 } 9718 9719 void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 9720 const InputInfo &Output, 9721 const InputInfoList &Inputs, 9722 const ArgList &Args, 9723 const char *LinkingOutput) const { 9724 claimNoWarnArgs(Args); 9725 ArgStringList CmdArgs; 9726 9727 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 9728 9729 CmdArgs.push_back("-o"); 9730 CmdArgs.push_back(Output.getFilename()); 9731 9732 for (const auto &II : Inputs) 9733 CmdArgs.push_back(II.getFilename()); 9734 9735 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 9736 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9737 } 9738 9739 void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA, 9740 const InputInfo &Output, 9741 const InputInfoList &Inputs, 9742 const ArgList &Args, 9743 const char *LinkingOutput) const { 9744 const Driver &D = getToolChain().getDriver(); 9745 ArgStringList CmdArgs; 9746 9747 if (Output.isFilename()) { 9748 CmdArgs.push_back("-o"); 9749 CmdArgs.push_back(Output.getFilename()); 9750 } else { 9751 assert(Output.isNothing() && "Invalid output."); 9752 } 9753 9754 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 9755 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 9756 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 9757 CmdArgs.push_back( 9758 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 9759 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); 9760 } 9761 9762 Args.AddAllArgs(CmdArgs, 9763 {options::OPT_L, options::OPT_T_Group, options::OPT_e}); 9764 9765 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 9766 9767 getToolChain().addProfileRTLibs(Args, CmdArgs); 9768 9769 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 9770 if (D.CCCIsCXX()) { 9771 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 9772 CmdArgs.push_back("-lm"); 9773 } 9774 } 9775 9776 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 9777 if (Args.hasArg(options::OPT_pthread)) 9778 CmdArgs.push_back("-lpthread"); 9779 CmdArgs.push_back("-lc"); 9780 CmdArgs.push_back("-lCompilerRT-Generic"); 9781 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib"); 9782 CmdArgs.push_back( 9783 Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 9784 } 9785 9786 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 9787 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9788 } 9789 9790 /// DragonFly Tools 9791 9792 // For now, DragonFly Assemble does just about the same as for 9793 // FreeBSD, but this may change soon. 9794 void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 9795 const InputInfo &Output, 9796 const InputInfoList &Inputs, 9797 const ArgList &Args, 9798 const char *LinkingOutput) const { 9799 claimNoWarnArgs(Args); 9800 ArgStringList CmdArgs; 9801 9802 // When building 32-bit code on DragonFly/pc64, we have to explicitly 9803 // instruct as in the base system to assemble 32-bit code. 9804 if (getToolChain().getArch() == llvm::Triple::x86) 9805 CmdArgs.push_back("--32"); 9806 9807 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 9808 9809 CmdArgs.push_back("-o"); 9810 CmdArgs.push_back(Output.getFilename()); 9811 9812 for (const auto &II : Inputs) 9813 CmdArgs.push_back(II.getFilename()); 9814 9815 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 9816 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9817 } 9818 9819 void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA, 9820 const InputInfo &Output, 9821 const InputInfoList &Inputs, 9822 const ArgList &Args, 9823 const char *LinkingOutput) const { 9824 const Driver &D = getToolChain().getDriver(); 9825 ArgStringList CmdArgs; 9826 9827 if (!D.SysRoot.empty()) 9828 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 9829 9830 CmdArgs.push_back("--eh-frame-hdr"); 9831 if (Args.hasArg(options::OPT_static)) { 9832 CmdArgs.push_back("-Bstatic"); 9833 } else { 9834 if (Args.hasArg(options::OPT_rdynamic)) 9835 CmdArgs.push_back("-export-dynamic"); 9836 if (Args.hasArg(options::OPT_shared)) 9837 CmdArgs.push_back("-Bshareable"); 9838 else { 9839 CmdArgs.push_back("-dynamic-linker"); 9840 CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 9841 } 9842 CmdArgs.push_back("--hash-style=gnu"); 9843 CmdArgs.push_back("--enable-new-dtags"); 9844 } 9845 9846 // When building 32-bit code on DragonFly/pc64, we have to explicitly 9847 // instruct ld in the base system to link 32-bit code. 9848 if (getToolChain().getArch() == llvm::Triple::x86) { 9849 CmdArgs.push_back("-m"); 9850 CmdArgs.push_back("elf_i386"); 9851 } 9852 9853 if (Output.isFilename()) { 9854 CmdArgs.push_back("-o"); 9855 CmdArgs.push_back(Output.getFilename()); 9856 } else { 9857 assert(Output.isNothing() && "Invalid output."); 9858 } 9859 9860 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 9861 if (!Args.hasArg(options::OPT_shared)) { 9862 if (Args.hasArg(options::OPT_pg)) 9863 CmdArgs.push_back( 9864 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o"))); 9865 else { 9866 if (Args.hasArg(options::OPT_pie)) 9867 CmdArgs.push_back( 9868 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o"))); 9869 else 9870 CmdArgs.push_back( 9871 Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 9872 } 9873 } 9874 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 9875 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 9876 CmdArgs.push_back( 9877 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 9878 else 9879 CmdArgs.push_back( 9880 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 9881 } 9882 9883 Args.AddAllArgs(CmdArgs, 9884 {options::OPT_L, options::OPT_T_Group, options::OPT_e}); 9885 9886 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 9887 9888 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 9889 CmdArgs.push_back("-L/usr/lib/gcc50"); 9890 9891 if (!Args.hasArg(options::OPT_static)) { 9892 CmdArgs.push_back("-rpath"); 9893 CmdArgs.push_back("/usr/lib/gcc50"); 9894 } 9895 9896 if (D.CCCIsCXX()) { 9897 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 9898 CmdArgs.push_back("-lm"); 9899 } 9900 9901 if (Args.hasArg(options::OPT_pthread)) 9902 CmdArgs.push_back("-lpthread"); 9903 9904 if (!Args.hasArg(options::OPT_nolibc)) { 9905 CmdArgs.push_back("-lc"); 9906 } 9907 9908 if (Args.hasArg(options::OPT_static) || 9909 Args.hasArg(options::OPT_static_libgcc)) { 9910 CmdArgs.push_back("-lgcc"); 9911 CmdArgs.push_back("-lgcc_eh"); 9912 } else { 9913 if (Args.hasArg(options::OPT_shared_libgcc)) { 9914 CmdArgs.push_back("-lgcc_pic"); 9915 if (!Args.hasArg(options::OPT_shared)) 9916 CmdArgs.push_back("-lgcc"); 9917 } else { 9918 CmdArgs.push_back("-lgcc"); 9919 CmdArgs.push_back("--as-needed"); 9920 CmdArgs.push_back("-lgcc_pic"); 9921 CmdArgs.push_back("--no-as-needed"); 9922 } 9923 } 9924 } 9925 9926 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 9927 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 9928 CmdArgs.push_back( 9929 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); 9930 else 9931 CmdArgs.push_back( 9932 Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 9933 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); 9934 } 9935 9936 getToolChain().addProfileRTLibs(Args, CmdArgs); 9937 9938 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); 9939 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 9940 } 9941 9942 // Try to find Exe from a Visual Studio distribution. This first tries to find 9943 // an installed copy of Visual Studio and, failing that, looks in the PATH, 9944 // making sure that whatever executable that's found is not a same-named exe 9945 // from clang itself to prevent clang from falling back to itself. 9946 static std::string FindVisualStudioExecutable(const ToolChain &TC, 9947 const char *Exe, 9948 const char *ClangProgramPath) { 9949 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC); 9950 std::string visualStudioBinDir; 9951 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath, 9952 visualStudioBinDir)) { 9953 SmallString<128> FilePath(visualStudioBinDir); 9954 llvm::sys::path::append(FilePath, Exe); 9955 if (llvm::sys::fs::can_execute(FilePath.c_str())) 9956 return FilePath.str(); 9957 } 9958 9959 return Exe; 9960 } 9961 9962 void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, 9963 const InputInfo &Output, 9964 const InputInfoList &Inputs, 9965 const ArgList &Args, 9966 const char *LinkingOutput) const { 9967 ArgStringList CmdArgs; 9968 const ToolChain &TC = getToolChain(); 9969 9970 assert((Output.isFilename() || Output.isNothing()) && "invalid output"); 9971 if (Output.isFilename()) 9972 CmdArgs.push_back( 9973 Args.MakeArgString(std::string("-out:") + Output.getFilename())); 9974 9975 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) && 9976 !C.getDriver().IsCLMode()) 9977 CmdArgs.push_back("-defaultlib:libcmt"); 9978 9979 if (!llvm::sys::Process::GetEnv("LIB")) { 9980 // If the VC environment hasn't been configured (perhaps because the user 9981 // did not run vcvarsall), try to build a consistent link environment. If 9982 // the environment variable is set however, assume the user knows what 9983 // they're doing. 9984 std::string VisualStudioDir; 9985 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC); 9986 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) { 9987 SmallString<128> LibDir(VisualStudioDir); 9988 llvm::sys::path::append(LibDir, "VC", "lib"); 9989 switch (MSVC.getArch()) { 9990 case llvm::Triple::x86: 9991 // x86 just puts the libraries directly in lib 9992 break; 9993 case llvm::Triple::x86_64: 9994 llvm::sys::path::append(LibDir, "amd64"); 9995 break; 9996 case llvm::Triple::arm: 9997 llvm::sys::path::append(LibDir, "arm"); 9998 break; 9999 default: 10000 break; 10001 } 10002 CmdArgs.push_back( 10003 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str())); 10004 10005 if (MSVC.useUniversalCRT(VisualStudioDir)) { 10006 std::string UniversalCRTLibPath; 10007 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath)) 10008 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + 10009 UniversalCRTLibPath.c_str())); 10010 } 10011 } 10012 10013 std::string WindowsSdkLibPath; 10014 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath)) 10015 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + 10016 WindowsSdkLibPath.c_str())); 10017 } 10018 10019 if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L)) 10020 for (const auto &LibPath : Args.getAllArgValues(options::OPT_L)) 10021 CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath)); 10022 10023 CmdArgs.push_back("-nologo"); 10024 10025 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7, 10026 options::OPT__SLASH_Zd)) 10027 CmdArgs.push_back("-debug"); 10028 10029 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd, 10030 options::OPT_shared); 10031 if (DLL) { 10032 CmdArgs.push_back(Args.MakeArgString("-dll")); 10033 10034 SmallString<128> ImplibName(Output.getFilename()); 10035 llvm::sys::path::replace_extension(ImplibName, "lib"); 10036 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName)); 10037 } 10038 10039 if (TC.getSanitizerArgs().needsAsanRt()) { 10040 CmdArgs.push_back(Args.MakeArgString("-debug")); 10041 CmdArgs.push_back(Args.MakeArgString("-incremental:no")); 10042 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) { 10043 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"}) 10044 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); 10045 // Make sure the dynamic runtime thunk is not optimized out at link time 10046 // to ensure proper SEH handling. 10047 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor")); 10048 } else if (DLL) { 10049 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk")); 10050 } else { 10051 for (const auto &Lib : {"asan", "asan_cxx"}) 10052 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); 10053 } 10054 } 10055 10056 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link); 10057 10058 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, 10059 options::OPT_fno_openmp, false)) { 10060 CmdArgs.push_back("-nodefaultlib:vcomp.lib"); 10061 CmdArgs.push_back("-nodefaultlib:vcompd.lib"); 10062 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + 10063 TC.getDriver().Dir + "/../lib")); 10064 switch (getOpenMPRuntime(getToolChain(), Args)) { 10065 case OMPRT_OMP: 10066 CmdArgs.push_back("-defaultlib:libomp.lib"); 10067 break; 10068 case OMPRT_IOMP5: 10069 CmdArgs.push_back("-defaultlib:libiomp5md.lib"); 10070 break; 10071 case OMPRT_GOMP: 10072 break; 10073 case OMPRT_Unknown: 10074 // Already diagnosed. 10075 break; 10076 } 10077 } 10078 10079 // Add compiler-rt lib in case if it was explicitly 10080 // specified as an argument for --rtlib option. 10081 if (!Args.hasArg(options::OPT_nostdlib)) { 10082 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args); 10083 } 10084 10085 // Add filenames, libraries, and other linker inputs. 10086 for (const auto &Input : Inputs) { 10087 if (Input.isFilename()) { 10088 CmdArgs.push_back(Input.getFilename()); 10089 continue; 10090 } 10091 10092 const Arg &A = Input.getInputArg(); 10093 10094 // Render -l options differently for the MSVC linker. 10095 if (A.getOption().matches(options::OPT_l)) { 10096 StringRef Lib = A.getValue(); 10097 const char *LinkLibArg; 10098 if (Lib.endswith(".lib")) 10099 LinkLibArg = Args.MakeArgString(Lib); 10100 else 10101 LinkLibArg = Args.MakeArgString(Lib + ".lib"); 10102 CmdArgs.push_back(LinkLibArg); 10103 continue; 10104 } 10105 10106 // Otherwise, this is some other kind of linker input option like -Wl, -z, 10107 // or -L. Render it, even if MSVC doesn't understand it. 10108 A.renderAsInput(Args, CmdArgs); 10109 } 10110 10111 TC.addProfileRTLibs(Args, CmdArgs); 10112 10113 // We need to special case some linker paths. In the case of lld, we need to 10114 // translate 'lld' into 'lld-link', and in the case of the regular msvc 10115 // linker, we need to use a special search algorithm. 10116 llvm::SmallString<128> linkPath; 10117 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link"); 10118 if (Linker.equals_lower("lld")) 10119 Linker = "lld-link"; 10120 10121 if (Linker.equals_lower("link")) { 10122 // If we're using the MSVC linker, it's not sufficient to just use link 10123 // from the program PATH, because other environments like GnuWin32 install 10124 // their own link.exe which may come first. 10125 linkPath = FindVisualStudioExecutable(TC, "link.exe", 10126 C.getDriver().getClangProgramPath()); 10127 } else { 10128 linkPath = Linker; 10129 llvm::sys::path::replace_extension(linkPath, "exe"); 10130 linkPath = TC.GetProgramPath(linkPath.c_str()); 10131 } 10132 10133 const char *Exec = Args.MakeArgString(linkPath); 10134 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10135 } 10136 10137 void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA, 10138 const InputInfo &Output, 10139 const InputInfoList &Inputs, 10140 const ArgList &Args, 10141 const char *LinkingOutput) const { 10142 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput)); 10143 } 10144 10145 std::unique_ptr<Command> visualstudio::Compiler::GetCommand( 10146 Compilation &C, const JobAction &JA, const InputInfo &Output, 10147 const InputInfoList &Inputs, const ArgList &Args, 10148 const char *LinkingOutput) const { 10149 ArgStringList CmdArgs; 10150 CmdArgs.push_back("/nologo"); 10151 CmdArgs.push_back("/c"); // Compile only. 10152 CmdArgs.push_back("/W0"); // No warnings. 10153 10154 // The goal is to be able to invoke this tool correctly based on 10155 // any flag accepted by clang-cl. 10156 10157 // These are spelled the same way in clang and cl.exe,. 10158 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I}); 10159 10160 // Optimization level. 10161 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin)) 10162 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi" 10163 : "/Oi-"); 10164 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) { 10165 if (A->getOption().getID() == options::OPT_O0) { 10166 CmdArgs.push_back("/Od"); 10167 } else { 10168 CmdArgs.push_back("/Og"); 10169 10170 StringRef OptLevel = A->getValue(); 10171 if (OptLevel == "s" || OptLevel == "z") 10172 CmdArgs.push_back("/Os"); 10173 else 10174 CmdArgs.push_back("/Ot"); 10175 10176 CmdArgs.push_back("/Ob2"); 10177 } 10178 } 10179 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer, 10180 options::OPT_fno_omit_frame_pointer)) 10181 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer 10182 ? "/Oy" 10183 : "/Oy-"); 10184 if (!Args.hasArg(options::OPT_fwritable_strings)) 10185 CmdArgs.push_back("/GF"); 10186 10187 // Flags for which clang-cl has an alias. 10188 // FIXME: How can we ensure this stays in sync with relevant clang-cl options? 10189 10190 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR, 10191 /*default=*/false)) 10192 CmdArgs.push_back("/GR-"); 10193 10194 if (Args.hasFlag(options::OPT__SLASH_GS_, options::OPT__SLASH_GS, 10195 /*default=*/false)) 10196 CmdArgs.push_back("/GS-"); 10197 10198 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections, 10199 options::OPT_fno_function_sections)) 10200 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections 10201 ? "/Gy" 10202 : "/Gy-"); 10203 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections, 10204 options::OPT_fno_data_sections)) 10205 CmdArgs.push_back( 10206 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-"); 10207 if (Args.hasArg(options::OPT_fsyntax_only)) 10208 CmdArgs.push_back("/Zs"); 10209 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only, 10210 options::OPT__SLASH_Z7)) 10211 CmdArgs.push_back("/Z7"); 10212 10213 std::vector<std::string> Includes = 10214 Args.getAllArgValues(options::OPT_include); 10215 for (const auto &Include : Includes) 10216 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include)); 10217 10218 // Flags that can simply be passed through. 10219 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD); 10220 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd); 10221 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX); 10222 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_); 10223 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH); 10224 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl); 10225 10226 // The order of these flags is relevant, so pick the last one. 10227 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd, 10228 options::OPT__SLASH_MT, options::OPT__SLASH_MTd)) 10229 A->render(Args, CmdArgs); 10230 10231 // Pass through all unknown arguments so that the fallback command can see 10232 // them too. 10233 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN); 10234 10235 // Input filename. 10236 assert(Inputs.size() == 1); 10237 const InputInfo &II = Inputs[0]; 10238 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX); 10239 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp"); 10240 if (II.isFilename()) 10241 CmdArgs.push_back(II.getFilename()); 10242 else 10243 II.getInputArg().renderAsInput(Args, CmdArgs); 10244 10245 // Output filename. 10246 assert(Output.getType() == types::TY_Object); 10247 const char *Fo = 10248 Args.MakeArgString(std::string("/Fo") + Output.getFilename()); 10249 CmdArgs.push_back(Fo); 10250 10251 const Driver &D = getToolChain().getDriver(); 10252 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe", 10253 D.getClangProgramPath()); 10254 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), 10255 CmdArgs, Inputs); 10256 } 10257 10258 /// MinGW Tools 10259 void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 10260 const InputInfo &Output, 10261 const InputInfoList &Inputs, 10262 const ArgList &Args, 10263 const char *LinkingOutput) const { 10264 claimNoWarnArgs(Args); 10265 ArgStringList CmdArgs; 10266 10267 if (getToolChain().getArch() == llvm::Triple::x86) { 10268 CmdArgs.push_back("--32"); 10269 } else if (getToolChain().getArch() == llvm::Triple::x86_64) { 10270 CmdArgs.push_back("--64"); 10271 } 10272 10273 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 10274 10275 CmdArgs.push_back("-o"); 10276 CmdArgs.push_back(Output.getFilename()); 10277 10278 for (const auto &II : Inputs) 10279 CmdArgs.push_back(II.getFilename()); 10280 10281 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); 10282 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10283 10284 if (Args.hasArg(options::OPT_gsplit_dwarf)) 10285 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, 10286 SplitDebugName(Args, Inputs[0])); 10287 } 10288 10289 void MinGW::Linker::AddLibGCC(const ArgList &Args, 10290 ArgStringList &CmdArgs) const { 10291 if (Args.hasArg(options::OPT_mthreads)) 10292 CmdArgs.push_back("-lmingwthrd"); 10293 CmdArgs.push_back("-lmingw32"); 10294 10295 // Make use of compiler-rt if --rtlib option is used 10296 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args); 10297 if (RLT == ToolChain::RLT_Libgcc) { 10298 bool Static = Args.hasArg(options::OPT_static_libgcc) || 10299 Args.hasArg(options::OPT_static); 10300 bool Shared = Args.hasArg(options::OPT_shared); 10301 bool CXX = getToolChain().getDriver().CCCIsCXX(); 10302 10303 if (Static || (!CXX && !Shared)) { 10304 CmdArgs.push_back("-lgcc"); 10305 CmdArgs.push_back("-lgcc_eh"); 10306 } else { 10307 CmdArgs.push_back("-lgcc_s"); 10308 CmdArgs.push_back("-lgcc"); 10309 } 10310 } else { 10311 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args); 10312 } 10313 10314 CmdArgs.push_back("-lmoldname"); 10315 CmdArgs.push_back("-lmingwex"); 10316 CmdArgs.push_back("-lmsvcrt"); 10317 } 10318 10319 void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA, 10320 const InputInfo &Output, 10321 const InputInfoList &Inputs, 10322 const ArgList &Args, 10323 const char *LinkingOutput) const { 10324 const ToolChain &TC = getToolChain(); 10325 const Driver &D = TC.getDriver(); 10326 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs(); 10327 10328 ArgStringList CmdArgs; 10329 10330 // Silence warning for "clang -g foo.o -o foo" 10331 Args.ClaimAllArgs(options::OPT_g_Group); 10332 // and "clang -emit-llvm foo.o -o foo" 10333 Args.ClaimAllArgs(options::OPT_emit_llvm); 10334 // and for "clang -w foo.o -o foo". Other warning options are already 10335 // handled somewhere else. 10336 Args.ClaimAllArgs(options::OPT_w); 10337 10338 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld"); 10339 if (LinkerName.equals_lower("lld")) { 10340 CmdArgs.push_back("-flavor"); 10341 CmdArgs.push_back("gnu"); 10342 } else if (!LinkerName.equals_lower("ld")) { 10343 D.Diag(diag::err_drv_unsupported_linker) << LinkerName; 10344 } 10345 10346 if (!D.SysRoot.empty()) 10347 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 10348 10349 if (Args.hasArg(options::OPT_s)) 10350 CmdArgs.push_back("-s"); 10351 10352 CmdArgs.push_back("-m"); 10353 if (TC.getArch() == llvm::Triple::x86) 10354 CmdArgs.push_back("i386pe"); 10355 if (TC.getArch() == llvm::Triple::x86_64) 10356 CmdArgs.push_back("i386pep"); 10357 if (TC.getArch() == llvm::Triple::arm) 10358 CmdArgs.push_back("thumb2pe"); 10359 10360 if (Args.hasArg(options::OPT_mwindows)) { 10361 CmdArgs.push_back("--subsystem"); 10362 CmdArgs.push_back("windows"); 10363 } else if (Args.hasArg(options::OPT_mconsole)) { 10364 CmdArgs.push_back("--subsystem"); 10365 CmdArgs.push_back("console"); 10366 } 10367 10368 if (Args.hasArg(options::OPT_static)) 10369 CmdArgs.push_back("-Bstatic"); 10370 else { 10371 if (Args.hasArg(options::OPT_mdll)) 10372 CmdArgs.push_back("--dll"); 10373 else if (Args.hasArg(options::OPT_shared)) 10374 CmdArgs.push_back("--shared"); 10375 CmdArgs.push_back("-Bdynamic"); 10376 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) { 10377 CmdArgs.push_back("-e"); 10378 if (TC.getArch() == llvm::Triple::x86) 10379 CmdArgs.push_back("_DllMainCRTStartup@12"); 10380 else 10381 CmdArgs.push_back("DllMainCRTStartup"); 10382 CmdArgs.push_back("--enable-auto-image-base"); 10383 } 10384 } 10385 10386 CmdArgs.push_back("-o"); 10387 CmdArgs.push_back(Output.getFilename()); 10388 10389 Args.AddAllArgs(CmdArgs, options::OPT_e); 10390 // FIXME: add -N, -n flags 10391 Args.AddLastArg(CmdArgs, options::OPT_r); 10392 Args.AddLastArg(CmdArgs, options::OPT_s); 10393 Args.AddLastArg(CmdArgs, options::OPT_t); 10394 Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 10395 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag); 10396 10397 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 10398 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) { 10399 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o"))); 10400 } else { 10401 if (Args.hasArg(options::OPT_municode)) 10402 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o"))); 10403 else 10404 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o"))); 10405 } 10406 if (Args.hasArg(options::OPT_pg)) 10407 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o"))); 10408 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o"))); 10409 } 10410 10411 Args.AddAllArgs(CmdArgs, options::OPT_L); 10412 TC.AddFilePathLibArgs(Args, CmdArgs); 10413 AddLinkerInputs(TC, Inputs, Args, CmdArgs); 10414 10415 // TODO: Add ASan stuff here 10416 10417 // TODO: Add profile stuff here 10418 10419 if (D.CCCIsCXX() && 10420 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 10421 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) && 10422 !Args.hasArg(options::OPT_static); 10423 if (OnlyLibstdcxxStatic) 10424 CmdArgs.push_back("-Bstatic"); 10425 TC.AddCXXStdlibLibArgs(Args, CmdArgs); 10426 if (OnlyLibstdcxxStatic) 10427 CmdArgs.push_back("-Bdynamic"); 10428 } 10429 10430 if (!Args.hasArg(options::OPT_nostdlib)) { 10431 if (!Args.hasArg(options::OPT_nodefaultlibs)) { 10432 if (Args.hasArg(options::OPT_static)) 10433 CmdArgs.push_back("--start-group"); 10434 10435 if (Args.hasArg(options::OPT_fstack_protector) || 10436 Args.hasArg(options::OPT_fstack_protector_strong) || 10437 Args.hasArg(options::OPT_fstack_protector_all)) { 10438 CmdArgs.push_back("-lssp_nonshared"); 10439 CmdArgs.push_back("-lssp"); 10440 } 10441 if (Args.hasArg(options::OPT_fopenmp)) 10442 CmdArgs.push_back("-lgomp"); 10443 10444 AddLibGCC(Args, CmdArgs); 10445 10446 if (Args.hasArg(options::OPT_pg)) 10447 CmdArgs.push_back("-lgmon"); 10448 10449 if (Args.hasArg(options::OPT_pthread)) 10450 CmdArgs.push_back("-lpthread"); 10451 10452 // add system libraries 10453 if (Args.hasArg(options::OPT_mwindows)) { 10454 CmdArgs.push_back("-lgdi32"); 10455 CmdArgs.push_back("-lcomdlg32"); 10456 } 10457 CmdArgs.push_back("-ladvapi32"); 10458 CmdArgs.push_back("-lshell32"); 10459 CmdArgs.push_back("-luser32"); 10460 CmdArgs.push_back("-lkernel32"); 10461 10462 if (Args.hasArg(options::OPT_static)) 10463 CmdArgs.push_back("--end-group"); 10464 else if (!LinkerName.equals_lower("lld")) 10465 AddLibGCC(Args, CmdArgs); 10466 } 10467 10468 if (!Args.hasArg(options::OPT_nostartfiles)) { 10469 // Add crtfastmath.o if available and fast math is enabled. 10470 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs); 10471 10472 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o"))); 10473 } 10474 } 10475 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data())); 10476 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10477 } 10478 10479 /// XCore Tools 10480 // We pass assemble and link construction to the xcc tool. 10481 10482 void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 10483 const InputInfo &Output, 10484 const InputInfoList &Inputs, 10485 const ArgList &Args, 10486 const char *LinkingOutput) const { 10487 claimNoWarnArgs(Args); 10488 ArgStringList CmdArgs; 10489 10490 CmdArgs.push_back("-o"); 10491 CmdArgs.push_back(Output.getFilename()); 10492 10493 CmdArgs.push_back("-c"); 10494 10495 if (Args.hasArg(options::OPT_v)) 10496 CmdArgs.push_back("-v"); 10497 10498 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) 10499 if (!A->getOption().matches(options::OPT_g0)) 10500 CmdArgs.push_back("-g"); 10501 10502 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, 10503 false)) 10504 CmdArgs.push_back("-fverbose-asm"); 10505 10506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 10507 10508 for (const auto &II : Inputs) 10509 CmdArgs.push_back(II.getFilename()); 10510 10511 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc")); 10512 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10513 } 10514 10515 void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA, 10516 const InputInfo &Output, 10517 const InputInfoList &Inputs, 10518 const ArgList &Args, 10519 const char *LinkingOutput) const { 10520 ArgStringList CmdArgs; 10521 10522 if (Output.isFilename()) { 10523 CmdArgs.push_back("-o"); 10524 CmdArgs.push_back(Output.getFilename()); 10525 } else { 10526 assert(Output.isNothing() && "Invalid output."); 10527 } 10528 10529 if (Args.hasArg(options::OPT_v)) 10530 CmdArgs.push_back("-v"); 10531 10532 // Pass -fexceptions through to the linker if it was present. 10533 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, 10534 false)) 10535 CmdArgs.push_back("-fexceptions"); 10536 10537 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 10538 10539 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc")); 10540 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10541 } 10542 10543 void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 10544 const InputInfo &Output, 10545 const InputInfoList &Inputs, 10546 const ArgList &Args, 10547 const char *LinkingOutput) const { 10548 claimNoWarnArgs(Args); 10549 const auto &TC = 10550 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain()); 10551 ArgStringList CmdArgs; 10552 const char *Exec; 10553 10554 switch (TC.getArch()) { 10555 default: 10556 llvm_unreachable("unsupported architecture"); 10557 case llvm::Triple::arm: 10558 case llvm::Triple::thumb: 10559 break; 10560 case llvm::Triple::x86: 10561 CmdArgs.push_back("--32"); 10562 break; 10563 case llvm::Triple::x86_64: 10564 CmdArgs.push_back("--64"); 10565 break; 10566 } 10567 10568 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 10569 10570 CmdArgs.push_back("-o"); 10571 CmdArgs.push_back(Output.getFilename()); 10572 10573 for (const auto &Input : Inputs) 10574 CmdArgs.push_back(Input.getFilename()); 10575 10576 const std::string Assembler = TC.GetProgramPath("as"); 10577 Exec = Args.MakeArgString(Assembler); 10578 10579 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10580 } 10581 10582 void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA, 10583 const InputInfo &Output, 10584 const InputInfoList &Inputs, 10585 const ArgList &Args, 10586 const char *LinkingOutput) const { 10587 const auto &TC = 10588 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain()); 10589 const llvm::Triple &T = TC.getTriple(); 10590 const Driver &D = TC.getDriver(); 10591 SmallString<128> EntryPoint; 10592 ArgStringList CmdArgs; 10593 const char *Exec; 10594 10595 // Silence warning for "clang -g foo.o -o foo" 10596 Args.ClaimAllArgs(options::OPT_g_Group); 10597 // and "clang -emit-llvm foo.o -o foo" 10598 Args.ClaimAllArgs(options::OPT_emit_llvm); 10599 // and for "clang -w foo.o -o foo" 10600 Args.ClaimAllArgs(options::OPT_w); 10601 // Other warning options are already handled somewhere else. 10602 10603 if (!D.SysRoot.empty()) 10604 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 10605 10606 if (Args.hasArg(options::OPT_pie)) 10607 CmdArgs.push_back("-pie"); 10608 if (Args.hasArg(options::OPT_rdynamic)) 10609 CmdArgs.push_back("-export-dynamic"); 10610 if (Args.hasArg(options::OPT_s)) 10611 CmdArgs.push_back("--strip-all"); 10612 10613 CmdArgs.push_back("-m"); 10614 switch (TC.getArch()) { 10615 default: 10616 llvm_unreachable("unsupported architecture"); 10617 case llvm::Triple::arm: 10618 case llvm::Triple::thumb: 10619 // FIXME: this is incorrect for WinCE 10620 CmdArgs.push_back("thumb2pe"); 10621 break; 10622 case llvm::Triple::x86: 10623 CmdArgs.push_back("i386pe"); 10624 EntryPoint.append("_"); 10625 break; 10626 case llvm::Triple::x86_64: 10627 CmdArgs.push_back("i386pep"); 10628 break; 10629 } 10630 10631 if (Args.hasArg(options::OPT_shared)) { 10632 switch (T.getArch()) { 10633 default: 10634 llvm_unreachable("unsupported architecture"); 10635 case llvm::Triple::arm: 10636 case llvm::Triple::thumb: 10637 case llvm::Triple::x86_64: 10638 EntryPoint.append("_DllMainCRTStartup"); 10639 break; 10640 case llvm::Triple::x86: 10641 EntryPoint.append("_DllMainCRTStartup@12"); 10642 break; 10643 } 10644 10645 CmdArgs.push_back("-shared"); 10646 CmdArgs.push_back("-Bdynamic"); 10647 10648 CmdArgs.push_back("--enable-auto-image-base"); 10649 10650 CmdArgs.push_back("--entry"); 10651 CmdArgs.push_back(Args.MakeArgString(EntryPoint)); 10652 } else { 10653 EntryPoint.append("mainCRTStartup"); 10654 10655 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic" 10656 : "-Bdynamic"); 10657 10658 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 10659 CmdArgs.push_back("--entry"); 10660 CmdArgs.push_back(Args.MakeArgString(EntryPoint)); 10661 } 10662 10663 // FIXME: handle subsystem 10664 } 10665 10666 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT) 10667 CmdArgs.push_back("--allow-multiple-definition"); 10668 10669 CmdArgs.push_back("-o"); 10670 CmdArgs.push_back(Output.getFilename()); 10671 10672 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) { 10673 SmallString<261> ImpLib(Output.getFilename()); 10674 llvm::sys::path::replace_extension(ImpLib, ".lib"); 10675 10676 CmdArgs.push_back("--out-implib"); 10677 CmdArgs.push_back(Args.MakeArgString(ImpLib)); 10678 } 10679 10680 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 10681 const std::string CRTPath(D.SysRoot + "/usr/lib/"); 10682 const char *CRTBegin; 10683 10684 CRTBegin = 10685 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj"; 10686 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin)); 10687 } 10688 10689 Args.AddAllArgs(CmdArgs, options::OPT_L); 10690 TC.AddFilePathLibArgs(Args, CmdArgs); 10691 AddLinkerInputs(TC, Inputs, Args, CmdArgs); 10692 10693 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) && 10694 !Args.hasArg(options::OPT_nodefaultlibs)) { 10695 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) && 10696 !Args.hasArg(options::OPT_static); 10697 if (StaticCXX) 10698 CmdArgs.push_back("-Bstatic"); 10699 TC.AddCXXStdlibLibArgs(Args, CmdArgs); 10700 if (StaticCXX) 10701 CmdArgs.push_back("-Bdynamic"); 10702 } 10703 10704 if (!Args.hasArg(options::OPT_nostdlib)) { 10705 if (!Args.hasArg(options::OPT_nodefaultlibs)) { 10706 // TODO handle /MT[d] /MD[d] 10707 CmdArgs.push_back("-lmsvcrt"); 10708 AddRunTimeLibs(TC, D, CmdArgs, Args); 10709 } 10710 } 10711 10712 if (TC.getSanitizerArgs().needsAsanRt()) { 10713 // TODO handle /MT[d] /MD[d] 10714 if (Args.hasArg(options::OPT_shared)) { 10715 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk")); 10716 } else { 10717 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"}) 10718 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); 10719 // Make sure the dynamic runtime thunk is not optimized out at link time 10720 // to ensure proper SEH handling. 10721 CmdArgs.push_back(Args.MakeArgString("--undefined")); 10722 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86 10723 ? "___asan_seh_interceptor" 10724 : "__asan_seh_interceptor")); 10725 } 10726 } 10727 10728 Exec = Args.MakeArgString(TC.GetLinkerPath()); 10729 10730 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10731 } 10732 10733 void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA, 10734 const InputInfo &Output, 10735 const InputInfoList &Inputs, 10736 const ArgList &Args, 10737 const char *LinkingOutput) const { 10738 ArgStringList CmdArgs; 10739 assert(Inputs.size() == 1); 10740 const InputInfo &II = Inputs[0]; 10741 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX || 10742 II.getType() == types::TY_PP_CXX); 10743 10744 if (JA.getKind() == Action::PreprocessJobClass) { 10745 Args.ClaimAllArgs(); 10746 CmdArgs.push_back("-E"); 10747 } else { 10748 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm. 10749 CmdArgs.push_back("-S"); 10750 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified. 10751 } 10752 CmdArgs.push_back("-DMYRIAD2"); 10753 10754 // Append all -I, -iquote, -isystem paths, defines/undefines, 10755 // 'f' flags, optimize flags, and warning options. 10756 // These are spelled the same way in clang and moviCompile. 10757 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group, 10758 options::OPT_std_EQ, options::OPT_D, options::OPT_U, 10759 options::OPT_f_Group, options::OPT_f_clang_Group, 10760 options::OPT_g_Group, options::OPT_M_Group, 10761 options::OPT_O_Group, options::OPT_W_Group, 10762 options::OPT_mcpu_EQ}); 10763 10764 // If we're producing a dependency file, and assembly is the final action, 10765 // then the name of the target in the dependency file should be the '.o' 10766 // file, not the '.s' file produced by this step. For example, instead of 10767 // /tmp/mumble.s: mumble.c .../someheader.h 10768 // the filename on the lefthand side should be "mumble.o" 10769 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) && 10770 C.getActions().size() == 1 && 10771 C.getActions()[0]->getKind() == Action::AssembleJobClass) { 10772 Arg *A = Args.getLastArg(options::OPT_o); 10773 if (A) { 10774 CmdArgs.push_back("-MT"); 10775 CmdArgs.push_back(Args.MakeArgString(A->getValue())); 10776 } 10777 } 10778 10779 CmdArgs.push_back(II.getFilename()); 10780 CmdArgs.push_back("-o"); 10781 CmdArgs.push_back(Output.getFilename()); 10782 10783 std::string Exec = 10784 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile")); 10785 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), 10786 CmdArgs, Inputs)); 10787 } 10788 10789 void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 10790 const InputInfo &Output, 10791 const InputInfoList &Inputs, 10792 const ArgList &Args, 10793 const char *LinkingOutput) const { 10794 ArgStringList CmdArgs; 10795 10796 assert(Inputs.size() == 1); 10797 const InputInfo &II = Inputs[0]; 10798 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input. 10799 assert(Output.getType() == types::TY_Object); 10800 10801 CmdArgs.push_back("-no6thSlotCompression"); 10802 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ); 10803 if (CPUArg) 10804 CmdArgs.push_back( 10805 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue()))); 10806 CmdArgs.push_back("-noSPrefixing"); 10807 CmdArgs.push_back("-a"); // Mystery option. 10808 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 10809 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) { 10810 A->claim(); 10811 CmdArgs.push_back( 10812 Args.MakeArgString(std::string("-i:") + A->getValue(0))); 10813 } 10814 CmdArgs.push_back("-elf"); // Output format. 10815 CmdArgs.push_back(II.getFilename()); 10816 CmdArgs.push_back( 10817 Args.MakeArgString(std::string("-o:") + Output.getFilename())); 10818 10819 std::string Exec = 10820 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm")); 10821 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), 10822 CmdArgs, Inputs)); 10823 } 10824 10825 void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA, 10826 const InputInfo &Output, 10827 const InputInfoList &Inputs, 10828 const ArgList &Args, 10829 const char *LinkingOutput) const { 10830 const auto &TC = 10831 static_cast<const toolchains::MyriadToolChain &>(getToolChain()); 10832 const llvm::Triple &T = TC.getTriple(); 10833 ArgStringList CmdArgs; 10834 bool UseStartfiles = 10835 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); 10836 bool UseDefaultLibs = 10837 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs); 10838 10839 if (T.getArch() == llvm::Triple::sparc) 10840 CmdArgs.push_back("-EB"); 10841 else // SHAVE assumes little-endian, and sparcel is expressly so. 10842 CmdArgs.push_back("-EL"); 10843 10844 // The remaining logic is mostly like gnutools::Linker::ConstructJob, 10845 // but we never pass through a --sysroot option and various other bits. 10846 // For example, there are no sanitizers (yet) nor gold linker. 10847 10848 // Eat some arguments that may be present but have no effect. 10849 Args.ClaimAllArgs(options::OPT_g_Group); 10850 Args.ClaimAllArgs(options::OPT_w); 10851 Args.ClaimAllArgs(options::OPT_static_libgcc); 10852 10853 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option. 10854 CmdArgs.push_back("-s"); 10855 10856 CmdArgs.push_back("-o"); 10857 CmdArgs.push_back(Output.getFilename()); 10858 10859 if (UseStartfiles) { 10860 // If you want startfiles, it means you want the builtin crti and crtbegin, 10861 // but not crt0. Myriad link commands provide their own crt0.o as needed. 10862 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o"))); 10863 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o"))); 10864 } 10865 10866 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, 10867 options::OPT_e, options::OPT_s, options::OPT_t, 10868 options::OPT_Z_Flag, options::OPT_r}); 10869 10870 TC.AddFilePathLibArgs(Args, CmdArgs); 10871 10872 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 10873 10874 if (UseDefaultLibs) { 10875 if (C.getDriver().CCCIsCXX()) 10876 CmdArgs.push_back("-lstdc++"); 10877 if (T.getOS() == llvm::Triple::RTEMS) { 10878 CmdArgs.push_back("--start-group"); 10879 CmdArgs.push_back("-lc"); 10880 // You must provide your own "-L" option to enable finding these. 10881 CmdArgs.push_back("-lrtemscpu"); 10882 CmdArgs.push_back("-lrtemsbsp"); 10883 CmdArgs.push_back("--end-group"); 10884 } else { 10885 CmdArgs.push_back("-lc"); 10886 } 10887 CmdArgs.push_back("-lgcc"); 10888 } 10889 if (UseStartfiles) { 10890 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o"))); 10891 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o"))); 10892 } 10893 10894 std::string Exec = 10895 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld")); 10896 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), 10897 CmdArgs, Inputs)); 10898 } 10899 10900 void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 10901 const InputInfo &Output, 10902 const InputInfoList &Inputs, 10903 const ArgList &Args, 10904 const char *LinkingOutput) const { 10905 claimNoWarnArgs(Args); 10906 ArgStringList CmdArgs; 10907 10908 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); 10909 10910 CmdArgs.push_back("-o"); 10911 CmdArgs.push_back(Output.getFilename()); 10912 10913 assert(Inputs.size() == 1 && "Unexpected number of inputs."); 10914 const InputInfo &Input = Inputs[0]; 10915 assert(Input.isFilename() && "Invalid input."); 10916 CmdArgs.push_back(Input.getFilename()); 10917 10918 const char *Exec = 10919 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as")); 10920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 10921 } 10922 10923 static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) { 10924 const SanitizerArgs &SanArgs = TC.getSanitizerArgs(); 10925 if (SanArgs.needsUbsanRt()) { 10926 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak"); 10927 } 10928 if (SanArgs.needsAsanRt()) { 10929 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak"); 10930 } 10931 } 10932 10933 static void ConstructPS4LinkJob(const Tool &T, Compilation &C, 10934 const JobAction &JA, const InputInfo &Output, 10935 const InputInfoList &Inputs, 10936 const ArgList &Args, 10937 const char *LinkingOutput) { 10938 const toolchains::FreeBSD &ToolChain = 10939 static_cast<const toolchains::FreeBSD &>(T.getToolChain()); 10940 const Driver &D = ToolChain.getDriver(); 10941 ArgStringList CmdArgs; 10942 10943 // Silence warning for "clang -g foo.o -o foo" 10944 Args.ClaimAllArgs(options::OPT_g_Group); 10945 // and "clang -emit-llvm foo.o -o foo" 10946 Args.ClaimAllArgs(options::OPT_emit_llvm); 10947 // and for "clang -w foo.o -o foo". Other warning options are already 10948 // handled somewhere else. 10949 Args.ClaimAllArgs(options::OPT_w); 10950 10951 if (!D.SysRoot.empty()) 10952 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 10953 10954 if (Args.hasArg(options::OPT_pie)) 10955 CmdArgs.push_back("-pie"); 10956 10957 if (Args.hasArg(options::OPT_rdynamic)) 10958 CmdArgs.push_back("-export-dynamic"); 10959 if (Args.hasArg(options::OPT_shared)) 10960 CmdArgs.push_back("--oformat=so"); 10961 10962 if (Output.isFilename()) { 10963 CmdArgs.push_back("-o"); 10964 CmdArgs.push_back(Output.getFilename()); 10965 } else { 10966 assert(Output.isNothing() && "Invalid output."); 10967 } 10968 10969 AddPS4SanitizerArgs(ToolChain, CmdArgs); 10970 10971 Args.AddAllArgs(CmdArgs, options::OPT_L); 10972 Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 10973 Args.AddAllArgs(CmdArgs, options::OPT_e); 10974 Args.AddAllArgs(CmdArgs, options::OPT_s); 10975 Args.AddAllArgs(CmdArgs, options::OPT_t); 10976 Args.AddAllArgs(CmdArgs, options::OPT_r); 10977 10978 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 10979 CmdArgs.push_back("--no-demangle"); 10980 10981 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 10982 10983 if (Args.hasArg(options::OPT_pthread)) { 10984 CmdArgs.push_back("-lpthread"); 10985 } 10986 10987 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld")); 10988 10989 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs)); 10990 } 10991 10992 static void ConstructGoldLinkJob(const Tool &T, Compilation &C, 10993 const JobAction &JA, const InputInfo &Output, 10994 const InputInfoList &Inputs, 10995 const ArgList &Args, 10996 const char *LinkingOutput) { 10997 const toolchains::FreeBSD &ToolChain = 10998 static_cast<const toolchains::FreeBSD &>(T.getToolChain()); 10999 const Driver &D = ToolChain.getDriver(); 11000 ArgStringList CmdArgs; 11001 11002 // Silence warning for "clang -g foo.o -o foo" 11003 Args.ClaimAllArgs(options::OPT_g_Group); 11004 // and "clang -emit-llvm foo.o -o foo" 11005 Args.ClaimAllArgs(options::OPT_emit_llvm); 11006 // and for "clang -w foo.o -o foo". Other warning options are already 11007 // handled somewhere else. 11008 Args.ClaimAllArgs(options::OPT_w); 11009 11010 if (!D.SysRoot.empty()) 11011 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 11012 11013 if (Args.hasArg(options::OPT_pie)) 11014 CmdArgs.push_back("-pie"); 11015 11016 if (Args.hasArg(options::OPT_static)) { 11017 CmdArgs.push_back("-Bstatic"); 11018 } else { 11019 if (Args.hasArg(options::OPT_rdynamic)) 11020 CmdArgs.push_back("-export-dynamic"); 11021 CmdArgs.push_back("--eh-frame-hdr"); 11022 if (Args.hasArg(options::OPT_shared)) { 11023 CmdArgs.push_back("-Bshareable"); 11024 } else { 11025 CmdArgs.push_back("-dynamic-linker"); 11026 CmdArgs.push_back("/libexec/ld-elf.so.1"); 11027 } 11028 CmdArgs.push_back("--enable-new-dtags"); 11029 } 11030 11031 if (Output.isFilename()) { 11032 CmdArgs.push_back("-o"); 11033 CmdArgs.push_back(Output.getFilename()); 11034 } else { 11035 assert(Output.isNothing() && "Invalid output."); 11036 } 11037 11038 AddPS4SanitizerArgs(ToolChain, CmdArgs); 11039 11040 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 11041 const char *crt1 = nullptr; 11042 if (!Args.hasArg(options::OPT_shared)) { 11043 if (Args.hasArg(options::OPT_pg)) 11044 crt1 = "gcrt1.o"; 11045 else if (Args.hasArg(options::OPT_pie)) 11046 crt1 = "Scrt1.o"; 11047 else 11048 crt1 = "crt1.o"; 11049 } 11050 if (crt1) 11051 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 11052 11053 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 11054 11055 const char *crtbegin = nullptr; 11056 if (Args.hasArg(options::OPT_static)) 11057 crtbegin = "crtbeginT.o"; 11058 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 11059 crtbegin = "crtbeginS.o"; 11060 else 11061 crtbegin = "crtbegin.o"; 11062 11063 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 11064 } 11065 11066 Args.AddAllArgs(CmdArgs, options::OPT_L); 11067 ToolChain.AddFilePathLibArgs(Args, CmdArgs); 11068 Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 11069 Args.AddAllArgs(CmdArgs, options::OPT_e); 11070 Args.AddAllArgs(CmdArgs, options::OPT_s); 11071 Args.AddAllArgs(CmdArgs, options::OPT_t); 11072 Args.AddAllArgs(CmdArgs, options::OPT_r); 11073 11074 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 11075 CmdArgs.push_back("--no-demangle"); 11076 11077 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 11078 11079 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { 11080 // For PS4, we always want to pass libm, libstdc++ and libkernel 11081 // libraries for both C and C++ compilations. 11082 CmdArgs.push_back("-lkernel"); 11083 if (D.CCCIsCXX()) { 11084 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 11085 if (Args.hasArg(options::OPT_pg)) 11086 CmdArgs.push_back("-lm_p"); 11087 else 11088 CmdArgs.push_back("-lm"); 11089 } 11090 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 11091 // the default system libraries. Just mimic this for now. 11092 if (Args.hasArg(options::OPT_pg)) 11093 CmdArgs.push_back("-lgcc_p"); 11094 else 11095 CmdArgs.push_back("-lcompiler_rt"); 11096 if (Args.hasArg(options::OPT_static)) { 11097 CmdArgs.push_back("-lstdc++"); 11098 } else if (Args.hasArg(options::OPT_pg)) { 11099 CmdArgs.push_back("-lgcc_eh_p"); 11100 } else { 11101 CmdArgs.push_back("--as-needed"); 11102 CmdArgs.push_back("-lstdc++"); 11103 CmdArgs.push_back("--no-as-needed"); 11104 } 11105 11106 if (Args.hasArg(options::OPT_pthread)) { 11107 if (Args.hasArg(options::OPT_pg)) 11108 CmdArgs.push_back("-lpthread_p"); 11109 else 11110 CmdArgs.push_back("-lpthread"); 11111 } 11112 11113 if (Args.hasArg(options::OPT_pg)) { 11114 if (Args.hasArg(options::OPT_shared)) 11115 CmdArgs.push_back("-lc"); 11116 else { 11117 if (Args.hasArg(options::OPT_static)) { 11118 CmdArgs.push_back("--start-group"); 11119 CmdArgs.push_back("-lc_p"); 11120 CmdArgs.push_back("-lpthread_p"); 11121 CmdArgs.push_back("--end-group"); 11122 } else { 11123 CmdArgs.push_back("-lc_p"); 11124 } 11125 } 11126 CmdArgs.push_back("-lgcc_p"); 11127 } else { 11128 if (Args.hasArg(options::OPT_static)) { 11129 CmdArgs.push_back("--start-group"); 11130 CmdArgs.push_back("-lc"); 11131 CmdArgs.push_back("-lpthread"); 11132 CmdArgs.push_back("--end-group"); 11133 } else { 11134 CmdArgs.push_back("-lc"); 11135 } 11136 CmdArgs.push_back("-lcompiler_rt"); 11137 } 11138 11139 if (Args.hasArg(options::OPT_static)) { 11140 CmdArgs.push_back("-lstdc++"); 11141 } else if (Args.hasArg(options::OPT_pg)) { 11142 CmdArgs.push_back("-lgcc_eh_p"); 11143 } else { 11144 CmdArgs.push_back("--as-needed"); 11145 CmdArgs.push_back("-lstdc++"); 11146 CmdArgs.push_back("--no-as-needed"); 11147 } 11148 } 11149 11150 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { 11151 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 11152 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); 11153 else 11154 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); 11155 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 11156 } 11157 11158 const char *Exec = 11159 #ifdef LLVM_ON_WIN32 11160 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold")); 11161 #else 11162 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld")); 11163 #endif 11164 11165 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs)); 11166 } 11167 11168 void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA, 11169 const InputInfo &Output, 11170 const InputInfoList &Inputs, 11171 const ArgList &Args, 11172 const char *LinkingOutput) const { 11173 const toolchains::FreeBSD &ToolChain = 11174 static_cast<const toolchains::FreeBSD &>(getToolChain()); 11175 const Driver &D = ToolChain.getDriver(); 11176 bool PS4Linker; 11177 StringRef LinkerOptName; 11178 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) { 11179 LinkerOptName = A->getValue(); 11180 if (LinkerOptName != "ps4" && LinkerOptName != "gold") 11181 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName; 11182 } 11183 11184 if (LinkerOptName == "gold") 11185 PS4Linker = false; 11186 else if (LinkerOptName == "ps4") 11187 PS4Linker = true; 11188 else 11189 PS4Linker = !Args.hasArg(options::OPT_shared); 11190 11191 if (PS4Linker) 11192 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput); 11193 else 11194 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput); 11195 } 11196 11197 void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA, 11198 const InputInfo &Output, 11199 const InputInfoList &Inputs, 11200 const ArgList &Args, 11201 const char *LinkingOutput) const { 11202 const auto &TC = 11203 static_cast<const toolchains::CudaToolChain &>(getToolChain()); 11204 assert(TC.getTriple().isNVPTX() && "Wrong platform"); 11205 11206 std::vector<std::string> gpu_archs = 11207 Args.getAllArgValues(options::OPT_march_EQ); 11208 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas."); 11209 const std::string& gpu_arch = gpu_archs[0]; 11210 11211 // Check that our installation's ptxas supports gpu_arch. 11212 if (!Args.hasArg(options::OPT_no_cuda_version_check)) { 11213 TC.cudaInstallation().CheckCudaVersionSupportsArch( 11214 StringToCudaArch(gpu_arch)); 11215 } 11216 11217 ArgStringList CmdArgs; 11218 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32"); 11219 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug, 11220 options::OPT_no_cuda_noopt_device_debug, false)) { 11221 // ptxas does not accept -g option if optimization is enabled, so 11222 // we ignore the compiler's -O* options if we want debug info. 11223 CmdArgs.push_back("-g"); 11224 CmdArgs.push_back("--dont-merge-basicblocks"); 11225 CmdArgs.push_back("--return-at-end"); 11226 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 11227 // Map the -O we received to -O{0,1,2,3}. 11228 // 11229 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's 11230 // default, so it may correspond more closely to the spirit of clang -O2. 11231 11232 // -O3 seems like the least-bad option when -Osomething is specified to 11233 // clang but it isn't handled below. 11234 StringRef OOpt = "3"; 11235 if (A->getOption().matches(options::OPT_O4) || 11236 A->getOption().matches(options::OPT_Ofast)) 11237 OOpt = "3"; 11238 else if (A->getOption().matches(options::OPT_O0)) 11239 OOpt = "0"; 11240 else if (A->getOption().matches(options::OPT_O)) { 11241 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options. 11242 OOpt = llvm::StringSwitch<const char *>(A->getValue()) 11243 .Case("1", "1") 11244 .Case("2", "2") 11245 .Case("3", "3") 11246 .Case("s", "2") 11247 .Case("z", "2") 11248 .Default("2"); 11249 } 11250 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt)); 11251 } else { 11252 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond 11253 // to no optimizations, but ptxas's default is -O3. 11254 CmdArgs.push_back("-O0"); 11255 } 11256 11257 CmdArgs.push_back("--gpu-name"); 11258 CmdArgs.push_back(Args.MakeArgString(gpu_arch)); 11259 CmdArgs.push_back("--output-file"); 11260 CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); 11261 for (const auto& II : Inputs) 11262 CmdArgs.push_back(Args.MakeArgString(II.getFilename())); 11263 11264 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas)) 11265 CmdArgs.push_back(Args.MakeArgString(A)); 11266 11267 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas")); 11268 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 11269 } 11270 11271 // All inputs to this linker must be from CudaDeviceActions, as we need to look 11272 // at the Inputs' Actions in order to figure out which GPU architecture they 11273 // correspond to. 11274 void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA, 11275 const InputInfo &Output, 11276 const InputInfoList &Inputs, 11277 const ArgList &Args, 11278 const char *LinkingOutput) const { 11279 const auto &TC = 11280 static_cast<const toolchains::CudaToolChain &>(getToolChain()); 11281 assert(TC.getTriple().isNVPTX() && "Wrong platform"); 11282 11283 ArgStringList CmdArgs; 11284 CmdArgs.push_back("--cuda"); 11285 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32"); 11286 CmdArgs.push_back(Args.MakeArgString("--create")); 11287 CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); 11288 11289 for (const auto& II : Inputs) { 11290 auto* A = cast<const CudaDeviceAction>(II.getAction()); 11291 // We need to pass an Arch of the form "sm_XX" for cubin files and 11292 // "compute_XX" for ptx. 11293 const char *Arch = 11294 (II.getType() == types::TY_PP_Asm) 11295 ? CudaVirtualArchToString(VirtualArchForCudaArch(A->getGpuArch())) 11296 : CudaArchToString(A->getGpuArch()); 11297 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") + 11298 Arch + ",file=" + II.getFilename())); 11299 } 11300 11301 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary)) 11302 CmdArgs.push_back(Args.MakeArgString(A)); 11303 11304 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary")); 11305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); 11306 } 11307