183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===// 283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// 383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// The LLVM Compiler Infrastructure 483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// 583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// This file is distributed under the University of Illinois Open Source 683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// License. See LICENSE.TXT for details. 783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// 883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===----------------------------------------------------------------------===// 983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 1083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_ 1183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#define CLANG_LIB_DRIVER_TOOLCHAINS_H_ 1283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 13670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "clang/Driver/Action.h" 1483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "clang/Driver/ToolChain.h" 1583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 1609c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer#include "clang/Basic/VersionTuple.h" 17670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h" 1883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h" 1983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 20670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "Tools.h" 21670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 2283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang { 2383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver { 24985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains { 2583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// all subcommands; this relies on gcc translating the majority of 281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// command line options. 2992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 3075358d267256022475371416654b056ad8531cb3Daniel Dunbarprotected: 3119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Struct to store and manipulate GCC versions. 3219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 3319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// We rely on assumptions about the form and structure of GCC version 3419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// numbers: they consist of at most three '.'-separated components, and each 3519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// component is a non-negative integer except for the last component. For 3619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// the last component we are very flexible in order to tolerate release 3719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// candidates or 'x' wildcards. 3819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 3919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Note that the ordering established among GCCVersions is based on the 4019347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// preferred version string to use. For example we prefer versions without 4119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// a hard-coded patch number to those with a hard coded patch number. 4219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 4319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Currently this doesn't provide any logic for textual suffixes to patches 4419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// in the way that (for example) Debian's version format does. If that ever 4519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// becomes necessary, it can be added. 4619347edf7809866350750a1997ec4db009832fa4Chandler Carruth struct GCCVersion { 4719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief The unparsed text of the version. 4819347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::string Text; 4919347edf7809866350750a1997ec4db009832fa4Chandler Carruth 5019347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief The parsed major, minor, and patch numbers. 5119347edf7809866350750a1997ec4db009832fa4Chandler Carruth int Major, Minor, Patch; 5219347edf7809866350750a1997ec4db009832fa4Chandler Carruth 5319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Any textual suffix on the patch number. 5419347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::string PatchSuffix; 5519347edf7809866350750a1997ec4db009832fa4Chandler Carruth 5619347edf7809866350750a1997ec4db009832fa4Chandler Carruth static GCCVersion Parse(StringRef VersionText); 5719347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator<(const GCCVersion &RHS) const; 5819347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 5919347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 6019347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 6119347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 6219347edf7809866350750a1997ec4db009832fa4Chandler Carruth 6319347edf7809866350750a1997ec4db009832fa4Chandler Carruth 6419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief This is a class to find a viable GCC installation for Clang to 6519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// use. 6619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 6719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// This class tries to find a GCC installation on the system, and report 6819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// information about it. It starts from the host information provided to the 6919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Driver, and has logic for fuzzing that where appropriate. 7019347edf7809866350750a1997ec4db009832fa4Chandler Carruth class GCCInstallationDetector { 7119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 7219347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool IsValid; 73fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth llvm::Triple GCCTriple; 7419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 7519347edf7809866350750a1997ec4db009832fa4Chandler Carruth // FIXME: These might be better as path objects. 765d84bb418405e1256020a66895d163756886b102Chandler Carruth std::string GCCInstallPath; 771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth std::string GCCMultiarchSuffix; 785d84bb418405e1256020a66895d163756886b102Chandler Carruth std::string GCCParentLibPath; 7919347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8019347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCVersion Version; 8119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8219347edf7809866350750a1997ec4db009832fa4Chandler Carruth public: 830e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple, 840e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola const ArgList &Args); 8519347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Check whether we detected a valid GCC install. 8719347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool isValid() const { return IsValid; } 8819347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the GCC triple for the detected install. 90fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth const llvm::Triple &getTriple() const { return GCCTriple; } 9119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 9219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC installation path. 935d84bb418405e1256020a66895d163756886b102Chandler Carruth StringRef getInstallPath() const { return GCCInstallPath; } 9419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth /// \brief Get the detected GCC installation path suffix for multiarch GCCs. 961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth StringRef getMultiarchSuffix() const { return GCCMultiarchSuffix; } 971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 9819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC parent lib path. 995d84bb418405e1256020a66895d163756886b102Chandler Carruth StringRef getParentLibPath() const { return GCCParentLibPath; } 10019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 10119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC version string. 10219347edf7809866350750a1997ec4db009832fa4Chandler Carruth StringRef getVersion() const { return Version.Text; } 10319347edf7809866350750a1997ec4db009832fa4Chandler Carruth 10419347edf7809866350750a1997ec4db009832fa4Chandler Carruth private: 1051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static void CollectLibDirsAndTriples( 1061c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth const llvm::Triple &TargetTriple, 1071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth const llvm::Triple &MultiarchTriple, 1081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &LibDirs, 1091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &TripleAliases, 1101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &MultiarchLibDirs, 1111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &MultiarchTripleAliases); 1121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 1131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch, 114d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth const std::string &LibDir, 1151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth StringRef CandidateTriple, 1161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth bool NeedsMultiarchSuffix = false); 11719347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 11819347edf7809866350750a1997ec4db009832fa4Chandler Carruth 11919347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCInstallationDetector GCCInstallation; 12019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 121670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar mutable llvm::DenseMap<unsigned, Tool*> Tools; 122670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 12383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic: 1240e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 1253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar ~Generic_GCC(); 12683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 127ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 128ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 129670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 1303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual bool IsUnwindTablesDefault() const; 1313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual const char *GetDefaultRelocationModel() const; 1323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual const char *GetForcedPicModel() const; 133b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 134b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruthprotected: 135b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \name ToolChain Implementation Helper Functions 136b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// @{ 137b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 138b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \brief Check whether the target triple's architecture is 64-bits. 139d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 140d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth 141b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \brief Check whether the target triple's architecture is 32-bits. 142d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 143b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 144b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// @} 14583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar}; 14683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 1479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public ToolChain { 1489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumprotected: 1499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum mutable llvm::DenseMap<unsigned, Tool*> Tools; 1509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumpublic: 1521d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth Hexagon_TC(const Driver &D, const llvm::Triple& Triple); 1539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ~Hexagon_TC(); 1549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 1569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const ActionList &Inputs) const; 1579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual bool IsUnwindTablesDefault() const; 1599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual const char *GetDefaultRelocationModel() const; 1609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual const char *GetForcedPicModel() const; 1619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}; 1629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum /// Darwin - The base Darwin tool chain. 16492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { 16525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarpublic: 16625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar /// The host version. 16725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar unsigned DarwinVersion[3]; 16825b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar 16925b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarprivate: 1708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar mutable llvm::DenseMap<unsigned, Tool*> Tools; 1718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar /// Whether the information on the target has been initialized. 1732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // 1742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: This should be eliminated. What we want to do is make this part of 1752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the "default target for arguments" selection process, once we get out of 1762603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the argument translation business. 1772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetInitialized; 1782603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 179f85e193739c953358c865005855253af4f68a497John McCall // FIXME: Remove this once there is a proper way to detect an ARC runtime 180f85e193739c953358c865005855253af4f68a497John McCall // for the simulator. 181f85e193739c953358c865005855253af4f68a497John McCall public: 182f85e193739c953358c865005855253af4f68a497John McCall mutable enum { 183f85e193739c953358c865005855253af4f68a497John McCall ARCSimulator_None, 184f85e193739c953358c865005855253af4f68a497John McCall ARCSimulator_HasARCRuntime, 185f85e193739c953358c865005855253af4f68a497John McCall ARCSimulator_NoARCRuntime 186f85e193739c953358c865005855253af4f68a497John McCall } ARCRuntimeForSimulator; 187f85e193739c953358c865005855253af4f68a497John McCall 188163b151809beef8f917fd16c546016e83ae3e361Bob Wilson mutable enum { 189163b151809beef8f917fd16c546016e83ae3e361Bob Wilson LibCXXSimulator_None, 190163b151809beef8f917fd16c546016e83ae3e361Bob Wilson LibCXXSimulator_NotAvailable, 191163b151809beef8f917fd16c546016e83ae3e361Bob Wilson LibCXXSimulator_Available 192163b151809beef8f917fd16c546016e83ae3e361Bob Wilson } LibCXXForSimulator; 193163b151809beef8f917fd16c546016e83ae3e361Bob Wilson 194f85e193739c953358c865005855253af4f68a497John McCallprivate: 195fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// Whether we are targeting iPhoneOS target. 1962603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetIsIPhoneOS; 197eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar 1985f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar /// Whether we are targeting the iPhoneOS simulator target. 1995f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar mutable bool TargetIsIPhoneOSSimulator; 2005f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 201fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// The OS version we are targeting. 20209c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer mutable VersionTuple TargetVersion; 2032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 20402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// The default macosx-version-min of this tool chain; empty until 20502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// initialized. 206816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar std::string MacosxVersionMin; 20702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2089f084a3166b684573ba49df28fc5792bc37d92e1John McCall bool hasARCRuntime() const; 209ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek bool hasSubscriptingRuntime() const; 2109f084a3166b684573ba49df28fc5792bc37d92e1John McCall 211c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbarprivate: 21260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar void AddDeploymentTarget(DerivedArgList &Args) const; 213c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 2148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 2151d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth Darwin(const Driver &D, const llvm::Triple& Triple); 216f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar ~Darwin(); 2178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 21861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier std::string ComputeEffectiveClangTriple(const ArgList &Args, 21961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const; 22000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 2216b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name Darwin Specific Toolchain API 2226b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 2236b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 2242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: Eliminate these ...Target functions and derive separate tool chains 2252603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // for these targets and put version in constructor. 2265f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor, 2275f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar unsigned Micro, bool IsIOSSim) const { 2285f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!"); 2295f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 2302603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: For now, allow reinitialization as long as values don't 2312603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // change. This will go away when we move away from argument translation. 2325f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS && 2335f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar TargetIsIPhoneOSSimulator == IsIOSSim && 23409c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer TargetVersion == VersionTuple(Major, Minor, Micro)) 2352603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar return; 2362603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 2372603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(!TargetInitialized && "Target already initialized!"); 2382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetInitialized = true; 2395f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar TargetIsIPhoneOS = IsIPhoneOS; 2405f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar TargetIsIPhoneOSSimulator = IsIOSSim; 24109c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer TargetVersion = VersionTuple(Major, Minor, Micro); 2422603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 2432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 2442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool isTargetIPhoneOS() const { 2452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 2462603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar return TargetIsIPhoneOS; 2472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 2482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 2494035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar bool isTargetIOSSimulator() const { 2505f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 2515f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar return TargetIsIPhoneOSSimulator; 2524035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar } 2534035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar 254ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek bool isTargetMacOS() const { 255ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek return !isTargetIOSSimulator() && 256ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek !isTargetIPhoneOS() && 257ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek ARCRuntimeForSimulator == ARCSimulator_None; 258ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 259ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 26003d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar bool isTargetInitialized() const { return TargetInitialized; } 26103d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar 26209c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer VersionTuple getTargetVersion() const { 2632603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 26409c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer return TargetVersion; 2652603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 2662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 267eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler 268eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// invocation. For example, Darwin treats different ARM variations as 269eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// distinct architectures. 270686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getDarwinArchName(const ArgList &Args) const; 271eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 272ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 273ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar assert(isTargetIPhoneOS() && "Unexpected call for OS X target!"); 27409c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer return TargetVersion < VersionTuple(V0, V1, V2); 275608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 276608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 277ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 278ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!"); 27909c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer return TargetVersion < VersionTuple(V0, V1, V2); 280cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 281cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar 2826b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs. 2836b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// 2846b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// \param Args - The input argument list. 2856b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// \param CmdArgs [out] - The command argument list to append the paths 2866b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// (prefixed by -L) to. 2871d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 2881d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const = 0; 28902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 290f85e193739c953358c865005855253af4f68a497John McCall /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library. 291f85e193739c953358c865005855253af4f68a497John McCall virtual void AddLinkARCArgs(const ArgList &Args, 292f85e193739c953358c865005855253af4f68a497John McCall ArgStringList &CmdArgs) const = 0; 293f85e193739c953358c865005855253af4f68a497John McCall 2946cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler 2956cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar /// runtime library. 2961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 2971d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const = 0; 2983404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher 2996b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 3006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name ToolChain Implementation 3016b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 3026b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 3034180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar virtual types::ID LookupTypeForExtension(const char *Ext) const; 3044180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 305b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar virtual bool HasNativeLLVMSupport() const; 306b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar 3079f084a3166b684573ba49df28fc5792bc37d92e1John McCall virtual void configureObjCRuntime(ObjCRuntime &runtime) const; 30813db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall virtual bool hasBlocksRuntime() const; 309f85e193739c953358c865005855253af4f68a497John McCall 310279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args, 3110dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const; 3128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 313ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 314ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 3158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3169e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual bool IsBlocksDefault() const { 317ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar // Always allow blocks on Darwin; users interested in versioning are 318ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar // expected to use /usr/include/Blocks.h. 319ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar return true; 3209e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 321eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar virtual bool IsIntegratedAssemblerDefault() const { 32271a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER 32371a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar return false; 32471a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#else 325033d3007b16d7f6c0f0eafd06c7096cfd22d89f5Jim Grosbach // Default integrated assembler to on for Darwin. 326033d3007b16d7f6c0f0eafd06c7096cfd22d89f5Jim Grosbach return true; 32771a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#endif 328eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar } 329398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar virtual bool IsStrictAliasingDefault() const { 330398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#ifdef DISABLE_DEFAULT_STRICT_ALIASING 331398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar return false; 332398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#else 333398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar return ToolChain::IsStrictAliasingDefault(); 334398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#endif 335398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar } 336c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek 337c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek virtual bool IsObjCDefaultSynthPropertiesDefault() const { 3382a253960f0312c9759965a1defb9326d6b2764a4Ted Kremenek return true; 339c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek } 340c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek 3419e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual bool IsObjCNonFragileABIDefault() const { 342f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Non-fragile ABI is default for everything but i386. 343f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return getTriple().getArch() != llvm::Triple::x86; 3449e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 345609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar virtual bool IsObjCLegacyDispatchDefault() const { 346609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar // This is only used with the non-fragile ABI. 347f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 348f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Legacy dispatch is used everywhere except on x86_64. 349f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return getTriple().getArch() != llvm::Triple::x86_64; 350609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar } 351f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar virtual bool UseObjCMixedDispatch() const { 352f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // This is only used with the non-fragile ABI and non-legacy dispatch. 353f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 354f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Mixed dispatch is used everywhere except OS X before 10.6. 355f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6)); 356f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar } 3578eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual bool IsUnwindTablesDefault() const; 3582fef11164cbe804f7b808c07757c6f900c08d765Nico Weber virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 3592fef11164cbe804f7b808c07757c6f900c08d765Nico Weber // Stack protectors default to on for user code on 10.5, 3602fef11164cbe804f7b808c07757c6f900c08d765Nico Weber // and for everything in 10.6 and beyond 361dfba0278ce3b9cd86f5a050163ccb998aeb74aa6Bob Wilson return isTargetIPhoneOS() || 3622fef11164cbe804f7b808c07757c6f900c08d765Nico Weber (!isMacosxVersionLT(10, 6) || 3632fef11164cbe804f7b808c07757c6f900c08d765Nico Weber (!isMacosxVersionLT(10, 5) && !KernelOrKext)); 3649e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 365c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar virtual RuntimeLibType GetDefaultRuntimeLibType() const { 366c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return ToolChain::RLT_CompilerRT; 367c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar } 3688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetDefaultRelocationModel() const; 3698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetForcedPicModel() const; 3706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 371bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar virtual bool SupportsProfiling() const; 372bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar 37343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar virtual bool SupportsObjCGC() const; 37443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 3755840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis virtual bool SupportsObjCARC() const; 3765840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis 377f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar virtual bool UseDwarfDebugFlags() const; 378f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 379b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar virtual bool UseSjLjExceptions() const; 380b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 3816b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 3828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 3838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3841d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang. 38592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { 3868aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilsonprivate: 3878aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson void AddGCCLibexecPath(unsigned darwinVersion); 3888aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson 3891d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic: 3901d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth DarwinClang(const Driver &D, const llvm::Triple& Triple); 3911d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3921d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// @name Darwin ToolChain Implementation 3931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// { 3941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 3961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 3971d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3981d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 3991d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 4003404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, 4013404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher const char *DarwinStaticLib) const; 4023404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher 403132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar virtual void AddCXXStdlibLibArgs(const ArgList &Args, 404132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar ArgStringList &CmdArgs) const; 405efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 4067433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen virtual void AddCCKextLibArgs(const ArgList &Args, 4077433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen ArgStringList &CmdArgs) const; 4087433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 409f85e193739c953358c865005855253af4f68a497John McCall virtual void AddLinkARCArgs(const ArgList &Args, 410f85e193739c953358c865005855253af4f68a497John McCall ArgStringList &CmdArgs) const; 4111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// } 4121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}; 4131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc. 41592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC { 4168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 4170e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Darwin_Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 4180e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_GCC(D, Triple, Args) {} 4198eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 42061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier std::string ComputeEffectiveClangTriple(const ArgList &Args, 42161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const; 42200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 4238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetDefaultRelocationModel() const { return "pic"; } 4248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 4258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 426e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 42899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 4290e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Generic_ELF(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 4300e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_GCC(D, Triple, Args) {} 431e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola 432e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola virtual bool IsIntegratedAssemblerDefault() const { 433e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola // Default integrated assembler to on for x86. 434e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola return (getTriple().getArch() == llvm::Triple::x86 || 435e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola getTriple().getArch() == llvm::Triple::x86_64); 436e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola } 437e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola}; 438e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola 43992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { 440e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic: 4410e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola AuroraUX(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 442e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 443ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 444ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 445e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}; 446e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 44731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { 44831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallpublic: 4490e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Solaris(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 45031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 45131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 45231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const ActionList &Inputs) const; 45331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 45431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall virtual bool IsIntegratedAssemblerDefault() const { return true; } 45531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}; 45631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 45731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 458e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 459f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic: 4600e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 461f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 462c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall virtual bool IsObjCNonFragileABIDefault() const { return true; } 463c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall virtual bool IsObjCLegacyDispatchDefault() const { 464c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall llvm::Triple::ArchType Arch = getTriple().getArch(); 465c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall if (Arch == llvm::Triple::arm || 466c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall Arch == llvm::Triple::x86 || 467c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall Arch == llvm::Triple::x86_64) 468c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall return false; 469c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall return true; 470c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall } 471c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall 472ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 473ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 474f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}; 475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 476e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { 47775358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic: 4780e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 47975358d267256022475371416654b056ad8531cb3Daniel Dunbar 480c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall virtual bool IsObjCNonFragileABIDefault() const { return true; } 481c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall virtual bool IsObjCLegacyDispatchDefault() const { 482c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall llvm::Triple::ArchType Arch = getTriple().getArch(); 483c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall if (Arch == llvm::Triple::arm || 484c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall Arch == llvm::Triple::x86 || 485c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall Arch == llvm::Triple::x86_64) 486c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall return false; 487c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall return true; 488c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall } 489c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall 490ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 491ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 49275358d267256022475371416654b056ad8531cb3Daniel Dunbar}; 49375358d267256022475371416654b056ad8531cb3Daniel Dunbar 4948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { 4958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerpublic: 4960e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 4978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 498c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall virtual bool IsObjCNonFragileABIDefault() const { return true; } 499c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall virtual bool IsObjCLegacyDispatchDefault() const { 500c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall llvm::Triple::ArchType Arch = getTriple().getArch(); 501c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall if (Arch == llvm::Triple::arm || 502c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall Arch == llvm::Triple::x86 || 503c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall Arch == llvm::Triple::x86_64) 504c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall return false; 505c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall return true; 506c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall } 507c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall 508ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 509ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 5108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}; 5118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 5126d402dc963aa32194f3604af4463b113858291aeEli Friedmanclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { 51338e317d6dce161b249508686cc67eb7176958762Chris Lattnerpublic: 5140e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 51538e317d6dce161b249508686cc67eb7176958762Chris Lattner 516ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 517ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 51838e317d6dce161b249508686cc67eb7176958762Chris Lattner}; 51938e317d6dce161b249508686cc67eb7176958762Chris Lattner 520e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { 52111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic: 5220e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 52311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 524ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 525ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 52611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}; 52711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 528e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { 5296b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic: 5300e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Linux(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 531ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 532c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola virtual bool HasNativeLLVMSupport() const; 533c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 534ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 535ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 536c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, 5387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth ArgStringList &CC1Args) const; 5397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 5407d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth ArgStringList &CC1Args) const; 5417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 542c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Linker; 543c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::vector<std::string> ExtraOpts; 54479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 54579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruthprivate: 54679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 54779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const ArgList &DriverArgs, 54879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args); 5496b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}; 5506b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 5516b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 5523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 5533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 55492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { 5553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerpublic: 5561d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth TCEToolChain(const Driver &D, const llvm::Triple& Triple); 5573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner ~TCEToolChain(); 5583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 559ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 560ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 5613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner bool IsMathErrnoDefault() const; 5623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner bool IsUnwindTablesDefault() const; 5633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char* GetDefaultRelocationModel() const; 5643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char* GetForcedPicModel() const; 5653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 5663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerprivate: 5673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner mutable llvm::DenseMap<unsigned, Tool*> Tools; 5683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 5693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}; 5703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 571ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { 572ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer mutable llvm::DenseMap<unsigned, Tool*> Tools; 573ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 574ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerpublic: 5751d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth Windows(const Driver &D, const llvm::Triple& Triple); 576ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 577ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 578ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 579ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 580ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual bool IsIntegratedAssemblerDefault() const; 581ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual bool IsUnwindTablesDefault() const; 582ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual const char *GetDefaultRelocationModel() const; 583ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual const char *GetForcedPicModel() const; 584ca23419b8214654d185d595956e9ddf24984750aChandler Carruth 585ca23419b8214654d185d595956e9ddf24984750aChandler Carruth virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, 586ca23419b8214654d185d595956e9ddf24984750aChandler Carruth ArgStringList &CC1Args) const; 587ca23419b8214654d185d595956e9ddf24984750aChandler Carruth virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 588ca23419b8214654d185d595956e9ddf24984750aChandler Carruth ArgStringList &CC1Args) const; 589ca23419b8214654d185d595956e9ddf24984750aChandler Carruth 590ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}; 591ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 59283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains 59383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver 59483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang 59583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 59683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif 597