1 //===--- Driver.cpp - Clang GCC Compatible Driver -------------------------===// 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 "clang/Driver/Driver.h" 11 #include "InputInfo.h" 12 #include "ToolChains/AMDGPU.h" 13 #include "ToolChains/AVR.h" 14 #include "ToolChains/Ananas.h" 15 #include "ToolChains/BareMetal.h" 16 #include "ToolChains/Clang.h" 17 #include "ToolChains/CloudABI.h" 18 #include "ToolChains/Contiki.h" 19 #include "ToolChains/CrossWindows.h" 20 #include "ToolChains/Cuda.h" 21 #include "ToolChains/Darwin.h" 22 #include "ToolChains/DragonFly.h" 23 #include "ToolChains/FreeBSD.h" 24 #include "ToolChains/Fuchsia.h" 25 #include "ToolChains/Gnu.h" 26 #include "ToolChains/HIP.h" 27 #include "ToolChains/Haiku.h" 28 #include "ToolChains/Hexagon.h" 29 #include "ToolChains/Lanai.h" 30 #include "ToolChains/Linux.h" 31 #include "ToolChains/MSVC.h" 32 #include "ToolChains/MinGW.h" 33 #include "ToolChains/Minix.h" 34 #include "ToolChains/MipsLinux.h" 35 #include "ToolChains/Myriad.h" 36 #include "ToolChains/NaCl.h" 37 #include "ToolChains/NetBSD.h" 38 #include "ToolChains/OpenBSD.h" 39 #include "ToolChains/PS4CPU.h" 40 #include "ToolChains/RISCV.h" 41 #include "ToolChains/Solaris.h" 42 #include "ToolChains/TCE.h" 43 #include "ToolChains/WebAssembly.h" 44 #include "ToolChains/XCore.h" 45 #include "clang/Basic/Version.h" 46 #include "clang/Basic/VirtualFileSystem.h" 47 #include "clang/Config/config.h" 48 #include "clang/Driver/Action.h" 49 #include "clang/Driver/Compilation.h" 50 #include "clang/Driver/DriverDiagnostic.h" 51 #include "clang/Driver/Job.h" 52 #include "clang/Driver/Options.h" 53 #include "clang/Driver/SanitizerArgs.h" 54 #include "clang/Driver/Tool.h" 55 #include "clang/Driver/ToolChain.h" 56 #include "llvm/ADT/ArrayRef.h" 57 #include "llvm/ADT/STLExtras.h" 58 #include "llvm/ADT/SmallSet.h" 59 #include "llvm/ADT/StringExtras.h" 60 #include "llvm/ADT/StringSet.h" 61 #include "llvm/ADT/StringSwitch.h" 62 #include "llvm/Config/llvm-config.h" 63 #include "llvm/Option/Arg.h" 64 #include "llvm/Option/ArgList.h" 65 #include "llvm/Option/OptSpecifier.h" 66 #include "llvm/Option/OptTable.h" 67 #include "llvm/Option/Option.h" 68 #include "llvm/Support/CommandLine.h" 69 #include "llvm/Support/ErrorHandling.h" 70 #include "llvm/Support/FileSystem.h" 71 #include "llvm/Support/Path.h" 72 #include "llvm/Support/PrettyStackTrace.h" 73 #include "llvm/Support/Process.h" 74 #include "llvm/Support/Program.h" 75 #include "llvm/Support/StringSaver.h" 76 #include "llvm/Support/TargetRegistry.h" 77 #include "llvm/Support/raw_ostream.h" 78 #include <map> 79 #include <memory> 80 #include <utility> 81 #if LLVM_ON_UNIX 82 #include <unistd.h> // getpid 83 #endif 84 85 using namespace clang::driver; 86 using namespace clang; 87 using namespace llvm::opt; 88 89 Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple, 90 DiagnosticsEngine &Diags, 91 IntrusiveRefCntPtr<vfs::FileSystem> VFS) 92 : Opts(createDriverOptTable()), Diags(Diags), VFS(std::move(VFS)), 93 Mode(GCCMode), SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone), 94 LTOMode(LTOK_None), ClangExecutable(ClangExecutable), 95 SysRoot(DEFAULT_SYSROOT), DriverTitle("clang LLVM compiler"), 96 CCPrintOptionsFilename(nullptr), CCPrintHeadersFilename(nullptr), 97 CCLogDiagnosticsFilename(nullptr), CCCPrintBindings(false), 98 CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false), 99 CCGenDiagnostics(false), TargetTriple(TargetTriple), 100 CCCGenericGCCName(""), Saver(Alloc), CheckInputsExist(true), 101 CCCUsePCH(true), GenReproducer(false), 102 SuppressMissingInputWarning(false) { 103 104 // Provide a sane fallback if no VFS is specified. 105 if (!this->VFS) 106 this->VFS = vfs::getRealFileSystem(); 107 108 Name = llvm::sys::path::filename(ClangExecutable); 109 Dir = llvm::sys::path::parent_path(ClangExecutable); 110 InstalledDir = Dir; // Provide a sensible default installed dir. 111 112 #if defined(CLANG_CONFIG_FILE_SYSTEM_DIR) 113 SystemConfigDir = CLANG_CONFIG_FILE_SYSTEM_DIR; 114 #endif 115 #if defined(CLANG_CONFIG_FILE_USER_DIR) 116 UserConfigDir = CLANG_CONFIG_FILE_USER_DIR; 117 #endif 118 119 // Compute the path to the resource directory. 120 StringRef ClangResourceDir(CLANG_RESOURCE_DIR); 121 SmallString<128> P(Dir); 122 if (ClangResourceDir != "") { 123 llvm::sys::path::append(P, ClangResourceDir); 124 } else { 125 StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX); 126 P = llvm::sys::path::parent_path(Dir); 127 llvm::sys::path::append(P, Twine("lib") + ClangLibdirSuffix, "clang", 128 CLANG_VERSION_STRING); 129 } 130 ResourceDir = P.str(); 131 } 132 133 void Driver::ParseDriverMode(StringRef ProgramName, 134 ArrayRef<const char *> Args) { 135 if (ClangNameParts.isEmpty()) 136 ClangNameParts = ToolChain::getTargetAndModeFromProgramName(ProgramName); 137 setDriverModeFromOption(ClangNameParts.DriverMode); 138 139 for (const char *ArgPtr : Args) { 140 // Ignore nullptrs, they are the response file's EOL markers. 141 if (ArgPtr == nullptr) 142 continue; 143 const StringRef Arg = ArgPtr; 144 setDriverModeFromOption(Arg); 145 } 146 } 147 148 void Driver::setDriverModeFromOption(StringRef Opt) { 149 const std::string OptName = 150 getOpts().getOption(options::OPT_driver_mode).getPrefixedName(); 151 if (!Opt.startswith(OptName)) 152 return; 153 StringRef Value = Opt.drop_front(OptName.size()); 154 155 if (auto M = llvm::StringSwitch<llvm::Optional<DriverMode>>(Value) 156 .Case("gcc", GCCMode) 157 .Case("g++", GXXMode) 158 .Case("cpp", CPPMode) 159 .Case("cl", CLMode) 160 .Default(None)) 161 Mode = *M; 162 else 163 Diag(diag::err_drv_unsupported_option_argument) << OptName << Value; 164 } 165 166 InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings, 167 bool &ContainsError) { 168 llvm::PrettyStackTraceString CrashInfo("Command line argument parsing"); 169 ContainsError = false; 170 171 unsigned IncludedFlagsBitmask; 172 unsigned ExcludedFlagsBitmask; 173 std::tie(IncludedFlagsBitmask, ExcludedFlagsBitmask) = 174 getIncludeExcludeOptionFlagMasks(); 175 176 unsigned MissingArgIndex, MissingArgCount; 177 InputArgList Args = 178 getOpts().ParseArgs(ArgStrings, MissingArgIndex, MissingArgCount, 179 IncludedFlagsBitmask, ExcludedFlagsBitmask); 180 181 // Check for missing argument error. 182 if (MissingArgCount) { 183 Diag(diag::err_drv_missing_argument) 184 << Args.getArgString(MissingArgIndex) << MissingArgCount; 185 ContainsError |= 186 Diags.getDiagnosticLevel(diag::err_drv_missing_argument, 187 SourceLocation()) > DiagnosticsEngine::Warning; 188 } 189 190 // Check for unsupported options. 191 for (const Arg *A : Args) { 192 if (A->getOption().hasFlag(options::Unsupported)) { 193 unsigned DiagID; 194 auto ArgString = A->getAsString(Args); 195 std::string Nearest; 196 if (getOpts().findNearest( 197 ArgString, Nearest, IncludedFlagsBitmask, 198 ExcludedFlagsBitmask | options::Unsupported) > 1) { 199 DiagID = diag::err_drv_unsupported_opt; 200 Diag(DiagID) << ArgString; 201 } else { 202 DiagID = diag::err_drv_unsupported_opt_with_suggestion; 203 Diag(DiagID) << ArgString << Nearest; 204 } 205 ContainsError |= Diags.getDiagnosticLevel(DiagID, SourceLocation()) > 206 DiagnosticsEngine::Warning; 207 continue; 208 } 209 210 // Warn about -mcpu= without an argument. 211 if (A->getOption().matches(options::OPT_mcpu_EQ) && A->containsValue("")) { 212 Diag(diag::warn_drv_empty_joined_argument) << A->getAsString(Args); 213 ContainsError |= Diags.getDiagnosticLevel( 214 diag::warn_drv_empty_joined_argument, 215 SourceLocation()) > DiagnosticsEngine::Warning; 216 } 217 } 218 219 for (const Arg *A : Args.filtered(options::OPT_UNKNOWN)) { 220 unsigned DiagID; 221 auto ArgString = A->getAsString(Args); 222 std::string Nearest; 223 if (getOpts().findNearest( 224 ArgString, Nearest, IncludedFlagsBitmask, ExcludedFlagsBitmask) > 1) { 225 DiagID = IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl 226 : diag::err_drv_unknown_argument; 227 Diags.Report(DiagID) << ArgString; 228 } else { 229 DiagID = IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl_with_suggestion 230 : diag::err_drv_unknown_argument_with_suggestion; 231 Diags.Report(DiagID) << ArgString << Nearest; 232 } 233 ContainsError |= Diags.getDiagnosticLevel(DiagID, SourceLocation()) > 234 DiagnosticsEngine::Warning; 235 } 236 237 return Args; 238 } 239 240 // Determine which compilation mode we are in. We look for options which 241 // affect the phase, starting with the earliest phases, and record which 242 // option we used to determine the final phase. 243 phases::ID Driver::getFinalPhase(const DerivedArgList &DAL, 244 Arg **FinalPhaseArg) const { 245 Arg *PhaseArg = nullptr; 246 phases::ID FinalPhase; 247 248 // -{E,EP,P,M,MM} only run the preprocessor. 249 if (CCCIsCPP() || (PhaseArg = DAL.getLastArg(options::OPT_E)) || 250 (PhaseArg = DAL.getLastArg(options::OPT__SLASH_EP)) || 251 (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM)) || 252 (PhaseArg = DAL.getLastArg(options::OPT__SLASH_P))) { 253 FinalPhase = phases::Preprocess; 254 255 // --precompile only runs up to precompilation. 256 } else if ((PhaseArg = DAL.getLastArg(options::OPT__precompile))) { 257 FinalPhase = phases::Precompile; 258 259 // -{fsyntax-only,-analyze,emit-ast} only run up to the compiler. 260 } else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) || 261 (PhaseArg = DAL.getLastArg(options::OPT_module_file_info)) || 262 (PhaseArg = DAL.getLastArg(options::OPT_verify_pch)) || 263 (PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) || 264 (PhaseArg = DAL.getLastArg(options::OPT_rewrite_legacy_objc)) || 265 (PhaseArg = DAL.getLastArg(options::OPT__migrate)) || 266 (PhaseArg = DAL.getLastArg(options::OPT__analyze, 267 options::OPT__analyze_auto)) || 268 (PhaseArg = DAL.getLastArg(options::OPT_emit_ast))) { 269 FinalPhase = phases::Compile; 270 271 // -S only runs up to the backend. 272 } else if ((PhaseArg = DAL.getLastArg(options::OPT_S))) { 273 FinalPhase = phases::Backend; 274 275 // -c compilation only runs up to the assembler. 276 } else if ((PhaseArg = DAL.getLastArg(options::OPT_c))) { 277 FinalPhase = phases::Assemble; 278 279 // Otherwise do everything. 280 } else 281 FinalPhase = phases::Link; 282 283 if (FinalPhaseArg) 284 *FinalPhaseArg = PhaseArg; 285 286 return FinalPhase; 287 } 288 289 static Arg *MakeInputArg(DerivedArgList &Args, OptTable &Opts, 290 StringRef Value, bool Claim = true) { 291 Arg *A = new Arg(Opts.getOption(options::OPT_INPUT), Value, 292 Args.getBaseArgs().MakeIndex(Value), Value.data()); 293 Args.AddSynthesizedArg(A); 294 if (Claim) 295 A->claim(); 296 return A; 297 } 298 299 DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { 300 DerivedArgList *DAL = new DerivedArgList(Args); 301 302 bool HasNostdlib = Args.hasArg(options::OPT_nostdlib); 303 bool HasNodefaultlib = Args.hasArg(options::OPT_nodefaultlibs); 304 for (Arg *A : Args) { 305 // Unfortunately, we have to parse some forwarding options (-Xassembler, 306 // -Xlinker, -Xpreprocessor) because we either integrate their functionality 307 // (assembler and preprocessor), or bypass a previous driver ('collect2'). 308 309 // Rewrite linker options, to replace --no-demangle with a custom internal 310 // option. 311 if ((A->getOption().matches(options::OPT_Wl_COMMA) || 312 A->getOption().matches(options::OPT_Xlinker)) && 313 A->containsValue("--no-demangle")) { 314 // Add the rewritten no-demangle argument. 315 DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle)); 316 317 // Add the remaining values as Xlinker arguments. 318 for (StringRef Val : A->getValues()) 319 if (Val != "--no-demangle") 320 DAL->AddSeparateArg(A, Opts->getOption(options::OPT_Xlinker), Val); 321 322 continue; 323 } 324 325 // Rewrite preprocessor options, to replace -Wp,-MD,FOO which is used by 326 // some build systems. We don't try to be complete here because we don't 327 // care to encourage this usage model. 328 if (A->getOption().matches(options::OPT_Wp_COMMA) && 329 (A->getValue(0) == StringRef("-MD") || 330 A->getValue(0) == StringRef("-MMD"))) { 331 // Rewrite to -MD/-MMD along with -MF. 332 if (A->getValue(0) == StringRef("-MD")) 333 DAL->AddFlagArg(A, Opts->getOption(options::OPT_MD)); 334 else 335 DAL->AddFlagArg(A, Opts->getOption(options::OPT_MMD)); 336 if (A->getNumValues() == 2) 337 DAL->AddSeparateArg(A, Opts->getOption(options::OPT_MF), 338 A->getValue(1)); 339 continue; 340 } 341 342 // Rewrite reserved library names. 343 if (A->getOption().matches(options::OPT_l)) { 344 StringRef Value = A->getValue(); 345 346 // Rewrite unless -nostdlib is present. 347 if (!HasNostdlib && !HasNodefaultlib && Value == "stdc++") { 348 DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_reserved_lib_stdcxx)); 349 continue; 350 } 351 352 // Rewrite unconditionally. 353 if (Value == "cc_kext") { 354 DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_reserved_lib_cckext)); 355 continue; 356 } 357 } 358 359 // Pick up inputs via the -- option. 360 if (A->getOption().matches(options::OPT__DASH_DASH)) { 361 A->claim(); 362 for (StringRef Val : A->getValues()) 363 DAL->append(MakeInputArg(*DAL, *Opts, Val, false)); 364 continue; 365 } 366 367 DAL->append(A); 368 } 369 370 // Enforce -static if -miamcu is present. 371 if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) 372 DAL->AddFlagArg(0, Opts->getOption(options::OPT_static)); 373 374 // Add a default value of -mlinker-version=, if one was given and the user 375 // didn't specify one. 376 #if defined(HOST_LINK_VERSION) 377 if (!Args.hasArg(options::OPT_mlinker_version_EQ) && 378 strlen(HOST_LINK_VERSION) > 0) { 379 DAL->AddJoinedArg(0, Opts->getOption(options::OPT_mlinker_version_EQ), 380 HOST_LINK_VERSION); 381 DAL->getLastArg(options::OPT_mlinker_version_EQ)->claim(); 382 } 383 #endif 384 385 return DAL; 386 } 387 388 /// Compute target triple from args. 389 /// 390 /// This routine provides the logic to compute a target triple from various 391 /// args passed to the driver and the default triple string. 392 static llvm::Triple computeTargetTriple(const Driver &D, 393 StringRef TargetTriple, 394 const ArgList &Args, 395 StringRef DarwinArchName = "") { 396 // FIXME: Already done in Compilation *Driver::BuildCompilation 397 if (const Arg *A = Args.getLastArg(options::OPT_target)) 398 TargetTriple = A->getValue(); 399 400 llvm::Triple Target(llvm::Triple::normalize(TargetTriple)); 401 402 // Handle Apple-specific options available here. 403 if (Target.isOSBinFormatMachO()) { 404 // If an explicit Darwin arch name is given, that trumps all. 405 if (!DarwinArchName.empty()) { 406 tools::darwin::setTripleTypeForMachOArchName(Target, DarwinArchName); 407 return Target; 408 } 409 410 // Handle the Darwin '-arch' flag. 411 if (Arg *A = Args.getLastArg(options::OPT_arch)) { 412 StringRef ArchName = A->getValue(); 413 tools::darwin::setTripleTypeForMachOArchName(Target, ArchName); 414 } 415 } 416 417 // Handle pseudo-target flags '-mlittle-endian'/'-EL' and 418 // '-mbig-endian'/'-EB'. 419 if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian, 420 options::OPT_mbig_endian)) { 421 if (A->getOption().matches(options::OPT_mlittle_endian)) { 422 llvm::Triple LE = Target.getLittleEndianArchVariant(); 423 if (LE.getArch() != llvm::Triple::UnknownArch) 424 Target = std::move(LE); 425 } else { 426 llvm::Triple BE = Target.getBigEndianArchVariant(); 427 if (BE.getArch() != llvm::Triple::UnknownArch) 428 Target = std::move(BE); 429 } 430 } 431 432 // Skip further flag support on OSes which don't support '-m32' or '-m64'. 433 if (Target.getArch() == llvm::Triple::tce || 434 Target.getOS() == llvm::Triple::Minix) 435 return Target; 436 437 // Handle pseudo-target flags '-m64', '-mx32', '-m32' and '-m16'. 438 Arg *A = Args.getLastArg(options::OPT_m64, options::OPT_mx32, 439 options::OPT_m32, options::OPT_m16); 440 if (A) { 441 llvm::Triple::ArchType AT = llvm::Triple::UnknownArch; 442 443 if (A->getOption().matches(options::OPT_m64)) { 444 AT = Target.get64BitArchVariant().getArch(); 445 if (Target.getEnvironment() == llvm::Triple::GNUX32) 446 Target.setEnvironment(llvm::Triple::GNU); 447 } else if (A->getOption().matches(options::OPT_mx32) && 448 Target.get64BitArchVariant().getArch() == llvm::Triple::x86_64) { 449 AT = llvm::Triple::x86_64; 450 Target.setEnvironment(llvm::Triple::GNUX32); 451 } else if (A->getOption().matches(options::OPT_m32)) { 452 AT = Target.get32BitArchVariant().getArch(); 453 if (Target.getEnvironment() == llvm::Triple::GNUX32) 454 Target.setEnvironment(llvm::Triple::GNU); 455 } else if (A->getOption().matches(options::OPT_m16) && 456 Target.get32BitArchVariant().getArch() == llvm::Triple::x86) { 457 AT = llvm::Triple::x86; 458 Target.setEnvironment(llvm::Triple::CODE16); 459 } 460 461 if (AT != llvm::Triple::UnknownArch && AT != Target.getArch()) 462 Target.setArch(AT); 463 } 464 465 // Handle -miamcu flag. 466 if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) { 467 if (Target.get32BitArchVariant().getArch() != llvm::Triple::x86) 468 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-miamcu" 469 << Target.str(); 470 471 if (A && !A->getOption().matches(options::OPT_m32)) 472 D.Diag(diag::err_drv_argument_not_allowed_with) 473 << "-miamcu" << A->getBaseArg().getAsString(Args); 474 475 Target.setArch(llvm::Triple::x86); 476 Target.setArchName("i586"); 477 Target.setEnvironment(llvm::Triple::UnknownEnvironment); 478 Target.setEnvironmentName(""); 479 Target.setOS(llvm::Triple::ELFIAMCU); 480 Target.setVendor(llvm::Triple::UnknownVendor); 481 Target.setVendorName("intel"); 482 } 483 484 return Target; 485 } 486 487 // Parse the LTO options and record the type of LTO compilation 488 // based on which -f(no-)?lto(=.*)? option occurs last. 489 void Driver::setLTOMode(const llvm::opt::ArgList &Args) { 490 LTOMode = LTOK_None; 491 if (!Args.hasFlag(options::OPT_flto, options::OPT_flto_EQ, 492 options::OPT_fno_lto, false)) 493 return; 494 495 StringRef LTOName("full"); 496 497 const Arg *A = Args.getLastArg(options::OPT_flto_EQ); 498 if (A) 499 LTOName = A->getValue(); 500 501 LTOMode = llvm::StringSwitch<LTOKind>(LTOName) 502 .Case("full", LTOK_Full) 503 .Case("thin", LTOK_Thin) 504 .Default(LTOK_Unknown); 505 506 if (LTOMode == LTOK_Unknown) { 507 assert(A); 508 Diag(diag::err_drv_unsupported_option_argument) << A->getOption().getName() 509 << A->getValue(); 510 } 511 } 512 513 /// Compute the desired OpenMP runtime from the flags provided. 514 Driver::OpenMPRuntimeKind Driver::getOpenMPRuntime(const ArgList &Args) const { 515 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME); 516 517 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ); 518 if (A) 519 RuntimeName = A->getValue(); 520 521 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName) 522 .Case("libomp", OMPRT_OMP) 523 .Case("libgomp", OMPRT_GOMP) 524 .Case("libiomp5", OMPRT_IOMP5) 525 .Default(OMPRT_Unknown); 526 527 if (RT == OMPRT_Unknown) { 528 if (A) 529 Diag(diag::err_drv_unsupported_option_argument) 530 << A->getOption().getName() << A->getValue(); 531 else 532 // FIXME: We could use a nicer diagnostic here. 533 Diag(diag::err_drv_unsupported_opt) << "-fopenmp"; 534 } 535 536 return RT; 537 } 538 539 void Driver::CreateOffloadingDeviceToolChains(Compilation &C, 540 InputList &Inputs) { 541 542 // 543 // CUDA/HIP 544 // 545 // We need to generate a CUDA/HIP toolchain if any of the inputs has a CUDA 546 // or HIP type. However, mixed CUDA/HIP compilation is not supported. 547 bool IsCuda = 548 llvm::any_of(Inputs, [](std::pair<types::ID, const llvm::opt::Arg *> &I) { 549 return types::isCuda(I.first); 550 }); 551 bool IsHIP = 552 llvm::any_of(Inputs, 553 [](std::pair<types::ID, const llvm::opt::Arg *> &I) { 554 return types::isHIP(I.first); 555 }) || 556 C.getInputArgs().hasArg(options::OPT_hip_link); 557 if (IsCuda && IsHIP) { 558 Diag(clang::diag::err_drv_mix_cuda_hip); 559 return; 560 } 561 if (IsCuda) { 562 const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>(); 563 const llvm::Triple &HostTriple = HostTC->getTriple(); 564 StringRef DeviceTripleStr; 565 auto OFK = Action::OFK_Cuda; 566 DeviceTripleStr = 567 HostTriple.isArch64Bit() ? "nvptx64-nvidia-cuda" : "nvptx-nvidia-cuda"; 568 llvm::Triple CudaTriple(DeviceTripleStr); 569 // Use the CUDA and host triples as the key into the ToolChains map, 570 // because the device toolchain we create depends on both. 571 auto &CudaTC = ToolChains[CudaTriple.str() + "/" + HostTriple.str()]; 572 if (!CudaTC) { 573 CudaTC = llvm::make_unique<toolchains::CudaToolChain>( 574 *this, CudaTriple, *HostTC, C.getInputArgs(), OFK); 575 } 576 C.addOffloadDeviceToolChain(CudaTC.get(), OFK); 577 } else if (IsHIP) { 578 const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>(); 579 const llvm::Triple &HostTriple = HostTC->getTriple(); 580 StringRef DeviceTripleStr; 581 auto OFK = Action::OFK_HIP; 582 DeviceTripleStr = "amdgcn-amd-amdhsa"; 583 llvm::Triple HIPTriple(DeviceTripleStr); 584 // Use the HIP and host triples as the key into the ToolChains map, 585 // because the device toolchain we create depends on both. 586 auto &HIPTC = ToolChains[HIPTriple.str() + "/" + HostTriple.str()]; 587 if (!HIPTC) { 588 HIPTC = llvm::make_unique<toolchains::HIPToolChain>( 589 *this, HIPTriple, *HostTC, C.getInputArgs()); 590 } 591 C.addOffloadDeviceToolChain(HIPTC.get(), OFK); 592 } 593 594 // 595 // OpenMP 596 // 597 // We need to generate an OpenMP toolchain if the user specified targets with 598 // the -fopenmp-targets option. 599 if (Arg *OpenMPTargets = 600 C.getInputArgs().getLastArg(options::OPT_fopenmp_targets_EQ)) { 601 if (OpenMPTargets->getNumValues()) { 602 // We expect that -fopenmp-targets is always used in conjunction with the 603 // option -fopenmp specifying a valid runtime with offloading support, 604 // i.e. libomp or libiomp. 605 bool HasValidOpenMPRuntime = C.getInputArgs().hasFlag( 606 options::OPT_fopenmp, options::OPT_fopenmp_EQ, 607 options::OPT_fno_openmp, false); 608 if (HasValidOpenMPRuntime) { 609 OpenMPRuntimeKind OpenMPKind = getOpenMPRuntime(C.getInputArgs()); 610 HasValidOpenMPRuntime = 611 OpenMPKind == OMPRT_OMP || OpenMPKind == OMPRT_IOMP5; 612 } 613 614 if (HasValidOpenMPRuntime) { 615 llvm::StringMap<const char *> FoundNormalizedTriples; 616 for (const char *Val : OpenMPTargets->getValues()) { 617 llvm::Triple TT(Val); 618 std::string NormalizedName = TT.normalize(); 619 620 // Make sure we don't have a duplicate triple. 621 auto Duplicate = FoundNormalizedTriples.find(NormalizedName); 622 if (Duplicate != FoundNormalizedTriples.end()) { 623 Diag(clang::diag::warn_drv_omp_offload_target_duplicate) 624 << Val << Duplicate->second; 625 continue; 626 } 627 628 // Store the current triple so that we can check for duplicates in the 629 // following iterations. 630 FoundNormalizedTriples[NormalizedName] = Val; 631 632 // If the specified target is invalid, emit a diagnostic. 633 if (TT.getArch() == llvm::Triple::UnknownArch) 634 Diag(clang::diag::err_drv_invalid_omp_target) << Val; 635 else { 636 const ToolChain *TC; 637 // CUDA toolchains have to be selected differently. They pair host 638 // and device in their implementation. 639 if (TT.isNVPTX()) { 640 const ToolChain *HostTC = 641 C.getSingleOffloadToolChain<Action::OFK_Host>(); 642 assert(HostTC && "Host toolchain should be always defined."); 643 auto &CudaTC = 644 ToolChains[TT.str() + "/" + HostTC->getTriple().normalize()]; 645 if (!CudaTC) 646 CudaTC = llvm::make_unique<toolchains::CudaToolChain>( 647 *this, TT, *HostTC, C.getInputArgs(), Action::OFK_OpenMP); 648 TC = CudaTC.get(); 649 } else 650 TC = &getToolChain(C.getInputArgs(), TT); 651 C.addOffloadDeviceToolChain(TC, Action::OFK_OpenMP); 652 } 653 } 654 } else 655 Diag(clang::diag::err_drv_expecting_fopenmp_with_fopenmp_targets); 656 } else 657 Diag(clang::diag::warn_drv_empty_joined_argument) 658 << OpenMPTargets->getAsString(C.getInputArgs()); 659 } 660 661 // 662 // TODO: Add support for other offloading programming models here. 663 // 664 } 665 666 /// Looks the given directories for the specified file. 667 /// 668 /// \param[out] FilePath File path, if the file was found. 669 /// \param[in] Dirs Directories used for the search. 670 /// \param[in] FileName Name of the file to search for. 671 /// \return True if file was found. 672 /// 673 /// Looks for file specified by FileName sequentially in directories specified 674 /// by Dirs. 675 /// 676 static bool searchForFile(SmallVectorImpl<char> &FilePath, 677 ArrayRef<std::string> Dirs, 678 StringRef FileName) { 679 SmallString<128> WPath; 680 for (const StringRef &Dir : Dirs) { 681 if (Dir.empty()) 682 continue; 683 WPath.clear(); 684 llvm::sys::path::append(WPath, Dir, FileName); 685 llvm::sys::path::native(WPath); 686 if (llvm::sys::fs::is_regular_file(WPath)) { 687 FilePath = std::move(WPath); 688 return true; 689 } 690 } 691 return false; 692 } 693 694 bool Driver::readConfigFile(StringRef FileName) { 695 // Try reading the given file. 696 SmallVector<const char *, 32> NewCfgArgs; 697 if (!llvm::cl::readConfigFile(FileName, Saver, NewCfgArgs)) { 698 Diag(diag::err_drv_cannot_read_config_file) << FileName; 699 return true; 700 } 701 702 // Read options from config file. 703 llvm::SmallString<128> CfgFileName(FileName); 704 llvm::sys::path::native(CfgFileName); 705 ConfigFile = CfgFileName.str(); 706 bool ContainErrors; 707 CfgOptions = llvm::make_unique<InputArgList>( 708 ParseArgStrings(NewCfgArgs, ContainErrors)); 709 if (ContainErrors) { 710 CfgOptions.reset(); 711 return true; 712 } 713 714 if (CfgOptions->hasArg(options::OPT_config)) { 715 CfgOptions.reset(); 716 Diag(diag::err_drv_nested_config_file); 717 return true; 718 } 719 720 // Claim all arguments that come from a configuration file so that the driver 721 // does not warn on any that is unused. 722 for (Arg *A : *CfgOptions) 723 A->claim(); 724 return false; 725 } 726 727 bool Driver::loadConfigFile() { 728 std::string CfgFileName; 729 bool FileSpecifiedExplicitly = false; 730 731 // Process options that change search path for config files. 732 if (CLOptions) { 733 if (CLOptions->hasArg(options::OPT_config_system_dir_EQ)) { 734 SmallString<128> CfgDir; 735 CfgDir.append( 736 CLOptions->getLastArgValue(options::OPT_config_system_dir_EQ)); 737 if (!CfgDir.empty()) { 738 if (llvm::sys::fs::make_absolute(CfgDir).value() != 0) 739 SystemConfigDir.clear(); 740 else 741 SystemConfigDir = std::string(CfgDir.begin(), CfgDir.end()); 742 } 743 } 744 if (CLOptions->hasArg(options::OPT_config_user_dir_EQ)) { 745 SmallString<128> CfgDir; 746 CfgDir.append( 747 CLOptions->getLastArgValue(options::OPT_config_user_dir_EQ)); 748 if (!CfgDir.empty()) { 749 if (llvm::sys::fs::make_absolute(CfgDir).value() != 0) 750 UserConfigDir.clear(); 751 else 752 UserConfigDir = std::string(CfgDir.begin(), CfgDir.end()); 753 } 754 } 755 } 756 757 // First try to find config file specified in command line. 758 if (CLOptions) { 759 std::vector<std::string> ConfigFiles = 760 CLOptions->getAllArgValues(options::OPT_config); 761 if (ConfigFiles.size() > 1) { 762 Diag(diag::err_drv_duplicate_config); 763 return true; 764 } 765 766 if (!ConfigFiles.empty()) { 767 CfgFileName = ConfigFiles.front(); 768 assert(!CfgFileName.empty()); 769 770 // If argument contains directory separator, treat it as a path to 771 // configuration file. 772 if (llvm::sys::path::has_parent_path(CfgFileName)) { 773 SmallString<128> CfgFilePath; 774 if (llvm::sys::path::is_relative(CfgFileName)) 775 llvm::sys::fs::current_path(CfgFilePath); 776 llvm::sys::path::append(CfgFilePath, CfgFileName); 777 if (!llvm::sys::fs::is_regular_file(CfgFilePath)) { 778 Diag(diag::err_drv_config_file_not_exist) << CfgFilePath; 779 return true; 780 } 781 return readConfigFile(CfgFilePath); 782 } 783 784 FileSpecifiedExplicitly = true; 785 } 786 } 787 788 // If config file is not specified explicitly, try to deduce configuration 789 // from executable name. For instance, an executable 'armv7l-clang' will 790 // search for config file 'armv7l-clang.cfg'. 791 if (CfgFileName.empty() && !ClangNameParts.TargetPrefix.empty()) 792 CfgFileName = ClangNameParts.TargetPrefix + '-' + ClangNameParts.ModeSuffix; 793 794 if (CfgFileName.empty()) 795 return false; 796 797 // Determine architecture part of the file name, if it is present. 798 StringRef CfgFileArch = CfgFileName; 799 size_t ArchPrefixLen = CfgFileArch.find('-'); 800 if (ArchPrefixLen == StringRef::npos) 801 ArchPrefixLen = CfgFileArch.size(); 802 llvm::Triple CfgTriple; 803 CfgFileArch = CfgFileArch.take_front(ArchPrefixLen); 804 CfgTriple = llvm::Triple(llvm::Triple::normalize(CfgFileArch)); 805 if (CfgTriple.getArch() == llvm::Triple::ArchType::UnknownArch) 806 ArchPrefixLen = 0; 807 808 if (!StringRef(CfgFileName).endswith(".cfg")) 809 CfgFileName += ".cfg"; 810 811 // If config file starts with architecture name and command line options 812 // redefine architecture (with options like -m32 -LE etc), try finding new 813 // config file with that architecture. 814 SmallString<128> FixedConfigFile; 815 size_t FixedArchPrefixLen = 0; 816 if (ArchPrefixLen) { 817 // Get architecture name from config file name like 'i386.cfg' or 818 // 'armv7l-clang.cfg'. 819 // Check if command line options changes effective triple. 820 llvm::Triple EffectiveTriple = computeTargetTriple(*this, 821 CfgTriple.getTriple(), *CLOptions); 822 if (CfgTriple.getArch() != EffectiveTriple.getArch()) { 823 FixedConfigFile = EffectiveTriple.getArchName(); 824 FixedArchPrefixLen = FixedConfigFile.size(); 825 // Append the rest of original file name so that file name transforms 826 // like: i386-clang.cfg -> x86_64-clang.cfg. 827 if (ArchPrefixLen < CfgFileName.size()) 828 FixedConfigFile += CfgFileName.substr(ArchPrefixLen); 829 } 830 } 831 832 // Prepare list of directories where config file is searched for. 833 SmallVector<std::string, 3> CfgFileSearchDirs; 834 CfgFileSearchDirs.push_back(UserConfigDir); 835 CfgFileSearchDirs.push_back(SystemConfigDir); 836 CfgFileSearchDirs.push_back(Dir); 837 838 // Try to find config file. First try file with corrected architecture. 839 llvm::SmallString<128> CfgFilePath; 840 if (!FixedConfigFile.empty()) { 841 if (searchForFile(CfgFilePath, CfgFileSearchDirs, FixedConfigFile)) 842 return readConfigFile(CfgFilePath); 843 // If 'x86_64-clang.cfg' was not found, try 'x86_64.cfg'. 844 FixedConfigFile.resize(FixedArchPrefixLen); 845 FixedConfigFile.append(".cfg"); 846 if (searchForFile(CfgFilePath, CfgFileSearchDirs, FixedConfigFile)) 847 return readConfigFile(CfgFilePath); 848 } 849 850 // Then try original file name. 851 if (searchForFile(CfgFilePath, CfgFileSearchDirs, CfgFileName)) 852 return readConfigFile(CfgFilePath); 853 854 // Finally try removing driver mode part: 'x86_64-clang.cfg' -> 'x86_64.cfg'. 855 if (!ClangNameParts.ModeSuffix.empty() && 856 !ClangNameParts.TargetPrefix.empty()) { 857 CfgFileName.assign(ClangNameParts.TargetPrefix); 858 CfgFileName.append(".cfg"); 859 if (searchForFile(CfgFilePath, CfgFileSearchDirs, CfgFileName)) 860 return readConfigFile(CfgFilePath); 861 } 862 863 // Report error but only if config file was specified explicitly, by option 864 // --config. If it was deduced from executable name, it is not an error. 865 if (FileSpecifiedExplicitly) { 866 Diag(diag::err_drv_config_file_not_found) << CfgFileName; 867 for (const std::string &SearchDir : CfgFileSearchDirs) 868 if (!SearchDir.empty()) 869 Diag(diag::note_drv_config_file_searched_in) << SearchDir; 870 return true; 871 } 872 873 return false; 874 } 875 876 Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { 877 llvm::PrettyStackTraceString CrashInfo("Compilation construction"); 878 879 // FIXME: Handle environment options which affect driver behavior, somewhere 880 // (client?). GCC_EXEC_PREFIX, LPATH, CC_PRINT_OPTIONS. 881 882 if (Optional<std::string> CompilerPathValue = 883 llvm::sys::Process::GetEnv("COMPILER_PATH")) { 884 StringRef CompilerPath = *CompilerPathValue; 885 while (!CompilerPath.empty()) { 886 std::pair<StringRef, StringRef> Split = 887 CompilerPath.split(llvm::sys::EnvPathSeparator); 888 PrefixDirs.push_back(Split.first); 889 CompilerPath = Split.second; 890 } 891 } 892 893 // We look for the driver mode option early, because the mode can affect 894 // how other options are parsed. 895 ParseDriverMode(ClangExecutable, ArgList.slice(1)); 896 897 // FIXME: What are we going to do with -V and -b? 898 899 // Arguments specified in command line. 900 bool ContainsError; 901 CLOptions = llvm::make_unique<InputArgList>( 902 ParseArgStrings(ArgList.slice(1), ContainsError)); 903 904 // Try parsing configuration file. 905 if (!ContainsError) 906 ContainsError = loadConfigFile(); 907 bool HasConfigFile = !ContainsError && (CfgOptions.get() != nullptr); 908 909 // All arguments, from both config file and command line. 910 InputArgList Args = std::move(HasConfigFile ? std::move(*CfgOptions) 911 : std::move(*CLOptions)); 912 if (HasConfigFile) 913 for (auto *Opt : *CLOptions) { 914 if (Opt->getOption().matches(options::OPT_config)) 915 continue; 916 unsigned Index = Args.MakeIndex(Opt->getSpelling()); 917 const Arg *BaseArg = &Opt->getBaseArg(); 918 if (BaseArg == Opt) 919 BaseArg = nullptr; 920 Arg *Copy = new llvm::opt::Arg(Opt->getOption(), Opt->getSpelling(), 921 Index, BaseArg); 922 Copy->getValues() = Opt->getValues(); 923 if (Opt->isClaimed()) 924 Copy->claim(); 925 Args.append(Copy); 926 } 927 928 // FIXME: This stuff needs to go into the Compilation, not the driver. 929 bool CCCPrintPhases; 930 931 // Silence driver warnings if requested 932 Diags.setIgnoreAllWarnings(Args.hasArg(options::OPT_w)); 933 934 // -no-canonical-prefixes is used very early in main. 935 Args.ClaimAllArgs(options::OPT_no_canonical_prefixes); 936 937 // Ignore -pipe. 938 Args.ClaimAllArgs(options::OPT_pipe); 939 940 // Extract -ccc args. 941 // 942 // FIXME: We need to figure out where this behavior should live. Most of it 943 // should be outside in the client; the parts that aren't should have proper 944 // options, either by introducing new ones or by overloading gcc ones like -V 945 // or -b. 946 CCCPrintPhases = Args.hasArg(options::OPT_ccc_print_phases); 947 CCCPrintBindings = Args.hasArg(options::OPT_ccc_print_bindings); 948 if (const Arg *A = Args.getLastArg(options::OPT_ccc_gcc_name)) 949 CCCGenericGCCName = A->getValue(); 950 CCCUsePCH = 951 Args.hasFlag(options::OPT_ccc_pch_is_pch, options::OPT_ccc_pch_is_pth); 952 GenReproducer = Args.hasFlag(options::OPT_gen_reproducer, 953 options::OPT_fno_crash_diagnostics, 954 !!::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH")); 955 // FIXME: TargetTriple is used by the target-prefixed calls to as/ld 956 // and getToolChain is const. 957 if (IsCLMode()) { 958 // clang-cl targets MSVC-style Win32. 959 llvm::Triple T(TargetTriple); 960 T.setOS(llvm::Triple::Win32); 961 T.setVendor(llvm::Triple::PC); 962 T.setEnvironment(llvm::Triple::MSVC); 963 T.setObjectFormat(llvm::Triple::COFF); 964 TargetTriple = T.str(); 965 } 966 if (const Arg *A = Args.getLastArg(options::OPT_target)) 967 TargetTriple = A->getValue(); 968 if (const Arg *A = Args.getLastArg(options::OPT_ccc_install_dir)) 969 Dir = InstalledDir = A->getValue(); 970 for (const Arg *A : Args.filtered(options::OPT_B)) { 971 A->claim(); 972 PrefixDirs.push_back(A->getValue(0)); 973 } 974 if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) 975 SysRoot = A->getValue(); 976 if (const Arg *A = Args.getLastArg(options::OPT__dyld_prefix_EQ)) 977 DyldPrefix = A->getValue(); 978 979 if (const Arg *A = Args.getLastArg(options::OPT_resource_dir)) 980 ResourceDir = A->getValue(); 981 982 if (const Arg *A = Args.getLastArg(options::OPT_save_temps_EQ)) { 983 SaveTemps = llvm::StringSwitch<SaveTempsMode>(A->getValue()) 984 .Case("cwd", SaveTempsCwd) 985 .Case("obj", SaveTempsObj) 986 .Default(SaveTempsCwd); 987 } 988 989 setLTOMode(Args); 990 991 // Process -fembed-bitcode= flags. 992 if (Arg *A = Args.getLastArg(options::OPT_fembed_bitcode_EQ)) { 993 StringRef Name = A->getValue(); 994 unsigned Model = llvm::StringSwitch<unsigned>(Name) 995 .Case("off", EmbedNone) 996 .Case("all", EmbedBitcode) 997 .Case("bitcode", EmbedBitcode) 998 .Case("marker", EmbedMarker) 999 .Default(~0U); 1000 if (Model == ~0U) { 1001 Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) 1002 << Name; 1003 } else 1004 BitcodeEmbed = static_cast<BitcodeEmbedMode>(Model); 1005 } 1006 1007 std::unique_ptr<llvm::opt::InputArgList> UArgs = 1008 llvm::make_unique<InputArgList>(std::move(Args)); 1009 1010 // Perform the default argument translations. 1011 DerivedArgList *TranslatedArgs = TranslateInputArgs(*UArgs); 1012 1013 // Owned by the host. 1014 const ToolChain &TC = getToolChain( 1015 *UArgs, computeTargetTriple(*this, TargetTriple, *UArgs)); 1016 1017 // The compilation takes ownership of Args. 1018 Compilation *C = new Compilation(*this, TC, UArgs.release(), TranslatedArgs, 1019 ContainsError); 1020 1021 if (!HandleImmediateArgs(*C)) 1022 return C; 1023 1024 // Construct the list of inputs. 1025 InputList Inputs; 1026 BuildInputs(C->getDefaultToolChain(), *TranslatedArgs, Inputs); 1027 1028 // Populate the tool chains for the offloading devices, if any. 1029 CreateOffloadingDeviceToolChains(*C, Inputs); 1030 1031 // Construct the list of abstract actions to perform for this compilation. On 1032 // MachO targets this uses the driver-driver and universal actions. 1033 if (TC.getTriple().isOSBinFormatMachO()) 1034 BuildUniversalActions(*C, C->getDefaultToolChain(), Inputs); 1035 else 1036 BuildActions(*C, C->getArgs(), Inputs, C->getActions()); 1037 1038 if (CCCPrintPhases) { 1039 PrintActions(*C); 1040 return C; 1041 } 1042 1043 BuildJobs(*C); 1044 1045 return C; 1046 } 1047 1048 static void printArgList(raw_ostream &OS, const llvm::opt::ArgList &Args) { 1049 llvm::opt::ArgStringList ASL; 1050 for (const auto *A : Args) 1051 A->render(Args, ASL); 1052 1053 for (auto I = ASL.begin(), E = ASL.end(); I != E; ++I) { 1054 if (I != ASL.begin()) 1055 OS << ' '; 1056 Command::printArg(OS, *I, true); 1057 } 1058 OS << '\n'; 1059 } 1060 1061 bool Driver::getCrashDiagnosticFile(StringRef ReproCrashFilename, 1062 SmallString<128> &CrashDiagDir) { 1063 using namespace llvm::sys; 1064 assert(llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin() && 1065 "Only knows about .crash files on Darwin"); 1066 1067 // The .crash file can be found on at ~/Library/Logs/DiagnosticReports/ 1068 // (or /Library/Logs/DiagnosticReports for root) and has the filename pattern 1069 // clang-<VERSION>_<YYYY-MM-DD-HHMMSS>_<hostname>.crash. 1070 path::home_directory(CrashDiagDir); 1071 if (CrashDiagDir.startswith("/var/root")) 1072 CrashDiagDir = "/"; 1073 path::append(CrashDiagDir, "Library/Logs/DiagnosticReports"); 1074 int PID = 1075 #if LLVM_ON_UNIX 1076 getpid(); 1077 #else 1078 0; 1079 #endif 1080 std::error_code EC; 1081 fs::file_status FileStatus; 1082 TimePoint<> LastAccessTime; 1083 SmallString<128> CrashFilePath; 1084 // Lookup the .crash files and get the one generated by a subprocess spawned 1085 // by this driver invocation. 1086 for (fs::directory_iterator File(CrashDiagDir, EC), FileEnd; 1087 File != FileEnd && !EC; File.increment(EC)) { 1088 StringRef FileName = path::filename(File->path()); 1089 if (!FileName.startswith(Name)) 1090 continue; 1091 if (fs::status(File->path(), FileStatus)) 1092 continue; 1093 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> CrashFile = 1094 llvm::MemoryBuffer::getFile(File->path()); 1095 if (!CrashFile) 1096 continue; 1097 // The first line should start with "Process:", otherwise this isn't a real 1098 // .crash file. 1099 StringRef Data = CrashFile.get()->getBuffer(); 1100 if (!Data.startswith("Process:")) 1101 continue; 1102 // Parse parent process pid line, e.g: "Parent Process: clang-4.0 [79141]" 1103 size_t ParentProcPos = Data.find("Parent Process:"); 1104 if (ParentProcPos == StringRef::npos) 1105 continue; 1106 size_t LineEnd = Data.find_first_of("\n", ParentProcPos); 1107 if (LineEnd == StringRef::npos) 1108 continue; 1109 StringRef ParentProcess = Data.slice(ParentProcPos+15, LineEnd).trim(); 1110 int OpenBracket = -1, CloseBracket = -1; 1111 for (size_t i = 0, e = ParentProcess.size(); i < e; ++i) { 1112 if (ParentProcess[i] == '[') 1113 OpenBracket = i; 1114 if (ParentProcess[i] == ']') 1115 CloseBracket = i; 1116 } 1117 // Extract the parent process PID from the .crash file and check whether 1118 // it matches this driver invocation pid. 1119 int CrashPID; 1120 if (OpenBracket < 0 || CloseBracket < 0 || 1121 ParentProcess.slice(OpenBracket + 1, CloseBracket) 1122 .getAsInteger(10, CrashPID) || CrashPID != PID) { 1123 continue; 1124 } 1125 1126 // Found a .crash file matching the driver pid. To avoid getting an older 1127 // and misleading crash file, continue looking for the most recent. 1128 // FIXME: the driver can dispatch multiple cc1 invocations, leading to 1129 // multiple crashes poiting to the same parent process. Since the driver 1130 // does not collect pid information for the dispatched invocation there's 1131 // currently no way to distinguish among them. 1132 const auto FileAccessTime = FileStatus.getLastModificationTime(); 1133 if (FileAccessTime > LastAccessTime) { 1134 CrashFilePath.assign(File->path()); 1135 LastAccessTime = FileAccessTime; 1136 } 1137 } 1138 1139 // If found, copy it over to the location of other reproducer files. 1140 if (!CrashFilePath.empty()) { 1141 EC = fs::copy_file(CrashFilePath, ReproCrashFilename); 1142 if (EC) 1143 return false; 1144 return true; 1145 } 1146 1147 return false; 1148 } 1149 1150 // When clang crashes, produce diagnostic information including the fully 1151 // preprocessed source file(s). Request that the developer attach the 1152 // diagnostic information to a bug report. 1153 void Driver::generateCompilationDiagnostics( 1154 Compilation &C, const Command &FailingCommand, 1155 StringRef AdditionalInformation, CompilationDiagnosticReport *Report) { 1156 if (C.getArgs().hasArg(options::OPT_fno_crash_diagnostics)) 1157 return; 1158 1159 // Don't try to generate diagnostics for link or dsymutil jobs. 1160 if (FailingCommand.getCreator().isLinkJob() || 1161 FailingCommand.getCreator().isDsymutilJob()) 1162 return; 1163 1164 // Print the version of the compiler. 1165 PrintVersion(C, llvm::errs()); 1166 1167 Diag(clang::diag::note_drv_command_failed_diag_msg) 1168 << "PLEASE submit a bug report to " BUG_REPORT_URL " and include the " 1169 "crash backtrace, preprocessed source, and associated run script."; 1170 1171 // Suppress driver output and emit preprocessor output to temp file. 1172 Mode = CPPMode; 1173 CCGenDiagnostics = true; 1174 1175 // Save the original job command(s). 1176 Command Cmd = FailingCommand; 1177 1178 // Keep track of whether we produce any errors while trying to produce 1179 // preprocessed sources. 1180 DiagnosticErrorTrap Trap(Diags); 1181 1182 // Suppress tool output. 1183 C.initCompilationForDiagnostics(); 1184 1185 // Construct the list of inputs. 1186 InputList Inputs; 1187 BuildInputs(C.getDefaultToolChain(), C.getArgs(), Inputs); 1188 1189 for (InputList::iterator it = Inputs.begin(), ie = Inputs.end(); it != ie;) { 1190 bool IgnoreInput = false; 1191 1192 // Ignore input from stdin or any inputs that cannot be preprocessed. 1193 // Check type first as not all linker inputs have a value. 1194 if (types::getPreprocessedType(it->first) == types::TY_INVALID) { 1195 IgnoreInput = true; 1196 } else if (!strcmp(it->second->getValue(), "-")) { 1197 Diag(clang::diag::note_drv_command_failed_diag_msg) 1198 << "Error generating preprocessed source(s) - " 1199 "ignoring input from stdin."; 1200 IgnoreInput = true; 1201 } 1202 1203 if (IgnoreInput) { 1204 it = Inputs.erase(it); 1205 ie = Inputs.end(); 1206 } else { 1207 ++it; 1208 } 1209 } 1210 1211 if (Inputs.empty()) { 1212 Diag(clang::diag::note_drv_command_failed_diag_msg) 1213 << "Error generating preprocessed source(s) - " 1214 "no preprocessable inputs."; 1215 return; 1216 } 1217 1218 // Don't attempt to generate preprocessed files if multiple -arch options are 1219 // used, unless they're all duplicates. 1220 llvm::StringSet<> ArchNames; 1221 for (const Arg *A : C.getArgs()) { 1222 if (A->getOption().matches(options::OPT_arch)) { 1223 StringRef ArchName = A->getValue(); 1224 ArchNames.insert(ArchName); 1225 } 1226 } 1227 if (ArchNames.size() > 1) { 1228 Diag(clang::diag::note_drv_command_failed_diag_msg) 1229 << "Error generating preprocessed source(s) - cannot generate " 1230 "preprocessed source with multiple -arch options."; 1231 return; 1232 } 1233 1234 // Construct the list of abstract actions to perform for this compilation. On 1235 // Darwin OSes this uses the driver-driver and builds universal actions. 1236 const ToolChain &TC = C.getDefaultToolChain(); 1237 if (TC.getTriple().isOSBinFormatMachO()) 1238 BuildUniversalActions(C, TC, Inputs); 1239 else 1240 BuildActions(C, C.getArgs(), Inputs, C.getActions()); 1241 1242 BuildJobs(C); 1243 1244 // If there were errors building the compilation, quit now. 1245 if (Trap.hasErrorOccurred()) { 1246 Diag(clang::diag::note_drv_command_failed_diag_msg) 1247 << "Error generating preprocessed source(s)."; 1248 return; 1249 } 1250 1251 // Generate preprocessed output. 1252 SmallVector<std::pair<int, const Command *>, 4> FailingCommands; 1253 C.ExecuteJobs(C.getJobs(), FailingCommands); 1254 1255 // If any of the preprocessing commands failed, clean up and exit. 1256 if (!FailingCommands.empty()) { 1257 Diag(clang::diag::note_drv_command_failed_diag_msg) 1258 << "Error generating preprocessed source(s)."; 1259 return; 1260 } 1261 1262 const ArgStringList &TempFiles = C.getTempFiles(); 1263 if (TempFiles.empty()) { 1264 Diag(clang::diag::note_drv_command_failed_diag_msg) 1265 << "Error generating preprocessed source(s)."; 1266 return; 1267 } 1268 1269 Diag(clang::diag::note_drv_command_failed_diag_msg) 1270 << "\n********************\n\n" 1271 "PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:\n" 1272 "Preprocessed source(s) and associated run script(s) are located at:"; 1273 1274 SmallString<128> VFS; 1275 SmallString<128> ReproCrashFilename; 1276 for (const char *TempFile : TempFiles) { 1277 Diag(clang::diag::note_drv_command_failed_diag_msg) << TempFile; 1278 if (Report) 1279 Report->TemporaryFiles.push_back(TempFile); 1280 if (ReproCrashFilename.empty()) { 1281 ReproCrashFilename = TempFile; 1282 llvm::sys::path::replace_extension(ReproCrashFilename, ".crash"); 1283 } 1284 if (StringRef(TempFile).endswith(".cache")) { 1285 // In some cases (modules) we'll dump extra data to help with reproducing 1286 // the crash into a directory next to the output. 1287 VFS = llvm::sys::path::filename(TempFile); 1288 llvm::sys::path::append(VFS, "vfs", "vfs.yaml"); 1289 } 1290 } 1291 1292 // Assume associated files are based off of the first temporary file. 1293 CrashReportInfo CrashInfo(TempFiles[0], VFS); 1294 1295 llvm::SmallString<128> Script(CrashInfo.Filename); 1296 llvm::sys::path::replace_extension(Script, "sh"); 1297 std::error_code EC; 1298 llvm::raw_fd_ostream ScriptOS(Script, EC, llvm::sys::fs::CD_CreateNew); 1299 if (EC) { 1300 Diag(clang::diag::note_drv_command_failed_diag_msg) 1301 << "Error generating run script: " << Script << " " << EC.message(); 1302 } else { 1303 ScriptOS << "# Crash reproducer for " << getClangFullVersion() << "\n" 1304 << "# Driver args: "; 1305 printArgList(ScriptOS, C.getInputArgs()); 1306 ScriptOS << "# Original command: "; 1307 Cmd.Print(ScriptOS, "\n", /*Quote=*/true); 1308 Cmd.Print(ScriptOS, "\n", /*Quote=*/true, &CrashInfo); 1309 if (!AdditionalInformation.empty()) 1310 ScriptOS << "\n# Additional information: " << AdditionalInformation 1311 << "\n"; 1312 if (Report) 1313 Report->TemporaryFiles.push_back(Script.str()); 1314 Diag(clang::diag::note_drv_command_failed_diag_msg) << Script; 1315 } 1316 1317 // On darwin, provide information about the .crash diagnostic report. 1318 if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) { 1319 SmallString<128> CrashDiagDir; 1320 if (getCrashDiagnosticFile(ReproCrashFilename, CrashDiagDir)) { 1321 Diag(clang::diag::note_drv_command_failed_diag_msg) 1322 << ReproCrashFilename.str(); 1323 } else { // Suggest a directory for the user to look for .crash files. 1324 llvm::sys::path::append(CrashDiagDir, Name); 1325 CrashDiagDir += "_<YYYY-MM-DD-HHMMSS>_<hostname>.crash"; 1326 Diag(clang::diag::note_drv_command_failed_diag_msg) 1327 << "Crash backtrace is located in"; 1328 Diag(clang::diag::note_drv_command_failed_diag_msg) 1329 << CrashDiagDir.str(); 1330 Diag(clang::diag::note_drv_command_failed_diag_msg) 1331 << "(choose the .crash file that corresponds to your crash)"; 1332 } 1333 } 1334 1335 for (const auto &A : C.getArgs().filtered(options::OPT_frewrite_map_file, 1336 options::OPT_frewrite_map_file_EQ)) 1337 Diag(clang::diag::note_drv_command_failed_diag_msg) << A->getValue(); 1338 1339 Diag(clang::diag::note_drv_command_failed_diag_msg) 1340 << "\n\n********************"; 1341 } 1342 1343 void Driver::setUpResponseFiles(Compilation &C, Command &Cmd) { 1344 // Since commandLineFitsWithinSystemLimits() may underestimate system's capacity 1345 // if the tool does not support response files, there is a chance/ that things 1346 // will just work without a response file, so we silently just skip it. 1347 if (Cmd.getCreator().getResponseFilesSupport() == Tool::RF_None || 1348 llvm::sys::commandLineFitsWithinSystemLimits(Cmd.getExecutable(), Cmd.getArguments())) 1349 return; 1350 1351 std::string TmpName = GetTemporaryPath("response", "txt"); 1352 Cmd.setResponseFile(C.addTempFile(C.getArgs().MakeArgString(TmpName))); 1353 } 1354 1355 int Driver::ExecuteCompilation( 1356 Compilation &C, 1357 SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands) { 1358 // Just print if -### was present. 1359 if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) { 1360 C.getJobs().Print(llvm::errs(), "\n", true); 1361 return 0; 1362 } 1363 1364 // If there were errors building the compilation, quit now. 1365 if (Diags.hasErrorOccurred()) 1366 return 1; 1367 1368 // Set up response file names for each command, if necessary 1369 for (auto &Job : C.getJobs()) 1370 setUpResponseFiles(C, Job); 1371 1372 C.ExecuteJobs(C.getJobs(), FailingCommands); 1373 1374 // If the command succeeded, we are done. 1375 if (FailingCommands.empty()) 1376 return 0; 1377 1378 // Otherwise, remove result files and print extra information about abnormal 1379 // failures. 1380 for (const auto &CmdPair : FailingCommands) { 1381 int Res = CmdPair.first; 1382 const Command *FailingCommand = CmdPair.second; 1383 1384 // Remove result files if we're not saving temps. 1385 if (!isSaveTempsEnabled()) { 1386 const JobAction *JA = cast<JobAction>(&FailingCommand->getSource()); 1387 C.CleanupFileMap(C.getResultFiles(), JA, true); 1388 1389 // Failure result files are valid unless we crashed. 1390 if (Res < 0) 1391 C.CleanupFileMap(C.getFailureResultFiles(), JA, true); 1392 } 1393 1394 // Print extra information about abnormal failures, if possible. 1395 // 1396 // This is ad-hoc, but we don't want to be excessively noisy. If the result 1397 // status was 1, assume the command failed normally. In particular, if it 1398 // was the compiler then assume it gave a reasonable error code. Failures 1399 // in other tools are less common, and they generally have worse 1400 // diagnostics, so always print the diagnostic there. 1401 const Tool &FailingTool = FailingCommand->getCreator(); 1402 1403 if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) { 1404 // FIXME: See FIXME above regarding result code interpretation. 1405 if (Res < 0) 1406 Diag(clang::diag::err_drv_command_signalled) 1407 << FailingTool.getShortName(); 1408 else 1409 Diag(clang::diag::err_drv_command_failed) << FailingTool.getShortName() 1410 << Res; 1411 } 1412 } 1413 return 0; 1414 } 1415 1416 void Driver::PrintHelp(bool ShowHidden) const { 1417 unsigned IncludedFlagsBitmask; 1418 unsigned ExcludedFlagsBitmask; 1419 std::tie(IncludedFlagsBitmask, ExcludedFlagsBitmask) = 1420 getIncludeExcludeOptionFlagMasks(); 1421 1422 ExcludedFlagsBitmask |= options::NoDriverOption; 1423 if (!ShowHidden) 1424 ExcludedFlagsBitmask |= HelpHidden; 1425 1426 getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(), 1427 IncludedFlagsBitmask, ExcludedFlagsBitmask, 1428 /*ShowAllAliases=*/false); 1429 } 1430 1431 void Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const { 1432 // FIXME: The following handlers should use a callback mechanism, we don't 1433 // know what the client would like to do. 1434 OS << getClangFullVersion() << '\n'; 1435 const ToolChain &TC = C.getDefaultToolChain(); 1436 OS << "Target: " << TC.getTripleString() << '\n'; 1437 1438 // Print the threading model. 1439 if (Arg *A = C.getArgs().getLastArg(options::OPT_mthread_model)) { 1440 // Don't print if the ToolChain would have barfed on it already 1441 if (TC.isThreadModelSupported(A->getValue())) 1442 OS << "Thread model: " << A->getValue(); 1443 } else 1444 OS << "Thread model: " << TC.getThreadModel(); 1445 OS << '\n'; 1446 1447 // Print out the install directory. 1448 OS << "InstalledDir: " << InstalledDir << '\n'; 1449 1450 // If configuration file was used, print its path. 1451 if (!ConfigFile.empty()) 1452 OS << "Configuration file: " << ConfigFile << '\n'; 1453 } 1454 1455 /// PrintDiagnosticCategories - Implement the --print-diagnostic-categories 1456 /// option. 1457 static void PrintDiagnosticCategories(raw_ostream &OS) { 1458 // Skip the empty category. 1459 for (unsigned i = 1, max = DiagnosticIDs::getNumberOfCategories(); i != max; 1460 ++i) 1461 OS << i << ',' << DiagnosticIDs::getCategoryNameFromID(i) << '\n'; 1462 } 1463 1464 void Driver::HandleAutocompletions(StringRef PassedFlags) const { 1465 if (PassedFlags == "") 1466 return; 1467 // Print out all options that start with a given argument. This is used for 1468 // shell autocompletion. 1469 std::vector<std::string> SuggestedCompletions; 1470 std::vector<std::string> Flags; 1471 1472 unsigned short DisableFlags = 1473 options::NoDriverOption | options::Unsupported | options::Ignored; 1474 1475 // Parse PassedFlags by "," as all the command-line flags are passed to this 1476 // function separated by "," 1477 StringRef TargetFlags = PassedFlags; 1478 while (TargetFlags != "") { 1479 StringRef CurFlag; 1480 std::tie(CurFlag, TargetFlags) = TargetFlags.split(","); 1481 Flags.push_back(std::string(CurFlag)); 1482 } 1483 1484 // We want to show cc1-only options only when clang is invoked with -cc1 or 1485 // -Xclang. 1486 if (std::find(Flags.begin(), Flags.end(), "-Xclang") != Flags.end() || 1487 std::find(Flags.begin(), Flags.end(), "-cc1") != Flags.end()) 1488 DisableFlags &= ~options::NoDriverOption; 1489 1490 StringRef Cur; 1491 Cur = Flags.at(Flags.size() - 1); 1492 StringRef Prev; 1493 if (Flags.size() >= 2) { 1494 Prev = Flags.at(Flags.size() - 2); 1495 SuggestedCompletions = Opts->suggestValueCompletions(Prev, Cur); 1496 } 1497 1498 if (SuggestedCompletions.empty()) 1499 SuggestedCompletions = Opts->suggestValueCompletions(Cur, ""); 1500 1501 if (SuggestedCompletions.empty()) { 1502 // If the flag is in the form of "--autocomplete=-foo", 1503 // we were requested to print out all option names that start with "-foo". 1504 // For example, "--autocomplete=-fsyn" is expanded to "-fsyntax-only". 1505 SuggestedCompletions = Opts->findByPrefix(Cur, DisableFlags); 1506 1507 // We have to query the -W flags manually as they're not in the OptTable. 1508 // TODO: Find a good way to add them to OptTable instead and them remove 1509 // this code. 1510 for (StringRef S : DiagnosticIDs::getDiagnosticFlags()) 1511 if (S.startswith(Cur)) 1512 SuggestedCompletions.push_back(S); 1513 } 1514 1515 // Sort the autocomplete candidates so that shells print them out in a 1516 // deterministic order. We could sort in any way, but we chose 1517 // case-insensitive sorting for consistency with the -help option 1518 // which prints out options in the case-insensitive alphabetical order. 1519 llvm::sort(SuggestedCompletions.begin(), SuggestedCompletions.end(), 1520 [](StringRef A, StringRef B) { 1521 if (int X = A.compare_lower(B)) 1522 return X < 0; 1523 return A.compare(B) > 0; 1524 }); 1525 1526 llvm::outs() << llvm::join(SuggestedCompletions, "\n") << '\n'; 1527 } 1528 1529 bool Driver::HandleImmediateArgs(const Compilation &C) { 1530 // The order these options are handled in gcc is all over the place, but we 1531 // don't expect inconsistencies w.r.t. that to matter in practice. 1532 1533 if (C.getArgs().hasArg(options::OPT_dumpmachine)) { 1534 llvm::outs() << C.getDefaultToolChain().getTripleString() << '\n'; 1535 return false; 1536 } 1537 1538 if (C.getArgs().hasArg(options::OPT_dumpversion)) { 1539 // Since -dumpversion is only implemented for pedantic GCC compatibility, we 1540 // return an answer which matches our definition of __VERSION__. 1541 // 1542 // If we want to return a more correct answer some day, then we should 1543 // introduce a non-pedantically GCC compatible mode to Clang in which we 1544 // provide sensible definitions for -dumpversion, __VERSION__, etc. 1545 llvm::outs() << "4.2.1\n"; 1546 return false; 1547 } 1548 1549 if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) { 1550 PrintDiagnosticCategories(llvm::outs()); 1551 return false; 1552 } 1553 1554 if (C.getArgs().hasArg(options::OPT_help) || 1555 C.getArgs().hasArg(options::OPT__help_hidden)) { 1556 PrintHelp(C.getArgs().hasArg(options::OPT__help_hidden)); 1557 return false; 1558 } 1559 1560 if (C.getArgs().hasArg(options::OPT__version)) { 1561 // Follow gcc behavior and use stdout for --version and stderr for -v. 1562 PrintVersion(C, llvm::outs()); 1563 return false; 1564 } 1565 1566 if (C.getArgs().hasArg(options::OPT_v) || 1567 C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) { 1568 PrintVersion(C, llvm::errs()); 1569 SuppressMissingInputWarning = true; 1570 } 1571 1572 if (C.getArgs().hasArg(options::OPT_v)) { 1573 if (!SystemConfigDir.empty()) 1574 llvm::errs() << "System configuration file directory: " 1575 << SystemConfigDir << "\n"; 1576 if (!UserConfigDir.empty()) 1577 llvm::errs() << "User configuration file directory: " 1578 << UserConfigDir << "\n"; 1579 } 1580 1581 const ToolChain &TC = C.getDefaultToolChain(); 1582 1583 if (C.getArgs().hasArg(options::OPT_v)) 1584 TC.printVerboseInfo(llvm::errs()); 1585 1586 if (C.getArgs().hasArg(options::OPT_print_resource_dir)) { 1587 llvm::outs() << ResourceDir << '\n'; 1588 return false; 1589 } 1590 1591 if (C.getArgs().hasArg(options::OPT_print_search_dirs)) { 1592 llvm::outs() << "programs: ="; 1593 bool separator = false; 1594 for (const std::string &Path : TC.getProgramPaths()) { 1595 if (separator) 1596 llvm::outs() << ':'; 1597 llvm::outs() << Path; 1598 separator = true; 1599 } 1600 llvm::outs() << "\n"; 1601 llvm::outs() << "libraries: =" << ResourceDir; 1602 1603 StringRef sysroot = C.getSysRoot(); 1604 1605 for (const std::string &Path : TC.getFilePaths()) { 1606 // Always print a separator. ResourceDir was the first item shown. 1607 llvm::outs() << ':'; 1608 // Interpretation of leading '=' is needed only for NetBSD. 1609 if (Path[0] == '=') 1610 llvm::outs() << sysroot << Path.substr(1); 1611 else 1612 llvm::outs() << Path; 1613 } 1614 llvm::outs() << "\n"; 1615 return false; 1616 } 1617 1618 // FIXME: The following handlers should use a callback mechanism, we don't 1619 // know what the client would like to do. 1620 if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) { 1621 llvm::outs() << GetFilePath(A->getValue(), TC) << "\n"; 1622 return false; 1623 } 1624 1625 if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) { 1626 StringRef ProgName = A->getValue(); 1627 1628 // Null program name cannot have a path. 1629 if (! ProgName.empty()) 1630 llvm::outs() << GetProgramPath(ProgName, TC); 1631 1632 llvm::outs() << "\n"; 1633 return false; 1634 } 1635 1636 if (Arg *A = C.getArgs().getLastArg(options::OPT_autocomplete)) { 1637 StringRef PassedFlags = A->getValue(); 1638 HandleAutocompletions(PassedFlags); 1639 return false; 1640 } 1641 1642 if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) { 1643 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(C.getArgs()); 1644 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(C.getArgs())); 1645 RegisterEffectiveTriple TripleRAII(TC, Triple); 1646 switch (RLT) { 1647 case ToolChain::RLT_CompilerRT: 1648 llvm::outs() << TC.getCompilerRT(C.getArgs(), "builtins") << "\n"; 1649 break; 1650 case ToolChain::RLT_Libgcc: 1651 llvm::outs() << GetFilePath("libgcc.a", TC) << "\n"; 1652 break; 1653 } 1654 return false; 1655 } 1656 1657 if (C.getArgs().hasArg(options::OPT_print_multi_lib)) { 1658 for (const Multilib &Multilib : TC.getMultilibs()) 1659 llvm::outs() << Multilib << "\n"; 1660 return false; 1661 } 1662 1663 if (C.getArgs().hasArg(options::OPT_print_multi_directory)) { 1664 for (const Multilib &Multilib : TC.getMultilibs()) { 1665 if (Multilib.gccSuffix().empty()) 1666 llvm::outs() << ".\n"; 1667 else { 1668 StringRef Suffix(Multilib.gccSuffix()); 1669 assert(Suffix.front() == '/'); 1670 llvm::outs() << Suffix.substr(1) << "\n"; 1671 } 1672 } 1673 return false; 1674 } 1675 return true; 1676 } 1677 1678 // Display an action graph human-readably. Action A is the "sink" node 1679 // and latest-occuring action. Traversal is in pre-order, visiting the 1680 // inputs to each action before printing the action itself. 1681 static unsigned PrintActions1(const Compilation &C, Action *A, 1682 std::map<Action *, unsigned> &Ids) { 1683 if (Ids.count(A)) // A was already visited. 1684 return Ids[A]; 1685 1686 std::string str; 1687 llvm::raw_string_ostream os(str); 1688 1689 os << Action::getClassName(A->getKind()) << ", "; 1690 if (InputAction *IA = dyn_cast<InputAction>(A)) { 1691 os << "\"" << IA->getInputArg().getValue() << "\""; 1692 } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) { 1693 os << '"' << BIA->getArchName() << '"' << ", {" 1694 << PrintActions1(C, *BIA->input_begin(), Ids) << "}"; 1695 } else if (OffloadAction *OA = dyn_cast<OffloadAction>(A)) { 1696 bool IsFirst = true; 1697 OA->doOnEachDependence( 1698 [&](Action *A, const ToolChain *TC, const char *BoundArch) { 1699 // E.g. for two CUDA device dependences whose bound arch is sm_20 and 1700 // sm_35 this will generate: 1701 // "cuda-device" (nvptx64-nvidia-cuda:sm_20) {#ID}, "cuda-device" 1702 // (nvptx64-nvidia-cuda:sm_35) {#ID} 1703 if (!IsFirst) 1704 os << ", "; 1705 os << '"'; 1706 if (TC) 1707 os << A->getOffloadingKindPrefix(); 1708 else 1709 os << "host"; 1710 os << " ("; 1711 os << TC->getTriple().normalize(); 1712 1713 if (BoundArch) 1714 os << ":" << BoundArch; 1715 os << ")"; 1716 os << '"'; 1717 os << " {" << PrintActions1(C, A, Ids) << "}"; 1718 IsFirst = false; 1719 }); 1720 } else { 1721 const ActionList *AL = &A->getInputs(); 1722 1723 if (AL->size()) { 1724 const char *Prefix = "{"; 1725 for (Action *PreRequisite : *AL) { 1726 os << Prefix << PrintActions1(C, PreRequisite, Ids); 1727 Prefix = ", "; 1728 } 1729 os << "}"; 1730 } else 1731 os << "{}"; 1732 } 1733 1734 // Append offload info for all options other than the offloading action 1735 // itself (e.g. (cuda-device, sm_20) or (cuda-host)). 1736 std::string offload_str; 1737 llvm::raw_string_ostream offload_os(offload_str); 1738 if (!isa<OffloadAction>(A)) { 1739 auto S = A->getOffloadingKindPrefix(); 1740 if (!S.empty()) { 1741 offload_os << ", (" << S; 1742 if (A->getOffloadingArch()) 1743 offload_os << ", " << A->getOffloadingArch(); 1744 offload_os << ")"; 1745 } 1746 } 1747 1748 unsigned Id = Ids.size(); 1749 Ids[A] = Id; 1750 llvm::errs() << Id << ": " << os.str() << ", " 1751 << types::getTypeName(A->getType()) << offload_os.str() << "\n"; 1752 1753 return Id; 1754 } 1755 1756 // Print the action graphs in a compilation C. 1757 // For example "clang -c file1.c file2.c" is composed of two subgraphs. 1758 void Driver::PrintActions(const Compilation &C) const { 1759 std::map<Action *, unsigned> Ids; 1760 for (Action *A : C.getActions()) 1761 PrintActions1(C, A, Ids); 1762 } 1763 1764 /// Check whether the given input tree contains any compilation or 1765 /// assembly actions. 1766 static bool ContainsCompileOrAssembleAction(const Action *A) { 1767 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A) || 1768 isa<AssembleJobAction>(A)) 1769 return true; 1770 1771 for (const Action *Input : A->inputs()) 1772 if (ContainsCompileOrAssembleAction(Input)) 1773 return true; 1774 1775 return false; 1776 } 1777 1778 void Driver::BuildUniversalActions(Compilation &C, const ToolChain &TC, 1779 const InputList &BAInputs) const { 1780 DerivedArgList &Args = C.getArgs(); 1781 ActionList &Actions = C.getActions(); 1782 llvm::PrettyStackTraceString CrashInfo("Building universal build actions"); 1783 // Collect the list of architectures. Duplicates are allowed, but should only 1784 // be handled once (in the order seen). 1785 llvm::StringSet<> ArchNames; 1786 SmallVector<const char *, 4> Archs; 1787 for (Arg *A : Args) { 1788 if (A->getOption().matches(options::OPT_arch)) { 1789 // Validate the option here; we don't save the type here because its 1790 // particular spelling may participate in other driver choices. 1791 llvm::Triple::ArchType Arch = 1792 tools::darwin::getArchTypeForMachOArchName(A->getValue()); 1793 if (Arch == llvm::Triple::UnknownArch) { 1794 Diag(clang::diag::err_drv_invalid_arch_name) << A->getAsString(Args); 1795 continue; 1796 } 1797 1798 A->claim(); 1799 if (ArchNames.insert(A->getValue()).second) 1800 Archs.push_back(A->getValue()); 1801 } 1802 } 1803 1804 // When there is no explicit arch for this platform, make sure we still bind 1805 // the architecture (to the default) so that -Xarch_ is handled correctly. 1806 if (!Archs.size()) 1807 Archs.push_back(Args.MakeArgString(TC.getDefaultUniversalArchName())); 1808 1809 ActionList SingleActions; 1810 BuildActions(C, Args, BAInputs, SingleActions); 1811 1812 // Add in arch bindings for every top level action, as well as lipo and 1813 // dsymutil steps if needed. 1814 for (Action* Act : SingleActions) { 1815 // Make sure we can lipo this kind of output. If not (and it is an actual 1816 // output) then we disallow, since we can't create an output file with the 1817 // right name without overwriting it. We could remove this oddity by just 1818 // changing the output names to include the arch, which would also fix 1819 // -save-temps. Compatibility wins for now. 1820 1821 if (Archs.size() > 1 && !types::canLipoType(Act->getType())) 1822 Diag(clang::diag::err_drv_invalid_output_with_multiple_archs) 1823 << types::getTypeName(Act->getType()); 1824 1825 ActionList Inputs; 1826 for (unsigned i = 0, e = Archs.size(); i != e; ++i) 1827 Inputs.push_back(C.MakeAction<BindArchAction>(Act, Archs[i])); 1828 1829 // Lipo if necessary, we do it this way because we need to set the arch flag 1830 // so that -Xarch_ gets overwritten. 1831 if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing) 1832 Actions.append(Inputs.begin(), Inputs.end()); 1833 else 1834 Actions.push_back(C.MakeAction<LipoJobAction>(Inputs, Act->getType())); 1835 1836 // Handle debug info queries. 1837 Arg *A = Args.getLastArg(options::OPT_g_Group); 1838 if (A && !A->getOption().matches(options::OPT_g0) && 1839 !A->getOption().matches(options::OPT_gstabs) && 1840 ContainsCompileOrAssembleAction(Actions.back())) { 1841 1842 // Add a 'dsymutil' step if necessary, when debug info is enabled and we 1843 // have a compile input. We need to run 'dsymutil' ourselves in such cases 1844 // because the debug info will refer to a temporary object file which 1845 // will be removed at the end of the compilation process. 1846 if (Act->getType() == types::TY_Image) { 1847 ActionList Inputs; 1848 Inputs.push_back(Actions.back()); 1849 Actions.pop_back(); 1850 Actions.push_back( 1851 C.MakeAction<DsymutilJobAction>(Inputs, types::TY_dSYM)); 1852 } 1853 1854 // Verify the debug info output. 1855 if (Args.hasArg(options::OPT_verify_debug_info)) { 1856 Action* LastAction = Actions.back(); 1857 Actions.pop_back(); 1858 Actions.push_back(C.MakeAction<VerifyDebugInfoJobAction>( 1859 LastAction, types::TY_Nothing)); 1860 } 1861 } 1862 } 1863 } 1864 1865 /// Check that the file referenced by Value exists. If it doesn't, 1866 /// issue a diagnostic and return false. 1867 static bool DiagnoseInputExistence(const Driver &D, const DerivedArgList &Args, 1868 StringRef Value, types::ID Ty) { 1869 if (!D.getCheckInputsExist()) 1870 return true; 1871 1872 // stdin always exists. 1873 if (Value == "-") 1874 return true; 1875 1876 SmallString<64> Path(Value); 1877 if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) { 1878 if (!llvm::sys::path::is_absolute(Path)) { 1879 SmallString<64> Directory(WorkDir->getValue()); 1880 llvm::sys::path::append(Directory, Value); 1881 Path.assign(Directory); 1882 } 1883 } 1884 1885 if (llvm::sys::fs::exists(Twine(Path))) 1886 return true; 1887 1888 if (D.IsCLMode()) { 1889 if (!llvm::sys::path::is_absolute(Twine(Path)) && 1890 llvm::sys::Process::FindInEnvPath("LIB", Value)) 1891 return true; 1892 1893 if (Args.hasArg(options::OPT__SLASH_link) && Ty == types::TY_Object) { 1894 // Arguments to the /link flag might cause the linker to search for object 1895 // and library files in paths we don't know about. Don't error in such 1896 // cases. 1897 return true; 1898 } 1899 } 1900 1901 D.Diag(clang::diag::err_drv_no_such_file) << Path; 1902 return false; 1903 } 1904 1905 // Construct a the list of inputs and their types. 1906 void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args, 1907 InputList &Inputs) const { 1908 // Track the current user specified (-x) input. We also explicitly track the 1909 // argument used to set the type; we only want to claim the type when we 1910 // actually use it, so we warn about unused -x arguments. 1911 types::ID InputType = types::TY_Nothing; 1912 Arg *InputTypeArg = nullptr; 1913 1914 // The last /TC or /TP option sets the input type to C or C++ globally. 1915 if (Arg *TCTP = Args.getLastArgNoClaim(options::OPT__SLASH_TC, 1916 options::OPT__SLASH_TP)) { 1917 InputTypeArg = TCTP; 1918 InputType = TCTP->getOption().matches(options::OPT__SLASH_TC) 1919 ? types::TY_C 1920 : types::TY_CXX; 1921 1922 Arg *Previous = nullptr; 1923 bool ShowNote = false; 1924 for (Arg *A : Args.filtered(options::OPT__SLASH_TC, options::OPT__SLASH_TP)) { 1925 if (Previous) { 1926 Diag(clang::diag::warn_drv_overriding_flag_option) 1927 << Previous->getSpelling() << A->getSpelling(); 1928 ShowNote = true; 1929 } 1930 Previous = A; 1931 } 1932 if (ShowNote) 1933 Diag(clang::diag::note_drv_t_option_is_global); 1934 1935 // No driver mode exposes -x and /TC or /TP; we don't support mixing them. 1936 assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed"); 1937 } 1938 1939 for (Arg *A : Args) { 1940 if (A->getOption().getKind() == Option::InputClass) { 1941 const char *Value = A->getValue(); 1942 types::ID Ty = types::TY_INVALID; 1943 1944 // Infer the input type if necessary. 1945 if (InputType == types::TY_Nothing) { 1946 // If there was an explicit arg for this, claim it. 1947 if (InputTypeArg) 1948 InputTypeArg->claim(); 1949 1950 // stdin must be handled specially. 1951 if (memcmp(Value, "-", 2) == 0) { 1952 // If running with -E, treat as a C input (this changes the builtin 1953 // macros, for example). This may be overridden by -ObjC below. 1954 // 1955 // Otherwise emit an error but still use a valid type to avoid 1956 // spurious errors (e.g., no inputs). 1957 if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP()) 1958 Diag(IsCLMode() ? clang::diag::err_drv_unknown_stdin_type_clang_cl 1959 : clang::diag::err_drv_unknown_stdin_type); 1960 Ty = types::TY_C; 1961 } else { 1962 // Otherwise lookup by extension. 1963 // Fallback is C if invoked as C preprocessor or Object otherwise. 1964 // We use a host hook here because Darwin at least has its own 1965 // idea of what .s is. 1966 if (const char *Ext = strrchr(Value, '.')) 1967 Ty = TC.LookupTypeForExtension(Ext + 1); 1968 1969 if (Ty == types::TY_INVALID) { 1970 if (CCCIsCPP()) 1971 Ty = types::TY_C; 1972 else 1973 Ty = types::TY_Object; 1974 } 1975 1976 // If the driver is invoked as C++ compiler (like clang++ or c++) it 1977 // should autodetect some input files as C++ for g++ compatibility. 1978 if (CCCIsCXX()) { 1979 types::ID OldTy = Ty; 1980 Ty = types::lookupCXXTypeForCType(Ty); 1981 1982 if (Ty != OldTy) 1983 Diag(clang::diag::warn_drv_treating_input_as_cxx) 1984 << getTypeName(OldTy) << getTypeName(Ty); 1985 } 1986 } 1987 1988 // -ObjC and -ObjC++ override the default language, but only for "source 1989 // files". We just treat everything that isn't a linker input as a 1990 // source file. 1991 // 1992 // FIXME: Clean this up if we move the phase sequence into the type. 1993 if (Ty != types::TY_Object) { 1994 if (Args.hasArg(options::OPT_ObjC)) 1995 Ty = types::TY_ObjC; 1996 else if (Args.hasArg(options::OPT_ObjCXX)) 1997 Ty = types::TY_ObjCXX; 1998 } 1999 } else { 2000 assert(InputTypeArg && "InputType set w/o InputTypeArg"); 2001 if (!InputTypeArg->getOption().matches(options::OPT_x)) { 2002 // If emulating cl.exe, make sure that /TC and /TP don't affect input 2003 // object files. 2004 const char *Ext = strrchr(Value, '.'); 2005 if (Ext && TC.LookupTypeForExtension(Ext + 1) == types::TY_Object) 2006 Ty = types::TY_Object; 2007 } 2008 if (Ty == types::TY_INVALID) { 2009 Ty = InputType; 2010 InputTypeArg->claim(); 2011 } 2012 } 2013 2014 if (DiagnoseInputExistence(*this, Args, Value, Ty)) 2015 Inputs.push_back(std::make_pair(Ty, A)); 2016 2017 } else if (A->getOption().matches(options::OPT__SLASH_Tc)) { 2018 StringRef Value = A->getValue(); 2019 if (DiagnoseInputExistence(*this, Args, Value, types::TY_C)) { 2020 Arg *InputArg = MakeInputArg(Args, *Opts, A->getValue()); 2021 Inputs.push_back(std::make_pair(types::TY_C, InputArg)); 2022 } 2023 A->claim(); 2024 } else if (A->getOption().matches(options::OPT__SLASH_Tp)) { 2025 StringRef Value = A->getValue(); 2026 if (DiagnoseInputExistence(*this, Args, Value, types::TY_CXX)) { 2027 Arg *InputArg = MakeInputArg(Args, *Opts, A->getValue()); 2028 Inputs.push_back(std::make_pair(types::TY_CXX, InputArg)); 2029 } 2030 A->claim(); 2031 } else if (A->getOption().hasFlag(options::LinkerInput)) { 2032 // Just treat as object type, we could make a special type for this if 2033 // necessary. 2034 Inputs.push_back(std::make_pair(types::TY_Object, A)); 2035 2036 } else if (A->getOption().matches(options::OPT_x)) { 2037 InputTypeArg = A; 2038 InputType = types::lookupTypeForTypeSpecifier(A->getValue()); 2039 A->claim(); 2040 2041 // Follow gcc behavior and treat as linker input for invalid -x 2042 // options. Its not clear why we shouldn't just revert to unknown; but 2043 // this isn't very important, we might as well be bug compatible. 2044 if (!InputType) { 2045 Diag(clang::diag::err_drv_unknown_language) << A->getValue(); 2046 InputType = types::TY_Object; 2047 } 2048 } else if (A->getOption().getID() == options::OPT__SLASH_U) { 2049 assert(A->getNumValues() == 1 && "The /U option has one value."); 2050 StringRef Val = A->getValue(0); 2051 if (Val.find_first_of("/\\") != StringRef::npos) { 2052 // Warn about e.g. "/Users/me/myfile.c". 2053 Diag(diag::warn_slash_u_filename) << Val; 2054 Diag(diag::note_use_dashdash); 2055 } 2056 } 2057 } 2058 if (CCCIsCPP() && Inputs.empty()) { 2059 // If called as standalone preprocessor, stdin is processed 2060 // if no other input is present. 2061 Arg *A = MakeInputArg(Args, *Opts, "-"); 2062 Inputs.push_back(std::make_pair(types::TY_C, A)); 2063 } 2064 } 2065 2066 namespace { 2067 /// Provides a convenient interface for different programming models to generate 2068 /// the required device actions. 2069 class OffloadingActionBuilder final { 2070 /// Flag used to trace errors in the builder. 2071 bool IsValid = false; 2072 2073 /// The compilation that is using this builder. 2074 Compilation &C; 2075 2076 /// Map between an input argument and the offload kinds used to process it. 2077 std::map<const Arg *, unsigned> InputArgToOffloadKindMap; 2078 2079 /// Builder interface. It doesn't build anything or keep any state. 2080 class DeviceActionBuilder { 2081 public: 2082 typedef llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PhasesTy; 2083 2084 enum ActionBuilderReturnCode { 2085 // The builder acted successfully on the current action. 2086 ABRT_Success, 2087 // The builder didn't have to act on the current action. 2088 ABRT_Inactive, 2089 // The builder was successful and requested the host action to not be 2090 // generated. 2091 ABRT_Ignore_Host, 2092 }; 2093 2094 protected: 2095 /// Compilation associated with this builder. 2096 Compilation &C; 2097 2098 /// Tool chains associated with this builder. The same programming 2099 /// model may have associated one or more tool chains. 2100 SmallVector<const ToolChain *, 2> ToolChains; 2101 2102 /// The derived arguments associated with this builder. 2103 DerivedArgList &Args; 2104 2105 /// The inputs associated with this builder. 2106 const Driver::InputList &Inputs; 2107 2108 /// The associated offload kind. 2109 Action::OffloadKind AssociatedOffloadKind = Action::OFK_None; 2110 2111 public: 2112 DeviceActionBuilder(Compilation &C, DerivedArgList &Args, 2113 const Driver::InputList &Inputs, 2114 Action::OffloadKind AssociatedOffloadKind) 2115 : C(C), Args(Args), Inputs(Inputs), 2116 AssociatedOffloadKind(AssociatedOffloadKind) {} 2117 virtual ~DeviceActionBuilder() {} 2118 2119 /// Fill up the array \a DA with all the device dependences that should be 2120 /// added to the provided host action \a HostAction. By default it is 2121 /// inactive. 2122 virtual ActionBuilderReturnCode 2123 getDeviceDependences(OffloadAction::DeviceDependences &DA, 2124 phases::ID CurPhase, phases::ID FinalPhase, 2125 PhasesTy &Phases) { 2126 return ABRT_Inactive; 2127 } 2128 2129 /// Update the state to include the provided host action \a HostAction as a 2130 /// dependency of the current device action. By default it is inactive. 2131 virtual ActionBuilderReturnCode addDeviceDepences(Action *HostAction) { 2132 return ABRT_Inactive; 2133 } 2134 2135 /// Append top level actions generated by the builder. Return true if errors 2136 /// were found. 2137 virtual void appendTopLevelActions(ActionList &AL) {} 2138 2139 /// Append linker actions generated by the builder. Return true if errors 2140 /// were found. 2141 virtual void appendLinkDependences(OffloadAction::DeviceDependences &DA) {} 2142 2143 /// Initialize the builder. Return true if any initialization errors are 2144 /// found. 2145 virtual bool initialize() { return false; } 2146 2147 /// Return true if the builder can use bundling/unbundling. 2148 virtual bool canUseBundlerUnbundler() const { return false; } 2149 2150 /// Return true if this builder is valid. We have a valid builder if we have 2151 /// associated device tool chains. 2152 bool isValid() { return !ToolChains.empty(); } 2153 2154 /// Return the associated offload kind. 2155 Action::OffloadKind getAssociatedOffloadKind() { 2156 return AssociatedOffloadKind; 2157 } 2158 }; 2159 2160 /// Base class for CUDA/HIP action builder. It injects device code in 2161 /// the host backend action. 2162 class CudaActionBuilderBase : public DeviceActionBuilder { 2163 protected: 2164 /// Flags to signal if the user requested host-only or device-only 2165 /// compilation. 2166 bool CompileHostOnly = false; 2167 bool CompileDeviceOnly = false; 2168 2169 /// List of GPU architectures to use in this compilation. 2170 SmallVector<CudaArch, 4> GpuArchList; 2171 2172 /// The CUDA actions for the current input. 2173 ActionList CudaDeviceActions; 2174 2175 /// The CUDA fat binary if it was generated for the current input. 2176 Action *CudaFatBinary = nullptr; 2177 2178 /// Flag that is set to true if this builder acted on the current input. 2179 bool IsActive = false; 2180 public: 2181 CudaActionBuilderBase(Compilation &C, DerivedArgList &Args, 2182 const Driver::InputList &Inputs, 2183 Action::OffloadKind OFKind) 2184 : DeviceActionBuilder(C, Args, Inputs, OFKind) {} 2185 2186 ActionBuilderReturnCode addDeviceDepences(Action *HostAction) override { 2187 // While generating code for CUDA, we only depend on the host input action 2188 // to trigger the creation of all the CUDA device actions. 2189 2190 // If we are dealing with an input action, replicate it for each GPU 2191 // architecture. If we are in host-only mode we return 'success' so that 2192 // the host uses the CUDA offload kind. 2193 if (auto *IA = dyn_cast<InputAction>(HostAction)) { 2194 assert(!GpuArchList.empty() && 2195 "We should have at least one GPU architecture."); 2196 2197 // If the host input is not CUDA or HIP, we don't need to bother about 2198 // this input. 2199 if (IA->getType() != types::TY_CUDA && 2200 IA->getType() != types::TY_HIP) { 2201 // The builder will ignore this input. 2202 IsActive = false; 2203 return ABRT_Inactive; 2204 } 2205 2206 // Set the flag to true, so that the builder acts on the current input. 2207 IsActive = true; 2208 2209 if (CompileHostOnly) 2210 return ABRT_Success; 2211 2212 // Replicate inputs for each GPU architecture. 2213 auto Ty = IA->getType() == types::TY_HIP ? types::TY_HIP_DEVICE 2214 : types::TY_CUDA_DEVICE; 2215 for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I) { 2216 CudaDeviceActions.push_back( 2217 C.MakeAction<InputAction>(IA->getInputArg(), Ty)); 2218 } 2219 2220 return ABRT_Success; 2221 } 2222 2223 // If this is an unbundling action use it as is for each CUDA toolchain. 2224 if (auto *UA = dyn_cast<OffloadUnbundlingJobAction>(HostAction)) { 2225 CudaDeviceActions.clear(); 2226 for (auto Arch : GpuArchList) { 2227 CudaDeviceActions.push_back(UA); 2228 UA->registerDependentActionInfo(ToolChains[0], CudaArchToString(Arch), 2229 AssociatedOffloadKind); 2230 } 2231 return ABRT_Success; 2232 } 2233 2234 return IsActive ? ABRT_Success : ABRT_Inactive; 2235 } 2236 2237 void appendTopLevelActions(ActionList &AL) override { 2238 // Utility to append actions to the top level list. 2239 auto AddTopLevel = [&](Action *A, CudaArch BoundArch) { 2240 OffloadAction::DeviceDependences Dep; 2241 Dep.add(*A, *ToolChains.front(), CudaArchToString(BoundArch), 2242 AssociatedOffloadKind); 2243 AL.push_back(C.MakeAction<OffloadAction>(Dep, A->getType())); 2244 }; 2245 2246 // If we have a fat binary, add it to the list. 2247 if (CudaFatBinary) { 2248 AddTopLevel(CudaFatBinary, CudaArch::UNKNOWN); 2249 CudaDeviceActions.clear(); 2250 CudaFatBinary = nullptr; 2251 return; 2252 } 2253 2254 if (CudaDeviceActions.empty()) 2255 return; 2256 2257 // If we have CUDA actions at this point, that's because we have a have 2258 // partial compilation, so we should have an action for each GPU 2259 // architecture. 2260 assert(CudaDeviceActions.size() == GpuArchList.size() && 2261 "Expecting one action per GPU architecture."); 2262 assert(ToolChains.size() == 1 && 2263 "Expecting to have a sing CUDA toolchain."); 2264 for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I) 2265 AddTopLevel(CudaDeviceActions[I], GpuArchList[I]); 2266 2267 CudaDeviceActions.clear(); 2268 } 2269 2270 bool initialize() override { 2271 assert(AssociatedOffloadKind == Action::OFK_Cuda || 2272 AssociatedOffloadKind == Action::OFK_HIP); 2273 2274 // We don't need to support CUDA. 2275 if (AssociatedOffloadKind == Action::OFK_Cuda && 2276 !C.hasOffloadToolChain<Action::OFK_Cuda>()) 2277 return false; 2278 2279 // We don't need to support HIP. 2280 if (AssociatedOffloadKind == Action::OFK_HIP && 2281 !C.hasOffloadToolChain<Action::OFK_HIP>()) 2282 return false; 2283 2284 const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>(); 2285 assert(HostTC && "No toolchain for host compilation."); 2286 if (HostTC->getTriple().isNVPTX() || 2287 HostTC->getTriple().getArch() == llvm::Triple::amdgcn) { 2288 // We do not support targeting NVPTX/AMDGCN for host compilation. Throw 2289 // an error and abort pipeline construction early so we don't trip 2290 // asserts that assume device-side compilation. 2291 C.getDriver().Diag(diag::err_drv_cuda_host_arch) 2292 << HostTC->getTriple().getArchName(); 2293 return true; 2294 } 2295 2296 ToolChains.push_back( 2297 AssociatedOffloadKind == Action::OFK_Cuda 2298 ? C.getSingleOffloadToolChain<Action::OFK_Cuda>() 2299 : C.getSingleOffloadToolChain<Action::OFK_HIP>()); 2300 2301 Arg *PartialCompilationArg = Args.getLastArg( 2302 options::OPT_cuda_host_only, options::OPT_cuda_device_only, 2303 options::OPT_cuda_compile_host_device); 2304 CompileHostOnly = PartialCompilationArg && 2305 PartialCompilationArg->getOption().matches( 2306 options::OPT_cuda_host_only); 2307 CompileDeviceOnly = PartialCompilationArg && 2308 PartialCompilationArg->getOption().matches( 2309 options::OPT_cuda_device_only); 2310 2311 // Collect all cuda_gpu_arch parameters, removing duplicates. 2312 std::set<CudaArch> GpuArchs; 2313 bool Error = false; 2314 for (Arg *A : Args) { 2315 if (!(A->getOption().matches(options::OPT_cuda_gpu_arch_EQ) || 2316 A->getOption().matches(options::OPT_no_cuda_gpu_arch_EQ))) 2317 continue; 2318 A->claim(); 2319 2320 const StringRef ArchStr = A->getValue(); 2321 if (A->getOption().matches(options::OPT_no_cuda_gpu_arch_EQ) && 2322 ArchStr == "all") { 2323 GpuArchs.clear(); 2324 continue; 2325 } 2326 CudaArch Arch = StringToCudaArch(ArchStr); 2327 if (Arch == CudaArch::UNKNOWN) { 2328 C.getDriver().Diag(clang::diag::err_drv_cuda_bad_gpu_arch) << ArchStr; 2329 Error = true; 2330 } else if (A->getOption().matches(options::OPT_cuda_gpu_arch_EQ)) 2331 GpuArchs.insert(Arch); 2332 else if (A->getOption().matches(options::OPT_no_cuda_gpu_arch_EQ)) 2333 GpuArchs.erase(Arch); 2334 else 2335 llvm_unreachable("Unexpected option."); 2336 } 2337 2338 // Collect list of GPUs remaining in the set. 2339 for (CudaArch Arch : GpuArchs) 2340 GpuArchList.push_back(Arch); 2341 2342 // Default to sm_20 which is the lowest common denominator for 2343 // supported GPUs. sm_20 code should work correctly, if 2344 // suboptimally, on all newer GPUs. 2345 if (GpuArchList.empty()) 2346 GpuArchList.push_back(CudaArch::SM_20); 2347 2348 return Error; 2349 } 2350 }; 2351 2352 /// \brief CUDA action builder. It injects device code in the host backend 2353 /// action. 2354 class CudaActionBuilder final : public CudaActionBuilderBase { 2355 public: 2356 CudaActionBuilder(Compilation &C, DerivedArgList &Args, 2357 const Driver::InputList &Inputs) 2358 : CudaActionBuilderBase(C, Args, Inputs, Action::OFK_Cuda) {} 2359 2360 ActionBuilderReturnCode 2361 getDeviceDependences(OffloadAction::DeviceDependences &DA, 2362 phases::ID CurPhase, phases::ID FinalPhase, 2363 PhasesTy &Phases) override { 2364 if (!IsActive) 2365 return ABRT_Inactive; 2366 2367 // If we don't have more CUDA actions, we don't have any dependences to 2368 // create for the host. 2369 if (CudaDeviceActions.empty()) 2370 return ABRT_Success; 2371 2372 assert(CudaDeviceActions.size() == GpuArchList.size() && 2373 "Expecting one action per GPU architecture."); 2374 assert(!CompileHostOnly && 2375 "Not expecting CUDA actions in host-only compilation."); 2376 2377 // If we are generating code for the device or we are in a backend phase, 2378 // we attempt to generate the fat binary. We compile each arch to ptx and 2379 // assemble to cubin, then feed the cubin *and* the ptx into a device 2380 // "link" action, which uses fatbinary to combine these cubins into one 2381 // fatbin. The fatbin is then an input to the host action if not in 2382 // device-only mode. 2383 if (CompileDeviceOnly || CurPhase == phases::Backend) { 2384 ActionList DeviceActions; 2385 for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I) { 2386 // Produce the device action from the current phase up to the assemble 2387 // phase. 2388 for (auto Ph : Phases) { 2389 // Skip the phases that were already dealt with. 2390 if (Ph < CurPhase) 2391 continue; 2392 // We have to be consistent with the host final phase. 2393 if (Ph > FinalPhase) 2394 break; 2395 2396 CudaDeviceActions[I] = C.getDriver().ConstructPhaseAction( 2397 C, Args, Ph, CudaDeviceActions[I], Action::OFK_Cuda); 2398 2399 if (Ph == phases::Assemble) 2400 break; 2401 } 2402 2403 // If we didn't reach the assemble phase, we can't generate the fat 2404 // binary. We don't need to generate the fat binary if we are not in 2405 // device-only mode. 2406 if (!isa<AssembleJobAction>(CudaDeviceActions[I]) || 2407 CompileDeviceOnly) 2408 continue; 2409 2410 Action *AssembleAction = CudaDeviceActions[I]; 2411 assert(AssembleAction->getType() == types::TY_Object); 2412 assert(AssembleAction->getInputs().size() == 1); 2413 2414 Action *BackendAction = AssembleAction->getInputs()[0]; 2415 assert(BackendAction->getType() == types::TY_PP_Asm); 2416 2417 for (auto &A : {AssembleAction, BackendAction}) { 2418 OffloadAction::DeviceDependences DDep; 2419 DDep.add(*A, *ToolChains.front(), CudaArchToString(GpuArchList[I]), 2420 Action::OFK_Cuda); 2421 DeviceActions.push_back( 2422 C.MakeAction<OffloadAction>(DDep, A->getType())); 2423 } 2424 } 2425 2426 // We generate the fat binary if we have device input actions. 2427 if (!DeviceActions.empty()) { 2428 CudaFatBinary = 2429 C.MakeAction<LinkJobAction>(DeviceActions, types::TY_CUDA_FATBIN); 2430 2431 if (!CompileDeviceOnly) { 2432 DA.add(*CudaFatBinary, *ToolChains.front(), /*BoundArch=*/nullptr, 2433 Action::OFK_Cuda); 2434 // Clear the fat binary, it is already a dependence to an host 2435 // action. 2436 CudaFatBinary = nullptr; 2437 } 2438 2439 // Remove the CUDA actions as they are already connected to an host 2440 // action or fat binary. 2441 CudaDeviceActions.clear(); 2442 } 2443 2444 // We avoid creating host action in device-only mode. 2445 return CompileDeviceOnly ? ABRT_Ignore_Host : ABRT_Success; 2446 } else if (CurPhase > phases::Backend) { 2447 // If we are past the backend phase and still have a device action, we 2448 // don't have to do anything as this action is already a device 2449 // top-level action. 2450 return ABRT_Success; 2451 } 2452 2453 assert(CurPhase < phases::Backend && "Generating single CUDA " 2454 "instructions should only occur " 2455 "before the backend phase!"); 2456 2457 // By default, we produce an action for each device arch. 2458 for (Action *&A : CudaDeviceActions) 2459 A = C.getDriver().ConstructPhaseAction(C, Args, CurPhase, A); 2460 2461 return ABRT_Success; 2462 } 2463 }; 2464 /// \brief HIP action builder. It injects device code in the host backend 2465 /// action. 2466 class HIPActionBuilder final : public CudaActionBuilderBase { 2467 /// The linker inputs obtained for each device arch. 2468 SmallVector<ActionList, 8> DeviceLinkerInputs; 2469 2470 public: 2471 HIPActionBuilder(Compilation &C, DerivedArgList &Args, 2472 const Driver::InputList &Inputs) 2473 : CudaActionBuilderBase(C, Args, Inputs, Action::OFK_HIP) {} 2474 2475 bool canUseBundlerUnbundler() const override { return true; } 2476 2477 ActionBuilderReturnCode 2478 getDeviceDependences(OffloadAction::DeviceDependences &DA, 2479 phases::ID CurPhase, phases::ID FinalPhase, 2480 PhasesTy &Phases) override { 2481 // amdgcn does not support linking of object files, therefore we skip 2482 // backend and assemble phases to output LLVM IR. 2483 if (CudaDeviceActions.empty() || CurPhase == phases::Backend || 2484 CurPhase == phases::Assemble) 2485 return ABRT_Success; 2486 2487 assert((CurPhase == phases::Link || 2488 CudaDeviceActions.size() == GpuArchList.size()) && 2489 "Expecting one action per GPU architecture."); 2490 assert(!CompileHostOnly && 2491 "Not expecting CUDA actions in host-only compilation."); 2492 2493 // Save CudaDeviceActions to DeviceLinkerInputs for each GPU subarch. 2494 // This happens to each device action originated from each input file. 2495 // Later on, device actions in DeviceLinkerInputs are used to create 2496 // device link actions in appendLinkDependences and the created device 2497 // link actions are passed to the offload action as device dependence. 2498 if (CurPhase == phases::Link) { 2499 DeviceLinkerInputs.resize(CudaDeviceActions.size()); 2500 auto LI = DeviceLinkerInputs.begin(); 2501 for (auto *A : CudaDeviceActions) { 2502 LI->push_back(A); 2503 ++LI; 2504 } 2505 2506 // We will pass the device action as a host dependence, so we don't 2507 // need to do anything else with them. 2508 CudaDeviceActions.clear(); 2509 return ABRT_Success; 2510 } 2511 2512 // By default, we produce an action for each device arch. 2513 for (Action *&A : CudaDeviceActions) 2514 A = C.getDriver().ConstructPhaseAction(C, Args, CurPhase, A, 2515 AssociatedOffloadKind); 2516 2517 return ABRT_Success; 2518 } 2519 2520 void appendLinkDependences(OffloadAction::DeviceDependences &DA) override { 2521 // Append a new link action for each device. 2522 unsigned I = 0; 2523 for (auto &LI : DeviceLinkerInputs) { 2524 auto *DeviceLinkAction = 2525 C.MakeAction<LinkJobAction>(LI, types::TY_Image); 2526 DA.add(*DeviceLinkAction, *ToolChains[0], 2527 CudaArchToString(GpuArchList[I]), AssociatedOffloadKind); 2528 ++I; 2529 } 2530 } 2531 }; 2532 2533 /// OpenMP action builder. The host bitcode is passed to the device frontend 2534 /// and all the device linked images are passed to the host link phase. 2535 class OpenMPActionBuilder final : public DeviceActionBuilder { 2536 /// The OpenMP actions for the current input. 2537 ActionList OpenMPDeviceActions; 2538 2539 /// The linker inputs obtained for each toolchain. 2540 SmallVector<ActionList, 8> DeviceLinkerInputs; 2541 2542 public: 2543 OpenMPActionBuilder(Compilation &C, DerivedArgList &Args, 2544 const Driver::InputList &Inputs) 2545 : DeviceActionBuilder(C, Args, Inputs, Action::OFK_OpenMP) {} 2546 2547 ActionBuilderReturnCode 2548 getDeviceDependences(OffloadAction::DeviceDependences &DA, 2549 phases::ID CurPhase, phases::ID FinalPhase, 2550 PhasesTy &Phases) override { 2551 2552 // We should always have an action for each input. 2553 assert(OpenMPDeviceActions.size() == ToolChains.size() && 2554 "Number of OpenMP actions and toolchains do not match."); 2555 2556 // The host only depends on device action in the linking phase, when all 2557 // the device images have to be embedded in the host image. 2558 if (CurPhase == phases::Link) { 2559 assert(ToolChains.size() == DeviceLinkerInputs.size() && 2560 "Toolchains and linker inputs sizes do not match."); 2561 auto LI = DeviceLinkerInputs.begin(); 2562 for (auto *A : OpenMPDeviceActions) { 2563 LI->push_back(A); 2564 ++LI; 2565 } 2566 2567 // We passed the device action as a host dependence, so we don't need to 2568 // do anything else with them. 2569 OpenMPDeviceActions.clear(); 2570 return ABRT_Success; 2571 } 2572 2573 // By default, we produce an action for each device arch. 2574 for (Action *&A : OpenMPDeviceActions) 2575 A = C.getDriver().ConstructPhaseAction(C, Args, CurPhase, A); 2576 2577 return ABRT_Success; 2578 } 2579 2580 ActionBuilderReturnCode addDeviceDepences(Action *HostAction) override { 2581 2582 // If this is an input action replicate it for each OpenMP toolchain. 2583 if (auto *IA = dyn_cast<InputAction>(HostAction)) { 2584 OpenMPDeviceActions.clear(); 2585 for (unsigned I = 0; I < ToolChains.size(); ++I) 2586 OpenMPDeviceActions.push_back( 2587 C.MakeAction<InputAction>(IA->getInputArg(), IA->getType())); 2588 return ABRT_Success; 2589 } 2590 2591 // If this is an unbundling action use it as is for each OpenMP toolchain. 2592 if (auto *UA = dyn_cast<OffloadUnbundlingJobAction>(HostAction)) { 2593 OpenMPDeviceActions.clear(); 2594 for (unsigned I = 0; I < ToolChains.size(); ++I) { 2595 OpenMPDeviceActions.push_back(UA); 2596 UA->registerDependentActionInfo( 2597 ToolChains[I], /*BoundArch=*/StringRef(), Action::OFK_OpenMP); 2598 } 2599 return ABRT_Success; 2600 } 2601 2602 // When generating code for OpenMP we use the host compile phase result as 2603 // a dependence to the device compile phase so that it can learn what 2604 // declarations should be emitted. However, this is not the only use for 2605 // the host action, so we prevent it from being collapsed. 2606 if (isa<CompileJobAction>(HostAction)) { 2607 HostAction->setCannotBeCollapsedWithNextDependentAction(); 2608 assert(ToolChains.size() == OpenMPDeviceActions.size() && 2609 "Toolchains and device action sizes do not match."); 2610 OffloadAction::HostDependence HDep( 2611 *HostAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(), 2612 /*BoundArch=*/nullptr, Action::OFK_OpenMP); 2613 auto TC = ToolChains.begin(); 2614 for (Action *&A : OpenMPDeviceActions) { 2615 assert(isa<CompileJobAction>(A)); 2616 OffloadAction::DeviceDependences DDep; 2617 DDep.add(*A, **TC, /*BoundArch=*/nullptr, Action::OFK_OpenMP); 2618 A = C.MakeAction<OffloadAction>(HDep, DDep); 2619 ++TC; 2620 } 2621 } 2622 return ABRT_Success; 2623 } 2624 2625 void appendTopLevelActions(ActionList &AL) override { 2626 if (OpenMPDeviceActions.empty()) 2627 return; 2628 2629 // We should always have an action for each input. 2630 assert(OpenMPDeviceActions.size() == ToolChains.size() && 2631 "Number of OpenMP actions and toolchains do not match."); 2632 2633 // Append all device actions followed by the proper offload action. 2634 auto TI = ToolChains.begin(); 2635 for (auto *A : OpenMPDeviceActions) { 2636 OffloadAction::DeviceDependences Dep; 2637 Dep.add(*A, **TI, /*BoundArch=*/nullptr, Action::OFK_OpenMP); 2638 AL.push_back(C.MakeAction<OffloadAction>(Dep, A->getType())); 2639 ++TI; 2640 } 2641 // We no longer need the action stored in this builder. 2642 OpenMPDeviceActions.clear(); 2643 } 2644 2645 void appendLinkDependences(OffloadAction::DeviceDependences &DA) override { 2646 assert(ToolChains.size() == DeviceLinkerInputs.size() && 2647 "Toolchains and linker inputs sizes do not match."); 2648 2649 // Append a new link action for each device. 2650 auto TC = ToolChains.begin(); 2651 for (auto &LI : DeviceLinkerInputs) { 2652 auto *DeviceLinkAction = 2653 C.MakeAction<LinkJobAction>(LI, types::TY_Image); 2654 DA.add(*DeviceLinkAction, **TC, /*BoundArch=*/nullptr, 2655 Action::OFK_OpenMP); 2656 ++TC; 2657 } 2658 } 2659 2660 bool initialize() override { 2661 // Get the OpenMP toolchains. If we don't get any, the action builder will 2662 // know there is nothing to do related to OpenMP offloading. 2663 auto OpenMPTCRange = C.getOffloadToolChains<Action::OFK_OpenMP>(); 2664 for (auto TI = OpenMPTCRange.first, TE = OpenMPTCRange.second; TI != TE; 2665 ++TI) 2666 ToolChains.push_back(TI->second); 2667 2668 DeviceLinkerInputs.resize(ToolChains.size()); 2669 return false; 2670 } 2671 2672 bool canUseBundlerUnbundler() const override { 2673 // OpenMP should use bundled files whenever possible. 2674 return true; 2675 } 2676 }; 2677 2678 /// 2679 /// TODO: Add the implementation for other specialized builders here. 2680 /// 2681 2682 /// Specialized builders being used by this offloading action builder. 2683 SmallVector<DeviceActionBuilder *, 4> SpecializedBuilders; 2684 2685 /// Flag set to true if all valid builders allow file bundling/unbundling. 2686 bool CanUseBundler; 2687 2688 public: 2689 OffloadingActionBuilder(Compilation &C, DerivedArgList &Args, 2690 const Driver::InputList &Inputs) 2691 : C(C) { 2692 // Create a specialized builder for each device toolchain. 2693 2694 IsValid = true; 2695 2696 // Create a specialized builder for CUDA. 2697 SpecializedBuilders.push_back(new CudaActionBuilder(C, Args, Inputs)); 2698 2699 // Create a specialized builder for HIP. 2700 SpecializedBuilders.push_back(new HIPActionBuilder(C, Args, Inputs)); 2701 2702 // Create a specialized builder for OpenMP. 2703 SpecializedBuilders.push_back(new OpenMPActionBuilder(C, Args, Inputs)); 2704 2705 // 2706 // TODO: Build other specialized builders here. 2707 // 2708 2709 // Initialize all the builders, keeping track of errors. If all valid 2710 // builders agree that we can use bundling, set the flag to true. 2711 unsigned ValidBuilders = 0u; 2712 unsigned ValidBuildersSupportingBundling = 0u; 2713 for (auto *SB : SpecializedBuilders) { 2714 IsValid = IsValid && !SB->initialize(); 2715 2716 // Update the counters if the builder is valid. 2717 if (SB->isValid()) { 2718 ++ValidBuilders; 2719 if (SB->canUseBundlerUnbundler()) 2720 ++ValidBuildersSupportingBundling; 2721 } 2722 } 2723 CanUseBundler = 2724 ValidBuilders && ValidBuilders == ValidBuildersSupportingBundling; 2725 } 2726 2727 ~OffloadingActionBuilder() { 2728 for (auto *SB : SpecializedBuilders) 2729 delete SB; 2730 } 2731 2732 /// Generate an action that adds device dependences (if any) to a host action. 2733 /// If no device dependence actions exist, just return the host action \a 2734 /// HostAction. If an error is found or if no builder requires the host action 2735 /// to be generated, return nullptr. 2736 Action * 2737 addDeviceDependencesToHostAction(Action *HostAction, const Arg *InputArg, 2738 phases::ID CurPhase, phases::ID FinalPhase, 2739 DeviceActionBuilder::PhasesTy &Phases) { 2740 if (!IsValid) 2741 return nullptr; 2742 2743 if (SpecializedBuilders.empty()) 2744 return HostAction; 2745 2746 assert(HostAction && "Invalid host action!"); 2747 2748 OffloadAction::DeviceDependences DDeps; 2749 // Check if all the programming models agree we should not emit the host 2750 // action. Also, keep track of the offloading kinds employed. 2751 auto &OffloadKind = InputArgToOffloadKindMap[InputArg]; 2752 unsigned InactiveBuilders = 0u; 2753 unsigned IgnoringBuilders = 0u; 2754 for (auto *SB : SpecializedBuilders) { 2755 if (!SB->isValid()) { 2756 ++InactiveBuilders; 2757 continue; 2758 } 2759 2760 auto RetCode = 2761 SB->getDeviceDependences(DDeps, CurPhase, FinalPhase, Phases); 2762 2763 // If the builder explicitly says the host action should be ignored, 2764 // we need to increment the variable that tracks the builders that request 2765 // the host object to be ignored. 2766 if (RetCode == DeviceActionBuilder::ABRT_Ignore_Host) 2767 ++IgnoringBuilders; 2768 2769 // Unless the builder was inactive for this action, we have to record the 2770 // offload kind because the host will have to use it. 2771 if (RetCode != DeviceActionBuilder::ABRT_Inactive) 2772 OffloadKind |= SB->getAssociatedOffloadKind(); 2773 } 2774 2775 // If all builders agree that the host object should be ignored, just return 2776 // nullptr. 2777 if (IgnoringBuilders && 2778 SpecializedBuilders.size() == (InactiveBuilders + IgnoringBuilders)) 2779 return nullptr; 2780 2781 if (DDeps.getActions().empty()) 2782 return HostAction; 2783 2784 // We have dependences we need to bundle together. We use an offload action 2785 // for that. 2786 OffloadAction::HostDependence HDep( 2787 *HostAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(), 2788 /*BoundArch=*/nullptr, DDeps); 2789 return C.MakeAction<OffloadAction>(HDep, DDeps); 2790 } 2791 2792 /// Generate an action that adds a host dependence to a device action. The 2793 /// results will be kept in this action builder. Return true if an error was 2794 /// found. 2795 bool addHostDependenceToDeviceActions(Action *&HostAction, 2796 const Arg *InputArg) { 2797 if (!IsValid) 2798 return true; 2799 2800 // If we are supporting bundling/unbundling and the current action is an 2801 // input action of non-source file, we replace the host action by the 2802 // unbundling action. The bundler tool has the logic to detect if an input 2803 // is a bundle or not and if the input is not a bundle it assumes it is a 2804 // host file. Therefore it is safe to create an unbundling action even if 2805 // the input is not a bundle. 2806 if (CanUseBundler && isa<InputAction>(HostAction) && 2807 InputArg->getOption().getKind() == llvm::opt::Option::InputClass && 2808 !types::isSrcFile(HostAction->getType())) { 2809 auto UnbundlingHostAction = 2810 C.MakeAction<OffloadUnbundlingJobAction>(HostAction); 2811 UnbundlingHostAction->registerDependentActionInfo( 2812 C.getSingleOffloadToolChain<Action::OFK_Host>(), 2813 /*BoundArch=*/StringRef(), Action::OFK_Host); 2814 HostAction = UnbundlingHostAction; 2815 } 2816 2817 assert(HostAction && "Invalid host action!"); 2818 2819 // Register the offload kinds that are used. 2820 auto &OffloadKind = InputArgToOffloadKindMap[InputArg]; 2821 for (auto *SB : SpecializedBuilders) { 2822 if (!SB->isValid()) 2823 continue; 2824 2825 auto RetCode = SB->addDeviceDepences(HostAction); 2826 2827 // Host dependences for device actions are not compatible with that same 2828 // action being ignored. 2829 assert(RetCode != DeviceActionBuilder::ABRT_Ignore_Host && 2830 "Host dependence not expected to be ignored.!"); 2831 2832 // Unless the builder was inactive for this action, we have to record the 2833 // offload kind because the host will have to use it. 2834 if (RetCode != DeviceActionBuilder::ABRT_Inactive) 2835 OffloadKind |= SB->getAssociatedOffloadKind(); 2836 } 2837 2838 return false; 2839 } 2840 2841 /// Add the offloading top level actions to the provided action list. This 2842 /// function can replace the host action by a bundling action if the 2843 /// programming models allow it. 2844 bool appendTopLevelActions(ActionList &AL, Action *HostAction, 2845 const Arg *InputArg) { 2846 // Get the device actions to be appended. 2847 ActionList OffloadAL; 2848 for (auto *SB : SpecializedBuilders) { 2849 if (!SB->isValid()) 2850 continue; 2851 SB->appendTopLevelActions(OffloadAL); 2852 } 2853 2854 // If we can use the bundler, replace the host action by the bundling one in 2855 // the resulting list. Otherwise, just append the device actions. 2856 if (CanUseBundler && !OffloadAL.empty()) { 2857 // Add the host action to the list in order to create the bundling action. 2858 OffloadAL.push_back(HostAction); 2859 2860 // We expect that the host action was just appended to the action list 2861 // before this method was called. 2862 assert(HostAction == AL.back() && "Host action not in the list??"); 2863 HostAction = C.MakeAction<OffloadBundlingJobAction>(OffloadAL); 2864 AL.back() = HostAction; 2865 } else 2866 AL.append(OffloadAL.begin(), OffloadAL.end()); 2867 2868 // Propagate to the current host action (if any) the offload information 2869 // associated with the current input. 2870 if (HostAction) 2871 HostAction->propagateHostOffloadInfo(InputArgToOffloadKindMap[InputArg], 2872 /*BoundArch=*/nullptr); 2873 return false; 2874 } 2875 2876 /// Processes the host linker action. This currently consists of replacing it 2877 /// with an offload action if there are device link objects and propagate to 2878 /// the host action all the offload kinds used in the current compilation. The 2879 /// resulting action is returned. 2880 Action *processHostLinkAction(Action *HostAction) { 2881 // Add all the dependences from the device linking actions. 2882 OffloadAction::DeviceDependences DDeps; 2883 for (auto *SB : SpecializedBuilders) { 2884 if (!SB->isValid()) 2885 continue; 2886 2887 SB->appendLinkDependences(DDeps); 2888 } 2889 2890 // Calculate all the offload kinds used in the current compilation. 2891 unsigned ActiveOffloadKinds = 0u; 2892 for (auto &I : InputArgToOffloadKindMap) 2893 ActiveOffloadKinds |= I.second; 2894 2895 // If we don't have device dependencies, we don't have to create an offload 2896 // action. 2897 if (DDeps.getActions().empty()) { 2898 // Propagate all the active kinds to host action. Given that it is a link 2899 // action it is assumed to depend on all actions generated so far. 2900 HostAction->propagateHostOffloadInfo(ActiveOffloadKinds, 2901 /*BoundArch=*/nullptr); 2902 return HostAction; 2903 } 2904 2905 // Create the offload action with all dependences. When an offload action 2906 // is created the kinds are propagated to the host action, so we don't have 2907 // to do that explicitly here. 2908 OffloadAction::HostDependence HDep( 2909 *HostAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(), 2910 /*BoundArch*/ nullptr, ActiveOffloadKinds); 2911 return C.MakeAction<OffloadAction>(HDep, DDeps); 2912 } 2913 }; 2914 } // anonymous namespace. 2915 2916 void Driver::BuildActions(Compilation &C, DerivedArgList &Args, 2917 const InputList &Inputs, ActionList &Actions) const { 2918 llvm::PrettyStackTraceString CrashInfo("Building compilation actions"); 2919 2920 if (!SuppressMissingInputWarning && Inputs.empty()) { 2921 Diag(clang::diag::err_drv_no_input_files); 2922 return; 2923 } 2924 2925 Arg *FinalPhaseArg; 2926 phases::ID FinalPhase = getFinalPhase(Args, &FinalPhaseArg); 2927 2928 if (FinalPhase == phases::Link) { 2929 if (Args.hasArg(options::OPT_emit_llvm)) 2930 Diag(clang::diag::err_drv_emit_llvm_link); 2931 if (IsCLMode() && LTOMode != LTOK_None && 2932 !Args.getLastArgValue(options::OPT_fuse_ld_EQ).equals_lower("lld")) 2933 Diag(clang::diag::err_drv_lto_without_lld); 2934 } 2935 2936 // Reject -Z* at the top level, these options should never have been exposed 2937 // by gcc. 2938 if (Arg *A = Args.getLastArg(options::OPT_Z_Joined)) 2939 Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args); 2940 2941 // Diagnose misuse of /Fo. 2942 if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fo)) { 2943 StringRef V = A->getValue(); 2944 if (Inputs.size() > 1 && !V.empty() && 2945 !llvm::sys::path::is_separator(V.back())) { 2946 // Check whether /Fo tries to name an output file for multiple inputs. 2947 Diag(clang::diag::err_drv_out_file_argument_with_multiple_sources) 2948 << A->getSpelling() << V; 2949 Args.eraseArg(options::OPT__SLASH_Fo); 2950 } 2951 } 2952 2953 // Diagnose misuse of /Fa. 2954 if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fa)) { 2955 StringRef V = A->getValue(); 2956 if (Inputs.size() > 1 && !V.empty() && 2957 !llvm::sys::path::is_separator(V.back())) { 2958 // Check whether /Fa tries to name an asm file for multiple inputs. 2959 Diag(clang::diag::err_drv_out_file_argument_with_multiple_sources) 2960 << A->getSpelling() << V; 2961 Args.eraseArg(options::OPT__SLASH_Fa); 2962 } 2963 } 2964 2965 // Diagnose misuse of /o. 2966 if (Arg *A = Args.getLastArg(options::OPT__SLASH_o)) { 2967 if (A->getValue()[0] == '\0') { 2968 // It has to have a value. 2969 Diag(clang::diag::err_drv_missing_argument) << A->getSpelling() << 1; 2970 Args.eraseArg(options::OPT__SLASH_o); 2971 } 2972 } 2973 2974 // Diagnose unsupported forms of /Yc /Yu. Ignore /Yc/Yu for now if: 2975 // * no filename after it 2976 // * both /Yc and /Yu passed but with different filenames 2977 // * corresponding file not also passed as /FI 2978 Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc); 2979 Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu); 2980 if (YcArg && YcArg->getValue()[0] == '\0') { 2981 Diag(clang::diag::warn_drv_ycyu_no_arg_clang_cl) << YcArg->getSpelling(); 2982 Args.eraseArg(options::OPT__SLASH_Yc); 2983 YcArg = nullptr; 2984 } 2985 if (YuArg && YuArg->getValue()[0] == '\0') { 2986 Diag(clang::diag::warn_drv_ycyu_no_arg_clang_cl) << YuArg->getSpelling(); 2987 Args.eraseArg(options::OPT__SLASH_Yu); 2988 YuArg = nullptr; 2989 } 2990 if (YcArg && YuArg && strcmp(YcArg->getValue(), YuArg->getValue()) != 0) { 2991 Diag(clang::diag::warn_drv_ycyu_different_arg_clang_cl); 2992 Args.eraseArg(options::OPT__SLASH_Yc); 2993 Args.eraseArg(options::OPT__SLASH_Yu); 2994 YcArg = YuArg = nullptr; 2995 } 2996 if (YcArg && Inputs.size() > 1) { 2997 Diag(clang::diag::warn_drv_yc_multiple_inputs_clang_cl); 2998 Args.eraseArg(options::OPT__SLASH_Yc); 2999 YcArg = nullptr; 3000 } 3001 if (Args.hasArg(options::OPT__SLASH_Y_)) { 3002 // /Y- disables all pch handling. Rather than check for it everywhere, 3003 // just remove clang-cl pch-related flags here. 3004 Args.eraseArg(options::OPT__SLASH_Fp); 3005 Args.eraseArg(options::OPT__SLASH_Yc); 3006 Args.eraseArg(options::OPT__SLASH_Yu); 3007 YcArg = YuArg = nullptr; 3008 } 3009 3010 // Builder to be used to build offloading actions. 3011 OffloadingActionBuilder OffloadBuilder(C, Args, Inputs); 3012 3013 // Construct the actions to perform. 3014 ActionList LinkerInputs; 3015 3016 llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PL; 3017 for (auto &I : Inputs) { 3018 types::ID InputType = I.first; 3019 const Arg *InputArg = I.second; 3020 3021 PL.clear(); 3022 types::getCompilationPhases(InputType, PL); 3023 3024 // If the first step comes after the final phase we are doing as part of 3025 // this compilation, warn the user about it. 3026 phases::ID InitialPhase = PL[0]; 3027 if (InitialPhase > FinalPhase) { 3028 if (InputArg->isClaimed()) 3029 continue; 3030 3031 // Claim here to avoid the more general unused warning. 3032 InputArg->claim(); 3033 3034 // Suppress all unused style warnings with -Qunused-arguments 3035 if (Args.hasArg(options::OPT_Qunused_arguments)) 3036 continue; 3037 3038 // Special case when final phase determined by binary name, rather than 3039 // by a command-line argument with a corresponding Arg. 3040 if (CCCIsCPP()) 3041 Diag(clang::diag::warn_drv_input_file_unused_by_cpp) 3042 << InputArg->getAsString(Args) << getPhaseName(InitialPhase); 3043 // Special case '-E' warning on a previously preprocessed file to make 3044 // more sense. 3045 else if (InitialPhase == phases::Compile && 3046 FinalPhase == phases::Preprocess && 3047 getPreprocessedType(InputType) == types::TY_INVALID) 3048 Diag(clang::diag::warn_drv_preprocessed_input_file_unused) 3049 << InputArg->getAsString(Args) << !!FinalPhaseArg 3050 << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : ""); 3051 else 3052 Diag(clang::diag::warn_drv_input_file_unused) 3053 << InputArg->getAsString(Args) << getPhaseName(InitialPhase) 3054 << !!FinalPhaseArg 3055 << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : ""); 3056 continue; 3057 } 3058 3059 if (YcArg) { 3060 // Add a separate precompile phase for the compile phase. 3061 if (FinalPhase >= phases::Compile) { 3062 const types::ID HeaderType = lookupHeaderTypeForSourceType(InputType); 3063 llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PCHPL; 3064 types::getCompilationPhases(HeaderType, PCHPL); 3065 // Build the pipeline for the pch file. 3066 Action *ClangClPch = 3067 C.MakeAction<InputAction>(*InputArg, HeaderType); 3068 for (phases::ID Phase : PCHPL) 3069 ClangClPch = ConstructPhaseAction(C, Args, Phase, ClangClPch); 3070 assert(ClangClPch); 3071 Actions.push_back(ClangClPch); 3072 // The driver currently exits after the first failed command. This 3073 // relies on that behavior, to make sure if the pch generation fails, 3074 // the main compilation won't run. 3075 // FIXME: If the main compilation fails, the PCH generation should 3076 // probably not be considered successful either. 3077 } 3078 } 3079 3080 // Build the pipeline for this file. 3081 Action *Current = C.MakeAction<InputAction>(*InputArg, InputType); 3082 3083 // Use the current host action in any of the offloading actions, if 3084 // required. 3085 if (OffloadBuilder.addHostDependenceToDeviceActions(Current, InputArg)) 3086 break; 3087 3088 for (SmallVectorImpl<phases::ID>::iterator i = PL.begin(), e = PL.end(); 3089 i != e; ++i) { 3090 phases::ID Phase = *i; 3091 3092 // We are done if this step is past what the user requested. 3093 if (Phase > FinalPhase) 3094 break; 3095 3096 // Add any offload action the host action depends on. 3097 Current = OffloadBuilder.addDeviceDependencesToHostAction( 3098 Current, InputArg, Phase, FinalPhase, PL); 3099 if (!Current) 3100 break; 3101 3102 // Queue linker inputs. 3103 if (Phase == phases::Link) { 3104 assert((i + 1) == e && "linking must be final compilation step."); 3105 LinkerInputs.push_back(Current); 3106 Current = nullptr; 3107 break; 3108 } 3109 3110 // Otherwise construct the appropriate action. 3111 auto *NewCurrent = ConstructPhaseAction(C, Args, Phase, Current); 3112 3113 // We didn't create a new action, so we will just move to the next phase. 3114 if (NewCurrent == Current) 3115 continue; 3116 3117 Current = NewCurrent; 3118 3119 // Use the current host action in any of the offloading actions, if 3120 // required. 3121 if (OffloadBuilder.addHostDependenceToDeviceActions(Current, InputArg)) 3122 break; 3123 3124 if (Current->getType() == types::TY_Nothing) 3125 break; 3126 } 3127 3128 // If we ended with something, add to the output list. 3129 if (Current) 3130 Actions.push_back(Current); 3131 3132 // Add any top level actions generated for offloading. 3133 OffloadBuilder.appendTopLevelActions(Actions, Current, InputArg); 3134 } 3135 3136 // Add a link action if necessary. 3137 if (!LinkerInputs.empty()) { 3138 Action *LA = C.MakeAction<LinkJobAction>(LinkerInputs, types::TY_Image); 3139 LA = OffloadBuilder.processHostLinkAction(LA); 3140 Actions.push_back(LA); 3141 } 3142 3143 // If we are linking, claim any options which are obviously only used for 3144 // compilation. 3145 if (FinalPhase == phases::Link && PL.size() == 1) { 3146 Args.ClaimAllArgs(options::OPT_CompileOnly_Group); 3147 Args.ClaimAllArgs(options::OPT_cl_compile_Group); 3148 } 3149 3150 // Claim ignored clang-cl options. 3151 Args.ClaimAllArgs(options::OPT_cl_ignored_Group); 3152 3153 // Claim --cuda-host-only and --cuda-compile-host-device, which may be passed 3154 // to non-CUDA compilations and should not trigger warnings there. 3155 Args.ClaimAllArgs(options::OPT_cuda_host_only); 3156 Args.ClaimAllArgs(options::OPT_cuda_compile_host_device); 3157 } 3158 3159 Action *Driver::ConstructPhaseAction( 3160 Compilation &C, const ArgList &Args, phases::ID Phase, Action *Input, 3161 Action::OffloadKind TargetDeviceOffloadKind) const { 3162 llvm::PrettyStackTraceString CrashInfo("Constructing phase actions"); 3163 3164 // Some types skip the assembler phase (e.g., llvm-bc), but we can't 3165 // encode this in the steps because the intermediate type depends on 3166 // arguments. Just special case here. 3167 if (Phase == phases::Assemble && Input->getType() != types::TY_PP_Asm) 3168 return Input; 3169 3170 // Build the appropriate action. 3171 switch (Phase) { 3172 case phases::Link: 3173 llvm_unreachable("link action invalid here."); 3174 case phases::Preprocess: { 3175 types::ID OutputTy; 3176 // -{M, MM} alter the output type. 3177 if (Args.hasArg(options::OPT_M, options::OPT_MM)) { 3178 OutputTy = types::TY_Dependencies; 3179 } else { 3180 OutputTy = Input->getType(); 3181 if (!Args.hasFlag(options::OPT_frewrite_includes, 3182 options::OPT_fno_rewrite_includes, false) && 3183 !Args.hasFlag(options::OPT_frewrite_imports, 3184 options::OPT_fno_rewrite_imports, false) && 3185 !CCGenDiagnostics) 3186 OutputTy = types::getPreprocessedType(OutputTy); 3187 assert(OutputTy != types::TY_INVALID && 3188 "Cannot preprocess this input type!"); 3189 } 3190 return C.MakeAction<PreprocessJobAction>(Input, OutputTy); 3191 } 3192 case phases::Precompile: { 3193 types::ID OutputTy = getPrecompiledType(Input->getType()); 3194 assert(OutputTy != types::TY_INVALID && 3195 "Cannot precompile this input type!"); 3196 if (Args.hasArg(options::OPT_fsyntax_only)) { 3197 // Syntax checks should not emit a PCH file 3198 OutputTy = types::TY_Nothing; 3199 } 3200 return C.MakeAction<PrecompileJobAction>(Input, OutputTy); 3201 } 3202 case phases::Compile: { 3203 if (Args.hasArg(options::OPT_fsyntax_only)) 3204 return C.MakeAction<CompileJobAction>(Input, types::TY_Nothing); 3205 if (Args.hasArg(options::OPT_rewrite_objc)) 3206 return C.MakeAction<CompileJobAction>(Input, types::TY_RewrittenObjC); 3207 if (Args.hasArg(options::OPT_rewrite_legacy_objc)) 3208 return C.MakeAction<CompileJobAction>(Input, 3209 types::TY_RewrittenLegacyObjC); 3210 if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto)) 3211 return C.MakeAction<AnalyzeJobAction>(Input, types::TY_Plist); 3212 if (Args.hasArg(options::OPT__migrate)) 3213 return C.MakeAction<MigrateJobAction>(Input, types::TY_Remap); 3214 if (Args.hasArg(options::OPT_emit_ast)) 3215 return C.MakeAction<CompileJobAction>(Input, types::TY_AST); 3216 if (Args.hasArg(options::OPT_module_file_info)) 3217 return C.MakeAction<CompileJobAction>(Input, types::TY_ModuleFile); 3218 if (Args.hasArg(options::OPT_verify_pch)) 3219 return C.MakeAction<VerifyPCHJobAction>(Input, types::TY_Nothing); 3220 return C.MakeAction<CompileJobAction>(Input, types::TY_LLVM_BC); 3221 } 3222 case phases::Backend: { 3223 if (isUsingLTO() && TargetDeviceOffloadKind == Action::OFK_None) { 3224 types::ID Output = 3225 Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC; 3226 return C.MakeAction<BackendJobAction>(Input, Output); 3227 } 3228 if (Args.hasArg(options::OPT_emit_llvm)) { 3229 types::ID Output = 3230 Args.hasArg(options::OPT_S) ? types::TY_LLVM_IR : types::TY_LLVM_BC; 3231 return C.MakeAction<BackendJobAction>(Input, Output); 3232 } 3233 return C.MakeAction<BackendJobAction>(Input, types::TY_PP_Asm); 3234 } 3235 case phases::Assemble: 3236 return C.MakeAction<AssembleJobAction>(std::move(Input), types::TY_Object); 3237 } 3238 3239 llvm_unreachable("invalid phase in ConstructPhaseAction"); 3240 } 3241 3242 void Driver::BuildJobs(Compilation &C) const { 3243 llvm::PrettyStackTraceString CrashInfo("Building compilation jobs"); 3244 3245 Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o); 3246 3247 // It is an error to provide a -o option if we are making multiple output 3248 // files. 3249 if (FinalOutput) { 3250 unsigned NumOutputs = 0; 3251 for (const Action *A : C.getActions()) 3252 if (A->getType() != types::TY_Nothing) 3253 ++NumOutputs; 3254 3255 if (NumOutputs > 1) { 3256 Diag(clang::diag::err_drv_output_argument_with_multiple_files); 3257 FinalOutput = nullptr; 3258 } 3259 } 3260 3261 // Collect the list of architectures. 3262 llvm::StringSet<> ArchNames; 3263 if (C.getDefaultToolChain().getTriple().isOSBinFormatMachO()) 3264 for (const Arg *A : C.getArgs()) 3265 if (A->getOption().matches(options::OPT_arch)) 3266 ArchNames.insert(A->getValue()); 3267 3268 // Set of (Action, canonical ToolChain triple) pairs we've built jobs for. 3269 std::map<std::pair<const Action *, std::string>, InputInfo> CachedResults; 3270 for (Action *A : C.getActions()) { 3271 // If we are linking an image for multiple archs then the linker wants 3272 // -arch_multiple and -final_output <final image name>. Unfortunately, this 3273 // doesn't fit in cleanly because we have to pass this information down. 3274 // 3275 // FIXME: This is a hack; find a cleaner way to integrate this into the 3276 // process. 3277 const char *LinkingOutput = nullptr; 3278 if (isa<LipoJobAction>(A)) { 3279 if (FinalOutput) 3280 LinkingOutput = FinalOutput->getValue(); 3281 else 3282 LinkingOutput = getDefaultImageName(); 3283 } 3284 3285 BuildJobsForAction(C, A, &C.getDefaultToolChain(), 3286 /*BoundArch*/ StringRef(), 3287 /*AtTopLevel*/ true, 3288 /*MultipleArchs*/ ArchNames.size() > 1, 3289 /*LinkingOutput*/ LinkingOutput, CachedResults, 3290 /*TargetDeviceOffloadKind*/ Action::OFK_None); 3291 } 3292 3293 // If the user passed -Qunused-arguments or there were errors, don't warn 3294 // about any unused arguments. 3295 if (Diags.hasErrorOccurred() || 3296 C.getArgs().hasArg(options::OPT_Qunused_arguments)) 3297 return; 3298 3299 // Claim -### here. 3300 (void)C.getArgs().hasArg(options::OPT__HASH_HASH_HASH); 3301 3302 // Claim --driver-mode, --rsp-quoting, it was handled earlier. 3303 (void)C.getArgs().hasArg(options::OPT_driver_mode); 3304 (void)C.getArgs().hasArg(options::OPT_rsp_quoting); 3305 3306 for (Arg *A : C.getArgs()) { 3307 // FIXME: It would be nice to be able to send the argument to the 3308 // DiagnosticsEngine, so that extra values, position, and so on could be 3309 // printed. 3310 if (!A->isClaimed()) { 3311 if (A->getOption().hasFlag(options::NoArgumentUnused)) 3312 continue; 3313 3314 // Suppress the warning automatically if this is just a flag, and it is an 3315 // instance of an argument we already claimed. 3316 const Option &Opt = A->getOption(); 3317 if (Opt.getKind() == Option::FlagClass) { 3318 bool DuplicateClaimed = false; 3319 3320 for (const Arg *AA : C.getArgs().filtered(&Opt)) { 3321 if (AA->isClaimed()) { 3322 DuplicateClaimed = true; 3323 break; 3324 } 3325 } 3326 3327 if (DuplicateClaimed) 3328 continue; 3329 } 3330 3331 // In clang-cl, don't mention unknown arguments here since they have 3332 // already been warned about. 3333 if (!IsCLMode() || !A->getOption().matches(options::OPT_UNKNOWN)) 3334 Diag(clang::diag::warn_drv_unused_argument) 3335 << A->getAsString(C.getArgs()); 3336 } 3337 } 3338 } 3339 3340 namespace { 3341 /// Utility class to control the collapse of dependent actions and select the 3342 /// tools accordingly. 3343 class ToolSelector final { 3344 /// The tool chain this selector refers to. 3345 const ToolChain &TC; 3346 3347 /// The compilation this selector refers to. 3348 const Compilation &C; 3349 3350 /// The base action this selector refers to. 3351 const JobAction *BaseAction; 3352 3353 /// Set to true if the current toolchain refers to host actions. 3354 bool IsHostSelector; 3355 3356 /// Set to true if save-temps and embed-bitcode functionalities are active. 3357 bool SaveTemps; 3358 bool EmbedBitcode; 3359 3360 /// Get previous dependent action or null if that does not exist. If 3361 /// \a CanBeCollapsed is false, that action must be legal to collapse or 3362 /// null will be returned. 3363 const JobAction *getPrevDependentAction(const ActionList &Inputs, 3364 ActionList &SavedOffloadAction, 3365 bool CanBeCollapsed = true) { 3366 // An option can be collapsed only if it has a single input. 3367 if (Inputs.size() != 1) 3368 return nullptr; 3369 3370 Action *CurAction = *Inputs.begin(); 3371 if (CanBeCollapsed && 3372 !CurAction->isCollapsingWithNextDependentActionLegal()) 3373 return nullptr; 3374 3375 // If the input action is an offload action. Look through it and save any 3376 // offload action that can be dropped in the event of a collapse. 3377 if (auto *OA = dyn_cast<OffloadAction>(CurAction)) { 3378 // If the dependent action is a device action, we will attempt to collapse 3379 // only with other device actions. Otherwise, we would do the same but 3380 // with host actions only. 3381 if (!IsHostSelector) { 3382 if (OA->hasSingleDeviceDependence(/*DoNotConsiderHostActions=*/true)) { 3383 CurAction = 3384 OA->getSingleDeviceDependence(/*DoNotConsiderHostActions=*/true); 3385 if (CanBeCollapsed && 3386 !CurAction->isCollapsingWithNextDependentActionLegal()) 3387 return nullptr; 3388 SavedOffloadAction.push_back(OA); 3389 return dyn_cast<JobAction>(CurAction); 3390 } 3391 } else if (OA->hasHostDependence()) { 3392 CurAction = OA->getHostDependence(); 3393 if (CanBeCollapsed && 3394 !CurAction->isCollapsingWithNextDependentActionLegal()) 3395 return nullptr; 3396 SavedOffloadAction.push_back(OA); 3397 return dyn_cast<JobAction>(CurAction); 3398 } 3399 return nullptr; 3400 } 3401 3402 return dyn_cast<JobAction>(CurAction); 3403 } 3404 3405 /// Return true if an assemble action can be collapsed. 3406 bool canCollapseAssembleAction() const { 3407 return TC.useIntegratedAs() && !SaveTemps && 3408 !C.getArgs().hasArg(options::OPT_via_file_asm) && 3409 !C.getArgs().hasArg(options::OPT__SLASH_FA) && 3410 !C.getArgs().hasArg(options::OPT__SLASH_Fa); 3411 } 3412 3413 /// Return true if a preprocessor action can be collapsed. 3414 bool canCollapsePreprocessorAction() const { 3415 return !C.getArgs().hasArg(options::OPT_no_integrated_cpp) && 3416 !C.getArgs().hasArg(options::OPT_traditional_cpp) && !SaveTemps && 3417 !C.getArgs().hasArg(options::OPT_rewrite_objc); 3418 } 3419 3420 /// Struct that relates an action with the offload actions that would be 3421 /// collapsed with it. 3422 struct JobActionInfo final { 3423 /// The action this info refers to. 3424 const JobAction *JA = nullptr; 3425 /// The offload actions we need to take care off if this action is 3426 /// collapsed. 3427 ActionList SavedOffloadAction; 3428 }; 3429 3430 /// Append collapsed offload actions from the give nnumber of elements in the 3431 /// action info array. 3432 static void AppendCollapsedOffloadAction(ActionList &CollapsedOffloadAction, 3433 ArrayRef<JobActionInfo> &ActionInfo, 3434 unsigned ElementNum) { 3435 assert(ElementNum <= ActionInfo.size() && "Invalid number of elements."); 3436 for (unsigned I = 0; I < ElementNum; ++I) 3437 CollapsedOffloadAction.append(ActionInfo[I].SavedOffloadAction.begin(), 3438 ActionInfo[I].SavedOffloadAction.end()); 3439 } 3440 3441 /// Functions that attempt to perform the combining. They detect if that is 3442 /// legal, and if so they update the inputs \a Inputs and the offload action 3443 /// that were collapsed in \a CollapsedOffloadAction. A tool that deals with 3444 /// the combined action is returned. If the combining is not legal or if the 3445 /// tool does not exist, null is returned. 3446 /// Currently three kinds of collapsing are supported: 3447 /// - Assemble + Backend + Compile; 3448 /// - Assemble + Backend ; 3449 /// - Backend + Compile. 3450 const Tool * 3451 combineAssembleBackendCompile(ArrayRef<JobActionInfo> ActionInfo, 3452 const ActionList *&Inputs, 3453 ActionList &CollapsedOffloadAction) { 3454 if (ActionInfo.size() < 3 || !canCollapseAssembleAction()) 3455 return nullptr; 3456 auto *AJ = dyn_cast<AssembleJobAction>(ActionInfo[0].JA); 3457 auto *BJ = dyn_cast<BackendJobAction>(ActionInfo[1].JA); 3458 auto *CJ = dyn_cast<CompileJobAction>(ActionInfo[2].JA); 3459 if (!AJ || !BJ || !CJ) 3460 return nullptr; 3461 3462 // Get compiler tool. 3463 const Tool *T = TC.SelectTool(*CJ); 3464 if (!T) 3465 return nullptr; 3466 3467 // When using -fembed-bitcode, it is required to have the same tool (clang) 3468 // for both CompilerJA and BackendJA. Otherwise, combine two stages. 3469 if (EmbedBitcode) { 3470 const Tool *BT = TC.SelectTool(*BJ); 3471 if (BT == T) 3472 return nullptr; 3473 } 3474 3475 if (!T->hasIntegratedAssembler()) 3476 return nullptr; 3477 3478 Inputs = &CJ->getInputs(); 3479 AppendCollapsedOffloadAction(CollapsedOffloadAction, ActionInfo, 3480 /*NumElements=*/3); 3481 return T; 3482 } 3483 const Tool *combineAssembleBackend(ArrayRef<JobActionInfo> ActionInfo, 3484 const ActionList *&Inputs, 3485 ActionList &CollapsedOffloadAction) { 3486 if (ActionInfo.size() < 2 || !canCollapseAssembleAction()) 3487 return nullptr; 3488 auto *AJ = dyn_cast<AssembleJobAction>(ActionInfo[0].JA); 3489 auto *BJ = dyn_cast<BackendJobAction>(ActionInfo[1].JA); 3490 if (!AJ || !BJ) 3491 return nullptr; 3492 3493 // Retrieve the compile job, backend action must always be preceded by one. 3494 ActionList CompileJobOffloadActions; 3495 auto *CJ = getPrevDependentAction(BJ->getInputs(), CompileJobOffloadActions, 3496 /*CanBeCollapsed=*/false); 3497 if (!AJ || !BJ || !CJ) 3498 return nullptr; 3499 3500 assert(isa<CompileJobAction>(CJ) && 3501 "Expecting compile job preceding backend job."); 3502 3503 // Get compiler tool. 3504 const Tool *T = TC.SelectTool(*CJ); 3505 if (!T) 3506 return nullptr; 3507 3508 if (!T->hasIntegratedAssembler()) 3509 return nullptr; 3510 3511 Inputs = &BJ->getInputs(); 3512 AppendCollapsedOffloadAction(CollapsedOffloadAction, ActionInfo, 3513 /*NumElements=*/2); 3514 return T; 3515 } 3516 const Tool *combineBackendCompile(ArrayRef<JobActionInfo> ActionInfo, 3517 const ActionList *&Inputs, 3518 ActionList &CollapsedOffloadAction) { 3519 if (ActionInfo.size() < 2) 3520 return nullptr; 3521 auto *BJ = dyn_cast<BackendJobAction>(ActionInfo[0].JA); 3522 auto *CJ = dyn_cast<CompileJobAction>(ActionInfo[1].JA); 3523 if (!BJ || !CJ) 3524 return nullptr; 3525 3526 // Check if the initial input (to the compile job or its predessor if one 3527 // exists) is LLVM bitcode. In that case, no preprocessor step is required 3528 // and we can still collapse the compile and backend jobs when we have 3529 // -save-temps. I.e. there is no need for a separate compile job just to 3530 // emit unoptimized bitcode. 3531 bool InputIsBitcode = true; 3532 for (size_t i = 1; i < ActionInfo.size(); i++) 3533 if (ActionInfo[i].JA->getType() != types::TY_LLVM_BC && 3534 ActionInfo[i].JA->getType() != types::TY_LTO_BC) { 3535 InputIsBitcode = false; 3536 break; 3537 } 3538 if (!InputIsBitcode && !canCollapsePreprocessorAction()) 3539 return nullptr; 3540 3541 // Get compiler tool. 3542 const Tool *T = TC.SelectTool(*CJ); 3543 if (!T) 3544 return nullptr; 3545 3546 if (T->canEmitIR() && ((SaveTemps && !InputIsBitcode) || EmbedBitcode)) 3547 return nullptr; 3548 3549 Inputs = &CJ->getInputs(); 3550 AppendCollapsedOffloadAction(CollapsedOffloadAction, ActionInfo, 3551 /*NumElements=*/2); 3552 return T; 3553 } 3554 3555 /// Updates the inputs if the obtained tool supports combining with 3556 /// preprocessor action, and the current input is indeed a preprocessor 3557 /// action. If combining results in the collapse of offloading actions, those 3558 /// are appended to \a CollapsedOffloadAction. 3559 void combineWithPreprocessor(const Tool *T, const ActionList *&Inputs, 3560 ActionList &CollapsedOffloadAction) { 3561 if (!T || !canCollapsePreprocessorAction() || !T->hasIntegratedCPP()) 3562 return; 3563 3564 // Attempt to get a preprocessor action dependence. 3565 ActionList PreprocessJobOffloadActions; 3566 auto *PJ = getPrevDependentAction(*Inputs, PreprocessJobOffloadActions); 3567 if (!PJ || !isa<PreprocessJobAction>(PJ)) 3568 return; 3569 3570 // This is legal to combine. Append any offload action we found and set the 3571 // current inputs to preprocessor inputs. 3572 CollapsedOffloadAction.append(PreprocessJobOffloadActions.begin(), 3573 PreprocessJobOffloadActions.end()); 3574 Inputs = &PJ->getInputs(); 3575 } 3576 3577 public: 3578 ToolSelector(const JobAction *BaseAction, const ToolChain &TC, 3579 const Compilation &C, bool SaveTemps, bool EmbedBitcode) 3580 : TC(TC), C(C), BaseAction(BaseAction), SaveTemps(SaveTemps), 3581 EmbedBitcode(EmbedBitcode) { 3582 assert(BaseAction && "Invalid base action."); 3583 IsHostSelector = BaseAction->getOffloadingDeviceKind() == Action::OFK_None; 3584 } 3585 3586 /// Check if a chain of actions can be combined and return the tool that can 3587 /// handle the combination of actions. The pointer to the current inputs \a 3588 /// Inputs and the list of offload actions \a CollapsedOffloadActions 3589 /// connected to collapsed actions are updated accordingly. The latter enables 3590 /// the caller of the selector to process them afterwards instead of just 3591 /// dropping them. If no suitable tool is found, null will be returned. 3592 const Tool *getTool(const ActionList *&Inputs, 3593 ActionList &CollapsedOffloadAction) { 3594 // 3595 // Get the largest chain of actions that we could combine. 3596 // 3597 3598 SmallVector<JobActionInfo, 5> ActionChain(1); 3599 ActionChain.back().JA = BaseAction; 3600 while (ActionChain.back().JA) { 3601 const Action *CurAction = ActionChain.back().JA; 3602 3603 // Grow the chain by one element. 3604 ActionChain.resize(ActionChain.size() + 1); 3605 JobActionInfo &AI = ActionChain.back(); 3606 3607 // Attempt to fill it with the 3608 AI.JA = 3609 getPrevDependentAction(CurAction->getInputs(), AI.SavedOffloadAction); 3610 } 3611 3612 // Pop the last action info as it could not be filled. 3613 ActionChain.pop_back(); 3614 3615 // 3616 // Attempt to combine actions. If all combining attempts failed, just return 3617 // the tool of the provided action. At the end we attempt to combine the 3618 // action with any preprocessor action it may depend on. 3619 // 3620 3621 const Tool *T = combineAssembleBackendCompile(ActionChain, Inputs, 3622 CollapsedOffloadAction); 3623 if (!T) 3624 T = combineAssembleBackend(ActionChain, Inputs, CollapsedOffloadAction); 3625 if (!T) 3626 T = combineBackendCompile(ActionChain, Inputs, CollapsedOffloadAction); 3627 if (!T) { 3628 Inputs = &BaseAction->getInputs(); 3629 T = TC.SelectTool(*BaseAction); 3630 } 3631 3632 combineWithPreprocessor(T, Inputs, CollapsedOffloadAction); 3633 return T; 3634 } 3635 }; 3636 } 3637 3638 /// Return a string that uniquely identifies the result of a job. The bound arch 3639 /// is not necessarily represented in the toolchain's triple -- for example, 3640 /// armv7 and armv7s both map to the same triple -- so we need both in our map. 3641 /// Also, we need to add the offloading device kind, as the same tool chain can 3642 /// be used for host and device for some programming models, e.g. OpenMP. 3643 static std::string GetTriplePlusArchString(const ToolChain *TC, 3644 StringRef BoundArch, 3645 Action::OffloadKind OffloadKind) { 3646 std::string TriplePlusArch = TC->getTriple().normalize(); 3647 if (!BoundArch.empty()) { 3648 TriplePlusArch += "-"; 3649 TriplePlusArch += BoundArch; 3650 } 3651 TriplePlusArch += "-"; 3652 TriplePlusArch += Action::GetOffloadKindName(OffloadKind); 3653 return TriplePlusArch; 3654 } 3655 3656 InputInfo Driver::BuildJobsForAction( 3657 Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, 3658 bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, 3659 std::map<std::pair<const Action *, std::string>, InputInfo> &CachedResults, 3660 Action::OffloadKind TargetDeviceOffloadKind) const { 3661 std::pair<const Action *, std::string> ActionTC = { 3662 A, GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}; 3663 auto CachedResult = CachedResults.find(ActionTC); 3664 if (CachedResult != CachedResults.end()) { 3665 return CachedResult->second; 3666 } 3667 InputInfo Result = BuildJobsForActionNoCache( 3668 C, A, TC, BoundArch, AtTopLevel, MultipleArchs, LinkingOutput, 3669 CachedResults, TargetDeviceOffloadKind); 3670 CachedResults[ActionTC] = Result; 3671 return Result; 3672 } 3673 3674 InputInfo Driver::BuildJobsForActionNoCache( 3675 Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, 3676 bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, 3677 std::map<std::pair<const Action *, std::string>, InputInfo> &CachedResults, 3678 Action::OffloadKind TargetDeviceOffloadKind) const { 3679 llvm::PrettyStackTraceString CrashInfo("Building compilation jobs"); 3680 3681 InputInfoList OffloadDependencesInputInfo; 3682 bool BuildingForOffloadDevice = TargetDeviceOffloadKind != Action::OFK_None; 3683 if (const OffloadAction *OA = dyn_cast<OffloadAction>(A)) { 3684 // The 'Darwin' toolchain is initialized only when its arguments are 3685 // computed. Get the default arguments for OFK_None to ensure that 3686 // initialization is performed before processing the offload action. 3687 // FIXME: Remove when darwin's toolchain is initialized during construction. 3688 C.getArgsForToolChain(TC, BoundArch, Action::OFK_None); 3689 3690 // The offload action is expected to be used in four different situations. 3691 // 3692 // a) Set a toolchain/architecture/kind for a host action: 3693 // Host Action 1 -> OffloadAction -> Host Action 2 3694 // 3695 // b) Set a toolchain/architecture/kind for a device action; 3696 // Device Action 1 -> OffloadAction -> Device Action 2 3697 // 3698 // c) Specify a device dependence to a host action; 3699 // Device Action 1 _ 3700 // \ 3701 // Host Action 1 ---> OffloadAction -> Host Action 2 3702 // 3703 // d) Specify a host dependence to a device action. 3704 // Host Action 1 _ 3705 // \ 3706 // Device Action 1 ---> OffloadAction -> Device Action 2 3707 // 3708 // For a) and b), we just return the job generated for the dependence. For 3709 // c) and d) we override the current action with the host/device dependence 3710 // if the current toolchain is host/device and set the offload dependences 3711 // info with the jobs obtained from the device/host dependence(s). 3712 3713 // If there is a single device option, just generate the job for it. 3714 if (OA->hasSingleDeviceDependence()) { 3715 InputInfo DevA; 3716 OA->doOnEachDeviceDependence([&](Action *DepA, const ToolChain *DepTC, 3717 const char *DepBoundArch) { 3718 DevA = 3719 BuildJobsForAction(C, DepA, DepTC, DepBoundArch, AtTopLevel, 3720 /*MultipleArchs*/ !!DepBoundArch, LinkingOutput, 3721 CachedResults, DepA->getOffloadingDeviceKind()); 3722 }); 3723 return DevA; 3724 } 3725 3726 // If 'Action 2' is host, we generate jobs for the device dependences and 3727 // override the current action with the host dependence. Otherwise, we 3728 // generate the host dependences and override the action with the device 3729 // dependence. The dependences can't therefore be a top-level action. 3730 OA->doOnEachDependence( 3731 /*IsHostDependence=*/BuildingForOffloadDevice, 3732 [&](Action *DepA, const ToolChain *DepTC, const char *DepBoundArch) { 3733 OffloadDependencesInputInfo.push_back(BuildJobsForAction( 3734 C, DepA, DepTC, DepBoundArch, /*AtTopLevel=*/false, 3735 /*MultipleArchs*/ !!DepBoundArch, LinkingOutput, CachedResults, 3736 DepA->getOffloadingDeviceKind())); 3737 }); 3738 3739 A = BuildingForOffloadDevice 3740 ? OA->getSingleDeviceDependence(/*DoNotConsiderHostActions=*/true) 3741 : OA->getHostDependence(); 3742 } 3743 3744 if (const InputAction *IA = dyn_cast<InputAction>(A)) { 3745 // FIXME: It would be nice to not claim this here; maybe the old scheme of 3746 // just using Args was better? 3747 const Arg &Input = IA->getInputArg(); 3748 Input.claim(); 3749 if (Input.getOption().matches(options::OPT_INPUT)) { 3750 const char *Name = Input.getValue(); 3751 return InputInfo(A, Name, /* BaseInput = */ Name); 3752 } 3753 return InputInfo(A, &Input, /* BaseInput = */ ""); 3754 } 3755 3756 if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) { 3757 const ToolChain *TC; 3758 StringRef ArchName = BAA->getArchName(); 3759 3760 if (!ArchName.empty()) 3761 TC = &getToolChain(C.getArgs(), 3762 computeTargetTriple(*this, TargetTriple, 3763 C.getArgs(), ArchName)); 3764 else 3765 TC = &C.getDefaultToolChain(); 3766 3767 return BuildJobsForAction(C, *BAA->input_begin(), TC, ArchName, AtTopLevel, 3768 MultipleArchs, LinkingOutput, CachedResults, 3769 TargetDeviceOffloadKind); 3770 } 3771 3772 3773 const ActionList *Inputs = &A->getInputs(); 3774 3775 const JobAction *JA = cast<JobAction>(A); 3776 ActionList CollapsedOffloadActions; 3777 3778 ToolSelector TS(JA, *TC, C, isSaveTempsEnabled(), 3779 embedBitcodeInObject() && !isUsingLTO()); 3780 const Tool *T = TS.getTool(Inputs, CollapsedOffloadActions); 3781 3782 if (!T) 3783 return InputInfo(); 3784 3785 // If we've collapsed action list that contained OffloadAction we 3786 // need to build jobs for host/device-side inputs it may have held. 3787 for (const auto *OA : CollapsedOffloadActions) 3788 cast<OffloadAction>(OA)->doOnEachDependence( 3789 /*IsHostDependence=*/BuildingForOffloadDevice, 3790 [&](Action *DepA, const ToolChain *DepTC, const char *DepBoundArch) { 3791 OffloadDependencesInputInfo.push_back(BuildJobsForAction( 3792 C, DepA, DepTC, DepBoundArch, /* AtTopLevel */ false, 3793 /*MultipleArchs=*/!!DepBoundArch, LinkingOutput, CachedResults, 3794 DepA->getOffloadingDeviceKind())); 3795 }); 3796 3797 // Only use pipes when there is exactly one input. 3798 InputInfoList InputInfos; 3799 for (const Action *Input : *Inputs) { 3800 // Treat dsymutil and verify sub-jobs as being at the top-level too, they 3801 // shouldn't get temporary output names. 3802 // FIXME: Clean this up. 3803 bool SubJobAtTopLevel = 3804 AtTopLevel && (isa<DsymutilJobAction>(A) || isa<VerifyJobAction>(A)); 3805 InputInfos.push_back(BuildJobsForAction( 3806 C, Input, TC, BoundArch, SubJobAtTopLevel, MultipleArchs, LinkingOutput, 3807 CachedResults, A->getOffloadingDeviceKind())); 3808 } 3809 3810 // Always use the first input as the base input. 3811 const char *BaseInput = InputInfos[0].getBaseInput(); 3812 3813 // ... except dsymutil actions, which use their actual input as the base 3814 // input. 3815 if (JA->getType() == types::TY_dSYM) 3816 BaseInput = InputInfos[0].getFilename(); 3817 3818 // Append outputs of offload device jobs to the input list 3819 if (!OffloadDependencesInputInfo.empty()) 3820 InputInfos.append(OffloadDependencesInputInfo.begin(), 3821 OffloadDependencesInputInfo.end()); 3822 3823 // Set the effective triple of the toolchain for the duration of this job. 3824 llvm::Triple EffectiveTriple; 3825 const ToolChain &ToolTC = T->getToolChain(); 3826 const ArgList &Args = 3827 C.getArgsForToolChain(TC, BoundArch, A->getOffloadingDeviceKind()); 3828 if (InputInfos.size() != 1) { 3829 EffectiveTriple = llvm::Triple(ToolTC.ComputeEffectiveClangTriple(Args)); 3830 } else { 3831 // Pass along the input type if it can be unambiguously determined. 3832 EffectiveTriple = llvm::Triple( 3833 ToolTC.ComputeEffectiveClangTriple(Args, InputInfos[0].getType())); 3834 } 3835 RegisterEffectiveTriple TripleRAII(ToolTC, EffectiveTriple); 3836 3837 // Determine the place to write output to, if any. 3838 InputInfo Result; 3839 InputInfoList UnbundlingResults; 3840 if (auto *UA = dyn_cast<OffloadUnbundlingJobAction>(JA)) { 3841 // If we have an unbundling job, we need to create results for all the 3842 // outputs. We also update the results cache so that other actions using 3843 // this unbundling action can get the right results. 3844 for (auto &UI : UA->getDependentActionsInfo()) { 3845 assert(UI.DependentOffloadKind != Action::OFK_None && 3846 "Unbundling with no offloading??"); 3847 3848 // Unbundling actions are never at the top level. When we generate the 3849 // offloading prefix, we also do that for the host file because the 3850 // unbundling action does not change the type of the output which can 3851 // cause a overwrite. 3852 std::string OffloadingPrefix = Action::GetOffloadingFileNamePrefix( 3853 UI.DependentOffloadKind, 3854 UI.DependentToolChain->getTriple().normalize(), 3855 /*CreatePrefixForHost=*/true); 3856 auto CurI = InputInfo( 3857 UA, 3858 GetNamedOutputPath(C, *UA, BaseInput, UI.DependentBoundArch, 3859 /*AtTopLevel=*/false, 3860 MultipleArchs || 3861 UI.DependentOffloadKind == Action::OFK_HIP, 3862 OffloadingPrefix), 3863 BaseInput); 3864 // Save the unbundling result. 3865 UnbundlingResults.push_back(CurI); 3866 3867 // Get the unique string identifier for this dependence and cache the 3868 // result. 3869 StringRef Arch; 3870 if (TargetDeviceOffloadKind == Action::OFK_HIP) { 3871 if (UI.DependentOffloadKind == Action::OFK_Host) 3872 Arch = StringRef(); 3873 else 3874 Arch = UI.DependentBoundArch; 3875 } else 3876 Arch = BoundArch; 3877 3878 CachedResults[{A, GetTriplePlusArchString(UI.DependentToolChain, Arch, 3879 UI.DependentOffloadKind)}] = 3880 CurI; 3881 } 3882 3883 // Now that we have all the results generated, select the one that should be 3884 // returned for the current depending action. 3885 std::pair<const Action *, std::string> ActionTC = { 3886 A, GetTriplePlusArchString(TC, BoundArch, TargetDeviceOffloadKind)}; 3887 assert(CachedResults.find(ActionTC) != CachedResults.end() && 3888 "Result does not exist??"); 3889 Result = CachedResults[ActionTC]; 3890 } else if (JA->getType() == types::TY_Nothing) 3891 Result = InputInfo(A, BaseInput); 3892 else { 3893 // We only have to generate a prefix for the host if this is not a top-level 3894 // action. 3895 std::string OffloadingPrefix = Action::GetOffloadingFileNamePrefix( 3896 A->getOffloadingDeviceKind(), TC->getTriple().normalize(), 3897 /*CreatePrefixForHost=*/!!A->getOffloadingHostActiveKinds() && 3898 !AtTopLevel); 3899 Result = InputInfo(A, GetNamedOutputPath(C, *JA, BaseInput, BoundArch, 3900 AtTopLevel, MultipleArchs, 3901 OffloadingPrefix), 3902 BaseInput); 3903 } 3904 3905 if (CCCPrintBindings && !CCGenDiagnostics) { 3906 llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"' 3907 << " - \"" << T->getName() << "\", inputs: ["; 3908 for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) { 3909 llvm::errs() << InputInfos[i].getAsString(); 3910 if (i + 1 != e) 3911 llvm::errs() << ", "; 3912 } 3913 if (UnbundlingResults.empty()) 3914 llvm::errs() << "], output: " << Result.getAsString() << "\n"; 3915 else { 3916 llvm::errs() << "], outputs: ["; 3917 for (unsigned i = 0, e = UnbundlingResults.size(); i != e; ++i) { 3918 llvm::errs() << UnbundlingResults[i].getAsString(); 3919 if (i + 1 != e) 3920 llvm::errs() << ", "; 3921 } 3922 llvm::errs() << "] \n"; 3923 } 3924 } else { 3925 if (UnbundlingResults.empty()) 3926 T->ConstructJob( 3927 C, *JA, Result, InputInfos, 3928 C.getArgsForToolChain(TC, BoundArch, JA->getOffloadingDeviceKind()), 3929 LinkingOutput); 3930 else 3931 T->ConstructJobMultipleOutputs( 3932 C, *JA, UnbundlingResults, InputInfos, 3933 C.getArgsForToolChain(TC, BoundArch, JA->getOffloadingDeviceKind()), 3934 LinkingOutput); 3935 } 3936 return Result; 3937 } 3938 3939 const char *Driver::getDefaultImageName() const { 3940 llvm::Triple Target(llvm::Triple::normalize(TargetTriple)); 3941 return Target.isOSWindows() ? "a.exe" : "a.out"; 3942 } 3943 3944 /// Create output filename based on ArgValue, which could either be a 3945 /// full filename, filename without extension, or a directory. If ArgValue 3946 /// does not provide a filename, then use BaseName, and use the extension 3947 /// suitable for FileType. 3948 static const char *MakeCLOutputFilename(const ArgList &Args, StringRef ArgValue, 3949 StringRef BaseName, 3950 types::ID FileType) { 3951 SmallString<128> Filename = ArgValue; 3952 3953 if (ArgValue.empty()) { 3954 // If the argument is empty, output to BaseName in the current dir. 3955 Filename = BaseName; 3956 } else if (llvm::sys::path::is_separator(Filename.back())) { 3957 // If the argument is a directory, output to BaseName in that dir. 3958 llvm::sys::path::append(Filename, BaseName); 3959 } 3960 3961 if (!llvm::sys::path::has_extension(ArgValue)) { 3962 // If the argument didn't provide an extension, then set it. 3963 const char *Extension = types::getTypeTempSuffix(FileType, true); 3964 3965 if (FileType == types::TY_Image && 3966 Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd)) { 3967 // The output file is a dll. 3968 Extension = "dll"; 3969 } 3970 3971 llvm::sys::path::replace_extension(Filename, Extension); 3972 } 3973 3974 return Args.MakeArgString(Filename.c_str()); 3975 } 3976 3977 const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, 3978 const char *BaseInput, 3979 StringRef BoundArch, bool AtTopLevel, 3980 bool MultipleArchs, 3981 StringRef OffloadingPrefix) const { 3982 llvm::PrettyStackTraceString CrashInfo("Computing output path"); 3983 // Output to a user requested destination? 3984 if (AtTopLevel && !isa<DsymutilJobAction>(JA) && !isa<VerifyJobAction>(JA)) { 3985 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) 3986 return C.addResultFile(FinalOutput->getValue(), &JA); 3987 } 3988 3989 // For /P, preprocess to file named after BaseInput. 3990 if (C.getArgs().hasArg(options::OPT__SLASH_P)) { 3991 assert(AtTopLevel && isa<PreprocessJobAction>(JA)); 3992 StringRef BaseName = llvm::sys::path::filename(BaseInput); 3993 StringRef NameArg; 3994 if (Arg *A = C.getArgs().getLastArg(options::OPT__SLASH_Fi)) 3995 NameArg = A->getValue(); 3996 return C.addResultFile( 3997 MakeCLOutputFilename(C.getArgs(), NameArg, BaseName, types::TY_PP_C), 3998 &JA); 3999 } 4000 4001 // Default to writing to stdout? 4002 if (AtTopLevel && !CCGenDiagnostics && isa<PreprocessJobAction>(JA)) 4003 return "-"; 4004 4005 // Is this the assembly listing for /FA? 4006 if (JA.getType() == types::TY_PP_Asm && 4007 (C.getArgs().hasArg(options::OPT__SLASH_FA) || 4008 C.getArgs().hasArg(options::OPT__SLASH_Fa))) { 4009 // Use /Fa and the input filename to determine the asm file name. 4010 StringRef BaseName = llvm::sys::path::filename(BaseInput); 4011 StringRef FaValue = C.getArgs().getLastArgValue(options::OPT__SLASH_Fa); 4012 return C.addResultFile( 4013 MakeCLOutputFilename(C.getArgs(), FaValue, BaseName, JA.getType()), 4014 &JA); 4015 } 4016 4017 // Output to a temporary file? 4018 if ((!AtTopLevel && !isSaveTempsEnabled() && 4019 !C.getArgs().hasArg(options::OPT__SLASH_Fo)) || 4020 CCGenDiagnostics) { 4021 StringRef Name = llvm::sys::path::filename(BaseInput); 4022 std::pair<StringRef, StringRef> Split = Name.split('.'); 4023 SmallString<128> TmpName; 4024 const char *Suffix = types::getTypeTempSuffix(JA.getType(), IsCLMode()); 4025 Arg *A = C.getArgs().getLastArg(options::OPT_fcrash_diagnostics_dir); 4026 if (CCGenDiagnostics && A) { 4027 SmallString<128> CrashDirectory(A->getValue()); 4028 llvm::sys::path::append(CrashDirectory, Split.first); 4029 const char *Middle = Suffix ? "-%%%%%%." : "-%%%%%%"; 4030 std::error_code EC = 4031 llvm::sys::fs::createUniqueFile(CrashDirectory + Middle + Suffix, TmpName); 4032 if (EC) { 4033 Diag(clang::diag::err_unable_to_make_temp) << EC.message(); 4034 return ""; 4035 } 4036 } else { 4037 TmpName = GetTemporaryPath(Split.first, Suffix); 4038 } 4039 return C.addTempFile(C.getArgs().MakeArgString(TmpName)); 4040 } 4041 4042 SmallString<128> BasePath(BaseInput); 4043 StringRef BaseName; 4044 4045 // Dsymutil actions should use the full path. 4046 if (isa<DsymutilJobAction>(JA) || isa<VerifyJobAction>(JA)) 4047 BaseName = BasePath; 4048 else 4049 BaseName = llvm::sys::path::filename(BasePath); 4050 4051 // Determine what the derived output name should be. 4052 const char *NamedOutput; 4053 4054 if ((JA.getType() == types::TY_Object || JA.getType() == types::TY_LTO_BC) && 4055 C.getArgs().hasArg(options::OPT__SLASH_Fo, options::OPT__SLASH_o)) { 4056 // The /Fo or /o flag decides the object filename. 4057 StringRef Val = 4058 C.getArgs() 4059 .getLastArg(options::OPT__SLASH_Fo, options::OPT__SLASH_o) 4060 ->getValue(); 4061 NamedOutput = 4062 MakeCLOutputFilename(C.getArgs(), Val, BaseName, types::TY_Object); 4063 } else if (JA.getType() == types::TY_Image && 4064 C.getArgs().hasArg(options::OPT__SLASH_Fe, 4065 options::OPT__SLASH_o)) { 4066 // The /Fe or /o flag names the linked file. 4067 StringRef Val = 4068 C.getArgs() 4069 .getLastArg(options::OPT__SLASH_Fe, options::OPT__SLASH_o) 4070 ->getValue(); 4071 NamedOutput = 4072 MakeCLOutputFilename(C.getArgs(), Val, BaseName, types::TY_Image); 4073 } else if (JA.getType() == types::TY_Image) { 4074 if (IsCLMode()) { 4075 // clang-cl uses BaseName for the executable name. 4076 NamedOutput = 4077 MakeCLOutputFilename(C.getArgs(), "", BaseName, types::TY_Image); 4078 } else { 4079 SmallString<128> Output(getDefaultImageName()); 4080 Output += OffloadingPrefix; 4081 if (MultipleArchs && !BoundArch.empty()) { 4082 Output += "-"; 4083 Output.append(BoundArch); 4084 } 4085 NamedOutput = C.getArgs().MakeArgString(Output.c_str()); 4086 } 4087 } else if (JA.getType() == types::TY_PCH && IsCLMode()) { 4088 NamedOutput = C.getArgs().MakeArgString(GetClPchPath(C, BaseName)); 4089 } else { 4090 const char *Suffix = types::getTypeTempSuffix(JA.getType(), IsCLMode()); 4091 assert(Suffix && "All types used for output should have a suffix."); 4092 4093 std::string::size_type End = std::string::npos; 4094 if (!types::appendSuffixForType(JA.getType())) 4095 End = BaseName.rfind('.'); 4096 SmallString<128> Suffixed(BaseName.substr(0, End)); 4097 Suffixed += OffloadingPrefix; 4098 if (MultipleArchs && !BoundArch.empty()) { 4099 Suffixed += "-"; 4100 Suffixed.append(BoundArch); 4101 } 4102 // When using both -save-temps and -emit-llvm, use a ".tmp.bc" suffix for 4103 // the unoptimized bitcode so that it does not get overwritten by the ".bc" 4104 // optimized bitcode output. 4105 if (!AtTopLevel && C.getArgs().hasArg(options::OPT_emit_llvm) && 4106 JA.getType() == types::TY_LLVM_BC) 4107 Suffixed += ".tmp"; 4108 Suffixed += '.'; 4109 Suffixed += Suffix; 4110 NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str()); 4111 } 4112 4113 // Prepend object file path if -save-temps=obj 4114 if (!AtTopLevel && isSaveTempsObj() && C.getArgs().hasArg(options::OPT_o) && 4115 JA.getType() != types::TY_PCH) { 4116 Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o); 4117 SmallString<128> TempPath(FinalOutput->getValue()); 4118 llvm::sys::path::remove_filename(TempPath); 4119 StringRef OutputFileName = llvm::sys::path::filename(NamedOutput); 4120 llvm::sys::path::append(TempPath, OutputFileName); 4121 NamedOutput = C.getArgs().MakeArgString(TempPath.c_str()); 4122 } 4123 4124 // If we're saving temps and the temp file conflicts with the input file, 4125 // then avoid overwriting input file. 4126 if (!AtTopLevel && isSaveTempsEnabled() && NamedOutput == BaseName) { 4127 bool SameFile = false; 4128 SmallString<256> Result; 4129 llvm::sys::fs::current_path(Result); 4130 llvm::sys::path::append(Result, BaseName); 4131 llvm::sys::fs::equivalent(BaseInput, Result.c_str(), SameFile); 4132 // Must share the same path to conflict. 4133 if (SameFile) { 4134 StringRef Name = llvm::sys::path::filename(BaseInput); 4135 std::pair<StringRef, StringRef> Split = Name.split('.'); 4136 std::string TmpName = GetTemporaryPath( 4137 Split.first, types::getTypeTempSuffix(JA.getType(), IsCLMode())); 4138 return C.addTempFile(C.getArgs().MakeArgString(TmpName)); 4139 } 4140 } 4141 4142 // As an annoying special case, PCH generation doesn't strip the pathname. 4143 if (JA.getType() == types::TY_PCH && !IsCLMode()) { 4144 llvm::sys::path::remove_filename(BasePath); 4145 if (BasePath.empty()) 4146 BasePath = NamedOutput; 4147 else 4148 llvm::sys::path::append(BasePath, NamedOutput); 4149 return C.addResultFile(C.getArgs().MakeArgString(BasePath.c_str()), &JA); 4150 } else { 4151 return C.addResultFile(NamedOutput, &JA); 4152 } 4153 } 4154 4155 std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const { 4156 // Respect a limited subset of the '-Bprefix' functionality in GCC by 4157 // attempting to use this prefix when looking for file paths. 4158 for (const std::string &Dir : PrefixDirs) { 4159 if (Dir.empty()) 4160 continue; 4161 SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir); 4162 llvm::sys::path::append(P, Name); 4163 if (llvm::sys::fs::exists(Twine(P))) 4164 return P.str(); 4165 } 4166 4167 SmallString<128> R(ResourceDir); 4168 llvm::sys::path::append(R, Name); 4169 if (llvm::sys::fs::exists(Twine(R))) 4170 return R.str(); 4171 4172 SmallString<128> P(TC.getCompilerRTPath()); 4173 llvm::sys::path::append(P, Name); 4174 if (llvm::sys::fs::exists(Twine(P))) 4175 return P.str(); 4176 4177 for (const std::string &Dir : TC.getFilePaths()) { 4178 if (Dir.empty()) 4179 continue; 4180 SmallString<128> P(Dir[0] == '=' ? SysRoot + Dir.substr(1) : Dir); 4181 llvm::sys::path::append(P, Name); 4182 if (llvm::sys::fs::exists(Twine(P))) 4183 return P.str(); 4184 } 4185 4186 return Name; 4187 } 4188 4189 void Driver::generatePrefixedToolNames( 4190 StringRef Tool, const ToolChain &TC, 4191 SmallVectorImpl<std::string> &Names) const { 4192 // FIXME: Needs a better variable than TargetTriple 4193 Names.emplace_back((TargetTriple + "-" + Tool).str()); 4194 Names.emplace_back(Tool); 4195 4196 // Allow the discovery of tools prefixed with LLVM's default target triple. 4197 std::string DefaultTargetTriple = llvm::sys::getDefaultTargetTriple(); 4198 if (DefaultTargetTriple != TargetTriple) 4199 Names.emplace_back((DefaultTargetTriple + "-" + Tool).str()); 4200 } 4201 4202 static bool ScanDirForExecutable(SmallString<128> &Dir, 4203 ArrayRef<std::string> Names) { 4204 for (const auto &Name : Names) { 4205 llvm::sys::path::append(Dir, Name); 4206 if (llvm::sys::fs::can_execute(Twine(Dir))) 4207 return true; 4208 llvm::sys::path::remove_filename(Dir); 4209 } 4210 return false; 4211 } 4212 4213 std::string Driver::GetProgramPath(StringRef Name, const ToolChain &TC) const { 4214 SmallVector<std::string, 2> TargetSpecificExecutables; 4215 generatePrefixedToolNames(Name, TC, TargetSpecificExecutables); 4216 4217 // Respect a limited subset of the '-Bprefix' functionality in GCC by 4218 // attempting to use this prefix when looking for program paths. 4219 for (const auto &PrefixDir : PrefixDirs) { 4220 if (llvm::sys::fs::is_directory(PrefixDir)) { 4221 SmallString<128> P(PrefixDir); 4222 if (ScanDirForExecutable(P, TargetSpecificExecutables)) 4223 return P.str(); 4224 } else { 4225 SmallString<128> P((PrefixDir + Name).str()); 4226 if (llvm::sys::fs::can_execute(Twine(P))) 4227 return P.str(); 4228 } 4229 } 4230 4231 const ToolChain::path_list &List = TC.getProgramPaths(); 4232 for (const auto &Path : List) { 4233 SmallString<128> P(Path); 4234 if (ScanDirForExecutable(P, TargetSpecificExecutables)) 4235 return P.str(); 4236 } 4237 4238 // If all else failed, search the path. 4239 for (const auto &TargetSpecificExecutable : TargetSpecificExecutables) 4240 if (llvm::ErrorOr<std::string> P = 4241 llvm::sys::findProgramByName(TargetSpecificExecutable)) 4242 return *P; 4243 4244 return Name; 4245 } 4246 4247 std::string Driver::GetTemporaryPath(StringRef Prefix, StringRef Suffix) const { 4248 SmallString<128> Path; 4249 std::error_code EC = llvm::sys::fs::createTemporaryFile(Prefix, Suffix, Path); 4250 if (EC) { 4251 Diag(clang::diag::err_unable_to_make_temp) << EC.message(); 4252 return ""; 4253 } 4254 4255 return Path.str(); 4256 } 4257 4258 std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const { 4259 SmallString<128> Output; 4260 if (Arg *FpArg = C.getArgs().getLastArg(options::OPT__SLASH_Fp)) { 4261 // FIXME: If anybody needs it, implement this obscure rule: 4262 // "If you specify a directory without a file name, the default file name 4263 // is VCx0.pch., where x is the major version of Visual C++ in use." 4264 Output = FpArg->getValue(); 4265 4266 // "If you do not specify an extension as part of the path name, an 4267 // extension of .pch is assumed. " 4268 if (!llvm::sys::path::has_extension(Output)) 4269 Output += ".pch"; 4270 } else if (Arg *YcArg = C.getArgs().getLastArg(options::OPT__SLASH_Yc)) { 4271 Output = YcArg->getValue(); 4272 llvm::sys::path::replace_extension(Output, ".pch"); 4273 } else { 4274 Output = BaseName; 4275 llvm::sys::path::replace_extension(Output, ".pch"); 4276 } 4277 return Output.str(); 4278 } 4279 4280 const ToolChain &Driver::getToolChain(const ArgList &Args, 4281 const llvm::Triple &Target) const { 4282 4283 auto &TC = ToolChains[Target.str()]; 4284 if (!TC) { 4285 switch (Target.getOS()) { 4286 case llvm::Triple::Haiku: 4287 TC = llvm::make_unique<toolchains::Haiku>(*this, Target, Args); 4288 break; 4289 case llvm::Triple::Ananas: 4290 TC = llvm::make_unique<toolchains::Ananas>(*this, Target, Args); 4291 break; 4292 case llvm::Triple::CloudABI: 4293 TC = llvm::make_unique<toolchains::CloudABI>(*this, Target, Args); 4294 break; 4295 case llvm::Triple::Darwin: 4296 case llvm::Triple::MacOSX: 4297 case llvm::Triple::IOS: 4298 case llvm::Triple::TvOS: 4299 case llvm::Triple::WatchOS: 4300 TC = llvm::make_unique<toolchains::DarwinClang>(*this, Target, Args); 4301 break; 4302 case llvm::Triple::DragonFly: 4303 TC = llvm::make_unique<toolchains::DragonFly>(*this, Target, Args); 4304 break; 4305 case llvm::Triple::OpenBSD: 4306 TC = llvm::make_unique<toolchains::OpenBSD>(*this, Target, Args); 4307 break; 4308 case llvm::Triple::NetBSD: 4309 TC = llvm::make_unique<toolchains::NetBSD>(*this, Target, Args); 4310 break; 4311 case llvm::Triple::FreeBSD: 4312 TC = llvm::make_unique<toolchains::FreeBSD>(*this, Target, Args); 4313 break; 4314 case llvm::Triple::Minix: 4315 TC = llvm::make_unique<toolchains::Minix>(*this, Target, Args); 4316 break; 4317 case llvm::Triple::Linux: 4318 case llvm::Triple::ELFIAMCU: 4319 if (Target.getArch() == llvm::Triple::hexagon) 4320 TC = llvm::make_unique<toolchains::HexagonToolChain>(*this, Target, 4321 Args); 4322 else if ((Target.getVendor() == llvm::Triple::MipsTechnologies) && 4323 !Target.hasEnvironment()) 4324 TC = llvm::make_unique<toolchains::MipsLLVMToolChain>(*this, Target, 4325 Args); 4326 else 4327 TC = llvm::make_unique<toolchains::Linux>(*this, Target, Args); 4328 break; 4329 case llvm::Triple::NaCl: 4330 TC = llvm::make_unique<toolchains::NaClToolChain>(*this, Target, Args); 4331 break; 4332 case llvm::Triple::Fuchsia: 4333 TC = llvm::make_unique<toolchains::Fuchsia>(*this, Target, Args); 4334 break; 4335 case llvm::Triple::Solaris: 4336 TC = llvm::make_unique<toolchains::Solaris>(*this, Target, Args); 4337 break; 4338 case llvm::Triple::AMDHSA: 4339 TC = llvm::make_unique<toolchains::AMDGPUToolChain>(*this, Target, Args); 4340 break; 4341 case llvm::Triple::Win32: 4342 switch (Target.getEnvironment()) { 4343 default: 4344 if (Target.isOSBinFormatELF()) 4345 TC = llvm::make_unique<toolchains::Generic_ELF>(*this, Target, Args); 4346 else if (Target.isOSBinFormatMachO()) 4347 TC = llvm::make_unique<toolchains::MachO>(*this, Target, Args); 4348 else 4349 TC = llvm::make_unique<toolchains::Generic_GCC>(*this, Target, Args); 4350 break; 4351 case llvm::Triple::GNU: 4352 TC = llvm::make_unique<toolchains::MinGW>(*this, Target, Args); 4353 break; 4354 case llvm::Triple::Itanium: 4355 TC = llvm::make_unique<toolchains::CrossWindowsToolChain>(*this, Target, 4356 Args); 4357 break; 4358 case llvm::Triple::MSVC: 4359 case llvm::Triple::UnknownEnvironment: 4360 if (Args.getLastArgValue(options::OPT_fuse_ld_EQ) 4361 .startswith_lower("bfd")) 4362 TC = llvm::make_unique<toolchains::CrossWindowsToolChain>( 4363 *this, Target, Args); 4364 else 4365 TC = 4366 llvm::make_unique<toolchains::MSVCToolChain>(*this, Target, Args); 4367 break; 4368 } 4369 break; 4370 case llvm::Triple::PS4: 4371 TC = llvm::make_unique<toolchains::PS4CPU>(*this, Target, Args); 4372 break; 4373 case llvm::Triple::Contiki: 4374 TC = llvm::make_unique<toolchains::Contiki>(*this, Target, Args); 4375 break; 4376 default: 4377 // Of these targets, Hexagon is the only one that might have 4378 // an OS of Linux, in which case it got handled above already. 4379 switch (Target.getArch()) { 4380 case llvm::Triple::tce: 4381 TC = llvm::make_unique<toolchains::TCEToolChain>(*this, Target, Args); 4382 break; 4383 case llvm::Triple::tcele: 4384 TC = llvm::make_unique<toolchains::TCELEToolChain>(*this, Target, Args); 4385 break; 4386 case llvm::Triple::hexagon: 4387 TC = llvm::make_unique<toolchains::HexagonToolChain>(*this, Target, 4388 Args); 4389 break; 4390 case llvm::Triple::lanai: 4391 TC = llvm::make_unique<toolchains::LanaiToolChain>(*this, Target, Args); 4392 break; 4393 case llvm::Triple::xcore: 4394 TC = llvm::make_unique<toolchains::XCoreToolChain>(*this, Target, Args); 4395 break; 4396 case llvm::Triple::wasm32: 4397 case llvm::Triple::wasm64: 4398 TC = llvm::make_unique<toolchains::WebAssembly>(*this, Target, Args); 4399 break; 4400 case llvm::Triple::avr: 4401 TC = llvm::make_unique<toolchains::AVRToolChain>(*this, Target, Args); 4402 break; 4403 case llvm::Triple::riscv32: 4404 case llvm::Triple::riscv64: 4405 TC = llvm::make_unique<toolchains::RISCVToolChain>(*this, Target, Args); 4406 break; 4407 default: 4408 if (Target.getVendor() == llvm::Triple::Myriad) 4409 TC = llvm::make_unique<toolchains::MyriadToolChain>(*this, Target, 4410 Args); 4411 else if (toolchains::BareMetal::handlesTarget(Target)) 4412 TC = llvm::make_unique<toolchains::BareMetal>(*this, Target, Args); 4413 else if (Target.isOSBinFormatELF()) 4414 TC = llvm::make_unique<toolchains::Generic_ELF>(*this, Target, Args); 4415 else if (Target.isOSBinFormatMachO()) 4416 TC = llvm::make_unique<toolchains::MachO>(*this, Target, Args); 4417 else 4418 TC = llvm::make_unique<toolchains::Generic_GCC>(*this, Target, Args); 4419 } 4420 } 4421 } 4422 4423 // Intentionally omitted from the switch above: llvm::Triple::CUDA. CUDA 4424 // compiles always need two toolchains, the CUDA toolchain and the host 4425 // toolchain. So the only valid way to create a CUDA toolchain is via 4426 // CreateOffloadingDeviceToolChains. 4427 4428 return *TC; 4429 } 4430 4431 bool Driver::ShouldUseClangCompiler(const JobAction &JA) const { 4432 // Say "no" if there is not exactly one input of a type clang understands. 4433 if (JA.size() != 1 || 4434 !types::isAcceptedByClang((*JA.input_begin())->getType())) 4435 return false; 4436 4437 // And say "no" if this is not a kind of action clang understands. 4438 if (!isa<PreprocessJobAction>(JA) && !isa<PrecompileJobAction>(JA) && 4439 !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA)) 4440 return false; 4441 4442 return true; 4443 } 4444 4445 /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the 4446 /// grouped values as integers. Numbers which are not provided are set to 0. 4447 /// 4448 /// \return True if the entire string was parsed (9.2), or all groups were 4449 /// parsed (10.3.5extrastuff). 4450 bool Driver::GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, 4451 unsigned &Micro, bool &HadExtra) { 4452 HadExtra = false; 4453 4454 Major = Minor = Micro = 0; 4455 if (Str.empty()) 4456 return false; 4457 4458 if (Str.consumeInteger(10, Major)) 4459 return false; 4460 if (Str.empty()) 4461 return true; 4462 if (Str[0] != '.') 4463 return false; 4464 4465 Str = Str.drop_front(1); 4466 4467 if (Str.consumeInteger(10, Minor)) 4468 return false; 4469 if (Str.empty()) 4470 return true; 4471 if (Str[0] != '.') 4472 return false; 4473 Str = Str.drop_front(1); 4474 4475 if (Str.consumeInteger(10, Micro)) 4476 return false; 4477 if (!Str.empty()) 4478 HadExtra = true; 4479 return true; 4480 } 4481 4482 /// Parse digits from a string \p Str and fulfill \p Digits with 4483 /// the parsed numbers. This method assumes that the max number of 4484 /// digits to look for is equal to Digits.size(). 4485 /// 4486 /// \return True if the entire string was parsed and there are 4487 /// no extra characters remaining at the end. 4488 bool Driver::GetReleaseVersion(StringRef Str, 4489 MutableArrayRef<unsigned> Digits) { 4490 if (Str.empty()) 4491 return false; 4492 4493 unsigned CurDigit = 0; 4494 while (CurDigit < Digits.size()) { 4495 unsigned Digit; 4496 if (Str.consumeInteger(10, Digit)) 4497 return false; 4498 Digits[CurDigit] = Digit; 4499 if (Str.empty()) 4500 return true; 4501 if (Str[0] != '.') 4502 return false; 4503 Str = Str.drop_front(1); 4504 CurDigit++; 4505 } 4506 4507 // More digits than requested, bail out... 4508 return false; 4509 } 4510 4511 std::pair<unsigned, unsigned> Driver::getIncludeExcludeOptionFlagMasks() const { 4512 unsigned IncludedFlagsBitmask = 0; 4513 unsigned ExcludedFlagsBitmask = options::NoDriverOption; 4514 4515 if (Mode == CLMode) { 4516 // Include CL and Core options. 4517 IncludedFlagsBitmask |= options::CLOption; 4518 IncludedFlagsBitmask |= options::CoreOption; 4519 } else { 4520 ExcludedFlagsBitmask |= options::CLOption; 4521 } 4522 4523 return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask); 4524 } 4525 4526 bool clang::driver::isOptimizationLevelFast(const ArgList &Args) { 4527 return Args.hasFlag(options::OPT_Ofast, options::OPT_O_Group, false); 4528 } 4529