1 //===--- Driver.h - Clang GCC Compatible Driver -----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_DRIVER_DRIVER_H 10 #define LLVM_CLANG_DRIVER_DRIVER_H 11 12 #include "clang/Basic/Diagnostic.h" 13 #include "clang/Basic/HeaderInclude.h" 14 #include "clang/Basic/LLVM.h" 15 #include "clang/Driver/Action.h" 16 #include "clang/Driver/DriverDiagnostic.h" 17 #include "clang/Driver/InputInfo.h" 18 #include "clang/Driver/Options.h" 19 #include "clang/Driver/Phases.h" 20 #include "clang/Driver/ToolChain.h" 21 #include "clang/Driver/Types.h" 22 #include "clang/Driver/Util.h" 23 #include "llvm/ADT/ArrayRef.h" 24 #include "llvm/ADT/StringMap.h" 25 #include "llvm/ADT/StringRef.h" 26 #include "llvm/Option/Arg.h" 27 #include "llvm/Option/ArgList.h" 28 #include "llvm/Support/StringSaver.h" 29 30 #include <list> 31 #include <map> 32 #include <string> 33 #include <vector> 34 35 namespace llvm { 36 class Triple; 37 namespace vfs { 38 class FileSystem; 39 } 40 namespace cl { 41 class ExpansionContext; 42 } 43 } // namespace llvm 44 45 namespace clang { 46 47 namespace driver { 48 49 typedef SmallVector<InputInfo, 4> InputInfoList; 50 51 class Command; 52 class Compilation; 53 class JobAction; 54 class ToolChain; 55 56 /// Describes the kind of LTO mode selected via -f(no-)?lto(=.*)? options. 57 enum LTOKind { 58 LTOK_None, 59 LTOK_Full, 60 LTOK_Thin, 61 LTOK_Unknown 62 }; 63 64 /// Whether headers used to construct C++20 module units should be looked 65 /// up by the path supplied on the command line, or in the user or system 66 /// search paths. 67 enum ModuleHeaderMode { 68 HeaderMode_None, 69 HeaderMode_Default, 70 HeaderMode_User, 71 HeaderMode_System 72 }; 73 74 /// Driver - Encapsulate logic for constructing compilation processes 75 /// from a set of gcc-driver-like command line arguments. 76 class Driver { 77 DiagnosticsEngine &Diags; 78 79 IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS; 80 81 enum DriverMode { 82 GCCMode, 83 GXXMode, 84 CPPMode, 85 CLMode, 86 FlangMode, 87 DXCMode 88 } Mode; 89 90 enum SaveTempsMode { 91 SaveTempsNone, 92 SaveTempsCwd, 93 SaveTempsObj 94 } SaveTemps; 95 96 enum BitcodeEmbedMode { 97 EmbedNone, 98 EmbedMarker, 99 EmbedBitcode 100 } BitcodeEmbed; 101 102 enum OffloadMode { 103 OffloadHostDevice, 104 OffloadHost, 105 OffloadDevice, 106 } Offload; 107 108 /// Header unit mode set by -fmodule-header={user,system}. 109 ModuleHeaderMode CXX20HeaderType; 110 111 /// Set if we should process inputs and jobs with C++20 module 112 /// interpretation. 113 bool ModulesModeCXX20; 114 115 /// LTO mode selected via -f(no-)?lto(=.*)? options. 116 LTOKind LTOMode; 117 118 /// LTO mode selected via -f(no-offload-)?lto(=.*)? options. 119 LTOKind OffloadLTOMode; 120 121 public: 122 enum OpenMPRuntimeKind { 123 /// An unknown OpenMP runtime. We can't generate effective OpenMP code 124 /// without knowing what runtime to target. 125 OMPRT_Unknown, 126 127 /// The LLVM OpenMP runtime. When completed and integrated, this will become 128 /// the default for Clang. 129 OMPRT_OMP, 130 131 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for 132 /// this runtime but can swallow the pragmas, and find and link against the 133 /// runtime library itself. 134 OMPRT_GOMP, 135 136 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel 137 /// OpenMP runtime. We support this mode for users with existing 138 /// dependencies on this runtime library name. 139 OMPRT_IOMP5 140 }; 141 142 // Diag - Forwarding function for diagnostics. Diag(unsigned DiagID)143 DiagnosticBuilder Diag(unsigned DiagID) const { 144 return Diags.Report(DiagID); 145 } 146 147 // FIXME: Privatize once interface is stable. 148 public: 149 /// The name the driver was invoked as. 150 std::string Name; 151 152 /// The path the driver executable was in, as invoked from the 153 /// command line. 154 std::string Dir; 155 156 /// The original path to the clang executable. 157 std::string ClangExecutable; 158 159 /// Target and driver mode components extracted from clang executable name. 160 ParsedClangName ClangNameParts; 161 162 /// The path to the installed clang directory, if any. 163 std::string InstalledDir; 164 165 /// The path to the compiler resource directory. 166 std::string ResourceDir; 167 168 /// System directory for config files. 169 std::string SystemConfigDir; 170 171 /// User directory for config files. 172 std::string UserConfigDir; 173 174 /// A prefix directory used to emulate a limited subset of GCC's '-Bprefix' 175 /// functionality. 176 /// FIXME: This type of customization should be removed in favor of the 177 /// universal driver when it is ready. 178 typedef SmallVector<std::string, 4> prefix_list; 179 prefix_list PrefixDirs; 180 181 /// sysroot, if present 182 std::string SysRoot; 183 184 /// Dynamic loader prefix, if present 185 std::string DyldPrefix; 186 187 /// Driver title to use with help. 188 std::string DriverTitle; 189 190 /// Information about the host which can be overridden by the user. 191 std::string HostBits, HostMachine, HostSystem, HostRelease; 192 193 /// The file to log CC_PRINT_PROC_STAT_FILE output to, if enabled. 194 std::string CCPrintStatReportFilename; 195 196 /// The file to log CC_PRINT_OPTIONS output to, if enabled. 197 std::string CCPrintOptionsFilename; 198 199 /// The file to log CC_PRINT_HEADERS output to, if enabled. 200 std::string CCPrintHeadersFilename; 201 202 /// The file to log CC_LOG_DIAGNOSTICS output to, if enabled. 203 std::string CCLogDiagnosticsFilename; 204 205 /// An input type and its arguments. 206 using InputTy = std::pair<types::ID, const llvm::opt::Arg *>; 207 208 /// A list of inputs and their types for the given arguments. 209 using InputList = SmallVector<InputTy, 16>; 210 211 /// Whether the driver should follow g++ like behavior. CCCIsCXX()212 bool CCCIsCXX() const { return Mode == GXXMode; } 213 214 /// Whether the driver is just the preprocessor. CCCIsCPP()215 bool CCCIsCPP() const { return Mode == CPPMode; } 216 217 /// Whether the driver should follow gcc like behavior. CCCIsCC()218 bool CCCIsCC() const { return Mode == GCCMode; } 219 220 /// Whether the driver should follow cl.exe like behavior. IsCLMode()221 bool IsCLMode() const { return Mode == CLMode; } 222 223 /// Whether the driver should invoke flang for fortran inputs. 224 /// Other modes fall back to calling gcc which in turn calls gfortran. IsFlangMode()225 bool IsFlangMode() const { return Mode == FlangMode; } 226 227 /// Whether the driver should follow dxc.exe like behavior. IsDXCMode()228 bool IsDXCMode() const { return Mode == DXCMode; } 229 230 /// Only print tool bindings, don't build any jobs. 231 unsigned CCCPrintBindings : 1; 232 233 /// Set CC_PRINT_OPTIONS mode, which is like -v but logs the commands to 234 /// CCPrintOptionsFilename or to stderr. 235 unsigned CCPrintOptions : 1; 236 237 /// The format of the header information that is emitted. If CC_PRINT_HEADERS 238 /// is set, the format is textual. Otherwise, the format is determined by the 239 /// enviroment variable CC_PRINT_HEADERS_FORMAT. 240 HeaderIncludeFormatKind CCPrintHeadersFormat = HIFMT_None; 241 242 /// This flag determines whether clang should filter the header information 243 /// that is emitted. If enviroment variable CC_PRINT_HEADERS_FILTERING is set 244 /// to "only-direct-system", only system headers that are directly included 245 /// from non-system headers are emitted. 246 HeaderIncludeFilteringKind CCPrintHeadersFiltering = HIFIL_None; 247 248 /// Set CC_LOG_DIAGNOSTICS mode, which causes the frontend to log diagnostics 249 /// to CCLogDiagnosticsFilename or to stderr, in a stable machine readable 250 /// format. 251 unsigned CCLogDiagnostics : 1; 252 253 /// Whether the driver is generating diagnostics for debugging purposes. 254 unsigned CCGenDiagnostics : 1; 255 256 /// Set CC_PRINT_PROC_STAT mode, which causes the driver to dump 257 /// performance report to CC_PRINT_PROC_STAT_FILE or to stdout. 258 unsigned CCPrintProcessStats : 1; 259 260 /// Pointer to the ExecuteCC1Tool function, if available. 261 /// When the clangDriver lib is used through clang.exe, this provides a 262 /// shortcut for executing the -cc1 command-line directly, in the same 263 /// process. 264 typedef int (*CC1ToolFunc)(SmallVectorImpl<const char *> &ArgV); 265 CC1ToolFunc CC1Main = nullptr; 266 267 private: 268 /// Raw target triple. 269 std::string TargetTriple; 270 271 /// Name to use when invoking gcc/g++. 272 std::string CCCGenericGCCName; 273 274 /// Paths to configuration files used. 275 std::vector<std::string> ConfigFiles; 276 277 /// Allocator for string saver. 278 llvm::BumpPtrAllocator Alloc; 279 280 /// Object that stores strings read from configuration file. 281 llvm::StringSaver Saver; 282 283 /// Arguments originated from configuration file. 284 std::unique_ptr<llvm::opt::InputArgList> CfgOptions; 285 286 /// Arguments originated from command line. 287 std::unique_ptr<llvm::opt::InputArgList> CLOptions; 288 289 /// Whether to check that input files exist when constructing compilation 290 /// jobs. 291 unsigned CheckInputsExist : 1; 292 /// Whether to probe for PCH files on disk, in order to upgrade 293 /// -include foo.h to -include-pch foo.h.pch. 294 unsigned ProbePrecompiled : 1; 295 296 public: 297 // getFinalPhase - Determine which compilation mode we are in and record 298 // which option we used to determine the final phase. 299 // TODO: Much of what getFinalPhase returns are not actually true compiler 300 // modes. Fold this functionality into Types::getCompilationPhases and 301 // handleArguments. 302 phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL, 303 llvm::opt::Arg **FinalPhaseArg = nullptr) const; 304 305 private: 306 /// Certain options suppress the 'no input files' warning. 307 unsigned SuppressMissingInputWarning : 1; 308 309 /// Cache of all the ToolChains in use by the driver. 310 /// 311 /// This maps from the string representation of a triple to a ToolChain 312 /// created targeting that triple. The driver owns all the ToolChain objects 313 /// stored in it, and will clean them up when torn down. 314 mutable llvm::StringMap<std::unique_ptr<ToolChain>> ToolChains; 315 316 /// Cache of known offloading architectures for the ToolChain already derived. 317 /// This should only be modified when we first initialize the offloading 318 /// toolchains. 319 llvm::DenseMap<const ToolChain *, llvm::DenseSet<llvm::StringRef>> KnownArchs; 320 321 private: 322 /// TranslateInputArgs - Create a new derived argument list from the input 323 /// arguments, after applying the standard argument translations. 324 llvm::opt::DerivedArgList * 325 TranslateInputArgs(const llvm::opt::InputArgList &Args) const; 326 327 // handleArguments - All code related to claiming and printing diagnostics 328 // related to arguments to the driver are done here. 329 void handleArguments(Compilation &C, llvm::opt::DerivedArgList &Args, 330 const InputList &Inputs, ActionList &Actions) const; 331 332 // Before executing jobs, sets up response files for commands that need them. 333 void setUpResponseFiles(Compilation &C, Command &Cmd); 334 335 void generatePrefixedToolNames(StringRef Tool, const ToolChain &TC, 336 SmallVectorImpl<std::string> &Names) const; 337 338 /// Find the appropriate .crash diagonostic file for the child crash 339 /// under this driver and copy it out to a temporary destination with the 340 /// other reproducer related files (.sh, .cache, etc). If not found, suggest a 341 /// directory for the user to look at. 342 /// 343 /// \param ReproCrashFilename The file path to copy the .crash to. 344 /// \param CrashDiagDir The suggested directory for the user to look at 345 /// in case the search or copy fails. 346 /// 347 /// \returns If the .crash is found and successfully copied return true, 348 /// otherwise false and return the suggested directory in \p CrashDiagDir. 349 bool getCrashDiagnosticFile(StringRef ReproCrashFilename, 350 SmallString<128> &CrashDiagDir); 351 352 public: 353 354 /// Takes the path to a binary that's either in bin/ or lib/ and returns 355 /// the path to clang's resource directory. 356 static std::string GetResourcesPath(StringRef BinaryPath, 357 StringRef CustomResourceDir = ""); 358 359 Driver(StringRef ClangExecutable, StringRef TargetTriple, 360 DiagnosticsEngine &Diags, std::string Title = "clang LLVM compiler", 361 IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr); 362 363 /// @name Accessors 364 /// @{ 365 366 /// Name to use when invoking gcc/g++. getCCCGenericGCCName()367 const std::string &getCCCGenericGCCName() const { return CCCGenericGCCName; } 368 getConfigFiles()369 llvm::ArrayRef<std::string> getConfigFiles() const { 370 return ConfigFiles; 371 } 372 getOpts()373 const llvm::opt::OptTable &getOpts() const { return getDriverOptTable(); } 374 getDiags()375 DiagnosticsEngine &getDiags() const { return Diags; } 376 getVFS()377 llvm::vfs::FileSystem &getVFS() const { return *VFS; } 378 getCheckInputsExist()379 bool getCheckInputsExist() const { return CheckInputsExist; } 380 setCheckInputsExist(bool Value)381 void setCheckInputsExist(bool Value) { CheckInputsExist = Value; } 382 getProbePrecompiled()383 bool getProbePrecompiled() const { return ProbePrecompiled; } setProbePrecompiled(bool Value)384 void setProbePrecompiled(bool Value) { ProbePrecompiled = Value; } 385 setTargetAndMode(const ParsedClangName & TM)386 void setTargetAndMode(const ParsedClangName &TM) { ClangNameParts = TM; } 387 getTitle()388 const std::string &getTitle() { return DriverTitle; } setTitle(std::string Value)389 void setTitle(std::string Value) { DriverTitle = std::move(Value); } 390 getTargetTriple()391 std::string getTargetTriple() const { return TargetTriple; } 392 393 /// Get the path to the main clang executable. getClangProgramPath()394 const char *getClangProgramPath() const { 395 return ClangExecutable.c_str(); 396 } 397 398 /// Get the path to where the clang executable was installed. getInstalledDir()399 const char *getInstalledDir() const { 400 if (!InstalledDir.empty()) 401 return InstalledDir.c_str(); 402 return Dir.c_str(); 403 } setInstalledDir(StringRef Value)404 void setInstalledDir(StringRef Value) { InstalledDir = std::string(Value); } 405 isSaveTempsEnabled()406 bool isSaveTempsEnabled() const { return SaveTemps != SaveTempsNone; } isSaveTempsObj()407 bool isSaveTempsObj() const { return SaveTemps == SaveTempsObj; } 408 embedBitcodeEnabled()409 bool embedBitcodeEnabled() const { return BitcodeEmbed != EmbedNone; } embedBitcodeInObject()410 bool embedBitcodeInObject() const { return (BitcodeEmbed == EmbedBitcode); } embedBitcodeMarkerOnly()411 bool embedBitcodeMarkerOnly() const { return (BitcodeEmbed == EmbedMarker); } 412 offloadHostOnly()413 bool offloadHostOnly() const { return Offload == OffloadHost; } offloadDeviceOnly()414 bool offloadDeviceOnly() const { return Offload == OffloadDevice; } 415 416 /// Compute the desired OpenMP runtime from the flags provided. 417 OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const; 418 419 /// @} 420 /// @name Primary Functionality 421 /// @{ 422 423 /// CreateOffloadingDeviceToolChains - create all the toolchains required to 424 /// support offloading devices given the programming models specified in the 425 /// current compilation. Also, update the host tool chain kind accordingly. 426 void CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs); 427 428 /// BuildCompilation - Construct a compilation object for a command 429 /// line argument vector. 430 /// 431 /// \return A compilation, or 0 if none was built for the given 432 /// argument vector. A null return value does not necessarily 433 /// indicate an error condition, the diagnostics should be queried 434 /// to determine if an error occurred. 435 Compilation *BuildCompilation(ArrayRef<const char *> Args); 436 437 /// ParseArgStrings - Parse the given list of strings into an 438 /// ArgList. 439 llvm::opt::InputArgList ParseArgStrings(ArrayRef<const char *> Args, 440 bool IsClCompatMode, 441 bool &ContainsError); 442 443 /// BuildInputs - Construct the list of inputs and their types from 444 /// the given arguments. 445 /// 446 /// \param TC - The default host tool chain. 447 /// \param Args - The input arguments. 448 /// \param Inputs - The list to store the resulting compilation 449 /// inputs onto. 450 void BuildInputs(const ToolChain &TC, llvm::opt::DerivedArgList &Args, 451 InputList &Inputs) const; 452 453 /// BuildActions - Construct the list of actions to perform for the 454 /// given arguments, which are only done for a single architecture. 455 /// 456 /// \param C - The compilation that is being built. 457 /// \param Args - The input arguments. 458 /// \param Actions - The list to store the resulting actions onto. 459 void BuildActions(Compilation &C, llvm::opt::DerivedArgList &Args, 460 const InputList &Inputs, ActionList &Actions) const; 461 462 /// BuildUniversalActions - Construct the list of actions to perform 463 /// for the given arguments, which may require a universal build. 464 /// 465 /// \param C - The compilation that is being built. 466 /// \param TC - The default host tool chain. 467 void BuildUniversalActions(Compilation &C, const ToolChain &TC, 468 const InputList &BAInputs) const; 469 470 /// BuildOffloadingActions - Construct the list of actions to perform for the 471 /// offloading toolchain that will be embedded in the host. 472 /// 473 /// \param C - The compilation that is being built. 474 /// \param Args - The input arguments. 475 /// \param Input - The input type and arguments 476 /// \param HostAction - The host action used in the offloading toolchain. 477 Action *BuildOffloadingActions(Compilation &C, 478 llvm::opt::DerivedArgList &Args, 479 const InputTy &Input, 480 Action *HostAction) const; 481 482 /// Returns the set of bound architectures active for this offload kind. 483 /// If there are no bound architctures we return a set containing only the 484 /// empty string. The \p SuppressError option is used to suppress errors. 485 llvm::DenseSet<StringRef> 486 getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args, 487 Action::OffloadKind Kind, const ToolChain *TC, 488 bool SuppressError = false) const; 489 490 /// Check that the file referenced by Value exists. If it doesn't, 491 /// issue a diagnostic and return false. 492 /// If TypoCorrect is true and the file does not exist, see if it looks 493 /// like a likely typo for a flag and if so print a "did you mean" blurb. 494 bool DiagnoseInputExistence(const llvm::opt::DerivedArgList &Args, 495 StringRef Value, types::ID Ty, 496 bool TypoCorrect) const; 497 498 /// BuildJobs - Bind actions to concrete tools and translate 499 /// arguments to form the list of jobs to run. 500 /// 501 /// \param C - The compilation that is being built. 502 void BuildJobs(Compilation &C) const; 503 504 /// ExecuteCompilation - Execute the compilation according to the command line 505 /// arguments and return an appropriate exit code. 506 /// 507 /// This routine handles additional processing that must be done in addition 508 /// to just running the subprocesses, for example reporting errors, setting 509 /// up response files, removing temporary files, etc. 510 int ExecuteCompilation(Compilation &C, 511 SmallVectorImpl< std::pair<int, const Command *> > &FailingCommands); 512 513 /// Contains the files in the compilation diagnostic report generated by 514 /// generateCompilationDiagnostics. 515 struct CompilationDiagnosticReport { 516 llvm::SmallVector<std::string, 4> TemporaryFiles; 517 }; 518 519 /// generateCompilationDiagnostics - Generate diagnostics information 520 /// including preprocessed source file(s). 521 /// 522 void generateCompilationDiagnostics( 523 Compilation &C, const Command &FailingCommand, 524 StringRef AdditionalInformation = "", 525 CompilationDiagnosticReport *GeneratedReport = nullptr); 526 527 enum class CommandStatus { 528 Crash = 1, 529 Error, 530 Ok, 531 }; 532 533 enum class ReproLevel { 534 Off = 0, 535 OnCrash = static_cast<int>(CommandStatus::Crash), 536 OnError = static_cast<int>(CommandStatus::Error), 537 Always = static_cast<int>(CommandStatus::Ok), 538 }; 539 540 bool maybeGenerateCompilationDiagnostics( 541 CommandStatus CS, ReproLevel Level, Compilation &C, 542 const Command &FailingCommand, StringRef AdditionalInformation = "", 543 CompilationDiagnosticReport *GeneratedReport = nullptr) { 544 if (static_cast<int>(CS) > static_cast<int>(Level)) 545 return false; 546 if (CS != CommandStatus::Crash) 547 Diags.Report(diag::err_drv_force_crash) 548 << !::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH"); 549 // Hack to ensure that diagnostic notes get emitted. 550 Diags.setLastDiagnosticIgnored(false); 551 generateCompilationDiagnostics(C, FailingCommand, AdditionalInformation, 552 GeneratedReport); 553 return true; 554 } 555 556 /// @} 557 /// @name Helper Methods 558 /// @{ 559 560 /// PrintActions - Print the list of actions. 561 void PrintActions(const Compilation &C) const; 562 563 /// PrintHelp - Print the help text. 564 /// 565 /// \param ShowHidden - Show hidden options. 566 void PrintHelp(bool ShowHidden) const; 567 568 /// PrintVersion - Print the driver version. 569 void PrintVersion(const Compilation &C, raw_ostream &OS) const; 570 571 /// GetFilePath - Lookup \p Name in the list of file search paths. 572 /// 573 /// \param TC - The tool chain for additional information on 574 /// directories to search. 575 // 576 // FIXME: This should be in CompilationInfo. 577 std::string GetFilePath(StringRef Name, const ToolChain &TC) const; 578 579 /// GetProgramPath - Lookup \p Name in the list of program search paths. 580 /// 581 /// \param TC - The provided tool chain for additional information on 582 /// directories to search. 583 // 584 // FIXME: This should be in CompilationInfo. 585 std::string GetProgramPath(StringRef Name, const ToolChain &TC) const; 586 587 /// HandleAutocompletions - Handle --autocomplete by searching and printing 588 /// possible flags, descriptions, and its arguments. 589 void HandleAutocompletions(StringRef PassedFlags) const; 590 591 /// HandleImmediateArgs - Handle any arguments which should be 592 /// treated before building actions or binding tools. 593 /// 594 /// \return Whether any compilation should be built for this 595 /// invocation. 596 bool HandleImmediateArgs(const Compilation &C); 597 598 /// ConstructAction - Construct the appropriate action to do for 599 /// \p Phase on the \p Input, taking in to account arguments 600 /// like -fsyntax-only or --analyze. 601 Action *ConstructPhaseAction( 602 Compilation &C, const llvm::opt::ArgList &Args, phases::ID Phase, 603 Action *Input, 604 Action::OffloadKind TargetDeviceOffloadKind = Action::OFK_None) const; 605 606 /// BuildJobsForAction - Construct the jobs to perform for the action \p A and 607 /// return an InputInfo for the result of running \p A. Will only construct 608 /// jobs for a given (Action, ToolChain, BoundArch, DeviceKind) tuple once. 609 InputInfoList BuildJobsForAction( 610 Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, 611 bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, 612 std::map<std::pair<const Action *, std::string>, InputInfoList> 613 &CachedResults, 614 Action::OffloadKind TargetDeviceOffloadKind) const; 615 616 /// Returns the default name for linked images (e.g., "a.out"). 617 const char *getDefaultImageName() const; 618 619 // Creates a temp file with $Prefix-%%%%%%.$Suffix 620 const char *CreateTempFile(Compilation &C, StringRef Prefix, StringRef Suffix, 621 bool MultipleArchs = false, 622 StringRef BoundArch = {}) const; 623 624 /// GetNamedOutputPath - Return the name to use for the output of 625 /// the action \p JA. The result is appended to the compilation's 626 /// list of temporary or result files, as appropriate. 627 /// 628 /// \param C - The compilation. 629 /// \param JA - The action of interest. 630 /// \param BaseInput - The original input file that this action was 631 /// triggered by. 632 /// \param BoundArch - The bound architecture. 633 /// \param AtTopLevel - Whether this is a "top-level" action. 634 /// \param MultipleArchs - Whether multiple -arch options were supplied. 635 /// \param NormalizedTriple - The normalized triple of the relevant target. 636 const char *GetNamedOutputPath(Compilation &C, const JobAction &JA, 637 const char *BaseInput, StringRef BoundArch, 638 bool AtTopLevel, bool MultipleArchs, 639 StringRef NormalizedTriple) const; 640 641 /// GetTemporaryPath - Return the pathname of a temporary file to use 642 /// as part of compilation; the file will have the given prefix and suffix. 643 /// 644 /// GCC goes to extra lengths here to be a bit more robust. 645 std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const; 646 647 /// GetTemporaryDirectory - Return the pathname of a temporary directory to 648 /// use as part of compilation; the directory will have the given prefix. 649 std::string GetTemporaryDirectory(StringRef Prefix) const; 650 651 /// Return the pathname of the pch file in clang-cl mode. 652 std::string GetClPchPath(Compilation &C, StringRef BaseName) const; 653 654 /// ShouldUseClangCompiler - Should the clang compiler be used to 655 /// handle this action. 656 bool ShouldUseClangCompiler(const JobAction &JA) const; 657 658 /// ShouldUseFlangCompiler - Should the flang compiler be used to 659 /// handle this action. 660 bool ShouldUseFlangCompiler(const JobAction &JA) const; 661 662 /// ShouldEmitStaticLibrary - Should the linker emit a static library. 663 bool ShouldEmitStaticLibrary(const llvm::opt::ArgList &Args) const; 664 665 /// Returns true if the user has indicated a C++20 header unit mode. hasHeaderMode()666 bool hasHeaderMode() const { return CXX20HeaderType != HeaderMode_None; } 667 668 /// Get the mode for handling headers as set by fmodule-header{=}. getModuleHeaderMode()669 ModuleHeaderMode getModuleHeaderMode() const { return CXX20HeaderType; } 670 671 /// Returns true if we are performing any kind of LTO. 672 bool isUsingLTO(bool IsOffload = false) const { 673 return getLTOMode(IsOffload) != LTOK_None; 674 } 675 676 /// Get the specific kind of LTO being performed. 677 LTOKind getLTOMode(bool IsOffload = false) const { 678 return IsOffload ? OffloadLTOMode : LTOMode; 679 } 680 681 private: 682 683 /// Tries to load options from configuration files. 684 /// 685 /// \returns true if error occurred. 686 bool loadConfigFiles(); 687 688 /// Tries to load options from default configuration files (deduced from 689 /// executable filename). 690 /// 691 /// \returns true if error occurred. 692 bool loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx); 693 694 /// Read options from the specified file. 695 /// 696 /// \param [in] FileName File to read. 697 /// \param [in] Search and expansion options. 698 /// \returns true, if error occurred while reading. 699 bool readConfigFile(StringRef FileName, llvm::cl::ExpansionContext &ExpCtx); 700 701 /// Set the driver mode (cl, gcc, etc) from the value of the `--driver-mode` 702 /// option. 703 void setDriverMode(StringRef DriverModeValue); 704 705 /// Parse the \p Args list for LTO options and record the type of LTO 706 /// compilation based on which -f(no-)?lto(=.*)? option occurs last. 707 void setLTOMode(const llvm::opt::ArgList &Args); 708 709 /// Retrieves a ToolChain for a particular \p Target triple. 710 /// 711 /// Will cache ToolChains for the life of the driver object, and create them 712 /// on-demand. 713 const ToolChain &getToolChain(const llvm::opt::ArgList &Args, 714 const llvm::Triple &Target) const; 715 716 /// @} 717 718 /// Retrieves a ToolChain for a particular device \p Target triple 719 /// 720 /// \param[in] HostTC is the host ToolChain paired with the device 721 /// 722 /// \param[in] TargetDeviceOffloadKind (e.g. OFK_Cuda/OFK_OpenMP/OFK_SYCL) is 723 /// an Offloading action that is optionally passed to a ToolChain (used by 724 /// CUDA, to specify if it's used in conjunction with OpenMP) 725 /// 726 /// Will cache ToolChains for the life of the driver object, and create them 727 /// on-demand. 728 const ToolChain &getOffloadingDeviceToolChain( 729 const llvm::opt::ArgList &Args, const llvm::Triple &Target, 730 const ToolChain &HostTC, 731 const Action::OffloadKind &TargetDeviceOffloadKind) const; 732 733 /// Get bitmasks for which option flags to include and exclude based on 734 /// the driver mode. 735 std::pair<unsigned, unsigned> getIncludeExcludeOptionFlagMasks(bool IsClCompatMode) const; 736 737 /// Helper used in BuildJobsForAction. Doesn't use the cache when building 738 /// jobs specifically for the given action, but will use the cache when 739 /// building jobs for the Action's inputs. 740 InputInfoList BuildJobsForActionNoCache( 741 Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, 742 bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, 743 std::map<std::pair<const Action *, std::string>, InputInfoList> 744 &CachedResults, 745 Action::OffloadKind TargetDeviceOffloadKind) const; 746 747 /// Return the typical executable name for the specified driver \p Mode. 748 static const char *getExecutableForDriverMode(DriverMode Mode); 749 750 public: 751 /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and 752 /// return the grouped values as integers. Numbers which are not 753 /// provided are set to 0. 754 /// 755 /// \return True if the entire string was parsed (9.2), or all 756 /// groups were parsed (10.3.5extrastuff). HadExtra is true if all 757 /// groups were parsed but extra characters remain at the end. 758 static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, 759 unsigned &Micro, bool &HadExtra); 760 761 /// Parse digits from a string \p Str and fulfill \p Digits with 762 /// the parsed numbers. This method assumes that the max number of 763 /// digits to look for is equal to Digits.size(). 764 /// 765 /// \return True if the entire string was parsed and there are 766 /// no extra characters remaining at the end. 767 static bool GetReleaseVersion(StringRef Str, 768 MutableArrayRef<unsigned> Digits); 769 /// Compute the default -fmodule-cache-path. 770 /// \return True if the system provides a default cache directory. 771 static bool getDefaultModuleCachePath(SmallVectorImpl<char> &Result); 772 }; 773 774 /// \return True if the last defined optimization level is -Ofast. 775 /// And False otherwise. 776 bool isOptimizationLevelFast(const llvm::opt::ArgList &Args); 777 778 /// \return True if the argument combination will end up generating remarks. 779 bool willEmitRemarks(const llvm::opt::ArgList &Args); 780 781 /// Returns the driver mode option's value, i.e. `X` in `--driver-mode=X`. If \p 782 /// Args doesn't mention one explicitly, tries to deduce from `ProgName`. 783 /// Returns empty on failure. 784 /// Common values are "gcc", "g++", "cpp", "cl" and "flang". Returned value need 785 /// not be one of these. 786 llvm::StringRef getDriverMode(StringRef ProgName, ArrayRef<const char *> Args); 787 788 /// Checks whether the value produced by getDriverMode is for CL mode. 789 bool IsClangCL(StringRef DriverMode); 790 791 } // end namespace driver 792 } // end namespace clang 793 794 #endif 795