Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===- ToolChain.h - Collections of tools for one platform ------*- 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_TOOLCHAIN_H | ||
| 10 | #define LLVM_CLANG_DRIVER_TOOLCHAIN_H | ||
| 11 | |||
| 12 | #include "clang/Basic/DebugInfoOptions.h" | ||
| 13 | #include "clang/Basic/LLVM.h" | ||
| 14 | #include "clang/Basic/LangOptions.h" | ||
| 15 | #include "clang/Basic/Sanitizers.h" | ||
| 16 | #include "clang/Driver/Action.h" | ||
| 17 | #include "clang/Driver/Multilib.h" | ||
| 18 | #include "clang/Driver/Types.h" | ||
| 19 | #include "llvm/ADT/APFloat.h" | ||
| 20 | #include "llvm/ADT/ArrayRef.h" | ||
| 21 | #include "llvm/ADT/FloatingPointMode.h" | ||
| 22 | #include "llvm/ADT/SmallVector.h" | ||
| 23 | #include "llvm/ADT/StringRef.h" | ||
| 24 | #include "llvm/ADT/Triple.h" | ||
| 25 | #include "llvm/MC/MCTargetOptions.h" | ||
| 26 | #include "llvm/Option/Option.h" | ||
| 27 | #include "llvm/Support/VersionTuple.h" | ||
| 28 | #include "llvm/Target/TargetOptions.h" | ||
| 29 | #include <cassert> | ||
| 30 | #include <climits> | ||
| 31 | #include <memory> | ||
| 32 | #include <string> | ||
| 33 | #include <utility> | ||
| 34 | |||
| 35 | namespace llvm { | ||
| 36 | namespace opt { | ||
| 37 | |||
| 38 | class Arg; | ||
| 39 | class ArgList; | ||
| 40 | class DerivedArgList; | ||
| 41 | |||
| 42 | } // namespace opt | ||
| 43 | namespace vfs { | ||
| 44 | |||
| 45 | class FileSystem; | ||
| 46 | |||
| 47 | } // namespace vfs | ||
| 48 | } // namespace llvm | ||
| 49 | |||
| 50 | namespace clang { | ||
| 51 | |||
| 52 | class ObjCRuntime; | ||
| 53 | |||
| 54 | namespace driver { | ||
| 55 | |||
| 56 | class Driver; | ||
| 57 | class InputInfo; | ||
| 58 | class SanitizerArgs; | ||
| 59 | class Tool; | ||
| 60 | class XRayArgs; | ||
| 61 | |||
| 62 | /// Helper structure used to pass information extracted from clang executable | ||
| 63 | /// name such as `i686-linux-android-g++`. | ||
| 64 | struct ParsedClangName { | ||
| 65 |   /// Target part of the executable name, as `i686-linux-android`. | ||
| 66 | std::string TargetPrefix; | ||
| 67 | |||
| 68 |   /// Driver mode part of the executable name, as `g++`. | ||
| 69 | std::string ModeSuffix; | ||
| 70 | |||
| 71 |   /// Corresponding driver mode argument, as '--driver-mode=g++' | ||
| 72 | const char *DriverMode = nullptr; | ||
| 73 | |||
| 74 |   /// True if TargetPrefix is recognized as a registered target name. | ||
| 75 | bool TargetIsValid = false; | ||
| 76 | |||
| 77 | ParsedClangName() = default; | ||
| 78 | ParsedClangName(std::string Suffix, const char *Mode) | ||
| 79 | : ModeSuffix(Suffix), DriverMode(Mode) {} | ||
| 80 | ParsedClangName(std::string Target, std::string Suffix, const char *Mode, | ||
| 81 | bool IsRegistered) | ||
| 82 | : TargetPrefix(Target), ModeSuffix(Suffix), DriverMode(Mode), | ||
| 83 | TargetIsValid(IsRegistered) {} | ||
| 84 | |||
| 85 | bool isEmpty() const { | ||
| 86 | return TargetPrefix.empty() && ModeSuffix.empty() && DriverMode == nullptr; | ||
| 87 |   } | ||
| 88 | }; | ||
| 89 | |||
| 90 | /// ToolChain - Access to tools for a single platform. | ||
| 91 | class ToolChain { | ||
| 92 | public: | ||
| 93 | using path_list = SmallVector<std::string, 16>; | ||
| 94 | |||
| 95 | enum CXXStdlibType { | ||
| 96 | CST_Libcxx, | ||
| 97 | CST_Libstdcxx | ||
| 98 | }; | ||
| 99 | |||
| 100 | enum RuntimeLibType { | ||
| 101 | RLT_CompilerRT, | ||
| 102 | RLT_Libgcc | ||
| 103 | }; | ||
| 104 | |||
| 105 | enum UnwindLibType { | ||
| 106 | UNW_None, | ||
| 107 | UNW_CompilerRT, | ||
| 108 | UNW_Libgcc | ||
| 109 | }; | ||
| 110 | |||
| 111 | enum class UnwindTableLevel { | ||
| 112 | None, | ||
| 113 | Synchronous, | ||
| 114 | Asynchronous, | ||
| 115 | }; | ||
| 116 | |||
| 117 | enum RTTIMode { | ||
| 118 | RM_Enabled, | ||
| 119 | RM_Disabled, | ||
| 120 | }; | ||
| 121 | |||
| 122 | struct BitCodeLibraryInfo { | ||
| 123 | std::string Path; | ||
| 124 | bool ShouldInternalize; | ||
| 125 | BitCodeLibraryInfo(StringRef Path, bool ShouldInternalize = true) | ||
| 126 | : Path(Path), ShouldInternalize(ShouldInternalize) {} | ||
| 127 | }; | ||
| 128 | |||
| 129 | enum FileType { FT_Object, FT_Static, FT_Shared }; | ||
| 130 | |||
| 131 | private: | ||
| 132 | friend class RegisterEffectiveTriple; | ||
| 133 | |||
| 134 | const Driver &D; | ||
| 135 | llvm::Triple Triple; | ||
| 136 | const llvm::opt::ArgList &Args; | ||
| 137 | |||
| 138 |   // We need to initialize CachedRTTIArg before CachedRTTIMode | ||
| 139 | const llvm::opt::Arg *const CachedRTTIArg; | ||
| 140 | |||
| 141 | const RTTIMode CachedRTTIMode; | ||
| 142 | |||
| 143 |   /// The list of toolchain specific path prefixes to search for libraries. | ||
| 144 |   path_list LibraryPaths; | ||
| 145 | |||
| 146 |   /// The list of toolchain specific path prefixes to search for files. | ||
| 147 |   path_list FilePaths; | ||
| 148 | |||
| 149 |   /// The list of toolchain specific path prefixes to search for programs. | ||
| 150 |   path_list ProgramPaths; | ||
| 151 | |||
| 152 | mutable std::unique_ptr<Tool> Clang; | ||
| 153 | mutable std::unique_ptr<Tool> Flang; | ||
| 154 | mutable std::unique_ptr<Tool> Assemble; | ||
| 155 | mutable std::unique_ptr<Tool> Link; | ||
| 156 | mutable std::unique_ptr<Tool> StaticLibTool; | ||
| 157 | mutable std::unique_ptr<Tool> IfsMerge; | ||
| 158 | mutable std::unique_ptr<Tool> OffloadBundler; | ||
| 159 | mutable std::unique_ptr<Tool> OffloadPackager; | ||
| 160 | mutable std::unique_ptr<Tool> LinkerWrapper; | ||
| 161 | |||
| 162 | Tool *getClang() const; | ||
| 163 | Tool *getFlang() const; | ||
| 164 | Tool *getAssemble() const; | ||
| 165 | Tool *getLink() const; | ||
| 166 | Tool *getStaticLibTool() const; | ||
| 167 | Tool *getIfsMerge() const; | ||
| 168 | Tool *getClangAs() const; | ||
| 169 | Tool *getOffloadBundler() const; | ||
| 170 | Tool *getOffloadPackager() const; | ||
| 171 | Tool *getLinkerWrapper() const; | ||
| 172 | |||
| 173 | mutable bool SanitizerArgsChecked = false; | ||
| 174 | mutable std::unique_ptr<XRayArgs> XRayArguments; | ||
| 175 | |||
| 176 |   /// The effective clang triple for the current Job. | ||
| 177 | mutable llvm::Triple EffectiveTriple; | ||
| 178 | |||
| 179 |   /// Set the toolchain's effective clang triple. | ||
| 180 | void setEffectiveTriple(llvm::Triple ET) const { | ||
| 181 | EffectiveTriple = std::move(ET); | ||
| 182 |   } | ||
| 183 | |||
| 184 | mutable std::optional<CXXStdlibType> cxxStdlibType; | ||
| 185 | mutable std::optional<RuntimeLibType> runtimeLibType; | ||
| 186 | mutable std::optional<UnwindLibType> unwindLibType; | ||
| 187 | |||
| 188 | protected: | ||
| 189 |   MultilibSet Multilibs; | ||
| 190 |   Multilib SelectedMultilib; | ||
| 191 | |||
| 192 | ToolChain(const Driver &D, const llvm::Triple &T, | ||
| 193 | const llvm::opt::ArgList &Args); | ||
| 194 | |||
| 195 |   /// Executes the given \p Executable and returns the stdout. | ||
| 196 | llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> | ||
| 197 | executeToolChainProgram(StringRef Executable) const; | ||
| 198 | |||
| 199 | void setTripleEnvironment(llvm::Triple::EnvironmentType Env); | ||
| 200 | |||
| 201 | virtual Tool *buildAssembler() const; | ||
| 202 | virtual Tool *buildLinker() const; | ||
| 203 | virtual Tool *buildStaticLibTool() const; | ||
| 204 | virtual Tool *getTool(Action::ActionClass AC) const; | ||
| 205 | |||
| 206 | virtual std::string buildCompilerRTBasename(const llvm::opt::ArgList &Args, | ||
| 207 | StringRef Component, | ||
| 208 | FileType Type, | ||
| 209 | bool AddArch) const; | ||
| 210 | |||
| 211 |   /// \name Utilities for implementing subclasses. | ||
| 212 |   ///@{ | ||
| 213 | static void addSystemInclude(const llvm::opt::ArgList &DriverArgs, | ||
| 214 | llvm::opt::ArgStringList &CC1Args, | ||
| 215 | const Twine &Path); | ||
| 216 | static void addExternCSystemInclude(const llvm::opt::ArgList &DriverArgs, | ||
| 217 | llvm::opt::ArgStringList &CC1Args, | ||
| 218 | const Twine &Path); | ||
| 219 | static void | ||
| 220 | addExternCSystemIncludeIfExists(const llvm::opt::ArgList &DriverArgs, | ||
| 221 | llvm::opt::ArgStringList &CC1Args, | ||
| 222 | const Twine &Path); | ||
| 223 | static void addSystemIncludes(const llvm::opt::ArgList &DriverArgs, | ||
| 224 | llvm::opt::ArgStringList &CC1Args, | ||
| 225 | ArrayRef<StringRef> Paths); | ||
| 226 | |||
| 227 | static std::string concat(StringRef Path, const Twine &A, const Twine &B = "", | ||
| 228 | const Twine &C = "", const Twine &D = ""); | ||
| 229 |   ///@} | ||
| 230 | |||
| 231 | public: | ||
| 232 | virtual ~ToolChain(); | ||
| 233 | |||
| 234 |   // Accessors | ||
| 235 | |||
| 236 | const Driver &getDriver() const { return D; } | ||
| 237 | llvm::vfs::FileSystem &getVFS() const; | ||
| 238 | const llvm::Triple &getTriple() const { return Triple; } | ||
| 239 | |||
| 240 |   /// Get the toolchain's aux triple, if it has one. | ||
| 241 |   /// | ||
| 242 |   /// Exactly what the aux triple represents depends on the toolchain, but for | ||
| 243 |   /// example when compiling CUDA code for the GPU, the triple might be NVPTX, | ||
| 244 |   /// while the aux triple is the host (CPU) toolchain, e.g. x86-linux-gnu. | ||
| 245 | virtual const llvm::Triple *getAuxTriple() const { return nullptr; } | ||
| 246 | |||
| 247 |   /// Some toolchains need to modify the file name, for example to replace the | ||
| 248 |   /// extension for object files with .cubin for OpenMP offloading to Nvidia | ||
| 249 |   /// GPUs. | ||
| 250 | virtual std::string getInputFilename(const InputInfo &Input) const; | ||
| 251 | |||
| 252 | llvm::Triple::ArchType getArch() const { return Triple.getArch(); } | ||
| 253 | StringRef getArchName() const { return Triple.getArchName(); } | ||
| 254 | StringRef getPlatform() const { return Triple.getVendorName(); } | ||
| 255 | StringRef getOS() const { return Triple.getOSName(); } | ||
| 256 | |||
| 257 |   /// Provide the default architecture name (as expected by -arch) for | ||
| 258 |   /// this toolchain. | ||
| 259 | StringRef getDefaultUniversalArchName() const; | ||
| 260 | |||
| 261 | std::string getTripleString() const { | ||
| 262 | return Triple.getTriple(); | ||
| 263 |   } | ||
| 264 | |||
| 265 |   /// Get the toolchain's effective clang triple. | ||
| 266 | const llvm::Triple &getEffectiveTriple() const { | ||
| 267 | assert(!EffectiveTriple.getTriple().empty() && "No effective triple"); | ||
| 268 | return EffectiveTriple; | ||
| 269 |   } | ||
| 270 | |||
| 271 | bool hasEffectiveTriple() const { | ||
| 272 | return !EffectiveTriple.getTriple().empty(); | ||
| 273 |   } | ||
| 274 | |||
| 275 | path_list &getLibraryPaths() { return LibraryPaths; } | ||
| 276 | const path_list &getLibraryPaths() const { return LibraryPaths; } | ||
| 277 | |||
| 278 | path_list &getFilePaths() { return FilePaths; } | ||
| 279 | const path_list &getFilePaths() const { return FilePaths; } | ||
| 280 | |||
| 281 | path_list &getProgramPaths() { return ProgramPaths; } | ||
| 282 | const path_list &getProgramPaths() const { return ProgramPaths; } | ||
| 283 | |||
| 284 | const MultilibSet &getMultilibs() const { return Multilibs; } | ||
| 285 | |||
| 286 | const Multilib &getMultilib() const { return SelectedMultilib; } | ||
| 287 | |||
| 288 | SanitizerArgs getSanitizerArgs(const llvm::opt::ArgList &JobArgs) const; | ||
| 289 | |||
| 290 | const XRayArgs& getXRayArgs() const; | ||
| 291 | |||
| 292 |   // Returns the Arg * that explicitly turned on/off rtti, or nullptr. | ||
| 293 | const llvm::opt::Arg *getRTTIArg() const { return CachedRTTIArg; } | ||
| 294 | |||
| 295 |   // Returns the RTTIMode for the toolchain with the current arguments. | ||
| 296 | RTTIMode getRTTIMode() const { return CachedRTTIMode; } | ||
| 297 | |||
| 298 |   /// Return any implicit target and/or mode flag for an invocation of | ||
| 299 |   /// the compiler driver as `ProgName`. | ||
| 300 |   /// | ||
| 301 |   /// For example, when called with i686-linux-android-g++, the first element | ||
| 302 |   /// of the return value will be set to `"i686-linux-android"` and the second | ||
| 303 |   /// will be set to "--driver-mode=g++"`. | ||
| 304 |   /// It is OK if the target name is not registered. In this case the return | ||
| 305 |   /// value contains false in the field TargetIsValid. | ||
| 306 |   /// | ||
| 307 |   /// \pre `llvm::InitializeAllTargets()` has been called. | ||
| 308 |   /// \param ProgName The name the Clang driver was invoked with (from, | ||
| 309 |   /// e.g., argv[0]). | ||
| 310 |   /// \return A structure of type ParsedClangName that contains the executable | ||
| 311 |   /// name parts. | ||
| 312 | static ParsedClangName getTargetAndModeFromProgramName(StringRef ProgName); | ||
| 313 | |||
| 314 |   // Tool access. | ||
| 315 | |||
| 316 |   /// TranslateArgs - Create a new derived argument list for any argument | ||
| 317 |   /// translations this ToolChain may wish to perform, or 0 if no tool chain | ||
| 318 |   /// specific translations are needed. If \p DeviceOffloadKind is specified | ||
| 319 |   /// the translation specific for that offload kind is performed. | ||
| 320 |   /// | ||
| 321 |   /// \param BoundArch - The bound architecture name, or 0. | ||
| 322 |   /// \param DeviceOffloadKind - The device offload kind used for the | ||
| 323 |   /// translation. | ||
| 324 | virtual llvm::opt::DerivedArgList * | ||
| 325 | TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, | ||
| 326 | Action::OffloadKind DeviceOffloadKind) const { | ||
| 327 | return nullptr; | ||
| 328 |   } | ||
| 329 | |||
| 330 |   /// TranslateOpenMPTargetArgs - Create a new derived argument list for | ||
| 331 |   /// that contains the OpenMP target specific flags passed via | ||
| 332 |   /// -Xopenmp-target -opt=val OR -Xopenmp-target=<triple> -opt=val | ||
| 333 | virtual llvm::opt::DerivedArgList *TranslateOpenMPTargetArgs( | ||
| 334 | const llvm::opt::DerivedArgList &Args, bool SameTripleAsHost, | ||
| 335 | SmallVectorImpl<llvm::opt::Arg *> &AllocatedArgs) const; | ||
| 336 | |||
| 337 |   /// Append the argument following \p A to \p DAL assuming \p A is an Xarch | ||
| 338 |   /// argument. If \p AllocatedArgs is null pointer, synthesized arguments are | ||
| 339 |   /// added to \p DAL, otherwise they are appended to \p AllocatedArgs. | ||
| 340 | virtual void TranslateXarchArgs( | ||
| 341 | const llvm::opt::DerivedArgList &Args, llvm::opt::Arg *&A, | ||
| 342 | llvm::opt::DerivedArgList *DAL, | ||
| 343 | SmallVectorImpl<llvm::opt::Arg *> *AllocatedArgs = nullptr) const; | ||
| 344 | |||
| 345 |   /// Translate -Xarch_ arguments. If there are no such arguments, return | ||
| 346 |   /// a null pointer, otherwise return a DerivedArgList containing the | ||
| 347 |   /// translated arguments. | ||
| 348 | virtual llvm::opt::DerivedArgList * | ||
| 349 | TranslateXarchArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, | ||
| 350 | Action::OffloadKind DeviceOffloadKind, | ||
| 351 | SmallVectorImpl<llvm::opt::Arg *> *AllocatedArgs) const; | ||
| 352 | |||
| 353 |   /// Choose a tool to use to handle the action \p JA. | ||
| 354 |   /// | ||
| 355 |   /// This can be overridden when a particular ToolChain needs to use | ||
| 356 |   /// a compiler other than Clang. | ||
| 357 | virtual Tool *SelectTool(const JobAction &JA) const; | ||
| 358 | |||
| 359 |   // Helper methods | ||
| 360 | |||
| 361 | std::string GetFilePath(const char *Name) const; | ||
| 362 | std::string GetProgramPath(const char *Name) const; | ||
| 363 | |||
| 364 |   /// Returns the linker path, respecting the -fuse-ld= argument to determine | ||
| 365 |   /// the linker suffix or name. | ||
| 366 |   /// If LinkerIsLLD is non-nullptr, it is set to true if the returned linker | ||
| 367 |   /// is LLD. If it's set, it can be assumed that the linker is LLD built | ||
| 368 |   /// at the same revision as clang, and clang can make assumptions about | ||
| 369 |   /// LLD's supported flags, error output, etc. | ||
| 370 | std::string GetLinkerPath(bool *LinkerIsLLD = nullptr) const; | ||
| 371 | |||
| 372 |   /// Returns the linker path for emitting a static library. | ||
| 373 | std::string GetStaticLibToolPath() const; | ||
| 374 | |||
| 375 |   /// Dispatch to the specific toolchain for verbose printing. | ||
| 376 |   /// | ||
| 377 |   /// This is used when handling the verbose option to print detailed, | ||
| 378 |   /// toolchain-specific information useful for understanding the behavior of | ||
| 379 |   /// the driver on a specific platform. | ||
| 380 | virtual void printVerboseInfo(raw_ostream &OS) const {} | ||
| 381 | |||
| 382 |   // Platform defaults information | ||
| 383 | |||
| 384 |   /// Returns true if the toolchain is targeting a non-native | ||
| 385 |   /// architecture. | ||
| 386 | virtual bool isCrossCompiling() const; | ||
| 387 | |||
| 388 |   /// HasNativeLTOLinker - Check whether the linker and related tools have | ||
| 389 |   /// native LLVM support. | ||
| 390 | virtual bool HasNativeLLVMSupport() const; | ||
| 391 | |||
| 392 |   /// LookupTypeForExtension - Return the default language type to use for the | ||
| 393 |   /// given extension. | ||
| 394 | virtual types::ID LookupTypeForExtension(StringRef Ext) const; | ||
| 395 | |||
| 396 |   /// IsBlocksDefault - Does this tool chain enable -fblocks by default. | ||
| 397 | virtual bool IsBlocksDefault() const { return false; } | ||
| 398 | |||
| 399 |   /// IsIntegratedAssemblerDefault - Does this tool chain enable -integrated-as | ||
| 400 |   /// by default. | ||
| 401 | virtual bool IsIntegratedAssemblerDefault() const { return false; } | ||
| 402 | |||
| 403 |   /// IsIntegratedBackendDefault - Does this tool chain enable | ||
| 404 |   /// -fintegrated-objemitter by default. | ||
| 405 | virtual bool IsIntegratedBackendDefault() const { return true; } | ||
| 406 | |||
| 407 |   /// IsIntegratedBackendSupported - Does this tool chain support | ||
| 408 |   /// -fintegrated-objemitter. | ||
| 409 | virtual bool IsIntegratedBackendSupported() const { return true; } | ||
| 410 | |||
| 411 |   /// IsNonIntegratedBackendSupported - Does this tool chain support | ||
| 412 |   /// -fno-integrated-objemitter. | ||
| 413 | virtual bool IsNonIntegratedBackendSupported() const { return false; } | ||
| 414 | |||
| 415 |   /// Check if the toolchain should use the integrated assembler. | ||
| 416 | virtual bool useIntegratedAs() const; | ||
| 417 | |||
| 418 |   /// Check if the toolchain should use the integrated backend. | ||
| 419 | virtual bool useIntegratedBackend() const; | ||
| 420 | |||
| 421 |   /// Check if the toolchain should use AsmParser to parse inlineAsm when | ||
| 422 |   /// integrated assembler is not default. | ||
| 423 | virtual bool parseInlineAsmUsingAsmParser() const { return false; } | ||
| 424 | |||
| 425 |   /// IsMathErrnoDefault - Does this tool chain use -fmath-errno by default. | ||
| 426 | virtual bool IsMathErrnoDefault() const { return true; } | ||
| 427 | |||
| 428 |   /// IsEncodeExtendedBlockSignatureDefault - Does this tool chain enable | ||
| 429 |   /// -fencode-extended-block-signature by default. | ||
| 430 | virtual bool IsEncodeExtendedBlockSignatureDefault() const { return false; } | ||
| 431 | |||
| 432 |   /// IsObjCNonFragileABIDefault - Does this tool chain set | ||
| 433 |   /// -fobjc-nonfragile-abi by default. | ||
| 434 | virtual bool IsObjCNonFragileABIDefault() const { return false; } | ||
| 435 | |||
| 436 |   /// UseObjCMixedDispatchDefault - When using non-legacy dispatch, should the | ||
| 437 |   /// mixed dispatch method be used? | ||
| 438 | virtual bool UseObjCMixedDispatch() const { return false; } | ||
| 439 | |||
| 440 |   /// Check whether to enable x86 relax relocations by default. | ||
| 441 | virtual bool useRelaxRelocations() const; | ||
| 442 | |||
| 443 |   /// Check whether use IEEE binary128 as long double format by default. | ||
| 444 | bool defaultToIEEELongDouble() const; | ||
| 445 | |||
| 446 |   /// GetDefaultStackProtectorLevel - Get the default stack protector level for | ||
| 447 |   /// this tool chain. | ||
| 448 | virtual LangOptions::StackProtectorMode | ||
| 449 | GetDefaultStackProtectorLevel(bool KernelOrKext) const { | ||
| 450 | return LangOptions::SSPOff; | ||
| 451 |   } | ||
| 452 | |||
| 453 |   /// Get the default trivial automatic variable initialization. | ||
| 454 | virtual LangOptions::TrivialAutoVarInitKind | ||
| 455 | GetDefaultTrivialAutoVarInit() const { | ||
| 456 | return LangOptions::TrivialAutoVarInitKind::Uninitialized; | ||
| 457 |   } | ||
| 458 | |||
| 459 |   /// GetDefaultLinker - Get the default linker to use. | ||
| 460 | virtual const char *getDefaultLinker() const { return "ld"; } | ||
| 461 | |||
| 462 |   /// GetDefaultRuntimeLibType - Get the default runtime library variant to use. | ||
| 463 | virtual RuntimeLibType GetDefaultRuntimeLibType() const { | ||
| 464 | return ToolChain::RLT_Libgcc; | ||
| 465 |   } | ||
| 466 | |||
| 467 | virtual CXXStdlibType GetDefaultCXXStdlibType() const { | ||
| 468 | return ToolChain::CST_Libstdcxx; | ||
| 469 |   } | ||
| 470 | |||
| 471 | virtual UnwindLibType GetDefaultUnwindLibType() const { | ||
| 472 | return ToolChain::UNW_None; | ||
| 473 |   } | ||
| 474 | |||
| 475 | virtual std::string getCompilerRTPath() const; | ||
| 476 | |||
| 477 | virtual std::string getCompilerRT(const llvm::opt::ArgList &Args, | ||
| 478 | StringRef Component, | ||
| 479 | FileType Type = ToolChain::FT_Static) const; | ||
| 480 | |||
| 481 | const char * | ||
| 482 | getCompilerRTArgString(const llvm::opt::ArgList &Args, StringRef Component, | ||
| 483 | FileType Type = ToolChain::FT_Static) const; | ||
| 484 | |||
| 485 | std::string getCompilerRTBasename(const llvm::opt::ArgList &Args, | ||
| 486 | StringRef Component, | ||
| 487 | FileType Type = ToolChain::FT_Static) const; | ||
| 488 | |||
| 489 |   // Returns target specific runtime paths. | ||
| 490 | path_list getRuntimePaths() const; | ||
| 491 | |||
| 492 |   // Returns target specific standard library paths. | ||
| 493 | path_list getStdlibPaths() const; | ||
| 494 | |||
| 495 |   // Returns <ResourceDir>/lib/<OSName>/<arch>.  This is used by runtimes (such | ||
| 496 |   // as OpenMP) to find arch-specific libraries. | ||
| 497 | std::string getArchSpecificLibPath() const; | ||
| 498 | |||
| 499 |   // Returns <OSname> part of above. | ||
| 500 | virtual StringRef getOSLibName() const; | ||
| 501 | |||
| 502 |   /// needsProfileRT - returns true if instrumentation profile is on. | ||
| 503 | static bool needsProfileRT(const llvm::opt::ArgList &Args); | ||
| 504 | |||
| 505 |   /// Returns true if gcov instrumentation (-fprofile-arcs or --coverage) is on. | ||
| 506 | static bool needsGCovInstrumentation(const llvm::opt::ArgList &Args); | ||
| 507 | |||
| 508 |   /// How detailed should the unwind tables be by default. | ||
| 509 |   virtual UnwindTableLevel | ||
| 510 | getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const; | ||
| 511 | |||
| 512 |   /// Test whether this toolchain supports outline atomics by default. | ||
| 513 | virtual bool | ||
| 514 | IsAArch64OutlineAtomicsDefault(const llvm::opt::ArgList &Args) const { | ||
| 515 | return false; | ||
| 516 |   } | ||
| 517 | |||
| 518 |   /// Test whether this toolchain defaults to PIC. | ||
| 519 | virtual bool isPICDefault() const = 0; | ||
| 520 | |||
| 521 |   /// Test whether this toolchain defaults to PIE. | ||
| 522 | virtual bool isPIEDefault(const llvm::opt::ArgList &Args) const = 0; | ||
| 523 | |||
| 524 |   /// Tests whether this toolchain forces its default for PIC, PIE or | ||
| 525 |   /// non-PIC.  If this returns true, any PIC related flags should be ignored | ||
| 526 |   /// and instead the results of \c isPICDefault() and \c isPIEDefault(const | ||
| 527 |   /// llvm::opt::ArgList &Args) are used exclusively. | ||
| 528 | virtual bool isPICDefaultForced() const = 0; | ||
| 529 | |||
| 530 |   /// SupportsProfiling - Does this tool chain support -pg. | ||
| 531 | virtual bool SupportsProfiling() const { return true; } | ||
| 532 | |||
| 533 |   /// Complain if this tool chain doesn't support Objective-C ARC. | ||
| 534 | virtual void CheckObjCARC() const {} | ||
| 535 | |||
| 536 |   /// Get the default debug info format. Typically, this is DWARF. | ||
| 537 | virtual codegenoptions::DebugInfoFormat getDefaultDebugFormat() const { | ||
| 538 | return codegenoptions::DIF_DWARF; | ||
| 539 |   } | ||
| 540 | |||
| 541 |   /// UseDwarfDebugFlags - Embed the compile options to clang into the Dwarf | ||
| 542 |   /// compile unit information. | ||
| 543 | virtual bool UseDwarfDebugFlags() const { return false; } | ||
| 544 | |||
| 545 |   /// Add an additional -fdebug-prefix-map entry. | ||
| 546 | virtual std::string GetGlobalDebugPathRemapping() const { return {}; } | ||
| 547 | |||
| 548 |   // Return the DWARF version to emit, in the absence of arguments | ||
| 549 |   // to the contrary. | ||
| 550 | virtual unsigned GetDefaultDwarfVersion() const { return 5; } | ||
| 551 | |||
| 552 |   // Some toolchains may have different restrictions on the DWARF version and | ||
| 553 |   // may need to adjust it. E.g. NVPTX may need to enforce DWARF2 even when host | ||
| 554 |   // compilation uses DWARF5. | ||
| 555 | virtual unsigned getMaxDwarfVersion() const { return UINT_MAX; } | ||
| 556 | |||
| 557 |   // True if the driver should assume "-fstandalone-debug" | ||
| 558 |   // in the absence of an option specifying otherwise, | ||
| 559 |   // provided that debugging was requested in the first place. | ||
| 560 |   // i.e. a value of 'true' does not imply that debugging is wanted. | ||
| 561 | virtual bool GetDefaultStandaloneDebug() const { return false; } | ||
| 562 | |||
| 563 |   // Return the default debugger "tuning." | ||
| 564 | virtual llvm::DebuggerKind getDefaultDebuggerTuning() const { | ||
| 565 | return llvm::DebuggerKind::GDB; | ||
| 566 |   } | ||
| 567 | |||
| 568 |   /// Does this toolchain supports given debug info option or not. | ||
| 569 | virtual bool supportsDebugInfoOption(const llvm::opt::Arg *) const { | ||
| 570 | return true; | ||
| 571 |   } | ||
| 572 | |||
| 573 |   /// Adjust debug information kind considering all passed options. | ||
| 574 | virtual void adjustDebugInfoKind(codegenoptions::DebugInfoKind &DebugInfoKind, | ||
| 575 | const llvm::opt::ArgList &Args) const {} | ||
| 576 | |||
| 577 |   /// GetExceptionModel - Return the tool chain exception model. | ||
| 578 | virtual llvm::ExceptionHandling | ||
| 579 | GetExceptionModel(const llvm::opt::ArgList &Args) const; | ||
| 580 | |||
| 581 |   /// SupportsEmbeddedBitcode - Does this tool chain support embedded bitcode. | ||
| 582 | virtual bool SupportsEmbeddedBitcode() const { return false; } | ||
| 583 | |||
| 584 |   /// getThreadModel() - Which thread model does this target use? | ||
| 585 | virtual std::string getThreadModel() const { return "posix"; } | ||
| 586 | |||
| 587 |   /// isThreadModelSupported() - Does this target support a thread model? | ||
| 588 | virtual bool isThreadModelSupported(const StringRef Model) const; | ||
| 589 | |||
| 590 |   /// isBareMetal - Is this a bare metal target. | ||
| 591 | virtual bool isBareMetal() const { return false; } | ||
| 592 | |||
| 593 | virtual std::string getMultiarchTriple(const Driver &D, | ||
| 594 | const llvm::Triple &TargetTriple, | ||
| 595 | StringRef SysRoot) const { | ||
| 596 | return TargetTriple.str(); | ||
| 597 |   } | ||
| 598 | |||
| 599 |   /// ComputeLLVMTriple - Return the LLVM target triple to use, after taking | ||
| 600 |   /// command line arguments into account. | ||
| 601 | virtual std::string | ||
| 602 | ComputeLLVMTriple(const llvm::opt::ArgList &Args, | ||
| 603 | types::ID InputType = types::TY_INVALID) const; | ||
| 604 | |||
| 605 |   /// ComputeEffectiveClangTriple - Return the Clang triple to use for this | ||
| 606 |   /// target, which may take into account the command line arguments. For | ||
| 607 |   /// example, on Darwin the -mmacosx-version-min= command line argument (which | ||
| 608 |   /// sets the deployment target) determines the version in the triple passed to | ||
| 609 |   /// Clang. | ||
| 610 | virtual std::string ComputeEffectiveClangTriple( | ||
| 611 | const llvm::opt::ArgList &Args, | ||
| 612 | types::ID InputType = types::TY_INVALID) const; | ||
| 613 | |||
| 614 |   /// getDefaultObjCRuntime - Return the default Objective-C runtime | ||
| 615 |   /// for this platform. | ||
| 616 |   /// | ||
| 617 |   /// FIXME: this really belongs on some sort of DeploymentTarget abstraction | ||
| 618 | virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const; | ||
| 619 | |||
| 620 |   /// hasBlocksRuntime - Given that the user is compiling with | ||
| 621 |   /// -fblocks, does this tool chain guarantee the existence of a | ||
| 622 |   /// blocks runtime? | ||
| 623 |   /// | ||
| 624 |   /// FIXME: this really belongs on some sort of DeploymentTarget abstraction | ||
| 625 | virtual bool hasBlocksRuntime() const { return true; } | ||
| 626 | |||
| 627 |   /// Return the sysroot, possibly searching for a default sysroot using | ||
| 628 |   /// target-specific logic. | ||
| 629 | virtual std::string computeSysRoot() const; | ||
| 630 | |||
| 631 |   /// Add the clang cc1 arguments for system include paths. | ||
| 632 |   /// | ||
| 633 |   /// This routine is responsible for adding the necessary cc1 arguments to | ||
| 634 |   /// include headers from standard system header directories. | ||
| 635 | virtual void | ||
| 636 | AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, | ||
| 637 | llvm::opt::ArgStringList &CC1Args) const; | ||
| 638 | |||
| 639 |   /// Add options that need to be passed to cc1 for this target. | ||
| 640 | virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, | ||
| 641 | llvm::opt::ArgStringList &CC1Args, | ||
| 642 | Action::OffloadKind DeviceOffloadKind) const; | ||
| 643 | |||
| 644 |   /// Add options that need to be passed to cc1as for this target. | ||
| 645 | virtual void | ||
| 646 | addClangCC1ASTargetOptions(const llvm::opt::ArgList &Args, | ||
| 647 | llvm::opt::ArgStringList &CC1ASArgs) const; | ||
| 648 | |||
| 649 |   /// Add warning options that need to be passed to cc1 for this target. | ||
| 650 | virtual void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const; | ||
| 651 | |||
| 652 |   // GetRuntimeLibType - Determine the runtime library type to use with the | ||
| 653 |   // given compilation arguments. | ||
| 654 |   virtual RuntimeLibType | ||
| 655 | GetRuntimeLibType(const llvm::opt::ArgList &Args) const; | ||
| 656 | |||
| 657 |   // GetCXXStdlibType - Determine the C++ standard library type to use with the | ||
| 658 |   // given compilation arguments. | ||
| 659 | virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; | ||
| 660 | |||
| 661 |   // GetUnwindLibType - Determine the unwind library type to use with the | ||
| 662 |   // given compilation arguments. | ||
| 663 | virtual UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const; | ||
| 664 | |||
| 665 |   // Detect the highest available version of libc++ in include path. | ||
| 666 | virtual std::string detectLibcxxVersion(StringRef IncludePath) const; | ||
| 667 | |||
| 668 |   /// AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set | ||
| 669 |   /// the include paths to use for the given C++ standard library type. | ||
| 670 | virtual void | ||
| 671 | AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, | ||
| 672 | llvm::opt::ArgStringList &CC1Args) const; | ||
| 673 | |||
| 674 |   /// AddClangCXXStdlibIsystemArgs - Add the clang -cc1 level arguments to set | ||
| 675 |   /// the specified include paths for the C++ standard library. | ||
| 676 | void AddClangCXXStdlibIsystemArgs(const llvm::opt::ArgList &DriverArgs, | ||
| 677 | llvm::opt::ArgStringList &CC1Args) const; | ||
| 678 | |||
| 679 |   /// Returns if the C++ standard library should be linked in. | ||
| 680 |   /// Note that e.g. -lm should still be linked even if this returns false. | ||
| 681 | bool ShouldLinkCXXStdlib(const llvm::opt::ArgList &Args) const; | ||
| 682 | |||
| 683 |   /// AddCXXStdlibLibArgs - Add the system specific linker arguments to use | ||
| 684 |   /// for the given C++ standard library type. | ||
| 685 | virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, | ||
| 686 | llvm::opt::ArgStringList &CmdArgs) const; | ||
| 687 | |||
| 688 |   /// AddFilePathLibArgs - Add each thing in getFilePaths() as a "-L" option. | ||
| 689 | void AddFilePathLibArgs(const llvm::opt::ArgList &Args, | ||
| 690 | llvm::opt::ArgStringList &CmdArgs) const; | ||
| 691 | |||
| 692 |   /// AddCCKextLibArgs - Add the system specific linker arguments to use | ||
| 693 |   /// for kernel extensions (Darwin-specific). | ||
| 694 | virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args, | ||
| 695 | llvm::opt::ArgStringList &CmdArgs) const; | ||
| 696 | |||
| 697 |   /// If a runtime library exists that sets global flags for unsafe floating | ||
| 698 |   /// point math, return true. | ||
| 699 |   /// | ||
| 700 |   /// This checks for presence of the -Ofast, -ffast-math or -funsafe-math flags. | ||
| 701 | virtual bool isFastMathRuntimeAvailable( | ||
| 702 | const llvm::opt::ArgList &Args, std::string &Path) const; | ||
| 703 | |||
| 704 |   /// AddFastMathRuntimeIfAvailable - If a runtime library exists that sets | ||
| 705 |   /// global flags for unsafe floating point math, add it and return true. | ||
| 706 |   /// | ||
| 707 |   /// This checks for presence of the -Ofast, -ffast-math or -funsafe-math flags. | ||
| 708 | bool addFastMathRuntimeIfAvailable( | ||
| 709 | const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; | ||
| 710 | |||
| 711 |   /// getSystemGPUArchs - Use a tool to detect the user's availible GPUs. | ||
| 712 | virtual Expected<SmallVector<std::string>> | ||
| 713 | getSystemGPUArchs(const llvm::opt::ArgList &Args) const; | ||
| 714 | |||
| 715 |   /// addProfileRTLibs - When -fprofile-instr-profile is specified, try to pass | ||
| 716 |   /// a suitable profile runtime library to the linker. | ||
| 717 | virtual void addProfileRTLibs(const llvm::opt::ArgList &Args, | ||
| 718 | llvm::opt::ArgStringList &CmdArgs) const; | ||
| 719 | |||
| 720 |   /// Add arguments to use system-specific CUDA includes. | ||
| 721 | virtual void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, | ||
| 722 | llvm::opt::ArgStringList &CC1Args) const; | ||
| 723 | |||
| 724 |   /// Add arguments to use system-specific HIP includes. | ||
| 725 | virtual void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, | ||
| 726 | llvm::opt::ArgStringList &CC1Args) const; | ||
| 727 | |||
| 728 |   /// Add arguments to use MCU GCC toolchain includes. | ||
| 729 | virtual void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, | ||
| 730 | llvm::opt::ArgStringList &CC1Args) const; | ||
| 731 | |||
| 732 |   /// On Windows, returns the MSVC compatibility version. | ||
| 733 | virtual VersionTuple computeMSVCVersion(const Driver *D, | ||
| 734 | const llvm::opt::ArgList &Args) const; | ||
| 735 | |||
| 736 |   /// Get paths for device libraries. | ||
| 737 | virtual llvm::SmallVector<BitCodeLibraryInfo, 12> | ||
| 738 | getDeviceLibs(const llvm::opt::ArgList &Args) const; | ||
| 739 | |||
| 740 |   /// Add the system specific linker arguments to use | ||
| 741 |   /// for the given HIP runtime library type. | ||
| 742 | virtual void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args, | ||
| 743 | llvm::opt::ArgStringList &CmdArgs) const {} | ||
| 744 | |||
| 745 |   /// Return sanitizers which are available in this toolchain. | ||
| 746 | virtual SanitizerMask getSupportedSanitizers() const; | ||
| 747 | |||
| 748 |   /// Return sanitizers which are enabled by default. | ||
| 749 | virtual SanitizerMask getDefaultSanitizers() const { | ||
| 750 | return SanitizerMask(); | ||
| 751 |   } | ||
| 752 | |||
| 753 |   /// Returns true when it's possible to split LTO unit to use whole | ||
| 754 |   /// program devirtualization and CFI santiizers. | ||
| 755 | virtual bool canSplitThinLTOUnit() const { return true; } | ||
| 756 | |||
| 757 |   /// Returns the output denormal handling type in the default floating point | ||
| 758 |   /// environment for the given \p FPType if given. Otherwise, the default | ||
| 759 |   /// assumed mode for any floating point type. | ||
| 760 | virtual llvm::DenormalMode getDefaultDenormalModeForType( | ||
| 761 | const llvm::opt::ArgList &DriverArgs, const JobAction &JA, | ||
| 762 | const llvm::fltSemantics *FPType = nullptr) const { | ||
| 763 | return llvm::DenormalMode::getIEEE(); | ||
| 764 |   } | ||
| 765 | |||
| 766 |   // We want to expand the shortened versions of the triples passed in to | ||
| 767 |   // the values used for the bitcode libraries. | ||
| 768 | static llvm::Triple getOpenMPTriple(StringRef TripleStr) { | ||
| 769 | llvm::Triple TT(TripleStr); | ||
| 770 | if (TT.getVendor() == llvm::Triple::UnknownVendor || | ||
| 771 | TT.getOS() == llvm::Triple::UnknownOS) { | ||
| 772 | if (TT.getArch() == llvm::Triple::nvptx) | ||
| 773 | return llvm::Triple("nvptx-nvidia-cuda"); | ||
| 774 | if (TT.getArch() == llvm::Triple::nvptx64) | ||
| 775 | return llvm::Triple("nvptx64-nvidia-cuda"); | ||
| 776 | if (TT.getArch() == llvm::Triple::amdgcn) | ||
| 777 | return llvm::Triple("amdgcn-amd-amdhsa"); | ||
| 778 |     } | ||
| 779 | return TT; | ||
| 780 |   } | ||
| 781 | }; | ||
| 782 | |||
| 783 | /// Set a ToolChain's effective triple. Reset it when the registration object | ||
| 784 | /// is destroyed. | ||
| 785 | class RegisterEffectiveTriple { | ||
| 786 | const ToolChain &TC; | ||
| 787 | |||
| 788 | public: | ||
| 789 | RegisterEffectiveTriple(const ToolChain &TC, llvm::Triple T) : TC(TC) { | ||
| 790 | TC.setEffectiveTriple(std::move(T)); | ||
| 791 |   } | ||
| 792 | |||
| 793 | ~RegisterEffectiveTriple() { TC.setEffectiveTriple(llvm::Triple()); } | ||
| 794 | }; | ||
| 795 | |||
| 796 | } // namespace driver | ||
| 797 | |||
| 798 | } // namespace clang | ||
| 799 | |||
| 800 | #endif // LLVM_CLANG_DRIVER_TOOLCHAIN_H |