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 13252723Sdim#include "Tools.h" 14252723Sdim#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" 19263509Sdim#include <vector> 20263509Sdim#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: 31235633Sdim /// \brief Struct to store and manipulate GCC versions. 32235633Sdim /// 33235633Sdim /// We rely on assumptions about the form and structure of GCC version 34235633Sdim /// numbers: they consist of at most three '.'-separated components, and each 35235633Sdim /// component is a non-negative integer except for the last component. For 36235633Sdim /// the last component we are very flexible in order to tolerate release 37235633Sdim /// candidates or 'x' wildcards. 38235633Sdim /// 39235633Sdim /// Note that the ordering established among GCCVersions is based on the 40235633Sdim /// preferred version string to use. For example we prefer versions without 41235633Sdim /// a hard-coded patch number to those with a hard coded patch number. 42235633Sdim /// 43235633Sdim /// Currently this doesn't provide any logic for textual suffixes to patches 44235633Sdim /// in the way that (for example) Debian's version format does. If that ever 45235633Sdim /// becomes necessary, it can be added. 46235633Sdim struct GCCVersion { 47235633Sdim /// \brief The unparsed text of the version. 48235633Sdim std::string Text; 49235633Sdim 50235633Sdim /// \brief The parsed major, minor, and patch numbers. 51235633Sdim int Major, Minor, Patch; 52235633Sdim 53263509Sdim /// \brief The text of the parsed major, and major+minor versions. 54263509Sdim std::string MajorStr, MinorStr; 55263509Sdim 56235633Sdim /// \brief Any textual suffix on the patch number. 57235633Sdim std::string PatchSuffix; 58235633Sdim 59235633Sdim static GCCVersion Parse(StringRef VersionText); 60263509Sdim bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 61263509Sdim StringRef RHSPatchSuffix = StringRef()) const; 62263509Sdim bool operator<(const GCCVersion &RHS) const { 63263509Sdim return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 64263509Sdim } 65235633Sdim bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 66235633Sdim bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 67235633Sdim bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 68235633Sdim }; 69235633Sdim 70235633Sdim 71235633Sdim /// \brief This is a class to find a viable GCC installation for Clang to 72235633Sdim /// use. 73235633Sdim /// 74235633Sdim /// This class tries to find a GCC installation on the system, and report 75235633Sdim /// information about it. It starts from the host information provided to the 76235633Sdim /// Driver, and has logic for fuzzing that where appropriate. 77235633Sdim class GCCInstallationDetector { 78235633Sdim bool IsValid; 79263509Sdim const Driver &D; 80235633Sdim llvm::Triple GCCTriple; 81235633Sdim 82235633Sdim // FIXME: These might be better as path objects. 83235633Sdim std::string GCCInstallPath; 84263509Sdim std::string GCCBiarchSuffix; 85235633Sdim std::string GCCParentLibPath; 86263509Sdim std::string GCCMIPSABIDirSuffix; 87235633Sdim 88235633Sdim GCCVersion Version; 89235633Sdim 90263509Sdim // We retain the list of install paths that were considered and rejected in 91263509Sdim // order to print out detailed information in verbose mode. 92263509Sdim std::set<std::string> CandidateGCCInstallPaths; 93263509Sdim 94235633Sdim public: 95263509Sdim GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} 96263509Sdim void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args); 97235633Sdim 98235633Sdim /// \brief Check whether we detected a valid GCC install. 99235633Sdim bool isValid() const { return IsValid; } 100235633Sdim 101235633Sdim /// \brief Get the GCC triple for the detected install. 102235633Sdim const llvm::Triple &getTriple() const { return GCCTriple; } 103235633Sdim 104235633Sdim /// \brief Get the detected GCC installation path. 105235633Sdim StringRef getInstallPath() const { return GCCInstallPath; } 106235633Sdim 107263509Sdim /// \brief Get the detected GCC installation path suffix for the bi-arch 108263509Sdim /// target variant. 109263509Sdim StringRef getBiarchSuffix() const { return GCCBiarchSuffix; } 110235633Sdim 111235633Sdim /// \brief Get the detected GCC parent lib path. 112235633Sdim StringRef getParentLibPath() const { return GCCParentLibPath; } 113235633Sdim 114263509Sdim /// \brief Get the detected GCC MIPS ABI directory suffix. 115263509Sdim /// 116263509Sdim /// This is used as a suffix both to the install directory of GCC and as 117263509Sdim /// a suffix to its parent lib path in order to select a MIPS ABI-specific 118263509Sdim /// subdirectory. 119263509Sdim /// 120263509Sdim /// This will always be empty for any non-MIPS target. 121263509Sdim /// 122263509Sdim // FIXME: This probably shouldn't exist at all, and should be factored 123263509Sdim // into the multiarch and/or biarch support. Please don't add more uses of 124263509Sdim // this interface, it is meant as a legacy crutch for the MIPS driver 125263509Sdim // logic. 126263509Sdim StringRef getMIPSABIDirSuffix() const { return GCCMIPSABIDirSuffix; } 127263509Sdim 128235633Sdim /// \brief Get the detected GCC version string. 129245431Sdim const GCCVersion &getVersion() const { return Version; } 130235633Sdim 131263509Sdim /// \brief Print information about the detected GCC installation. 132263509Sdim void print(raw_ostream &OS) const; 133263509Sdim 134235633Sdim private: 135263509Sdim static void 136263509Sdim CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 137263509Sdim const llvm::Triple &BiarchTriple, 138263509Sdim SmallVectorImpl<StringRef> &LibDirs, 139263509Sdim SmallVectorImpl<StringRef> &TripleAliases, 140263509Sdim SmallVectorImpl<StringRef> &BiarchLibDirs, 141263509Sdim SmallVectorImpl<StringRef> &BiarchTripleAliases); 142235633Sdim 143235633Sdim void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch, 144263509Sdim const llvm::opt::ArgList &Args, 145235633Sdim const std::string &LibDir, 146235633Sdim StringRef CandidateTriple, 147263509Sdim bool NeedsBiarchSuffix = false); 148263509Sdim 149263509Sdim void findMIPSABIDirSuffix(std::string &Suffix, 150263509Sdim llvm::Triple::ArchType TargetArch, StringRef Path, 151263509Sdim const llvm::opt::ArgList &Args); 152235633Sdim }; 153235633Sdim 154235633Sdim GCCInstallationDetector GCCInstallation; 155235633Sdim 156193326Sedpublic: 157263509Sdim Generic_GCC(const Driver &D, const llvm::Triple &Triple, 158263509Sdim const llvm::opt::ArgList &Args); 159193326Sed ~Generic_GCC(); 160193326Sed 161263509Sdim virtual void printVerboseInfo(raw_ostream &OS) const; 162263509Sdim 163193326Sed virtual bool IsUnwindTablesDefault() const; 164245431Sdim virtual bool isPICDefault() const; 165252723Sdim virtual bool isPIEDefault() const; 166245431Sdim virtual bool isPICDefaultForced() const; 167266759Sdim virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 168266759Sdim llvm::opt::ArgStringList &CC1Args) const; 169235633Sdim 170235633Sdimprotected: 171252723Sdim virtual Tool *getTool(Action::ActionClass AC) const; 172252723Sdim virtual Tool *buildAssembler() const; 173252723Sdim virtual Tool *buildLinker() const; 174252723Sdim 175235633Sdim /// \name ToolChain Implementation Helper Functions 176235633Sdim /// @{ 177235633Sdim 178235633Sdim /// \brief Check whether the target triple's architecture is 64-bits. 179235633Sdim bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 180235633Sdim 181235633Sdim /// \brief Check whether the target triple's architecture is 32-bits. 182235633Sdim bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 183235633Sdim 184235633Sdim /// @} 185193326Sed 186252723Sdimprivate: 187252723Sdim mutable OwningPtr<tools::gcc::Preprocess> Preprocess; 188252723Sdim mutable OwningPtr<tools::gcc::Precompile> Precompile; 189252723Sdim mutable OwningPtr<tools::gcc::Compile> Compile; 190235633Sdim}; 191235633Sdim 192235633Sdim /// Darwin - The base Darwin tool chain. 193208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { 194212904Sdimpublic: 195212904Sdim /// The host version. 196212904Sdim unsigned DarwinVersion[3]; 197212904Sdim 198252723Sdimprotected: 199252723Sdim virtual Tool *buildAssembler() const; 200252723Sdim virtual Tool *buildLinker() const; 201252723Sdim virtual Tool *getTool(Action::ActionClass AC) const; 202252723Sdim 203212904Sdimprivate: 204252723Sdim mutable OwningPtr<tools::darwin::Lipo> Lipo; 205252723Sdim mutable OwningPtr<tools::darwin::Dsymutil> Dsymutil; 206252723Sdim 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. 222235633Sdim mutable VersionTuple TargetVersion; 223203955Srdivacky 224245431Sdimprivate: 225193326Sed /// The default macosx-version-min of this tool chain; empty until 226193326Sed /// initialized. 227203955Srdivacky std::string MacosxVersionMin; 228193326Sed 229245431Sdim /// The default ios-version-min of this tool chain; empty until 230245431Sdim /// initialized. 231245431Sdim std::string iOSVersionMin; 232224145Sdim 233212904Sdimprivate: 234263509Sdim void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const; 235212904Sdim 236193326Sedpublic: 237263509Sdim Darwin(const Driver &D, const llvm::Triple &Triple, 238263509Sdim const llvm::opt::ArgList &Args); 239198092Srdivacky ~Darwin(); 240193326Sed 241263509Sdim std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 242226890Sdim 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 && 257235633Sdim TargetVersion == VersionTuple(Major, Minor, Micro)) 258203955Srdivacky return; 259203955Srdivacky 260203955Srdivacky assert(!TargetInitialized && "Target already initialized!"); 261203955Srdivacky TargetInitialized = true; 262221345Sdim TargetIsIPhoneOS = IsIPhoneOS; 263221345Sdim TargetIsIPhoneOSSimulator = IsIOSSim; 264235633Sdim 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 277235633Sdim bool isTargetMacOS() const { 278245431Sdim return !isTargetIOSSimulator() && !isTargetIPhoneOS(); 279235633Sdim } 280235633Sdim 281205408Srdivacky bool isTargetInitialized() const { return TargetInitialized; } 282205408Srdivacky 283235633Sdim VersionTuple getTargetVersion() const { 284203955Srdivacky assert(TargetInitialized && "Target not initialized!"); 285235633Sdim 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. 291263509Sdim 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!"); 295235633Sdim 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!"); 300235633Sdim return TargetVersion < VersionTuple(V0, V1, V2); 301193326Sed } 302193326Sed 303224145Sdim /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library. 304263509Sdim virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, 305263509Sdim llvm::opt::ArgStringList &CmdArgs) const = 0; 306263509Sdim 307198092Srdivacky /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler 308198092Srdivacky /// runtime library. 309263509Sdim virtual void 310263509Sdim AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 311263509Sdim llvm::opt::ArgStringList &CmdArgs) const = 0; 312263509Sdim 313198092Srdivacky /// } 314198092Srdivacky /// @name ToolChain Implementation 315198092Srdivacky /// { 316198092Srdivacky 317212904Sdim virtual types::ID LookupTypeForExtension(const char *Ext) const; 318212904Sdim 319218893Sdim virtual bool HasNativeLLVMSupport() const; 320218893Sdim 321245431Sdim virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const; 322226890Sdim virtual bool hasBlocksRuntime() const; 323224145Sdim 324263509Sdim virtual llvm::opt::DerivedArgList * 325263509Sdim TranslateArgs(const llvm::opt::DerivedArgList &Args, 326263509Sdim 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 { 334235633Sdim // Default integrated assembler to on for Darwin. 335235633Sdim return true; 336208600Srdivacky } 337245431Sdim 338245431Sdim virtual bool IsMathErrnoDefault() const { 339245431Sdim return false; 340245431Sdim } 341245431Sdim 342245431Sdim virtual bool IsEncodeExtendedBlockSignatureDefault() const { 343245431Sdim return true; 344245431Sdim } 345245431Sdim 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; 358226890Sdim virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 359226890Sdim // Stack protectors default to on for user code on 10.5, 360226890Sdim // and for everything in 10.6 and beyond 361235633Sdim return isTargetIPhoneOS() || 362226890Sdim (!isMacosxVersionLT(10, 6) || 363226890Sdim (!isMacosxVersionLT(10, 5) && !KernelOrKext)); 364199482Srdivacky } 365235633Sdim virtual RuntimeLibType GetDefaultRuntimeLibType() const { 366235633Sdim return ToolChain::RLT_CompilerRT; 367235633Sdim } 368245431Sdim virtual bool isPICDefault() const; 369252723Sdim virtual bool isPIEDefault() const; 370245431Sdim virtual bool isPICDefaultForced() const; 371198092Srdivacky 372221345Sdim virtual bool SupportsProfiling() const; 373221345Sdim 374207619Srdivacky virtual bool SupportsObjCGC() const; 375207619Srdivacky 376245431Sdim virtual void CheckObjCARC() const; 377235633Sdim 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: 388263509Sdim DarwinClang(const Driver &D, const llvm::Triple &Triple, 389263509Sdim const llvm::opt::ArgList &Args); 390198092Srdivacky 391198092Srdivacky /// @name Darwin ToolChain Implementation 392198092Srdivacky /// { 393198092Srdivacky 394263509Sdim virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 395263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 396263509Sdim void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, 397263509Sdim llvm::opt::ArgStringList &CmdArgs, 398252723Sdim const char *DarwinStaticLib, 399252723Sdim bool AlwaysLink = false) const; 400252723Sdim 401263509Sdim virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 402263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 403218893Sdim 404263509Sdim virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args, 405263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 406218893Sdim 407263509Sdim virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, 408263509Sdim 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: 415263509Sdim Darwin_Generic_GCC(const Driver &D, const llvm::Triple &Triple, 416263509Sdim const llvm::opt::ArgList &Args) 417263509Sdim : Generic_GCC(D, Triple, Args) {} 418193326Sed 419263509Sdim std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 420226890Sdim types::ID InputType) const; 421212904Sdim 422252723Sdim virtual bool isPICDefault() const { return false; } 423193326Sed}; 424193326Sed 425218893Sdimclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 426235633Sdim virtual void anchor(); 427235633Sdimpublic: 428263509Sdim Generic_ELF(const Driver &D, const llvm::Triple &Triple, 429263509Sdim const llvm::opt::ArgList &Args) 430263509Sdim : Generic_GCC(D, Triple, Args) {} 431218893Sdim 432218893Sdim virtual bool IsIntegratedAssemblerDefault() const { 433218893Sdim // Default integrated assembler to on for x86. 434252723Sdim return (getTriple().getArch() == llvm::Triple::aarch64 || 435252723Sdim getTriple().getArch() == llvm::Triple::x86 || 436218893Sdim getTriple().getArch() == llvm::Triple::x86_64); 437218893Sdim } 438218893Sdim}; 439218893Sdim 440208600Srdivackyclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { 441198092Srdivackypublic: 442263509Sdim AuroraUX(const Driver &D, const llvm::Triple &Triple, 443263509Sdim const llvm::opt::ArgList &Args); 444198092Srdivacky 445252723Sdimprotected: 446252723Sdim virtual Tool *buildAssembler() const; 447252723Sdim virtual Tool *buildLinker() const; 448198092Srdivacky}; 449198092Srdivacky 450235633Sdimclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { 451235633Sdimpublic: 452263509Sdim Solaris(const Driver &D, const llvm::Triple &Triple, 453263509Sdim const llvm::opt::ArgList &Args); 454235633Sdim 455252723Sdim virtual bool IsIntegratedAssemblerDefault() const { return true; } 456252723Sdimprotected: 457252723Sdim virtual Tool *buildAssembler() const; 458252723Sdim virtual Tool *buildLinker() const; 459235633Sdim 460235633Sdim}; 461235633Sdim 462235633Sdim 463218893Sdimclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 464195341Sedpublic: 465263509Sdim OpenBSD(const Driver &D, const llvm::Triple &Triple, 466263509Sdim const llvm::opt::ArgList &Args); 467195341Sed 468245431Sdim virtual bool IsMathErrnoDefault() const { return false; } 469235633Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 470263509Sdim virtual bool isPIEDefault() const { return true; } 471235633Sdim 472263509Sdim virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 473263509Sdim return 1; 474263509Sdim } 475263509Sdim 476252723Sdimprotected: 477252723Sdim virtual Tool *buildAssembler() const; 478252723Sdim virtual Tool *buildLinker() const; 479195341Sed}; 480195341Sed 481245431Sdimclass LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF { 482245431Sdimpublic: 483263509Sdim Bitrig(const Driver &D, const llvm::Triple &Triple, 484263509Sdim const llvm::opt::ArgList &Args); 485245431Sdim 486245431Sdim virtual bool IsMathErrnoDefault() const { return false; } 487245431Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 488245431Sdim virtual bool IsObjCLegacyDispatchDefault() const { return false; } 489245431Sdim 490263509Sdim virtual void 491263509Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 492263509Sdim llvm::opt::ArgStringList &CC1Args) const; 493263509Sdim virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 494263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 495245431Sdim virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 496245431Sdim return 1; 497245431Sdim } 498252723Sdim 499252723Sdimprotected: 500252723Sdim virtual Tool *buildAssembler() const; 501252723Sdim virtual Tool *buildLinker() const; 502245431Sdim}; 503245431Sdim 504218893Sdimclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { 505193326Sedpublic: 506263509Sdim FreeBSD(const Driver &D, const llvm::Triple &Triple, 507263509Sdim const llvm::opt::ArgList &Args); 508263509Sdim virtual bool HasNativeLLVMSupport() const; 509193326Sed 510245431Sdim virtual bool IsMathErrnoDefault() const { return false; } 511235633Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 512235633Sdim 513263509Sdim virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; 514263509Sdim virtual void 515263509Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 516263509Sdim llvm::opt::ArgStringList &CC1Args) const; 517263509Sdim virtual bool IsIntegratedAssemblerDefault() const { 518263509Sdim if (getTriple().getArch() == llvm::Triple::ppc || 519263509Sdim getTriple().getArch() == llvm::Triple::ppc64) 520263509Sdim return true; 521263509Sdim return Generic_ELF::IsIntegratedAssemblerDefault(); 522263509Sdim } 523263509Sdim 524245431Sdim virtual bool UseSjLjExceptions() const; 525252723Sdimprotected: 526252723Sdim virtual Tool *buildAssembler() const; 527252723Sdim virtual Tool *buildLinker() const; 528193326Sed}; 529193326Sed 530218893Sdimclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { 531218893Sdimpublic: 532263509Sdim NetBSD(const Driver &D, const llvm::Triple &Triple, 533263509Sdim const llvm::opt::ArgList &Args); 534218893Sdim 535245431Sdim virtual bool IsMathErrnoDefault() const { return false; } 536235633Sdim virtual bool IsObjCNonFragileABIDefault() const { return true; } 537235633Sdim 538263509Sdim virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; 539252723Sdim 540263509Sdim virtual void 541263509Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 542263509Sdim llvm::opt::ArgStringList &CC1Args) const; 543263509Sdim virtual bool IsUnwindTablesDefault() const { 544263509Sdim return true; 545263509Sdim } 546263509Sdim virtual bool IsIntegratedAssemblerDefault() const { 547263509Sdim if (getTriple().getArch() == llvm::Triple::ppc) 548263509Sdim return true; 549263509Sdim return Generic_ELF::IsIntegratedAssemblerDefault(); 550263509Sdim } 551252723Sdim 552252723Sdimprotected: 553252723Sdim virtual Tool *buildAssembler() const; 554252723Sdim virtual Tool *buildLinker() const; 555218893Sdim}; 556218893Sdim 557235633Sdimclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { 558210299Sedpublic: 559263509Sdim Minix(const Driver &D, const llvm::Triple &Triple, 560263509Sdim const llvm::opt::ArgList &Args); 561210299Sed 562252723Sdimprotected: 563252723Sdim virtual Tool *buildAssembler() const; 564252723Sdim virtual Tool *buildLinker() const; 565210299Sed}; 566210299Sed 567218893Sdimclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { 568193326Sedpublic: 569263509Sdim DragonFly(const Driver &D, const llvm::Triple &Triple, 570263509Sdim const llvm::opt::ArgList &Args); 571193326Sed 572245431Sdim virtual bool IsMathErrnoDefault() const { return false; } 573245431Sdim 574252723Sdimprotected: 575252723Sdim virtual Tool *buildAssembler() const; 576252723Sdim virtual Tool *buildLinker() const; 577193326Sed}; 578193326Sed 579218893Sdimclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { 580193326Sedpublic: 581263509Sdim Linux(const Driver &D, const llvm::Triple &Triple, 582263509Sdim const llvm::opt::ArgList &Args); 583212904Sdim 584218893Sdim virtual bool HasNativeLLVMSupport() const; 585218893Sdim 586263509Sdim virtual void 587263509Sdim AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 588263509Sdim llvm::opt::ArgStringList &CC1Args) const; 589263509Sdim virtual void 590263509Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 591263509Sdim llvm::opt::ArgStringList &CC1Args) const; 592252723Sdim virtual bool isPIEDefault() const; 593229042Sdim 594218893Sdim std::string Linker; 595218893Sdim std::vector<std::string> ExtraOpts; 596235633Sdim 597252723Sdimprotected: 598252723Sdim virtual Tool *buildAssembler() const; 599252723Sdim virtual Tool *buildLinker() const; 600252723Sdim 601235633Sdimprivate: 602252723Sdim static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, 603252723Sdim Twine TargetArchDir, 604263509Sdim Twine BiarchSuffix, 605263509Sdim Twine MIPSABIDirSuffix, 606263509Sdim const llvm::opt::ArgList &DriverArgs, 607263509Sdim llvm::opt::ArgStringList &CC1Args); 608235633Sdim static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 609263509Sdim const llvm::opt::ArgList &DriverArgs, 610263509Sdim llvm::opt::ArgStringList &CC1Args); 611252723Sdim 612263509Sdim std::string computeSysRoot() const; 613193326Sed}; 614193326Sed 615252723Sdimclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux { 616252723Sdimprotected: 617252723Sdim GCCVersion GCCLibAndIncVersion; 618252723Sdim virtual Tool *buildAssembler() const; 619252723Sdim virtual Tool *buildLinker() const; 620193326Sed 621252723Sdimpublic: 622252723Sdim Hexagon_TC(const Driver &D, const llvm::Triple &Triple, 623263509Sdim const llvm::opt::ArgList &Args); 624252723Sdim ~Hexagon_TC(); 625252723Sdim 626263509Sdim virtual void 627263509Sdim AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 628263509Sdim llvm::opt::ArgStringList &CC1Args) const; 629263509Sdim virtual void 630263509Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 631263509Sdim llvm::opt::ArgStringList &CC1Args) const; 632263509Sdim virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; 633252723Sdim 634252723Sdim StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } 635252723Sdim 636252723Sdim static std::string GetGnuDir(const std::string &InstalledDir); 637252723Sdim 638263509Sdim static StringRef GetTargetCPU(const llvm::opt::ArgList &Args); 639252723Sdim}; 640252723Sdim 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: 645263509Sdim TCEToolChain(const Driver &D, const llvm::Triple &Triple, 646263509Sdim const llvm::opt::ArgList &Args); 647204793Srdivacky ~TCEToolChain(); 648204793Srdivacky 649204793Srdivacky bool IsMathErrnoDefault() const; 650245431Sdim bool isPICDefault() const; 651252723Sdim bool isPIEDefault() const; 652245431Sdim bool isPICDefaultForced() const; 653204793Srdivacky}; 654204793Srdivacky 655212904Sdimclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { 656212904Sdimpublic: 657263509Sdim Windows(const Driver &D, const llvm::Triple &Triple, 658263509Sdim const llvm::opt::ArgList &Args); 659212904Sdim 660212904Sdim virtual bool IsIntegratedAssemblerDefault() const; 661212904Sdim virtual bool IsUnwindTablesDefault() const; 662245431Sdim virtual bool isPICDefault() const; 663252723Sdim virtual bool isPIEDefault() const; 664245431Sdim virtual bool isPICDefaultForced() const; 665229042Sdim 666263509Sdim virtual void 667263509Sdim AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 668263509Sdim llvm::opt::ArgStringList &CC1Args) const; 669263509Sdim virtual void 670263509Sdim AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 671263509Sdim llvm::opt::ArgStringList &CC1Args) const; 672263509Sdim 673252723Sdimprotected: 674252723Sdim virtual Tool *buildLinker() const; 675252723Sdim virtual Tool *buildAssembler() const; 676212904Sdim}; 677212904Sdim 678263509Sdim 679263509Sdimclass LLVM_LIBRARY_VISIBILITY XCore : public ToolChain { 680263509Sdimpublic: 681263509Sdim XCore(const Driver &D, const llvm::Triple &Triple, 682263509Sdim const llvm::opt::ArgList &Args); 683263509Sdimprotected: 684263509Sdim virtual Tool *buildAssembler() const; 685263509Sdim virtual Tool *buildLinker() const; 686263509Sdimpublic: 687263509Sdim virtual bool isPICDefault() const; 688263509Sdim virtual bool isPIEDefault() const; 689263509Sdim virtual bool isPICDefaultForced() const; 690263509Sdim virtual bool SupportsProfiling() const; 691263509Sdim virtual bool hasBlocksRuntime() const; 692263509Sdim virtual void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 693263509Sdim llvm::opt::ArgStringList &CC1Args) const; 694263509Sdim virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 695263509Sdim llvm::opt::ArgStringList &CC1Args) const; 696263509Sdim virtual void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 697263509Sdim llvm::opt::ArgStringList &CC1Args) const; 698263509Sdim virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 699263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 700263509Sdim}; 701263509Sdim 702193326Sed} // end namespace toolchains 703193326Sed} // end namespace driver 704193326Sed} // end namespace clang 705193326Sed 706193326Sed#endif 707