1193326Sed//===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===// 2193326Sed// 3193326Sed// The LLVM Compiler Infrastructure 4193326Sed// 5193326Sed// This file is distributed under the University of Illinois Open Source 6193326Sed// License. See LICENSE.TXT for details. 7193326Sed// 8193326Sed//===----------------------------------------------------------------------===// 9193326Sed 10193326Sed#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_ 11193326Sed#define CLANG_LIB_DRIVER_TOOLCHAINS_H_ 12193326Sed 13249423Sdim#include "Tools.h" 14249423Sdim#include "clang/Basic/VersionTuple.h" 15193326Sed#include "clang/Driver/Action.h" 16193326Sed#include "clang/Driver/ToolChain.h" 17193326Sed#include "llvm/ADT/DenseMap.h" 18193326Sed#include "llvm/Support/Compiler.h" 19263508Sdim#include <vector> 20263508Sdim#include <set> 21193326Sed 22193326Sednamespace clang { 23193326Sednamespace driver { 24193326Sednamespace toolchains { 25193326Sed 26198092Srdivacky/// Generic_GCC - A tool chain using the 'gcc' command to perform 27198092Srdivacky/// all subcommands; this relies on gcc translating the majority of 28198092Srdivacky/// command line options. 29208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 30193326Sedprotected: 31234353Sdim /// \brief Struct to store and manipulate GCC versions. 32234353Sdim /// 33234353Sdim /// We rely on assumptions about the form and structure of GCC version 34234353Sdim /// numbers: they consist of at most three '.'-separated components, and each 35234353Sdim /// component is a non-negative integer except for the last component. For 36234353Sdim /// the last component we are very flexible in order to tolerate release 37234353Sdim /// candidates or 'x' wildcards. 38234353Sdim /// 39234353Sdim /// Note that the ordering established among GCCVersions is based on the 40234353Sdim /// preferred version string to use. For example we prefer versions without 41234353Sdim /// a hard-coded patch number to those with a hard coded patch number. 42234353Sdim /// 43234353Sdim /// Currently this doesn't provide any logic for textual suffixes to patches 44234353Sdim /// in the way that (for example) Debian's version format does. If that ever 45234353Sdim /// becomes necessary, it can be added. 46234353Sdim struct GCCVersion { 47234353Sdim /// \brief The unparsed text of the version. 48234353Sdim std::string Text; 49234353Sdim 50234353Sdim /// \brief The parsed major, minor, and patch numbers. 51234353Sdim int Major, Minor, Patch; 52234353Sdim 53263508Sdim /// \brief The text of the parsed major, and major+minor versions. 54263508Sdim std::string MajorStr, MinorStr; 55263508Sdim 56234353Sdim /// \brief Any textual suffix on the patch number. 57234353Sdim std::string PatchSuffix; 58234353Sdim 59234353Sdim static GCCVersion Parse(StringRef VersionText); 60263508Sdim bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 61263508Sdim StringRef RHSPatchSuffix = StringRef()) const; 62263508Sdim bool operator<(const GCCVersion &RHS) const { 63263508Sdim return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 64263508Sdim } 65234353Sdim bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 66234353Sdim bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 67234353Sdim bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 68234353Sdim }; 69234353Sdim 70234353Sdim 71234353Sdim /// \brief This is a class to find a viable GCC installation for Clang to 72234353Sdim /// use. 73234353Sdim /// 74234353Sdim /// This class tries to find a GCC installation on the system, and report 75234353Sdim /// information about it. It starts from the host information provided to the 76234353Sdim /// Driver, and has logic for fuzzing that where appropriate. 77234353Sdim class GCCInstallationDetector { 78234353Sdim bool IsValid; 79263508Sdim const Driver &D; 80234353Sdim llvm::Triple GCCTriple; 81234353Sdim 82234353Sdim // FIXME: These might be better as path objects. 83234353Sdim std::string GCCInstallPath; 84263508Sdim std::string GCCBiarchSuffix; 85234353Sdim std::string GCCParentLibPath; 86263508Sdim std::string GCCMIPSABIDirSuffix; 87234353Sdim 88234353Sdim GCCVersion Version; 89234353Sdim 90263508Sdim // We retain the list of install paths that were considered and rejected in 91263508Sdim // order to print out detailed information in verbose mode. 92263508Sdim std::set<std::string> CandidateGCCInstallPaths; 93263508Sdim 94234353Sdim public: 95263508Sdim GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} 96263508Sdim void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args); 97234353Sdim 98234353Sdim /// \brief Check whether we detected a valid GCC install. 99234353Sdim bool isValid() const { return IsValid; } 100234353Sdim 101234353Sdim /// \brief Get the GCC triple for the detected install. 102234353Sdim const llvm::Triple &getTriple() const { return GCCTriple; } 103234353Sdim 104234353Sdim /// \brief Get the detected GCC installation path. 105234353Sdim StringRef getInstallPath() const { return GCCInstallPath; } 106234353Sdim 107263508Sdim /// \brief Get the detected GCC installation path suffix for the bi-arch 108263508Sdim /// target variant. 109263508Sdim StringRef getBiarchSuffix() const { return GCCBiarchSuffix; } 110234353Sdim 111234353Sdim /// \brief Get the detected GCC parent lib path. 112234353Sdim StringRef getParentLibPath() const { return GCCParentLibPath; } 113234353Sdim 114263508Sdim /// \brief Get the detected GCC MIPS ABI directory suffix. 115263508Sdim /// 116263508Sdim /// This is used as a suffix both to the install directory of GCC and as 117263508Sdim /// a suffix to its parent lib path in order to select a MIPS ABI-specific 118263508Sdim /// subdirectory. 119263508Sdim /// 120263508Sdim /// This will always be empty for any non-MIPS target. 121263508Sdim /// 122263508Sdim // FIXME: This probably shouldn't exist at all, and should be factored 123263508Sdim // into the multiarch and/or biarch support. Please don't add more uses of 124263508Sdim // this interface, it is meant as a legacy crutch for the MIPS driver 125263508Sdim // logic. 126263508Sdim StringRef getMIPSABIDirSuffix() const { return GCCMIPSABIDirSuffix; } 127263508Sdim 128234353Sdim /// \brief Get the detected GCC version string. 129239462Sdim const GCCVersion &getVersion() const { return Version; } 130234353Sdim 131263508Sdim /// \brief Print information about the detected GCC installation. 132263508Sdim void print(raw_ostream &OS) const; 133263508Sdim 134234353Sdim private: 135263508Sdim static void 136263508Sdim CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 137263508Sdim const llvm::Triple &BiarchTriple, 138263508Sdim SmallVectorImpl<StringRef> &LibDirs, 139263508Sdim SmallVectorImpl<StringRef> &TripleAliases, 140263508Sdim SmallVectorImpl<StringRef> &BiarchLibDirs, 141263508Sdim SmallVectorImpl<StringRef> &BiarchTripleAliases); 142234353Sdim 143234353Sdim void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch, 144263508Sdim const llvm::opt::ArgList &Args, 145234353Sdim const std::string &LibDir, 146234353Sdim StringRef CandidateTriple, 147263508Sdim bool NeedsBiarchSuffix = false); 148263508Sdim 149263508Sdim void findMIPSABIDirSuffix(std::string &Suffix, 150263508Sdim llvm::Triple::ArchType TargetArch, StringRef Path, 151263508Sdim const llvm::opt::ArgList &Args); 152234353Sdim }; 153234353Sdim 154234353Sdim GCCInstallationDetector GCCInstallation; 155234353Sdim 156193326Sedpublic: 157263508Sdim Generic_GCC(const Driver &D, const llvm::Triple &Triple, 158263508Sdim const llvm::opt::ArgList &Args); 159193326Sed ~Generic_GCC(); 160193326Sed 161263508Sdim virtual void printVerboseInfo(raw_ostream &OS) const; 162263508Sdim 163193326Sed virtual bool IsUnwindTablesDefault() const; 164243830Sdim virtual bool isPICDefault() const; 165251662Sdim virtual bool isPIEDefault() const; 166243830Sdim virtual bool isPICDefaultForced() const; 167266715Sdim virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 168266715Sdim llvm::opt::ArgStringList &CC1Args) const; 169234353Sdim 170234353Sdimprotected: 171249423Sdim virtual Tool *getTool(Action::ActionClass AC) const; 172249423Sdim virtual Tool *buildAssembler() const; 173249423Sdim virtual Tool *buildLinker() const; 174249423Sdim 175234353Sdim /// \name ToolChain Implementation Helper Functions 176234353Sdim /// @{ 177234353Sdim 178234353Sdim /// \brief Check whether the target triple's architecture is 64-bits. 179234353Sdim bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 180234353Sdim 181234353Sdim /// \brief Check whether the target triple's architecture is 32-bits. 182234353Sdim bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 183234353Sdim 184234353Sdim /// @} 185193326Sed 186249423Sdimprivate: 187249423Sdim mutable OwningPtr<tools::gcc::Preprocess> Preprocess; 188249423Sdim mutable OwningPtr<tools::gcc::Precompile> Precompile; 189249423Sdim mutable OwningPtr<tools::gcc::Compile> Compile; 190234353Sdim}; 191234353Sdim 192234353Sdim /// Darwin - The base Darwin tool chain. 193208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { 194212904Sdimpublic: 195212904Sdim /// The host version. 196212904Sdim unsigned DarwinVersion[3]; 197212904Sdim 198249423Sdimprotected: 199249423Sdim virtual Tool *buildAssembler() const; 200249423Sdim virtual Tool *buildLinker() const; 201249423Sdim virtual Tool *getTool(Action::ActionClass AC) const; 202249423Sdim 203212904Sdimprivate: 204249423Sdim mutable OwningPtr<tools::darwin::Lipo> Lipo; 205249423Sdim mutable OwningPtr<tools::darwin::Dsymutil> Dsymutil; 206249423Sdim mutable OwningPtr<tools::darwin::VerifyDebug> VerifyDebug; 207193326Sed 208203955Srdivacky /// Whether the information on the target has been initialized. 209198092Srdivacky // 210203955Srdivacky // FIXME: This should be eliminated. What we want to do is make this part of 211203955Srdivacky // the "default target for arguments" selection process, once we get out of 212203955Srdivacky // the argument translation business. 213203955Srdivacky mutable bool TargetInitialized; 214193326Sed 215221345Sdim /// Whether we are targeting iPhoneOS target. 216203955Srdivacky mutable bool TargetIsIPhoneOS; 217208600Srdivacky 218221345Sdim /// Whether we are targeting the iPhoneOS simulator target. 219221345Sdim mutable bool TargetIsIPhoneOSSimulator; 220221345Sdim 221221345Sdim /// The OS version we are targeting. 222234353Sdim mutable VersionTuple TargetVersion; 223203955Srdivacky 224239462Sdimprivate: 225193326Sed /// The default macosx-version-min of this tool chain; empty until 226193326Sed /// initialized. 227203955Srdivacky std::string MacosxVersionMin; 228193326Sed 229239462Sdim /// The default ios-version-min of this tool chain; empty until 230239462Sdim /// initialized. 231239462Sdim std::string iOSVersionMin; 232224145Sdim 233212904Sdimprivate: 234263508Sdim void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const; 235212904Sdim 236193326Sedpublic: 237263508Sdim Darwin(const Driver &D, const llvm::Triple &Triple, 238263508Sdim const llvm::opt::ArgList &Args); 239198092Srdivacky ~Darwin(); 240193326Sed 241263508Sdim std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 242226633Sdim types::ID InputType) const; 243212904Sdim 244198092Srdivacky /// @name Darwin Specific Toolchain API 245198092Srdivacky /// { 246198092Srdivacky 247203955Srdivacky // FIXME: Eliminate these ...Target functions and derive separate tool chains 248203955Srdivacky // for these targets and put version in constructor. 249221345Sdim void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor, 250221345Sdim unsigned Micro, bool IsIOSSim) const { 251221345Sdim assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!"); 252221345Sdim 253203955Srdivacky // FIXME: For now, allow reinitialization as long as values don't 254203955Srdivacky // change. This will go away when we move away from argument translation. 255221345Sdim if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS && 256221345Sdim TargetIsIPhoneOSSimulator == IsIOSSim && 257234353Sdim TargetVersion == VersionTuple(Major, Minor, Micro)) 258203955Srdivacky return; 259203955Srdivacky 260203955Srdivacky assert(!TargetInitialized && "Target already initialized!"); 261203955Srdivacky TargetInitialized = true; 262221345Sdim TargetIsIPhoneOS = IsIPhoneOS; 263221345Sdim TargetIsIPhoneOSSimulator = IsIOSSim; 264234353Sdim TargetVersion = VersionTuple(Major, Minor, Micro); 265193326Sed } 266193326Sed 267203955Srdivacky bool isTargetIPhoneOS() const { 268203955Srdivacky assert(TargetInitialized && "Target not initialized!"); 269203955Srdivacky return TargetIsIPhoneOS; 270193326Sed } 271193326Sed 272221345Sdim bool isTargetIOSSimulator() const { 273221345Sdim assert(TargetInitialized && "Target not initialized!"); 274221345Sdim return TargetIsIPhoneOSSimulator; 275221345Sdim } 276221345Sdim 277234353Sdim bool isTargetMacOS() const { 278243830Sdim return !isTargetIOSSimulator() && !isTargetIPhoneOS(); 279234353Sdim } 280234353Sdim 281205408Srdivacky bool isTargetInitialized() const { return TargetInitialized; } 282205408Srdivacky 283234353Sdim VersionTuple getTargetVersion() const { 284203955Srdivacky assert(TargetInitialized && "Target not initialized!"); 285234353Sdim return TargetVersion; 286203955Srdivacky } 287203955Srdivacky 288202879Srdivacky /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler 289202879Srdivacky /// invocation. For example, Darwin treats different ARM variations as 290202879Srdivacky /// distinct architectures. 291263508Sdim StringRef getDarwinArchName(const llvm::opt::ArgList &Args) const; 292202879Srdivacky 293203955Srdivacky bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 294203955Srdivacky assert(isTargetIPhoneOS() && "Unexpected call for OS X target!"); 295234353Sdim return TargetVersion < VersionTuple(V0, V1, V2); 296198092Srdivacky } 297198092Srdivacky 298203955Srdivacky bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 299203955Srdivacky assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!"); 300234353Sdim return TargetVersion < VersionTuple(V0, V1, V2); 301193326Sed } 302193326Sed 303224145Sdim /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library. 304263508Sdim virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, 305263508Sdim llvm::opt::ArgStringList &CmdArgs) const = 0; 306263508Sdim 307198092Srdivacky /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler 308198092Srdivacky /// runtime library. 309263508Sdim virtual void 310263508Sdim AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 311263508Sdim llvm::opt::ArgStringList &CmdArgs) const = 0; 312263508Sdim 313198092Srdivacky /// } 314198092Srdivacky /// @name ToolChain Implementation 315198092Srdivacky /// { 316198092Srdivacky 317212904Sdim virtual types::ID LookupTypeForExtension(const char *Ext) const; 318212904Sdim 319218893Sdim virtual bool HasNativeLLVMSupport() const; 320218893Sdim 321239462Sdim virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const; 322226633Sdim virtual bool hasBlocksRuntime() const; 323224145Sdim 324263508Sdim virtual llvm::opt::DerivedArgList * 325263508Sdim TranslateArgs(const llvm::opt::DerivedArgList &Args, 326263508Sdim const char *BoundArch) const; 327198092Srdivacky 328199482Srdivacky virtual bool IsBlocksDefault() const { 329212904Sdim // Always allow blocks on Darwin; users interested in versioning are 330212904Sdim // expected to use /usr/include/Blocks.h. 331212904Sdim return true; 332199482Srdivacky } 333208600Srdivacky virtual bool IsIntegratedAssemblerDefault() const { 334234353Sdim // Default integrated assembler to on for Darwin. 335234353Sdim return true; 336208600Srdivacky } 337239462Sdim 338239462Sdim virtual bool IsMathErrnoDefault() const { 339239462Sdim return false; 340239462Sdim } 341239462Sdim 342243830Sdim virtual bool IsEncodeExtendedBlockSignatureDefault() const { 343243830Sdim return true; 344243830Sdim } 345243830Sdim 346199482Srdivacky virtual bool IsObjCNonFragileABIDefault() const { 347207619Srdivacky // Non-fragile ABI is default for everything but i386. 348207619Srdivacky return getTriple().getArch() != llvm::Triple::x86; 349199482Srdivacky } 350207619Srdivacky 351207619Srdivacky virtual bool UseObjCMixedDispatch() const { 352207619Srdivacky // This is only used with the non-fragile ABI and non-legacy dispatch. 353207619Srdivacky 354207619Srdivacky // Mixed dispatch is used everywhere except OS X before 10.6. 355207619Srdivacky return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6)); 356207619Srdivacky } 357193326Sed virtual bool IsUnwindTablesDefault() const; 358226633Sdim virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 359226633Sdim // Stack protectors default to on for user code on 10.5, 360226633Sdim // and for everything in 10.6 and beyond 361234353Sdim return isTargetIPhoneOS() || 362226633Sdim (!isMacosxVersionLT(10, 6) || 363226633Sdim (!isMacosxVersionLT(10, 5) && !KernelOrKext)); 364199482Srdivacky } 365234353Sdim virtual RuntimeLibType GetDefaultRuntimeLibType() const { 366234353Sdim return ToolChain::RLT_CompilerRT; 367234353Sdim } 368243830Sdim virtual bool isPICDefault() const; 369251662Sdim virtual bool isPIEDefault() const; 370243830Sdim virtual bool isPICDefaultForced() const; 371198092Srdivacky 372221345Sdim virtual bool SupportsProfiling() const; 373221345Sdim 374207619Srdivacky virtual bool SupportsObjCGC() const; 375207619Srdivacky 376243830Sdim virtual void CheckObjCARC() const; 377234353Sdim 378201361Srdivacky virtual bool UseDwarfDebugFlags() const; 379201361Srdivacky 380203955Srdivacky virtual bool UseSjLjExceptions() const; 381203955Srdivacky 382198092Srdivacky /// } 383193326Sed}; 384193326Sed 385198092Srdivacky/// DarwinClang - The Darwin toolchain used by Clang. 386208600Srdivackyclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { 387193326Sedpublic: 388263508Sdim DarwinClang(const Driver &D, const llvm::Triple &Triple, 389263508Sdim const llvm::opt::ArgList &Args); 390198092Srdivacky 391198092Srdivacky /// @name Darwin ToolChain Implementation 392198092Srdivacky /// { 393198092Srdivacky 394263508Sdim virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 395263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 396263508Sdim void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, 397263508Sdim llvm::opt::ArgStringList &CmdArgs, 398249423Sdim const char *DarwinStaticLib, 399249423Sdim bool AlwaysLink = false) const; 400249423Sdim 401263508Sdim virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 402263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 403218893Sdim 404263508Sdim virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args, 405263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 406218893Sdim 407263508Sdim virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, 408263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 409198092Srdivacky /// } 410198092Srdivacky}; 411198092Srdivacky 412198092Srdivacky/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc. 413208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC { 414198092Srdivackypublic: 415263508Sdim Darwin_Generic_GCC(const Driver &D, const llvm::Triple &Triple, 416263508Sdim const llvm::opt::ArgList &Args) 417263508Sdim : Generic_GCC(D, Triple, Args) {} 418193326Sed 419263508Sdim std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 420226633Sdim types::ID InputType) const; 421212904Sdim 422249423Sdim virtual bool isPICDefault() const { return false; } 423193326Sed}; 424193326Sed 425218893Sdimclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 426234353Sdim virtual void anchor(); 427234353Sdimpublic: 428263508Sdim Generic_ELF(const Driver &D, const llvm::Triple &Triple, 429263508Sdim const llvm::opt::ArgList &Args) 430263508Sdim : Generic_GCC(D, Triple, Args) {} 431218893Sdim 432218893Sdim virtual bool IsIntegratedAssemblerDefault() const { 433218893Sdim // Default integrated assembler to on for x86. 434249423Sdim return (getTriple().getArch() == llvm::Triple::aarch64 || 435249423Sdim getTriple().getArch() == llvm::Triple::x86 || 436218893Sdim getTriple().getArch() == llvm::Triple::x86_64); 437218893Sdim } 438218893Sdim}; 439218893Sdim 440208600Srdivackyclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { 441198092Srdivackypublic: 442263508Sdim AuroraUX(const Driver &D, const llvm::Triple &Triple, 443263508Sdim const llvm::opt::ArgList &Args); 444198092Srdivacky 445249423Sdimprotected: 446249423Sdim virtual Tool *buildAssembler() const; 447249423Sdim virtual Tool *buildLinker() const; 448198092Srdivacky}; 449198092Srdivacky 450234353Sdimclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { 451234353Sdimpublic: 452263508Sdim Solaris(const Driver &D, const llvm::Triple &Triple, 453263508Sdim const llvm::opt::ArgList &Args); 454234353Sdim 455249423Sdim virtual bool IsIntegratedAssemblerDefault() const { return true; } 456249423Sdimprotected: 457249423Sdim virtual Tool *buildAssembler() const; 458249423Sdim virtual Tool *buildLinker() const; 459234353Sdim 460234353Sdim}; 461234353Sdim 462234353Sdim 463218893Sdimclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 464195341Sedpublic: 465263508Sdim OpenBSD(const Driver &D, const llvm::Triple &Triple, 466263508Sdim const llvm::opt::ArgList &Args); 467195341Sed 468239462Sdim virtual bool IsMathErrnoDefault() const { return false; } 469234353Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 470263508Sdim virtual bool isPIEDefault() const { return true; } 471234353Sdim 472263508Sdim virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 473263508Sdim return 1; 474263508Sdim } 475263508Sdim 476249423Sdimprotected: 477249423Sdim virtual Tool *buildAssembler() const; 478249423Sdim virtual Tool *buildLinker() const; 479195341Sed}; 480195341Sed 481239462Sdimclass LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF { 482239462Sdimpublic: 483263508Sdim Bitrig(const Driver &D, const llvm::Triple &Triple, 484263508Sdim const llvm::opt::ArgList &Args); 485239462Sdim 486239462Sdim virtual bool IsMathErrnoDefault() const { return false; } 487239462Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 488239462Sdim virtual bool IsObjCLegacyDispatchDefault() const { return false; } 489239462Sdim 490263508Sdim virtual void 491263508Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 492263508Sdim llvm::opt::ArgStringList &CC1Args) const; 493263508Sdim virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 494263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 495239462Sdim virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 496239462Sdim return 1; 497239462Sdim } 498249423Sdim 499249423Sdimprotected: 500249423Sdim virtual Tool *buildAssembler() const; 501249423Sdim virtual Tool *buildLinker() const; 502239462Sdim}; 503239462Sdim 504218893Sdimclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { 505193326Sedpublic: 506263508Sdim FreeBSD(const Driver &D, const llvm::Triple &Triple, 507263508Sdim const llvm::opt::ArgList &Args); 508263508Sdim virtual bool HasNativeLLVMSupport() const; 509193326Sed 510239462Sdim virtual bool IsMathErrnoDefault() const { return false; } 511234353Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 512234353Sdim 513263508Sdim virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; 514263508Sdim virtual void 515263508Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 516263508Sdim llvm::opt::ArgStringList &CC1Args) const; 517263508Sdim virtual bool IsIntegratedAssemblerDefault() const { 518263508Sdim if (getTriple().getArch() == llvm::Triple::ppc || 519263508Sdim getTriple().getArch() == llvm::Triple::ppc64) 520263508Sdim return true; 521263508Sdim return Generic_ELF::IsIntegratedAssemblerDefault(); 522263508Sdim } 523255321Stheraven 524244640Sandrew virtual bool UseSjLjExceptions() const; 525249423Sdimprotected: 526249423Sdim virtual Tool *buildAssembler() const; 527249423Sdim virtual Tool *buildLinker() const; 528193326Sed}; 529193326Sed 530218893Sdimclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { 531218893Sdimpublic: 532263508Sdim NetBSD(const Driver &D, const llvm::Triple &Triple, 533263508Sdim const llvm::opt::ArgList &Args); 534218893Sdim 535239462Sdim virtual bool IsMathErrnoDefault() const { return false; } 536234353Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 537234353Sdim 538263508Sdim virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; 539251662Sdim 540263508Sdim virtual void 541263508Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 542263508Sdim llvm::opt::ArgStringList &CC1Args) const; 543263508Sdim virtual bool IsUnwindTablesDefault() const { 544263508Sdim return true; 545263508Sdim } 546263508Sdim virtual bool IsIntegratedAssemblerDefault() const { 547263508Sdim if (getTriple().getArch() == llvm::Triple::ppc) 548263508Sdim return true; 549263508Sdim return Generic_ELF::IsIntegratedAssemblerDefault(); 550263508Sdim } 551251662Sdim 552249423Sdimprotected: 553249423Sdim virtual Tool *buildAssembler() const; 554249423Sdim virtual Tool *buildLinker() const; 555218893Sdim}; 556218893Sdim 557234353Sdimclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { 558210299Sedpublic: 559263508Sdim Minix(const Driver &D, const llvm::Triple &Triple, 560263508Sdim const llvm::opt::ArgList &Args); 561210299Sed 562249423Sdimprotected: 563249423Sdim virtual Tool *buildAssembler() const; 564249423Sdim virtual Tool *buildLinker() const; 565210299Sed}; 566210299Sed 567218893Sdimclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { 568193326Sedpublic: 569263508Sdim DragonFly(const Driver &D, const llvm::Triple &Triple, 570263508Sdim const llvm::opt::ArgList &Args); 571193326Sed 572239462Sdim virtual bool IsMathErrnoDefault() const { return false; } 573239462Sdim 574249423Sdimprotected: 575249423Sdim virtual Tool *buildAssembler() const; 576249423Sdim virtual Tool *buildLinker() const; 577193326Sed}; 578193326Sed 579218893Sdimclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { 580193326Sedpublic: 581263508Sdim Linux(const Driver &D, const llvm::Triple &Triple, 582263508Sdim const llvm::opt::ArgList &Args); 583212904Sdim 584218893Sdim virtual bool HasNativeLLVMSupport() const; 585218893Sdim 586263508Sdim virtual void 587263508Sdim AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 588263508Sdim llvm::opt::ArgStringList &CC1Args) const; 589263508Sdim virtual void 590263508Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 591263508Sdim llvm::opt::ArgStringList &CC1Args) const; 592251662Sdim virtual bool isPIEDefault() const; 593228379Sdim 594218893Sdim std::string Linker; 595218893Sdim std::vector<std::string> ExtraOpts; 596234353Sdim 597249423Sdimprotected: 598249423Sdim virtual Tool *buildAssembler() const; 599249423Sdim virtual Tool *buildLinker() const; 600249423Sdim 601234353Sdimprivate: 602249423Sdim static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, 603249423Sdim Twine TargetArchDir, 604263508Sdim Twine BiarchSuffix, 605263508Sdim Twine MIPSABIDirSuffix, 606263508Sdim const llvm::opt::ArgList &DriverArgs, 607263508Sdim llvm::opt::ArgStringList &CC1Args); 608234353Sdim static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 609263508Sdim const llvm::opt::ArgList &DriverArgs, 610263508Sdim llvm::opt::ArgStringList &CC1Args); 611251662Sdim 612263508Sdim std::string computeSysRoot() const; 613193326Sed}; 614193326Sed 615249423Sdimclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux { 616249423Sdimprotected: 617249423Sdim GCCVersion GCCLibAndIncVersion; 618249423Sdim virtual Tool *buildAssembler() const; 619249423Sdim virtual Tool *buildLinker() const; 620193326Sed 621249423Sdimpublic: 622249423Sdim Hexagon_TC(const Driver &D, const llvm::Triple &Triple, 623263508Sdim const llvm::opt::ArgList &Args); 624249423Sdim ~Hexagon_TC(); 625249423Sdim 626263508Sdim virtual void 627263508Sdim AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 628263508Sdim llvm::opt::ArgStringList &CC1Args) const; 629263508Sdim virtual void 630263508Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 631263508Sdim llvm::opt::ArgStringList &CC1Args) const; 632263508Sdim virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; 633249423Sdim 634249423Sdim StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } 635249423Sdim 636249423Sdim static std::string GetGnuDir(const std::string &InstalledDir); 637249423Sdim 638263508Sdim static StringRef GetTargetCPU(const llvm::opt::ArgList &Args); 639249423Sdim}; 640249423Sdim 641204793Srdivacky/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 642204793Srdivacky/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 643208600Srdivackyclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { 644204793Srdivackypublic: 645263508Sdim TCEToolChain(const Driver &D, const llvm::Triple &Triple, 646263508Sdim const llvm::opt::ArgList &Args); 647204793Srdivacky ~TCEToolChain(); 648204793Srdivacky 649204793Srdivacky bool IsMathErrnoDefault() const; 650243830Sdim bool isPICDefault() const; 651251662Sdim bool isPIEDefault() const; 652243830Sdim bool isPICDefaultForced() const; 653204793Srdivacky}; 654204793Srdivacky 655212904Sdimclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { 656212904Sdimpublic: 657263508Sdim Windows(const Driver &D, const llvm::Triple &Triple, 658263508Sdim const llvm::opt::ArgList &Args); 659212904Sdim 660212904Sdim virtual bool IsIntegratedAssemblerDefault() const; 661212904Sdim virtual bool IsUnwindTablesDefault() const; 662243830Sdim virtual bool isPICDefault() const; 663251662Sdim virtual bool isPIEDefault() const; 664243830Sdim virtual bool isPICDefaultForced() const; 665228379Sdim 666263508Sdim virtual void 667263508Sdim AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 668263508Sdim llvm::opt::ArgStringList &CC1Args) const; 669263508Sdim virtual void 670263508Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 671263508Sdim llvm::opt::ArgStringList &CC1Args) const; 672263508Sdim 673249423Sdimprotected: 674249423Sdim virtual Tool *buildLinker() const; 675249423Sdim virtual Tool *buildAssembler() const; 676212904Sdim}; 677212904Sdim 678263508Sdim 679263508Sdimclass LLVM_LIBRARY_VISIBILITY XCore : public ToolChain { 680263508Sdimpublic: 681263508Sdim XCore(const Driver &D, const llvm::Triple &Triple, 682263508Sdim const llvm::opt::ArgList &Args); 683263508Sdimprotected: 684263508Sdim virtual Tool *buildAssembler() const; 685263508Sdim virtual Tool *buildLinker() const; 686263508Sdimpublic: 687263508Sdim virtual bool isPICDefault() const; 688263508Sdim virtual bool isPIEDefault() const; 689263508Sdim virtual bool isPICDefaultForced() const; 690263508Sdim virtual bool SupportsProfiling() const; 691263508Sdim virtual bool hasBlocksRuntime() const; 692263508Sdim virtual void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 693263508Sdim llvm::opt::ArgStringList &CC1Args) const; 694263508Sdim virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 695263508Sdim llvm::opt::ArgStringList &CC1Args) const; 696263508Sdim virtual void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 697263508Sdim llvm::opt::ArgStringList &CC1Args) const; 698263508Sdim virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 699263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 700263508Sdim}; 701263508Sdim 702193326Sed} // end namespace toolchains 703193326Sed} // end namespace driver 704193326Sed} // end namespace clang 705193326Sed 706193326Sed#endif 707