diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Driver/ToolChains.h')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Driver/ToolChains.h | 303 |
1 files changed, 200 insertions, 103 deletions
diff --git a/contrib/llvm/tools/clang/lib/Driver/ToolChains.h b/contrib/llvm/tools/clang/lib/Driver/ToolChains.h index 50145e7..ba794a7 100644 --- a/contrib/llvm/tools/clang/lib/Driver/ToolChains.h +++ b/contrib/llvm/tools/clang/lib/Driver/ToolChains.h @@ -16,6 +16,8 @@ #include "clang/Driver/ToolChain.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Support/Compiler.h" +#include <vector> +#include <set> namespace clang { namespace driver { @@ -48,11 +50,18 @@ protected: /// \brief The parsed major, minor, and patch numbers. int Major, Minor, Patch; + /// \brief The text of the parsed major, and major+minor versions. + std::string MajorStr, MinorStr; + /// \brief Any textual suffix on the patch number. std::string PatchSuffix; static GCCVersion Parse(StringRef VersionText); - bool operator<(const GCCVersion &RHS) const; + bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, + StringRef RHSPatchSuffix = StringRef()) const; + bool operator<(const GCCVersion &RHS) const { + return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); + } bool operator>(const GCCVersion &RHS) const { return RHS < *this; } bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } @@ -66,21 +75,25 @@ protected: /// information about it. It starts from the host information provided to the /// Driver, and has logic for fuzzing that where appropriate. class GCCInstallationDetector { - bool IsValid; + const Driver &D; llvm::Triple GCCTriple; // FIXME: These might be better as path objects. std::string GCCInstallPath; - std::string GCCMultiarchSuffix; + std::string GCCBiarchSuffix; std::string GCCParentLibPath; + std::string GCCMIPSABIDirSuffix; GCCVersion Version; + // We retain the list of install paths that were considered and rejected in + // order to print out detailed information in verbose mode. + std::set<std::string> CandidateGCCInstallPaths; + public: - GCCInstallationDetector() : IsValid(false) {} - void init(const Driver &D, const llvm::Triple &TargetTriple, - const ArgList &Args); + GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {} + void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args); /// \brief Check whether we detected a valid GCC install. bool isValid() const { return IsValid; } @@ -91,37 +104,62 @@ protected: /// \brief Get the detected GCC installation path. StringRef getInstallPath() const { return GCCInstallPath; } - /// \brief Get the detected GCC installation path suffix for multiarch GCCs. - StringRef getMultiarchSuffix() const { return GCCMultiarchSuffix; } + /// \brief Get the detected GCC installation path suffix for the bi-arch + /// target variant. + StringRef getBiarchSuffix() const { return GCCBiarchSuffix; } /// \brief Get the detected GCC parent lib path. StringRef getParentLibPath() const { return GCCParentLibPath; } + /// \brief Get the detected GCC MIPS ABI directory suffix. + /// + /// This is used as a suffix both to the install directory of GCC and as + /// a suffix to its parent lib path in order to select a MIPS ABI-specific + /// subdirectory. + /// + /// This will always be empty for any non-MIPS target. + /// + // FIXME: This probably shouldn't exist at all, and should be factored + // into the multiarch and/or biarch support. Please don't add more uses of + // this interface, it is meant as a legacy crutch for the MIPS driver + // logic. + StringRef getMIPSABIDirSuffix() const { return GCCMIPSABIDirSuffix; } + /// \brief Get the detected GCC version string. const GCCVersion &getVersion() const { return Version; } + /// \brief Print information about the detected GCC installation. + void print(raw_ostream &OS) const; + private: - static void CollectLibDirsAndTriples( - const llvm::Triple &TargetTriple, - const llvm::Triple &MultiarchTriple, - SmallVectorImpl<StringRef> &LibDirs, - SmallVectorImpl<StringRef> &TripleAliases, - SmallVectorImpl<StringRef> &MultiarchLibDirs, - SmallVectorImpl<StringRef> &MultiarchTripleAliases); + static void + CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, + const llvm::Triple &BiarchTriple, + SmallVectorImpl<StringRef> &LibDirs, + SmallVectorImpl<StringRef> &TripleAliases, + SmallVectorImpl<StringRef> &BiarchLibDirs, + SmallVectorImpl<StringRef> &BiarchTripleAliases); void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch, - const ArgList &Args, + const llvm::opt::ArgList &Args, const std::string &LibDir, StringRef CandidateTriple, - bool NeedsMultiarchSuffix = false); + bool NeedsBiarchSuffix = false); + + void findMIPSABIDirSuffix(std::string &Suffix, + llvm::Triple::ArchType TargetArch, StringRef Path, + const llvm::opt::ArgList &Args); }; GCCInstallationDetector GCCInstallation; public: - Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Generic_GCC(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); ~Generic_GCC(); + virtual void printVerboseInfo(raw_ostream &OS) const; + virtual bool IsUnwindTablesDefault() const; virtual bool isPICDefault() const; virtual bool isPIEDefault() const; @@ -191,13 +229,14 @@ private: std::string iOSVersionMin; private: - void AddDeploymentTarget(DerivedArgList &Args) const; + void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const; public: - Darwin(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Darwin(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); ~Darwin(); - std::string ComputeEffectiveClangTriple(const ArgList &Args, + std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, types::ID InputType) const; /// @name Darwin Specific Toolchain API @@ -247,7 +286,7 @@ public: /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler /// invocation. For example, Darwin treats different ARM variations as /// distinct architectures. - StringRef getDarwinArchName(const ArgList &Args) const; + StringRef getDarwinArchName(const llvm::opt::ArgList &Args) const; bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { assert(isTargetIPhoneOS() && "Unexpected call for OS X target!"); @@ -260,14 +299,15 @@ public: } /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library. - virtual void AddLinkARCArgs(const ArgList &Args, - ArgStringList &CmdArgs) const = 0; - + virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const = 0; + /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler /// runtime library. - virtual void AddLinkRuntimeLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const = 0; - + virtual void + AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const = 0; + /// } /// @name ToolChain Implementation /// { @@ -279,8 +319,9 @@ public: virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const; virtual bool hasBlocksRuntime() const; - virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args, - const char *BoundArch) const; + virtual llvm::opt::DerivedArgList * + TranslateArgs(const llvm::opt::DerivedArgList &Args, + const char *BoundArch) const; virtual bool IsBlocksDefault() const { // Always allow blocks on Darwin; users interested in versioning are @@ -288,19 +329,8 @@ public: return true; } virtual bool IsIntegratedAssemblerDefault() const { -#ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER - return false; -#else // Default integrated assembler to on for Darwin. return true; -#endif - } - virtual bool IsStrictAliasingDefault() const { -#ifdef DISABLE_DEFAULT_STRICT_ALIASING - return false; -#else - return ToolChain::IsStrictAliasingDefault(); -#endif } virtual bool IsMathErrnoDefault() const { @@ -353,35 +383,38 @@ public: /// DarwinClang - The Darwin toolchain used by Clang. class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { public: - DarwinClang(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + DarwinClang(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); /// @name Darwin ToolChain Implementation /// { - virtual void AddLinkRuntimeLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const; - void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, + virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; + void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs, const char *DarwinStaticLib, bool AlwaysLink = false) const; - virtual void AddCXXStdlibLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const; + virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; - virtual void AddCCKextLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const; + virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; - virtual void AddLinkARCArgs(const ArgList &Args, - ArgStringList &CmdArgs) const; + virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; /// } }; /// Darwin_Generic_GCC - Generic Darwin tool chain using gcc. class LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC { public: - Darwin_Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) - : Generic_GCC(D, Triple, Args) {} + Darwin_Generic_GCC(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args) + : Generic_GCC(D, Triple, Args) {} - std::string ComputeEffectiveClangTriple(const ArgList &Args, + std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, types::ID InputType) const; virtual bool isPICDefault() const { return false; } @@ -390,8 +423,9 @@ public: class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { virtual void anchor(); public: - Generic_ELF(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) - : Generic_GCC(D, Triple, Args) {} + Generic_ELF(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args) + : Generic_GCC(D, Triple, Args) {} virtual bool IsIntegratedAssemblerDefault() const { // Default integrated assembler to on for x86. @@ -403,7 +437,8 @@ public: class LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { public: - AuroraUX(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + AuroraUX(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); protected: virtual Tool *buildAssembler() const; @@ -412,7 +447,8 @@ protected: class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { public: - Solaris(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Solaris(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool IsIntegratedAssemblerDefault() const { return true; } protected: @@ -424,10 +460,16 @@ protected: class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { public: - OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + OpenBSD(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } + virtual bool isPIEDefault() const { return true; } + + virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { + return 1; + } protected: virtual Tool *buildAssembler() const; @@ -436,16 +478,18 @@ protected: class LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF { public: - Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Bitrig(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } virtual bool IsObjCLegacyDispatchDefault() const { return false; } - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; - virtual void AddCXXStdlibLibArgs(const ArgList &Args, - ArgStringList &CmdArgs) const; + virtual void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { return 1; } @@ -457,15 +501,23 @@ protected: class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { public: - FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); - - virtual CXXStdlibType GetCXXStdlibType(const ArgList &Args) const; + FreeBSD(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + virtual bool HasNativeLLVMSupport() const; virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; + virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; + virtual void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual bool IsIntegratedAssemblerDefault() const { + if (getTriple().getArch() == llvm::Triple::ppc || + getTriple().getArch() == llvm::Triple::ppc64) + return true; + return Generic_ELF::IsIntegratedAssemblerDefault(); + } virtual bool UseSjLjExceptions() const; protected: @@ -475,15 +527,25 @@ protected: class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { public: - NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + NetBSD(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } - virtual CXXStdlibType GetCXXStdlibType(const ArgList &Args) const; + virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; + virtual void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual bool IsUnwindTablesDefault() const { + return true; + } + virtual bool IsIntegratedAssemblerDefault() const { + if (getTriple().getArch() == llvm::Triple::ppc) + return true; + return Generic_ELF::IsIntegratedAssemblerDefault(); + } protected: virtual Tool *buildAssembler() const; @@ -492,7 +554,8 @@ protected: class LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { public: - Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Minix(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); protected: virtual Tool *buildAssembler() const; @@ -501,7 +564,8 @@ protected: class LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { public: - DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + DragonFly(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool IsMathErrnoDefault() const { return false; } @@ -512,21 +576,23 @@ protected: class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { public: - Linux(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Linux(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool HasNativeLLVMSupport() const; - virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; - virtual void addClangTargetOptions(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; + virtual void + AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; virtual bool isPIEDefault() const; std::string Linker; std::vector<std::string> ExtraOpts; - bool IsPIEDefault; protected: virtual Tool *buildAssembler() const; @@ -535,14 +601,15 @@ protected: private: static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, Twine TargetArchDir, - Twine MultiLibSuffix, - const ArgList &DriverArgs, - ArgStringList &CC1Args); + Twine BiarchSuffix, + Twine MIPSABIDirSuffix, + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args); static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, - const ArgList &DriverArgs, - ArgStringList &CC1Args); + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args); - std::string computeSysRoot(const ArgList &Args) const; + std::string computeSysRoot() const; }; class LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux { @@ -553,28 +620,30 @@ protected: public: Hexagon_TC(const Driver &D, const llvm::Triple &Triple, - const ArgList &Args); + const llvm::opt::ArgList &Args); ~Hexagon_TC(); - virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; - virtual CXXStdlibType GetCXXStdlibType(const ArgList &Args) const; + virtual void + AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const; StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } static std::string GetGnuDir(const std::string &InstalledDir); - static StringRef GetTargetCPU(const ArgList &Args); + static StringRef GetTargetCPU(const llvm::opt::ArgList &Args); }; /// TCEToolChain - A tool chain using the llvm bitcode tools to perform /// all subcommands. See http://tce.cs.tut.fi for our peculiar target. class LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { public: - TCEToolChain(const Driver &D, const llvm::Triple& Triple, - const ArgList &Args); + TCEToolChain(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); ~TCEToolChain(); bool IsMathErrnoDefault() const; @@ -585,7 +654,8 @@ public: class LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { public: - Windows(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); + Windows(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); virtual bool IsIntegratedAssemblerDefault() const; virtual bool IsUnwindTablesDefault() const; @@ -593,15 +663,42 @@ public: virtual bool isPIEDefault() const; virtual bool isPICDefaultForced() const; - virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, - ArgStringList &CC1Args) const; + virtual void + AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void + AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + protected: virtual Tool *buildLinker() const; virtual Tool *buildAssembler() const; }; + +class LLVM_LIBRARY_VISIBILITY XCore : public ToolChain { +public: + XCore(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; +public: + virtual bool isPICDefault() const; + virtual bool isPIEDefault() const; + virtual bool isPICDefaultForced() const; + virtual bool SupportsProfiling() const; + virtual bool hasBlocksRuntime() const; + virtual void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; +}; + } // end namespace toolchains } // end namespace driver } // end namespace clang |