1*67e74705SXin Li //===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li 10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_H 11*67e74705SXin Li #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_H 12*67e74705SXin Li 13*67e74705SXin Li #include "Tools.h" 14*67e74705SXin Li #include "clang/Basic/Cuda.h" 15*67e74705SXin Li #include "clang/Basic/VersionTuple.h" 16*67e74705SXin Li #include "clang/Driver/Action.h" 17*67e74705SXin Li #include "clang/Driver/Multilib.h" 18*67e74705SXin Li #include "clang/Driver/ToolChain.h" 19*67e74705SXin Li #include "llvm/ADT/DenseMap.h" 20*67e74705SXin Li #include "llvm/ADT/Optional.h" 21*67e74705SXin Li #include "llvm/ADT/SmallSet.h" 22*67e74705SXin Li #include "llvm/Support/Compiler.h" 23*67e74705SXin Li #include <set> 24*67e74705SXin Li #include <vector> 25*67e74705SXin Li 26*67e74705SXin Li namespace clang { 27*67e74705SXin Li namespace driver { 28*67e74705SXin Li namespace toolchains { 29*67e74705SXin Li 30*67e74705SXin Li /// Generic_GCC - A tool chain using the 'gcc' command to perform 31*67e74705SXin Li /// all subcommands; this relies on gcc translating the majority of 32*67e74705SXin Li /// command line options. 33*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 34*67e74705SXin Li public: 35*67e74705SXin Li /// \brief Struct to store and manipulate GCC versions. 36*67e74705SXin Li /// 37*67e74705SXin Li /// We rely on assumptions about the form and structure of GCC version 38*67e74705SXin Li /// numbers: they consist of at most three '.'-separated components, and each 39*67e74705SXin Li /// component is a non-negative integer except for the last component. For 40*67e74705SXin Li /// the last component we are very flexible in order to tolerate release 41*67e74705SXin Li /// candidates or 'x' wildcards. 42*67e74705SXin Li /// 43*67e74705SXin Li /// Note that the ordering established among GCCVersions is based on the 44*67e74705SXin Li /// preferred version string to use. For example we prefer versions without 45*67e74705SXin Li /// a hard-coded patch number to those with a hard coded patch number. 46*67e74705SXin Li /// 47*67e74705SXin Li /// Currently this doesn't provide any logic for textual suffixes to patches 48*67e74705SXin Li /// in the way that (for example) Debian's version format does. If that ever 49*67e74705SXin Li /// becomes necessary, it can be added. 50*67e74705SXin Li struct GCCVersion { 51*67e74705SXin Li /// \brief The unparsed text of the version. 52*67e74705SXin Li std::string Text; 53*67e74705SXin Li 54*67e74705SXin Li /// \brief The parsed major, minor, and patch numbers. 55*67e74705SXin Li int Major, Minor, Patch; 56*67e74705SXin Li 57*67e74705SXin Li /// \brief The text of the parsed major, and major+minor versions. 58*67e74705SXin Li std::string MajorStr, MinorStr; 59*67e74705SXin Li 60*67e74705SXin Li /// \brief Any textual suffix on the patch number. 61*67e74705SXin Li std::string PatchSuffix; 62*67e74705SXin Li 63*67e74705SXin Li static GCCVersion Parse(StringRef VersionText); 64*67e74705SXin Li bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 65*67e74705SXin Li StringRef RHSPatchSuffix = StringRef()) const; 66*67e74705SXin Li bool operator<(const GCCVersion &RHS) const { 67*67e74705SXin Li return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 68*67e74705SXin Li } 69*67e74705SXin Li bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 70*67e74705SXin Li bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 71*67e74705SXin Li bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 72*67e74705SXin Li }; 73*67e74705SXin Li 74*67e74705SXin Li /// \brief This is a class to find a viable GCC installation for Clang to 75*67e74705SXin Li /// use. 76*67e74705SXin Li /// 77*67e74705SXin Li /// This class tries to find a GCC installation on the system, and report 78*67e74705SXin Li /// information about it. It starts from the host information provided to the 79*67e74705SXin Li /// Driver, and has logic for fuzzing that where appropriate. 80*67e74705SXin Li class GCCInstallationDetector { 81*67e74705SXin Li bool IsValid; 82*67e74705SXin Li llvm::Triple GCCTriple; 83*67e74705SXin Li const Driver &D; 84*67e74705SXin Li 85*67e74705SXin Li // FIXME: These might be better as path objects. 86*67e74705SXin Li std::string GCCInstallPath; 87*67e74705SXin Li std::string GCCParentLibPath; 88*67e74705SXin Li 89*67e74705SXin Li /// The primary multilib appropriate for the given flags. 90*67e74705SXin Li Multilib SelectedMultilib; 91*67e74705SXin Li /// On Biarch systems, this corresponds to the default multilib when 92*67e74705SXin Li /// targeting the non-default multilib. Otherwise, it is empty. 93*67e74705SXin Li llvm::Optional<Multilib> BiarchSibling; 94*67e74705SXin Li 95*67e74705SXin Li GCCVersion Version; 96*67e74705SXin Li 97*67e74705SXin Li // We retain the list of install paths that were considered and rejected in 98*67e74705SXin Li // order to print out detailed information in verbose mode. 99*67e74705SXin Li std::set<std::string> CandidateGCCInstallPaths; 100*67e74705SXin Li 101*67e74705SXin Li /// The set of multilibs that the detected installation supports. 102*67e74705SXin Li MultilibSet Multilibs; 103*67e74705SXin Li 104*67e74705SXin Li public: GCCInstallationDetector(const Driver & D)105*67e74705SXin Li explicit GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} 106*67e74705SXin Li void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args, 107*67e74705SXin Li ArrayRef<std::string> ExtraTripleAliases = None); 108*67e74705SXin Li 109*67e74705SXin Li /// \brief Check whether we detected a valid GCC install. isValid()110*67e74705SXin Li bool isValid() const { return IsValid; } 111*67e74705SXin Li 112*67e74705SXin Li /// \brief Get the GCC triple for the detected install. getTriple()113*67e74705SXin Li const llvm::Triple &getTriple() const { return GCCTriple; } 114*67e74705SXin Li 115*67e74705SXin Li /// \brief Get the detected GCC installation path. getInstallPath()116*67e74705SXin Li StringRef getInstallPath() const { return GCCInstallPath; } 117*67e74705SXin Li 118*67e74705SXin Li /// \brief Get the detected GCC parent lib path. getParentLibPath()119*67e74705SXin Li StringRef getParentLibPath() const { return GCCParentLibPath; } 120*67e74705SXin Li 121*67e74705SXin Li /// \brief Get the detected Multilib getMultilib()122*67e74705SXin Li const Multilib &getMultilib() const { return SelectedMultilib; } 123*67e74705SXin Li 124*67e74705SXin Li /// \brief Get the whole MultilibSet getMultilibs()125*67e74705SXin Li const MultilibSet &getMultilibs() const { return Multilibs; } 126*67e74705SXin Li 127*67e74705SXin Li /// Get the biarch sibling multilib (if it exists). 128*67e74705SXin Li /// \return true iff such a sibling exists 129*67e74705SXin Li bool getBiarchSibling(Multilib &M) const; 130*67e74705SXin Li 131*67e74705SXin Li /// \brief Get the detected GCC version string. getVersion()132*67e74705SXin Li const GCCVersion &getVersion() const { return Version; } 133*67e74705SXin Li 134*67e74705SXin Li /// \brief Print information about the detected GCC installation. 135*67e74705SXin Li void print(raw_ostream &OS) const; 136*67e74705SXin Li 137*67e74705SXin Li private: 138*67e74705SXin Li static void 139*67e74705SXin Li CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 140*67e74705SXin Li const llvm::Triple &BiarchTriple, 141*67e74705SXin Li SmallVectorImpl<StringRef> &LibDirs, 142*67e74705SXin Li SmallVectorImpl<StringRef> &TripleAliases, 143*67e74705SXin Li SmallVectorImpl<StringRef> &BiarchLibDirs, 144*67e74705SXin Li SmallVectorImpl<StringRef> &BiarchTripleAliases); 145*67e74705SXin Li 146*67e74705SXin Li void ScanLibDirForGCCTriple(const llvm::Triple &TargetArch, 147*67e74705SXin Li const llvm::opt::ArgList &Args, 148*67e74705SXin Li const std::string &LibDir, 149*67e74705SXin Li StringRef CandidateTriple, 150*67e74705SXin Li bool NeedsBiarchSuffix = false); 151*67e74705SXin Li 152*67e74705SXin Li void scanLibDirForGCCTripleSolaris(const llvm::Triple &TargetArch, 153*67e74705SXin Li const llvm::opt::ArgList &Args, 154*67e74705SXin Li const std::string &LibDir, 155*67e74705SXin Li StringRef CandidateTriple, 156*67e74705SXin Li bool NeedsBiarchSuffix = false); 157*67e74705SXin Li }; 158*67e74705SXin Li 159*67e74705SXin Li protected: 160*67e74705SXin Li GCCInstallationDetector GCCInstallation; 161*67e74705SXin Li 162*67e74705SXin Li // \brief A class to find a viable CUDA installation 163*67e74705SXin Li class CudaInstallationDetector { 164*67e74705SXin Li private: 165*67e74705SXin Li const Driver &D; 166*67e74705SXin Li bool IsValid = false; 167*67e74705SXin Li CudaVersion Version = CudaVersion::UNKNOWN; 168*67e74705SXin Li std::string InstallPath; 169*67e74705SXin Li std::string BinPath; 170*67e74705SXin Li std::string LibPath; 171*67e74705SXin Li std::string LibDevicePath; 172*67e74705SXin Li std::string IncludePath; 173*67e74705SXin Li llvm::StringMap<std::string> LibDeviceMap; 174*67e74705SXin Li 175*67e74705SXin Li // CUDA architectures for which we have raised an error in 176*67e74705SXin Li // CheckCudaVersionSupportsArch. 177*67e74705SXin Li mutable llvm::SmallSet<CudaArch, 4> ArchsWithVersionTooLowErrors; 178*67e74705SXin Li 179*67e74705SXin Li public: CudaInstallationDetector(const Driver & D)180*67e74705SXin Li CudaInstallationDetector(const Driver &D) : D(D) {} 181*67e74705SXin Li void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args); 182*67e74705SXin Li 183*67e74705SXin Li /// \brief Emit an error if Version does not support the given Arch. 184*67e74705SXin Li /// 185*67e74705SXin Li /// If either Version or Arch is unknown, does not emit an error. Emits at 186*67e74705SXin Li /// most one error per Arch. 187*67e74705SXin Li void CheckCudaVersionSupportsArch(CudaArch Arch) const; 188*67e74705SXin Li 189*67e74705SXin Li /// \brief Check whether we detected a valid Cuda install. isValid()190*67e74705SXin Li bool isValid() const { return IsValid; } 191*67e74705SXin Li /// \brief Print information about the detected CUDA installation. 192*67e74705SXin Li void print(raw_ostream &OS) const; 193*67e74705SXin Li 194*67e74705SXin Li /// \brief Get the deteced Cuda install's version. version()195*67e74705SXin Li CudaVersion version() const { return Version; } 196*67e74705SXin Li /// \brief Get the detected Cuda installation path. getInstallPath()197*67e74705SXin Li StringRef getInstallPath() const { return InstallPath; } 198*67e74705SXin Li /// \brief Get the detected path to Cuda's bin directory. getBinPath()199*67e74705SXin Li StringRef getBinPath() const { return BinPath; } 200*67e74705SXin Li /// \brief Get the detected Cuda Include path. getIncludePath()201*67e74705SXin Li StringRef getIncludePath() const { return IncludePath; } 202*67e74705SXin Li /// \brief Get the detected Cuda library path. getLibPath()203*67e74705SXin Li StringRef getLibPath() const { return LibPath; } 204*67e74705SXin Li /// \brief Get the detected Cuda device library path. getLibDevicePath()205*67e74705SXin Li StringRef getLibDevicePath() const { return LibDevicePath; } 206*67e74705SXin Li /// \brief Get libdevice file for given architecture getLibDeviceFile(StringRef Gpu)207*67e74705SXin Li std::string getLibDeviceFile(StringRef Gpu) const { 208*67e74705SXin Li return LibDeviceMap.lookup(Gpu); 209*67e74705SXin Li } 210*67e74705SXin Li }; 211*67e74705SXin Li 212*67e74705SXin Li CudaInstallationDetector CudaInstallation; 213*67e74705SXin Li 214*67e74705SXin Li public: 215*67e74705SXin Li Generic_GCC(const Driver &D, const llvm::Triple &Triple, 216*67e74705SXin Li const llvm::opt::ArgList &Args); 217*67e74705SXin Li ~Generic_GCC() override; 218*67e74705SXin Li 219*67e74705SXin Li void printVerboseInfo(raw_ostream &OS) const override; 220*67e74705SXin Li 221*67e74705SXin Li bool IsUnwindTablesDefault() const override; 222*67e74705SXin Li bool isPICDefault() const override; 223*67e74705SXin Li bool isPIEDefault() const override; 224*67e74705SXin Li bool isPICDefaultForced() const override; 225*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override; 226*67e74705SXin Li 227*67e74705SXin Li protected: 228*67e74705SXin Li Tool *getTool(Action::ActionClass AC) const override; 229*67e74705SXin Li Tool *buildAssembler() const override; 230*67e74705SXin Li Tool *buildLinker() const override; 231*67e74705SXin Li 232*67e74705SXin Li /// \name ToolChain Implementation Helper Functions 233*67e74705SXin Li /// @{ 234*67e74705SXin Li 235*67e74705SXin Li /// \brief Check whether the target triple's architecture is 64-bits. isTarget64Bit()236*67e74705SXin Li bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 237*67e74705SXin Li 238*67e74705SXin Li /// \brief Check whether the target triple's architecture is 32-bits. isTarget32Bit()239*67e74705SXin Li bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 240*67e74705SXin Li 241*67e74705SXin Li bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, StringRef GCCTriple, 242*67e74705SXin Li StringRef GCCMultiarchTriple, 243*67e74705SXin Li StringRef TargetMultiarchTriple, 244*67e74705SXin Li Twine IncludeSuffix, 245*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 246*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const; 247*67e74705SXin Li 248*67e74705SXin Li /// @} 249*67e74705SXin Li 250*67e74705SXin Li private: 251*67e74705SXin Li mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocess; 252*67e74705SXin Li mutable std::unique_ptr<tools::gcc::Compiler> Compile; 253*67e74705SXin Li }; 254*67e74705SXin Li 255*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain { 256*67e74705SXin Li protected: 257*67e74705SXin Li Tool *buildAssembler() const override; 258*67e74705SXin Li Tool *buildLinker() const override; 259*67e74705SXin Li Tool *getTool(Action::ActionClass AC) const override; 260*67e74705SXin Li 261*67e74705SXin Li private: 262*67e74705SXin Li mutable std::unique_ptr<tools::darwin::Lipo> Lipo; 263*67e74705SXin Li mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil; 264*67e74705SXin Li mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug; 265*67e74705SXin Li 266*67e74705SXin Li public: 267*67e74705SXin Li MachO(const Driver &D, const llvm::Triple &Triple, 268*67e74705SXin Li const llvm::opt::ArgList &Args); 269*67e74705SXin Li ~MachO() override; 270*67e74705SXin Li 271*67e74705SXin Li /// @name MachO specific toolchain API 272*67e74705SXin Li /// { 273*67e74705SXin Li 274*67e74705SXin Li /// Get the "MachO" arch name for a particular compiler invocation. For 275*67e74705SXin Li /// example, Apple treats different ARM variations as distinct architectures. 276*67e74705SXin Li StringRef getMachOArchName(const llvm::opt::ArgList &Args) const; 277*67e74705SXin Li 278*67e74705SXin Li /// Add the linker arguments to link the ARC runtime library. AddLinkARCArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs)279*67e74705SXin Li virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, 280*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const {} 281*67e74705SXin Li 282*67e74705SXin Li /// Add the linker arguments to link the compiler runtime library. 283*67e74705SXin Li virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 284*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 285*67e74705SXin Li addStartObjectFileArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs)286*67e74705SXin Li virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args, 287*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const { 288*67e74705SXin Li } 289*67e74705SXin Li addMinVersionArgs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs)290*67e74705SXin Li virtual void addMinVersionArgs(const llvm::opt::ArgList &Args, 291*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const {} 292*67e74705SXin Li 293*67e74705SXin Li /// On some iOS platforms, kernel and kernel modules were built statically. Is 294*67e74705SXin Li /// this such a target? isKernelStatic()295*67e74705SXin Li virtual bool isKernelStatic() const { return false; } 296*67e74705SXin Li 297*67e74705SXin Li /// Is the target either iOS or an iOS simulator? isTargetIOSBased()298*67e74705SXin Li bool isTargetIOSBased() const { return false; } 299*67e74705SXin Li 300*67e74705SXin Li void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, 301*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs, 302*67e74705SXin Li StringRef DarwinLibName, bool AlwaysLink = false, 303*67e74705SXin Li bool IsEmbedded = false, bool AddRPath = false) const; 304*67e74705SXin Li 305*67e74705SXin Li /// Add any profiling runtime libraries that are needed. This is essentially a 306*67e74705SXin Li /// MachO specific version of addProfileRT in Tools.cpp. addProfileRTLibs(const llvm::opt::ArgList & Args,llvm::opt::ArgStringList & CmdArgs)307*67e74705SXin Li void addProfileRTLibs(const llvm::opt::ArgList &Args, 308*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override { 309*67e74705SXin Li // There aren't any profiling libs for embedded targets currently. 310*67e74705SXin Li } 311*67e74705SXin Li 312*67e74705SXin Li /// } 313*67e74705SXin Li /// @name ToolChain Implementation 314*67e74705SXin Li /// { 315*67e74705SXin Li 316*67e74705SXin Li std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 317*67e74705SXin Li types::ID InputType) const override; 318*67e74705SXin Li 319*67e74705SXin Li types::ID LookupTypeForExtension(const char *Ext) const override; 320*67e74705SXin Li 321*67e74705SXin Li bool HasNativeLLVMSupport() const override; 322*67e74705SXin Li 323*67e74705SXin Li llvm::opt::DerivedArgList * 324*67e74705SXin Li TranslateArgs(const llvm::opt::DerivedArgList &Args, 325*67e74705SXin Li const char *BoundArch) const override; 326*67e74705SXin Li IsBlocksDefault()327*67e74705SXin Li bool IsBlocksDefault() const override { 328*67e74705SXin Li // Always allow blocks on Apple; users interested in versioning are 329*67e74705SXin Li // expected to use /usr/include/Block.h. 330*67e74705SXin Li return true; 331*67e74705SXin Li } IsIntegratedAssemblerDefault()332*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { 333*67e74705SXin Li // Default integrated assembler to on for Apple's MachO targets. 334*67e74705SXin Li return true; 335*67e74705SXin Li } 336*67e74705SXin Li IsMathErrnoDefault()337*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } 338*67e74705SXin Li IsEncodeExtendedBlockSignatureDefault()339*67e74705SXin Li bool IsEncodeExtendedBlockSignatureDefault() const override { return true; } 340*67e74705SXin Li IsObjCNonFragileABIDefault()341*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { 342*67e74705SXin Li // Non-fragile ABI is default for everything but i386. 343*67e74705SXin Li return getTriple().getArch() != llvm::Triple::x86; 344*67e74705SXin Li } 345*67e74705SXin Li UseObjCMixedDispatch()346*67e74705SXin Li bool UseObjCMixedDispatch() const override { return true; } 347*67e74705SXin Li 348*67e74705SXin Li bool IsUnwindTablesDefault() const override; 349*67e74705SXin Li GetDefaultRuntimeLibType()350*67e74705SXin Li RuntimeLibType GetDefaultRuntimeLibType() const override { 351*67e74705SXin Li return ToolChain::RLT_CompilerRT; 352*67e74705SXin Li } 353*67e74705SXin Li 354*67e74705SXin Li bool isPICDefault() const override; 355*67e74705SXin Li bool isPIEDefault() const override; 356*67e74705SXin Li bool isPICDefaultForced() const override; 357*67e74705SXin Li 358*67e74705SXin Li bool SupportsProfiling() const override; 359*67e74705SXin Li SupportsObjCGC()360*67e74705SXin Li bool SupportsObjCGC() const override { return false; } 361*67e74705SXin Li 362*67e74705SXin Li bool UseDwarfDebugFlags() const override; 363*67e74705SXin Li UseSjLjExceptions(const llvm::opt::ArgList & Args)364*67e74705SXin Li bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const override { 365*67e74705SXin Li return false; 366*67e74705SXin Li } 367*67e74705SXin Li 368*67e74705SXin Li /// } 369*67e74705SXin Li }; 370*67e74705SXin Li 371*67e74705SXin Li /// Darwin - The base Darwin tool chain. 372*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Darwin : public MachO { 373*67e74705SXin Li public: 374*67e74705SXin Li /// Whether the information on the target has been initialized. 375*67e74705SXin Li // 376*67e74705SXin Li // FIXME: This should be eliminated. What we want to do is make this part of 377*67e74705SXin Li // the "default target for arguments" selection process, once we get out of 378*67e74705SXin Li // the argument translation business. 379*67e74705SXin Li mutable bool TargetInitialized; 380*67e74705SXin Li 381*67e74705SXin Li enum DarwinPlatformKind { 382*67e74705SXin Li MacOS, 383*67e74705SXin Li IPhoneOS, 384*67e74705SXin Li IPhoneOSSimulator, 385*67e74705SXin Li TvOS, 386*67e74705SXin Li TvOSSimulator, 387*67e74705SXin Li WatchOS, 388*67e74705SXin Li WatchOSSimulator 389*67e74705SXin Li }; 390*67e74705SXin Li 391*67e74705SXin Li mutable DarwinPlatformKind TargetPlatform; 392*67e74705SXin Li 393*67e74705SXin Li /// The OS version we are targeting. 394*67e74705SXin Li mutable VersionTuple TargetVersion; 395*67e74705SXin Li 396*67e74705SXin Li private: 397*67e74705SXin Li void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const; 398*67e74705SXin Li 399*67e74705SXin Li public: 400*67e74705SXin Li Darwin(const Driver &D, const llvm::Triple &Triple, 401*67e74705SXin Li const llvm::opt::ArgList &Args); 402*67e74705SXin Li ~Darwin() override; 403*67e74705SXin Li 404*67e74705SXin Li std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 405*67e74705SXin Li types::ID InputType) const override; 406*67e74705SXin Li 407*67e74705SXin Li /// @name Apple Specific Toolchain Implementation 408*67e74705SXin Li /// { 409*67e74705SXin Li 410*67e74705SXin Li void addMinVersionArgs(const llvm::opt::ArgList &Args, 411*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 412*67e74705SXin Li 413*67e74705SXin Li void addStartObjectFileArgs(const llvm::opt::ArgList &Args, 414*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 415*67e74705SXin Li isKernelStatic()416*67e74705SXin Li bool isKernelStatic() const override { 417*67e74705SXin Li return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) && 418*67e74705SXin Li !isTargetWatchOS()); 419*67e74705SXin Li } 420*67e74705SXin Li 421*67e74705SXin Li void addProfileRTLibs(const llvm::opt::ArgList &Args, 422*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 423*67e74705SXin Li 424*67e74705SXin Li protected: 425*67e74705SXin Li /// } 426*67e74705SXin Li /// @name Darwin specific Toolchain functions 427*67e74705SXin Li /// { 428*67e74705SXin Li 429*67e74705SXin Li // FIXME: Eliminate these ...Target functions and derive separate tool chains 430*67e74705SXin Li // for these targets and put version in constructor. setTarget(DarwinPlatformKind Platform,unsigned Major,unsigned Minor,unsigned Micro)431*67e74705SXin Li void setTarget(DarwinPlatformKind Platform, unsigned Major, unsigned Minor, 432*67e74705SXin Li unsigned Micro) const { 433*67e74705SXin Li // FIXME: For now, allow reinitialization as long as values don't 434*67e74705SXin Li // change. This will go away when we move away from argument translation. 435*67e74705SXin Li if (TargetInitialized && TargetPlatform == Platform && 436*67e74705SXin Li TargetVersion == VersionTuple(Major, Minor, Micro)) 437*67e74705SXin Li return; 438*67e74705SXin Li 439*67e74705SXin Li assert(!TargetInitialized && "Target already initialized!"); 440*67e74705SXin Li TargetInitialized = true; 441*67e74705SXin Li TargetPlatform = Platform; 442*67e74705SXin Li TargetVersion = VersionTuple(Major, Minor, Micro); 443*67e74705SXin Li } 444*67e74705SXin Li isTargetIPhoneOS()445*67e74705SXin Li bool isTargetIPhoneOS() const { 446*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 447*67e74705SXin Li return TargetPlatform == IPhoneOS || TargetPlatform == TvOS; 448*67e74705SXin Li } 449*67e74705SXin Li isTargetIOSSimulator()450*67e74705SXin Li bool isTargetIOSSimulator() const { 451*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 452*67e74705SXin Li return TargetPlatform == IPhoneOSSimulator || 453*67e74705SXin Li TargetPlatform == TvOSSimulator; 454*67e74705SXin Li } 455*67e74705SXin Li isTargetIOSBased()456*67e74705SXin Li bool isTargetIOSBased() const { 457*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 458*67e74705SXin Li return isTargetIPhoneOS() || isTargetIOSSimulator(); 459*67e74705SXin Li } 460*67e74705SXin Li isTargetTvOS()461*67e74705SXin Li bool isTargetTvOS() const { 462*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 463*67e74705SXin Li return TargetPlatform == TvOS; 464*67e74705SXin Li } 465*67e74705SXin Li isTargetTvOSSimulator()466*67e74705SXin Li bool isTargetTvOSSimulator() const { 467*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 468*67e74705SXin Li return TargetPlatform == TvOSSimulator; 469*67e74705SXin Li } 470*67e74705SXin Li isTargetTvOSBased()471*67e74705SXin Li bool isTargetTvOSBased() const { 472*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 473*67e74705SXin Li return TargetPlatform == TvOS || TargetPlatform == TvOSSimulator; 474*67e74705SXin Li } 475*67e74705SXin Li isTargetWatchOS()476*67e74705SXin Li bool isTargetWatchOS() const { 477*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 478*67e74705SXin Li return TargetPlatform == WatchOS; 479*67e74705SXin Li } 480*67e74705SXin Li isTargetWatchOSSimulator()481*67e74705SXin Li bool isTargetWatchOSSimulator() const { 482*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 483*67e74705SXin Li return TargetPlatform == WatchOSSimulator; 484*67e74705SXin Li } 485*67e74705SXin Li isTargetWatchOSBased()486*67e74705SXin Li bool isTargetWatchOSBased() const { 487*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 488*67e74705SXin Li return TargetPlatform == WatchOS || TargetPlatform == WatchOSSimulator; 489*67e74705SXin Li } 490*67e74705SXin Li isTargetMacOS()491*67e74705SXin Li bool isTargetMacOS() const { 492*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 493*67e74705SXin Li return TargetPlatform == MacOS; 494*67e74705SXin Li } 495*67e74705SXin Li isTargetInitialized()496*67e74705SXin Li bool isTargetInitialized() const { return TargetInitialized; } 497*67e74705SXin Li getTargetVersion()498*67e74705SXin Li VersionTuple getTargetVersion() const { 499*67e74705SXin Li assert(TargetInitialized && "Target not initialized!"); 500*67e74705SXin Li return TargetVersion; 501*67e74705SXin Li } 502*67e74705SXin Li 503*67e74705SXin Li bool isIPhoneOSVersionLT(unsigned V0, unsigned V1 = 0, 504*67e74705SXin Li unsigned V2 = 0) const { 505*67e74705SXin Li assert(isTargetIOSBased() && "Unexpected call for non iOS target!"); 506*67e74705SXin Li return TargetVersion < VersionTuple(V0, V1, V2); 507*67e74705SXin Li } 508*67e74705SXin Li 509*67e74705SXin Li bool isMacosxVersionLT(unsigned V0, unsigned V1 = 0, unsigned V2 = 0) const { 510*67e74705SXin Li assert(isTargetMacOS() && "Unexpected call for non OS X target!"); 511*67e74705SXin Li return TargetVersion < VersionTuple(V0, V1, V2); 512*67e74705SXin Li } 513*67e74705SXin Li 514*67e74705SXin Li StringRef getPlatformFamily() const; 515*67e74705SXin Li static StringRef getSDKName(StringRef isysroot); 516*67e74705SXin Li StringRef getOSLibraryNameSuffix() const; 517*67e74705SXin Li 518*67e74705SXin Li public: 519*67e74705SXin Li /// } 520*67e74705SXin Li /// @name ToolChain Implementation 521*67e74705SXin Li /// { 522*67e74705SXin Li 523*67e74705SXin Li // Darwin tools support multiple architecture (e.g., i386 and x86_64) and 524*67e74705SXin Li // most development is done against SDKs, so compiling for a different 525*67e74705SXin Li // architecture should not get any special treatment. isCrossCompiling()526*67e74705SXin Li bool isCrossCompiling() const override { return false; } 527*67e74705SXin Li 528*67e74705SXin Li llvm::opt::DerivedArgList * 529*67e74705SXin Li TranslateArgs(const llvm::opt::DerivedArgList &Args, 530*67e74705SXin Li const char *BoundArch) const override; 531*67e74705SXin Li 532*67e74705SXin Li CXXStdlibType GetDefaultCXXStdlibType() const override; 533*67e74705SXin Li ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const override; 534*67e74705SXin Li bool hasBlocksRuntime() const override; 535*67e74705SXin Li UseObjCMixedDispatch()536*67e74705SXin Li bool UseObjCMixedDispatch() const override { 537*67e74705SXin Li // This is only used with the non-fragile ABI and non-legacy dispatch. 538*67e74705SXin Li 539*67e74705SXin Li // Mixed dispatch is used everywhere except OS X before 10.6. 540*67e74705SXin Li return !(isTargetMacOS() && isMacosxVersionLT(10, 6)); 541*67e74705SXin Li } 542*67e74705SXin Li GetDefaultStackProtectorLevel(bool KernelOrKext)543*67e74705SXin Li unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 544*67e74705SXin Li // Stack protectors default to on for user code on 10.5, 545*67e74705SXin Li // and for everything in 10.6 and beyond 546*67e74705SXin Li if (isTargetIOSBased() || isTargetWatchOSBased()) 547*67e74705SXin Li return 1; 548*67e74705SXin Li else if (isTargetMacOS() && !isMacosxVersionLT(10, 6)) 549*67e74705SXin Li return 1; 550*67e74705SXin Li else if (isTargetMacOS() && !isMacosxVersionLT(10, 5) && !KernelOrKext) 551*67e74705SXin Li return 1; 552*67e74705SXin Li 553*67e74705SXin Li return 0; 554*67e74705SXin Li } 555*67e74705SXin Li 556*67e74705SXin Li bool SupportsObjCGC() const override; 557*67e74705SXin Li 558*67e74705SXin Li void CheckObjCARC() const override; 559*67e74705SXin Li 560*67e74705SXin Li bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const override; 561*67e74705SXin Li 562*67e74705SXin Li bool SupportsEmbeddedBitcode() const override; 563*67e74705SXin Li 564*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; 565*67e74705SXin Li }; 566*67e74705SXin Li 567*67e74705SXin Li /// DarwinClang - The Darwin toolchain used by Clang. 568*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { 569*67e74705SXin Li public: 570*67e74705SXin Li DarwinClang(const Driver &D, const llvm::Triple &Triple, 571*67e74705SXin Li const llvm::opt::ArgList &Args); 572*67e74705SXin Li 573*67e74705SXin Li /// @name Apple ToolChain Implementation 574*67e74705SXin Li /// { 575*67e74705SXin Li 576*67e74705SXin Li void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 577*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 578*67e74705SXin Li 579*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 580*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 581*67e74705SXin Li 582*67e74705SXin Li void AddCCKextLibArgs(const llvm::opt::ArgList &Args, 583*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 584*67e74705SXin Li 585*67e74705SXin Li void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override; 586*67e74705SXin Li 587*67e74705SXin Li void AddLinkARCArgs(const llvm::opt::ArgList &Args, 588*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 589*67e74705SXin Li GetDefaultDwarfVersion()590*67e74705SXin Li unsigned GetDefaultDwarfVersion() const override { return 2; } 591*67e74705SXin Li // Until dtrace (via CTF) and LLDB can deal with distributed debug info, 592*67e74705SXin Li // Darwin defaults to standalone/full debug info. GetDefaultStandaloneDebug()593*67e74705SXin Li bool GetDefaultStandaloneDebug() const override { return true; } getDefaultDebuggerTuning()594*67e74705SXin Li llvm::DebuggerKind getDefaultDebuggerTuning() const override { 595*67e74705SXin Li return llvm::DebuggerKind::LLDB; 596*67e74705SXin Li } 597*67e74705SXin Li 598*67e74705SXin Li /// } 599*67e74705SXin Li 600*67e74705SXin Li private: 601*67e74705SXin Li void AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args, 602*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs, 603*67e74705SXin Li StringRef Sanitizer) const; 604*67e74705SXin Li }; 605*67e74705SXin Li 606*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 607*67e74705SXin Li virtual void anchor(); 608*67e74705SXin Li 609*67e74705SXin Li public: Generic_ELF(const Driver & D,const llvm::Triple & Triple,const llvm::opt::ArgList & Args)610*67e74705SXin Li Generic_ELF(const Driver &D, const llvm::Triple &Triple, 611*67e74705SXin Li const llvm::opt::ArgList &Args) 612*67e74705SXin Li : Generic_GCC(D, Triple, Args) {} 613*67e74705SXin Li 614*67e74705SXin Li void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 615*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 616*67e74705SXin Li }; 617*67e74705SXin Li 618*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY CloudABI : public Generic_ELF { 619*67e74705SXin Li public: 620*67e74705SXin Li CloudABI(const Driver &D, const llvm::Triple &Triple, 621*67e74705SXin Li const llvm::opt::ArgList &Args); HasNativeLLVMSupport()622*67e74705SXin Li bool HasNativeLLVMSupport() const override { return true; } 623*67e74705SXin Li IsMathErrnoDefault()624*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()625*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { return true; } 626*67e74705SXin Li 627*67e74705SXin Li CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList & Args)628*67e74705SXin Li GetCXXStdlibType(const llvm::opt::ArgList &Args) const override { 629*67e74705SXin Li return ToolChain::CST_Libcxx; 630*67e74705SXin Li } 631*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 632*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 633*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 634*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 635*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 636*67e74705SXin Li isPIEDefault()637*67e74705SXin Li bool isPIEDefault() const override { return true; } 638*67e74705SXin Li 639*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; 640*67e74705SXin Li SanitizerMask getDefaultSanitizers() const override; 641*67e74705SXin Li 642*67e74705SXin Li protected: 643*67e74705SXin Li Tool *buildLinker() const override; 644*67e74705SXin Li }; 645*67e74705SXin Li 646*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { 647*67e74705SXin Li public: 648*67e74705SXin Li Solaris(const Driver &D, const llvm::Triple &Triple, 649*67e74705SXin Li const llvm::opt::ArgList &Args); 650*67e74705SXin Li IsIntegratedAssemblerDefault()651*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { return true; } 652*67e74705SXin Li 653*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 654*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 655*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 656*67e74705SXin Li GetDefaultDwarfVersion()657*67e74705SXin Li unsigned GetDefaultDwarfVersion() const override { return 2; } 658*67e74705SXin Li 659*67e74705SXin Li protected: 660*67e74705SXin Li Tool *buildAssembler() const override; 661*67e74705SXin Li Tool *buildLinker() const override; 662*67e74705SXin Li }; 663*67e74705SXin Li 664*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain { 665*67e74705SXin Li public: 666*67e74705SXin Li MinGW(const Driver &D, const llvm::Triple &Triple, 667*67e74705SXin Li const llvm::opt::ArgList &Args); 668*67e74705SXin Li 669*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override; 670*67e74705SXin Li bool IsUnwindTablesDefault() const override; 671*67e74705SXin Li bool isPICDefault() const override; 672*67e74705SXin Li bool isPIEDefault() const override; 673*67e74705SXin Li bool isPICDefaultForced() const override; 674*67e74705SXin Li bool UseSEHExceptions() const; 675*67e74705SXin Li 676*67e74705SXin Li void 677*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 678*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 679*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 680*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 681*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 682*67e74705SXin Li 683*67e74705SXin Li protected: 684*67e74705SXin Li Tool *getTool(Action::ActionClass AC) const override; 685*67e74705SXin Li Tool *buildLinker() const override; 686*67e74705SXin Li Tool *buildAssembler() const override; 687*67e74705SXin Li 688*67e74705SXin Li private: 689*67e74705SXin Li std::string Base; 690*67e74705SXin Li std::string GccLibDir; 691*67e74705SXin Li std::string Ver; 692*67e74705SXin Li std::string Arch; 693*67e74705SXin Li mutable std::unique_ptr<tools::gcc::Preprocessor> Preprocessor; 694*67e74705SXin Li mutable std::unique_ptr<tools::gcc::Compiler> Compiler; 695*67e74705SXin Li void findGccLibDir(); 696*67e74705SXin Li }; 697*67e74705SXin Li 698*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Haiku : public Generic_ELF { 699*67e74705SXin Li public: 700*67e74705SXin Li Haiku(const Driver &D, const llvm::Triple &Triple, 701*67e74705SXin Li const llvm::opt::ArgList &Args); 702*67e74705SXin Li isPIEDefault()703*67e74705SXin Li bool isPIEDefault() const override { return getTriple().getArch() == llvm::Triple::x86_64; } 704*67e74705SXin Li 705*67e74705SXin Li void 706*67e74705SXin Li AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 707*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 708*67e74705SXin Li }; 709*67e74705SXin Li 710*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 711*67e74705SXin Li public: 712*67e74705SXin Li OpenBSD(const Driver &D, const llvm::Triple &Triple, 713*67e74705SXin Li const llvm::opt::ArgList &Args); 714*67e74705SXin Li IsMathErrnoDefault()715*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()716*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { return true; } isPIEDefault()717*67e74705SXin Li bool isPIEDefault() const override { return true; } 718*67e74705SXin Li GetDefaultStackProtectorLevel(bool KernelOrKext)719*67e74705SXin Li unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 720*67e74705SXin Li return 2; 721*67e74705SXin Li } GetDefaultDwarfVersion()722*67e74705SXin Li unsigned GetDefaultDwarfVersion() const override { return 2; } 723*67e74705SXin Li 724*67e74705SXin Li protected: 725*67e74705SXin Li Tool *buildAssembler() const override; 726*67e74705SXin Li Tool *buildLinker() const override; 727*67e74705SXin Li }; 728*67e74705SXin Li 729*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF { 730*67e74705SXin Li public: 731*67e74705SXin Li Bitrig(const Driver &D, const llvm::Triple &Triple, 732*67e74705SXin Li const llvm::opt::ArgList &Args); 733*67e74705SXin Li IsMathErrnoDefault()734*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()735*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { return true; } 736*67e74705SXin Li 737*67e74705SXin Li CXXStdlibType GetDefaultCXXStdlibType() const override; 738*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 739*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 740*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 741*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 742*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; GetDefaultStackProtectorLevel(bool KernelOrKext)743*67e74705SXin Li unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 744*67e74705SXin Li return 1; 745*67e74705SXin Li } 746*67e74705SXin Li 747*67e74705SXin Li protected: 748*67e74705SXin Li Tool *buildAssembler() const override; 749*67e74705SXin Li Tool *buildLinker() const override; 750*67e74705SXin Li }; 751*67e74705SXin Li 752*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { 753*67e74705SXin Li public: 754*67e74705SXin Li FreeBSD(const Driver &D, const llvm::Triple &Triple, 755*67e74705SXin Li const llvm::opt::ArgList &Args); 756*67e74705SXin Li bool HasNativeLLVMSupport() const override; 757*67e74705SXin Li IsMathErrnoDefault()758*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()759*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { return true; } 760*67e74705SXin Li 761*67e74705SXin Li CXXStdlibType GetDefaultCXXStdlibType() const override; 762*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 763*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 764*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 765*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 766*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 767*67e74705SXin Li 768*67e74705SXin Li bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const override; 769*67e74705SXin Li bool isPIEDefault() const override; 770*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; GetDefaultDwarfVersion()771*67e74705SXin Li unsigned GetDefaultDwarfVersion() const override { return 2; } 772*67e74705SXin Li // Until dtrace (via CTF) and LLDB can deal with distributed debug info, 773*67e74705SXin Li // FreeBSD defaults to standalone/full debug info. GetDefaultStandaloneDebug()774*67e74705SXin Li bool GetDefaultStandaloneDebug() const override { return true; } 775*67e74705SXin Li 776*67e74705SXin Li protected: 777*67e74705SXin Li Tool *buildAssembler() const override; 778*67e74705SXin Li Tool *buildLinker() const override; 779*67e74705SXin Li }; 780*67e74705SXin Li 781*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { 782*67e74705SXin Li public: 783*67e74705SXin Li NetBSD(const Driver &D, const llvm::Triple &Triple, 784*67e74705SXin Li const llvm::opt::ArgList &Args); 785*67e74705SXin Li IsMathErrnoDefault()786*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()787*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { return true; } 788*67e74705SXin Li 789*67e74705SXin Li CXXStdlibType GetDefaultCXXStdlibType() const override; 790*67e74705SXin Li 791*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 792*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 793*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; IsUnwindTablesDefault()794*67e74705SXin Li bool IsUnwindTablesDefault() const override { return true; } 795*67e74705SXin Li 796*67e74705SXin Li protected: 797*67e74705SXin Li Tool *buildAssembler() const override; 798*67e74705SXin Li Tool *buildLinker() const override; 799*67e74705SXin Li }; 800*67e74705SXin Li 801*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { 802*67e74705SXin Li public: 803*67e74705SXin Li Minix(const Driver &D, const llvm::Triple &Triple, 804*67e74705SXin Li const llvm::opt::ArgList &Args); 805*67e74705SXin Li 806*67e74705SXin Li protected: 807*67e74705SXin Li Tool *buildAssembler() const override; 808*67e74705SXin Li Tool *buildLinker() const override; 809*67e74705SXin Li }; 810*67e74705SXin Li 811*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { 812*67e74705SXin Li public: 813*67e74705SXin Li DragonFly(const Driver &D, const llvm::Triple &Triple, 814*67e74705SXin Li const llvm::opt::ArgList &Args); 815*67e74705SXin Li IsMathErrnoDefault()816*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } 817*67e74705SXin Li 818*67e74705SXin Li protected: 819*67e74705SXin Li Tool *buildAssembler() const override; 820*67e74705SXin Li Tool *buildLinker() const override; 821*67e74705SXin Li }; 822*67e74705SXin Li 823*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { 824*67e74705SXin Li public: 825*67e74705SXin Li Linux(const Driver &D, const llvm::Triple &Triple, 826*67e74705SXin Li const llvm::opt::ArgList &Args); 827*67e74705SXin Li 828*67e74705SXin Li bool HasNativeLLVMSupport() const override; 829*67e74705SXin Li 830*67e74705SXin Li void 831*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 832*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 833*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 834*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 835*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 836*67e74705SXin Li void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, 837*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 838*67e74705SXin Li void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, 839*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 840*67e74705SXin Li bool isPIEDefault() const override; 841*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; 842*67e74705SXin Li void addProfileRTLibs(const llvm::opt::ArgList &Args, 843*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 844*67e74705SXin Li virtual std::string computeSysRoot() const; 845*67e74705SXin Li 846*67e74705SXin Li virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const; 847*67e74705SXin Li 848*67e74705SXin Li std::vector<std::string> ExtraOpts; 849*67e74705SXin Li 850*67e74705SXin Li protected: 851*67e74705SXin Li Tool *buildAssembler() const override; 852*67e74705SXin Li Tool *buildLinker() const override; 853*67e74705SXin Li }; 854*67e74705SXin Li 855*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY CudaToolChain : public Linux { 856*67e74705SXin Li public: 857*67e74705SXin Li CudaToolChain(const Driver &D, const llvm::Triple &Triple, 858*67e74705SXin Li const llvm::opt::ArgList &Args); 859*67e74705SXin Li 860*67e74705SXin Li llvm::opt::DerivedArgList * 861*67e74705SXin Li TranslateArgs(const llvm::opt::DerivedArgList &Args, 862*67e74705SXin Li const char *BoundArch) const override; 863*67e74705SXin Li void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 864*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 865*67e74705SXin Li 866*67e74705SXin Li // Never try to use the integrated assembler with CUDA; always fork out to 867*67e74705SXin Li // ptxas. useIntegratedAs()868*67e74705SXin Li bool useIntegratedAs() const override { return false; } 869*67e74705SXin Li 870*67e74705SXin Li void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, 871*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 872*67e74705SXin Li cudaInstallation()873*67e74705SXin Li const Generic_GCC::CudaInstallationDetector &cudaInstallation() const { 874*67e74705SXin Li return CudaInstallation; 875*67e74705SXin Li } cudaInstallation()876*67e74705SXin Li Generic_GCC::CudaInstallationDetector &cudaInstallation() { 877*67e74705SXin Li return CudaInstallation; 878*67e74705SXin Li } 879*67e74705SXin Li 880*67e74705SXin Li protected: 881*67e74705SXin Li Tool *buildAssembler() const override; // ptxas 882*67e74705SXin Li Tool *buildLinker() const override; // fatbinary (ok, not really a linker) 883*67e74705SXin Li }; 884*67e74705SXin Li 885*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MipsLLVMToolChain : public Linux { 886*67e74705SXin Li protected: 887*67e74705SXin Li Tool *buildLinker() const override; 888*67e74705SXin Li 889*67e74705SXin Li public: 890*67e74705SXin Li MipsLLVMToolChain(const Driver &D, const llvm::Triple &Triple, 891*67e74705SXin Li const llvm::opt::ArgList &Args); 892*67e74705SXin Li 893*67e74705SXin Li void 894*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 895*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 896*67e74705SXin Li 897*67e74705SXin Li CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 898*67e74705SXin Li 899*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 900*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 901*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 902*67e74705SXin Li 903*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 904*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 905*67e74705SXin Li 906*67e74705SXin Li std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component, 907*67e74705SXin Li bool Shared = false) const override; 908*67e74705SXin Li 909*67e74705SXin Li std::string computeSysRoot() const override; 910*67e74705SXin Li GetDefaultRuntimeLibType()911*67e74705SXin Li RuntimeLibType GetDefaultRuntimeLibType() const override { 912*67e74705SXin Li return GCCInstallation.isValid() ? RuntimeLibType::RLT_Libgcc 913*67e74705SXin Li : RuntimeLibType::RLT_CompilerRT; 914*67e74705SXin Li } 915*67e74705SXin Li 916*67e74705SXin Li private: 917*67e74705SXin Li Multilib SelectedMultilib; 918*67e74705SXin Li std::string LibSuffix; 919*67e74705SXin Li }; 920*67e74705SXin Li 921*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY LanaiToolChain : public Generic_ELF { 922*67e74705SXin Li public: LanaiToolChain(const Driver & D,const llvm::Triple & Triple,const llvm::opt::ArgList & Args)923*67e74705SXin Li LanaiToolChain(const Driver &D, const llvm::Triple &Triple, 924*67e74705SXin Li const llvm::opt::ArgList &Args) 925*67e74705SXin Li : Generic_ELF(D, Triple, Args) {} IsIntegratedAssemblerDefault()926*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { return true; } 927*67e74705SXin Li }; 928*67e74705SXin Li 929*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux { 930*67e74705SXin Li protected: 931*67e74705SXin Li GCCVersion GCCLibAndIncVersion; 932*67e74705SXin Li Tool *buildAssembler() const override; 933*67e74705SXin Li Tool *buildLinker() const override; 934*67e74705SXin Li 935*67e74705SXin Li public: 936*67e74705SXin Li HexagonToolChain(const Driver &D, const llvm::Triple &Triple, 937*67e74705SXin Li const llvm::opt::ArgList &Args); 938*67e74705SXin Li ~HexagonToolChain() override; 939*67e74705SXin Li 940*67e74705SXin Li void 941*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 942*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 943*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 944*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 945*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 946*67e74705SXin Li CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 947*67e74705SXin Li GetGCCLibAndIncVersion()948*67e74705SXin Li StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } IsIntegratedAssemblerDefault()949*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { 950*67e74705SXin Li return true; 951*67e74705SXin Li } 952*67e74705SXin Li 953*67e74705SXin Li std::string getHexagonTargetDir( 954*67e74705SXin Li const std::string &InstalledDir, 955*67e74705SXin Li const SmallVectorImpl<std::string> &PrefixDirs) const; 956*67e74705SXin Li void getHexagonLibraryPaths(const llvm::opt::ArgList &Args, 957*67e74705SXin Li ToolChain::path_list &LibPaths) const; 958*67e74705SXin Li 959*67e74705SXin Li static const StringRef GetDefaultCPU(); 960*67e74705SXin Li static const StringRef GetTargetCPUVersion(const llvm::opt::ArgList &Args); 961*67e74705SXin Li 962*67e74705SXin Li static Optional<unsigned> getSmallDataThreshold( 963*67e74705SXin Li const llvm::opt::ArgList &Args); 964*67e74705SXin Li }; 965*67e74705SXin Li 966*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY AMDGPUToolChain : public Generic_ELF { 967*67e74705SXin Li protected: 968*67e74705SXin Li Tool *buildLinker() const override; 969*67e74705SXin Li 970*67e74705SXin Li public: 971*67e74705SXin Li AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple, 972*67e74705SXin Li const llvm::opt::ArgList &Args); GetDefaultDwarfVersion()973*67e74705SXin Li unsigned GetDefaultDwarfVersion() const override { return 2; } IsIntegratedAssemblerDefault()974*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { return true; } 975*67e74705SXin Li }; 976*67e74705SXin Li 977*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY NaClToolChain : public Generic_ELF { 978*67e74705SXin Li public: 979*67e74705SXin Li NaClToolChain(const Driver &D, const llvm::Triple &Triple, 980*67e74705SXin Li const llvm::opt::ArgList &Args); 981*67e74705SXin Li 982*67e74705SXin Li void 983*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 984*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 985*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 986*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 987*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 988*67e74705SXin Li 989*67e74705SXin Li CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 990*67e74705SXin Li 991*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 992*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 993*67e74705SXin Li IsIntegratedAssemblerDefault()994*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { 995*67e74705SXin Li return getTriple().getArch() == llvm::Triple::mipsel; 996*67e74705SXin Li } 997*67e74705SXin Li 998*67e74705SXin Li // Get the path to the file containing NaCl's ARM macros. 999*67e74705SXin Li // It lives in NaClToolChain because the ARMAssembler tool needs a 1000*67e74705SXin Li // const char * that it can pass around, GetNaClArmMacrosPath()1001*67e74705SXin Li const char *GetNaClArmMacrosPath() const { return NaClArmMacrosPath.c_str(); } 1002*67e74705SXin Li 1003*67e74705SXin Li std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 1004*67e74705SXin Li types::ID InputType) const override; 1005*67e74705SXin Li 1006*67e74705SXin Li protected: 1007*67e74705SXin Li Tool *buildLinker() const override; 1008*67e74705SXin Li Tool *buildAssembler() const override; 1009*67e74705SXin Li 1010*67e74705SXin Li private: 1011*67e74705SXin Li std::string NaClArmMacrosPath; 1012*67e74705SXin Li }; 1013*67e74705SXin Li 1014*67e74705SXin Li /// TCEToolChain - A tool chain using the llvm bitcode tools to perform 1015*67e74705SXin Li /// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 1016*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { 1017*67e74705SXin Li public: 1018*67e74705SXin Li TCEToolChain(const Driver &D, const llvm::Triple &Triple, 1019*67e74705SXin Li const llvm::opt::ArgList &Args); 1020*67e74705SXin Li ~TCEToolChain() override; 1021*67e74705SXin Li 1022*67e74705SXin Li bool IsMathErrnoDefault() const override; 1023*67e74705SXin Li bool isPICDefault() const override; 1024*67e74705SXin Li bool isPIEDefault() const override; 1025*67e74705SXin Li bool isPICDefaultForced() const override; 1026*67e74705SXin Li }; 1027*67e74705SXin Li 1028*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { 1029*67e74705SXin Li public: 1030*67e74705SXin Li MSVCToolChain(const Driver &D, const llvm::Triple &Triple, 1031*67e74705SXin Li const llvm::opt::ArgList &Args); 1032*67e74705SXin Li 1033*67e74705SXin Li llvm::opt::DerivedArgList * 1034*67e74705SXin Li TranslateArgs(const llvm::opt::DerivedArgList &Args, 1035*67e74705SXin Li const char *BoundArch) const override; 1036*67e74705SXin Li 1037*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override; 1038*67e74705SXin Li bool IsUnwindTablesDefault() const override; 1039*67e74705SXin Li bool isPICDefault() const override; 1040*67e74705SXin Li bool isPIEDefault() const override; 1041*67e74705SXin Li bool isPICDefaultForced() const override; 1042*67e74705SXin Li 1043*67e74705SXin Li void 1044*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 1045*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1046*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 1047*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 1048*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1049*67e74705SXin Li 1050*67e74705SXin Li bool getWindowsSDKDir(std::string &path, int &major, 1051*67e74705SXin Li std::string &windowsSDKIncludeVersion, 1052*67e74705SXin Li std::string &windowsSDKLibVersion) const; 1053*67e74705SXin Li bool getWindowsSDKLibraryPath(std::string &path) const; 1054*67e74705SXin Li /// \brief Check if Universal CRT should be used if available 1055*67e74705SXin Li bool useUniversalCRT(std::string &visualStudioDir) const; 1056*67e74705SXin Li bool getUniversalCRTSdkDir(std::string &path, std::string &ucrtVersion) const; 1057*67e74705SXin Li bool getUniversalCRTLibraryPath(std::string &path) const; 1058*67e74705SXin Li bool getVisualStudioInstallDir(std::string &path) const; 1059*67e74705SXin Li bool getVisualStudioBinariesFolder(const char *clangProgramPath, 1060*67e74705SXin Li std::string &path) const; 1061*67e74705SXin Li VersionTuple getMSVCVersionFromExe() const override; 1062*67e74705SXin Li 1063*67e74705SXin Li std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 1064*67e74705SXin Li types::ID InputType) const override; 1065*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; 1066*67e74705SXin Li 1067*67e74705SXin Li protected: 1068*67e74705SXin Li void AddSystemIncludeWithSubfolder(const llvm::opt::ArgList &DriverArgs, 1069*67e74705SXin Li llvm::opt::ArgStringList &CC1Args, 1070*67e74705SXin Li const std::string &folder, 1071*67e74705SXin Li const Twine &subfolder1, 1072*67e74705SXin Li const Twine &subfolder2 = "", 1073*67e74705SXin Li const Twine &subfolder3 = "") const; 1074*67e74705SXin Li 1075*67e74705SXin Li Tool *buildLinker() const override; 1076*67e74705SXin Li Tool *buildAssembler() const override; 1077*67e74705SXin Li }; 1078*67e74705SXin Li 1079*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY CrossWindowsToolChain : public Generic_GCC { 1080*67e74705SXin Li public: 1081*67e74705SXin Li CrossWindowsToolChain(const Driver &D, const llvm::Triple &T, 1082*67e74705SXin Li const llvm::opt::ArgList &Args); 1083*67e74705SXin Li IsIntegratedAssemblerDefault()1084*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override { return true; } 1085*67e74705SXin Li bool IsUnwindTablesDefault() const override; 1086*67e74705SXin Li bool isPICDefault() const override; 1087*67e74705SXin Li bool isPIEDefault() const override; 1088*67e74705SXin Li bool isPICDefaultForced() const override; 1089*67e74705SXin Li GetDefaultStackProtectorLevel(bool KernelOrKext)1090*67e74705SXin Li unsigned int GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 1091*67e74705SXin Li return 0; 1092*67e74705SXin Li } 1093*67e74705SXin Li 1094*67e74705SXin Li void 1095*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 1096*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1097*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 1098*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 1099*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1100*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 1101*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 1102*67e74705SXin Li 1103*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; 1104*67e74705SXin Li 1105*67e74705SXin Li protected: 1106*67e74705SXin Li Tool *buildLinker() const override; 1107*67e74705SXin Li Tool *buildAssembler() const override; 1108*67e74705SXin Li }; 1109*67e74705SXin Li 1110*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY XCoreToolChain : public ToolChain { 1111*67e74705SXin Li public: 1112*67e74705SXin Li XCoreToolChain(const Driver &D, const llvm::Triple &Triple, 1113*67e74705SXin Li const llvm::opt::ArgList &Args); 1114*67e74705SXin Li 1115*67e74705SXin Li protected: 1116*67e74705SXin Li Tool *buildAssembler() const override; 1117*67e74705SXin Li Tool *buildLinker() const override; 1118*67e74705SXin Li 1119*67e74705SXin Li public: 1120*67e74705SXin Li bool isPICDefault() const override; 1121*67e74705SXin Li bool isPIEDefault() const override; 1122*67e74705SXin Li bool isPICDefaultForced() const override; 1123*67e74705SXin Li bool SupportsProfiling() const override; 1124*67e74705SXin Li bool hasBlocksRuntime() const override; 1125*67e74705SXin Li void 1126*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 1127*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1128*67e74705SXin Li void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 1129*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1130*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 1131*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 1132*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1133*67e74705SXin Li void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 1134*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 1135*67e74705SXin Li }; 1136*67e74705SXin Li 1137*67e74705SXin Li /// MyriadToolChain - A tool chain using either clang or the external compiler 1138*67e74705SXin Li /// installed by the Movidius SDK to perform all subcommands. 1139*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MyriadToolChain : public Generic_ELF { 1140*67e74705SXin Li public: 1141*67e74705SXin Li MyriadToolChain(const Driver &D, const llvm::Triple &Triple, 1142*67e74705SXin Li const llvm::opt::ArgList &Args); 1143*67e74705SXin Li ~MyriadToolChain() override; 1144*67e74705SXin Li 1145*67e74705SXin Li void 1146*67e74705SXin Li AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 1147*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1148*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 1149*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 1150*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1151*67e74705SXin Li Tool *SelectTool(const JobAction &JA) const override; GetDefaultDwarfVersion()1152*67e74705SXin Li unsigned GetDefaultDwarfVersion() const override { return 2; } 1153*67e74705SXin Li 1154*67e74705SXin Li protected: 1155*67e74705SXin Li Tool *buildLinker() const override; isShaveCompilation(const llvm::Triple & T)1156*67e74705SXin Li bool isShaveCompilation(const llvm::Triple &T) const { 1157*67e74705SXin Li return T.getArch() == llvm::Triple::shave; 1158*67e74705SXin Li } 1159*67e74705SXin Li 1160*67e74705SXin Li private: 1161*67e74705SXin Li mutable std::unique_ptr<Tool> Compiler; 1162*67e74705SXin Li mutable std::unique_ptr<Tool> Assembler; 1163*67e74705SXin Li }; 1164*67e74705SXin Li 1165*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY WebAssembly final : public ToolChain { 1166*67e74705SXin Li public: 1167*67e74705SXin Li WebAssembly(const Driver &D, const llvm::Triple &Triple, 1168*67e74705SXin Li const llvm::opt::ArgList &Args); 1169*67e74705SXin Li 1170*67e74705SXin Li private: 1171*67e74705SXin Li bool IsMathErrnoDefault() const override; 1172*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override; 1173*67e74705SXin Li bool UseObjCMixedDispatch() const override; 1174*67e74705SXin Li bool isPICDefault() const override; 1175*67e74705SXin Li bool isPIEDefault() const override; 1176*67e74705SXin Li bool isPICDefaultForced() const override; 1177*67e74705SXin Li bool IsIntegratedAssemblerDefault() const override; 1178*67e74705SXin Li bool hasBlocksRuntime() const override; 1179*67e74705SXin Li bool SupportsObjCGC() const override; 1180*67e74705SXin Li bool SupportsProfiling() const override; 1181*67e74705SXin Li bool HasNativeLLVMSupport() const override; 1182*67e74705SXin Li void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 1183*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1184*67e74705SXin Li RuntimeLibType GetDefaultRuntimeLibType() const override; 1185*67e74705SXin Li CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 1186*67e74705SXin Li void AddClangSystemIncludeArgs( 1187*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 1188*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1189*67e74705SXin Li void AddClangCXXStdlibIncludeArgs( 1190*67e74705SXin Li const llvm::opt::ArgList &DriverArgs, 1191*67e74705SXin Li llvm::opt::ArgStringList &CC1Args) const override; 1192*67e74705SXin Li 1193*67e74705SXin Li Tool *buildLinker() const override; 1194*67e74705SXin Li }; 1195*67e74705SXin Li 1196*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY PS4CPU : public Generic_ELF { 1197*67e74705SXin Li public: 1198*67e74705SXin Li PS4CPU(const Driver &D, const llvm::Triple &Triple, 1199*67e74705SXin Li const llvm::opt::ArgList &Args); 1200*67e74705SXin Li IsMathErrnoDefault()1201*67e74705SXin Li bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()1202*67e74705SXin Li bool IsObjCNonFragileABIDefault() const override { return true; } 1203*67e74705SXin Li bool HasNativeLLVMSupport() const override; 1204*67e74705SXin Li bool isPICDefault() const override; 1205*67e74705SXin Li GetDefaultStackProtectorLevel(bool KernelOrKext)1206*67e74705SXin Li unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 1207*67e74705SXin Li return 2; // SSPStrong 1208*67e74705SXin Li } 1209*67e74705SXin Li getDefaultDebuggerTuning()1210*67e74705SXin Li llvm::DebuggerKind getDefaultDebuggerTuning() const override { 1211*67e74705SXin Li return llvm::DebuggerKind::SCE; 1212*67e74705SXin Li } 1213*67e74705SXin Li 1214*67e74705SXin Li SanitizerMask getSupportedSanitizers() const override; 1215*67e74705SXin Li 1216*67e74705SXin Li protected: 1217*67e74705SXin Li Tool *buildAssembler() const override; 1218*67e74705SXin Li Tool *buildLinker() const override; 1219*67e74705SXin Li }; 1220*67e74705SXin Li 1221*67e74705SXin Li } // end namespace toolchains 1222*67e74705SXin Li } // end namespace driver 1223*67e74705SXin Li } // end namespace clang 1224*67e74705SXin Li 1225*67e74705SXin Li #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_H 1226