ToolChains.h revision 2a253960f0312c9759965a1defb9326d6b2764a4
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 16670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h" 1783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h" 1883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 19670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "Tools.h" 20670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 2183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang { 2283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver { 23985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains { 2483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// all subcommands; this relies on gcc translating the majority of 271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// command line options. 2892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 2975358d267256022475371416654b056ad8531cb3Daniel Dunbarprotected: 3019347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Struct to store and manipulate GCC versions. 3119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 3219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// We rely on assumptions about the form and structure of GCC version 3319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// numbers: they consist of at most three '.'-separated components, and each 3419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// component is a non-negative integer except for the last component. For 3519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// the last component we are very flexible in order to tolerate release 3619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// candidates or 'x' wildcards. 3719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 3819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Note that the ordering established among GCCVersions is based on the 3919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// preferred version string to use. For example we prefer versions without 4019347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// a hard-coded patch number to those with a hard coded patch number. 4119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 4219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Currently this doesn't provide any logic for textual suffixes to patches 4319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// in the way that (for example) Debian's version format does. If that ever 4419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// becomes necessary, it can be added. 4519347edf7809866350750a1997ec4db009832fa4Chandler Carruth struct GCCVersion { 4619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief The unparsed text of the version. 4719347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::string Text; 4819347edf7809866350750a1997ec4db009832fa4Chandler Carruth 4919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief The parsed major, minor, and patch numbers. 5019347edf7809866350750a1997ec4db009832fa4Chandler Carruth int Major, Minor, Patch; 5119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 5219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Any textual suffix on the patch number. 5319347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::string PatchSuffix; 5419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 5519347edf7809866350750a1997ec4db009832fa4Chandler Carruth static GCCVersion Parse(StringRef VersionText); 5619347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator<(const GCCVersion &RHS) const; 5719347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 5819347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 5919347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 6019347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 6119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 6219347edf7809866350750a1997ec4db009832fa4Chandler Carruth 6319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief This is a class to find a viable GCC installation for Clang to 6419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// use. 6519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 6619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// This class tries to find a GCC installation on the system, and report 6719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// information about it. It starts from the host information provided to the 6819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Driver, and has logic for fuzzing that where appropriate. 6919347edf7809866350750a1997ec4db009832fa4Chandler Carruth class GCCInstallationDetector { 7019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 7119347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool IsValid; 72fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth llvm::Triple GCCTriple; 7319347edf7809866350750a1997ec4db009832fa4Chandler Carruth 7419347edf7809866350750a1997ec4db009832fa4Chandler Carruth // FIXME: These might be better as path objects. 755d84bb418405e1256020a66895d163756886b102Chandler Carruth std::string GCCInstallPath; 761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth std::string GCCMultiarchSuffix; 775d84bb418405e1256020a66895d163756886b102Chandler Carruth std::string GCCParentLibPath; 7819347edf7809866350750a1997ec4db009832fa4Chandler Carruth 7919347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCVersion Version; 8019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8119347edf7809866350750a1997ec4db009832fa4Chandler Carruth public: 820e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple, 830e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola const ArgList &Args); 8419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Check whether we detected a valid GCC install. 8619347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool isValid() const { return IsValid; } 8719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the GCC triple for the detected install. 89fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth const llvm::Triple &getTriple() const { return GCCTriple; } 9019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 9119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC installation path. 925d84bb418405e1256020a66895d163756886b102Chandler Carruth StringRef getInstallPath() const { return GCCInstallPath; } 9319347edf7809866350750a1997ec4db009832fa4Chandler Carruth 941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth /// \brief Get the detected GCC installation path suffix for multiarch GCCs. 951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth StringRef getMultiarchSuffix() const { return GCCMultiarchSuffix; } 961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 9719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC parent lib path. 985d84bb418405e1256020a66895d163756886b102Chandler Carruth StringRef getParentLibPath() const { return GCCParentLibPath; } 9919347edf7809866350750a1997ec4db009832fa4Chandler Carruth 10019347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC version string. 10119347edf7809866350750a1997ec4db009832fa4Chandler Carruth StringRef getVersion() const { return Version.Text; } 10219347edf7809866350750a1997ec4db009832fa4Chandler Carruth 10319347edf7809866350750a1997ec4db009832fa4Chandler Carruth private: 1041c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static void CollectLibDirsAndTriples( 1051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth const llvm::Triple &TargetTriple, 1061c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth const llvm::Triple &MultiarchTriple, 1071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &LibDirs, 1081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &TripleAliases, 1091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &MultiarchLibDirs, 1101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &MultiarchTripleAliases); 1111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 1121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch, 113d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth const std::string &LibDir, 1141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth StringRef CandidateTriple, 1151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth bool NeedsMultiarchSuffix = false); 11619347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 11719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 11819347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCInstallationDetector GCCInstallation; 11919347edf7809866350750a1997ec4db009832fa4Chandler Carruth 120670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar mutable llvm::DenseMap<unsigned, Tool*> Tools; 121670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 12283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic: 1230e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 1243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar ~Generic_GCC(); 12583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 126ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 127ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 128670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar 1293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual bool IsUnwindTablesDefault() const; 1303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual const char *GetDefaultRelocationModel() const; 1313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar virtual const char *GetForcedPicModel() const; 132b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 133b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruthprotected: 134b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \name ToolChain Implementation Helper Functions 135b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// @{ 136b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 137b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \brief Check whether the target triple's architecture is 64-bits. 138d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 139d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth 140b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \brief Check whether the target triple's architecture is 32-bits. 141d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 142b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 143b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// @} 14483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar}; 14583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 1469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public ToolChain { 1479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumprotected: 1489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum mutable llvm::DenseMap<unsigned, Tool*> Tools; 1499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumpublic: 1511d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth Hexagon_TC(const Driver &D, const llvm::Triple& Triple); 1529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ~Hexagon_TC(); 1539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 1559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const ActionList &Inputs) const; 1569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual bool IsUnwindTablesDefault() const; 1589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual const char *GetDefaultRelocationModel() const; 1599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual const char *GetForcedPicModel() const; 1609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}; 1619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum /// Darwin - The base Darwin tool chain. 16392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { 16425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarpublic: 16525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar /// The host version. 16625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar unsigned DarwinVersion[3]; 16725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar 16825b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarprivate: 1698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar mutable llvm::DenseMap<unsigned, Tool*> Tools; 1708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1712603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar /// Whether the information on the target has been initialized. 1722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // 1732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: This should be eliminated. What we want to do is make this part of 1742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the "default target for arguments" selection process, once we get out of 1752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the argument translation business. 1762603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetInitialized; 1772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 178f85e193739c953358c865005855253af4f68a497John McCall // FIXME: Remove this once there is a proper way to detect an ARC runtime 179f85e193739c953358c865005855253af4f68a497John McCall // for the simulator. 180f85e193739c953358c865005855253af4f68a497John McCall public: 181f85e193739c953358c865005855253af4f68a497John McCall mutable enum { 182f85e193739c953358c865005855253af4f68a497John McCall ARCSimulator_None, 183f85e193739c953358c865005855253af4f68a497John McCall ARCSimulator_HasARCRuntime, 184f85e193739c953358c865005855253af4f68a497John McCall ARCSimulator_NoARCRuntime 185f85e193739c953358c865005855253af4f68a497John McCall } ARCRuntimeForSimulator; 186f85e193739c953358c865005855253af4f68a497John McCall 187163b151809beef8f917fd16c546016e83ae3e361Bob Wilson mutable enum { 188163b151809beef8f917fd16c546016e83ae3e361Bob Wilson LibCXXSimulator_None, 189163b151809beef8f917fd16c546016e83ae3e361Bob Wilson LibCXXSimulator_NotAvailable, 190163b151809beef8f917fd16c546016e83ae3e361Bob Wilson LibCXXSimulator_Available 191163b151809beef8f917fd16c546016e83ae3e361Bob Wilson } LibCXXForSimulator; 192163b151809beef8f917fd16c546016e83ae3e361Bob Wilson 193f85e193739c953358c865005855253af4f68a497John McCallprivate: 194fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// Whether we are targeting iPhoneOS target. 1952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetIsIPhoneOS; 196eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar 1975f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar /// Whether we are targeting the iPhoneOS simulator target. 1985f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar mutable bool TargetIsIPhoneOSSimulator; 1995f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 200fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// The OS version we are targeting. 2012603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable unsigned TargetVersion[3]; 2022603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 20302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// The default macosx-version-min of this tool chain; empty until 20402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// initialized. 205816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar std::string MacosxVersionMin; 20602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2079f084a3166b684573ba49df28fc5792bc37d92e1John McCall bool hasARCRuntime() const; 208ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek bool hasSubscriptingRuntime() const; 2099f084a3166b684573ba49df28fc5792bc37d92e1John McCall 210c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbarprivate: 21160baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar void AddDeploymentTarget(DerivedArgList &Args) const; 212c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 2138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 2141d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth Darwin(const Driver &D, const llvm::Triple& Triple); 215f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar ~Darwin(); 2168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 21761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier std::string ComputeEffectiveClangTriple(const ArgList &Args, 21861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const; 21900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 2206b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name Darwin Specific Toolchain API 2216b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 2226b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 2232603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: Eliminate these ...Target functions and derive separate tool chains 2242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // for these targets and put version in constructor. 2255f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor, 2265f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar unsigned Micro, bool IsIOSSim) const { 2275f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!"); 2285f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 2292603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: For now, allow reinitialization as long as values don't 2302603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // change. This will go away when we move away from argument translation. 2315f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS && 2325f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar TargetIsIPhoneOSSimulator == IsIOSSim && 2332603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[0] == Major && TargetVersion[1] == Minor && 2342603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[2] == 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; 2412603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[0] = Major; 2422603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[1] = Minor; 2432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetVersion[2] = Micro; 2442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 2452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 2462603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool isTargetIPhoneOS() const { 2472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 2482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar return TargetIsIPhoneOS; 2492603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 2502603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 2514035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar bool isTargetIOSSimulator() const { 2525f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 2535f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar return TargetIsIPhoneOSSimulator; 2544035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar } 2554035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar 256ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek bool isTargetMacOS() const { 257ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek return !isTargetIOSSimulator() && 258ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek !isTargetIPhoneOS() && 259ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek ARCRuntimeForSimulator == ARCSimulator_None; 260ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 261ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 26203d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar bool isTargetInitialized() const { return TargetInitialized; } 26303d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar 2642603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar void getTargetVersion(unsigned (&Res)[3]) const { 2652603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 2662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Res[0] = TargetVersion[0]; 2672603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Res[1] = TargetVersion[1]; 2682603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Res[2] = TargetVersion[2]; 2692603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 2702603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 271eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler 272eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// invocation. For example, Darwin treats different ARM variations as 273eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar /// distinct architectures. 274686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getDarwinArchName(const ArgList &Args) const; 275eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 276ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar static bool isVersionLT(unsigned (&A)[3], unsigned (&B)[3]) { 277608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar for (unsigned i=0; i < 3; ++i) { 278608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar if (A[i] > B[i]) return false; 279608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar if (A[i] < B[i]) return true; 280608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 281608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar return false; 282608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 283608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 284ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 285ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar assert(isTargetIPhoneOS() && "Unexpected call for OS X target!"); 286608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 287ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar return isVersionLT(TargetVersion, B); 288608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 289608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 290ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 291ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!"); 292cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 293ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar return isVersionLT(TargetVersion, B); 294cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 295cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar 2966b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs. 2976b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// 2986b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// \param Args - The input argument list. 2996b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// \param CmdArgs [out] - The command argument list to append the paths 3006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// (prefixed by -L) to. 3011d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 3021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const = 0; 30302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 304f85e193739c953358c865005855253af4f68a497John McCall /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library. 305f85e193739c953358c865005855253af4f68a497John McCall virtual void AddLinkARCArgs(const ArgList &Args, 306f85e193739c953358c865005855253af4f68a497John McCall ArgStringList &CmdArgs) const = 0; 307f85e193739c953358c865005855253af4f68a497John McCall 3086cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler 3096cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar /// runtime library. 3101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 3111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const = 0; 3123404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher 3136b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 3146b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name ToolChain Implementation 3156b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 3166b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 3174180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar virtual types::ID LookupTypeForExtension(const char *Ext) const; 3184180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 319b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar virtual bool HasNativeLLVMSupport() const; 320b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar 3219f084a3166b684573ba49df28fc5792bc37d92e1John McCall virtual void configureObjCRuntime(ObjCRuntime &runtime) const; 32213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall virtual bool hasBlocksRuntime() const; 323f85e193739c953358c865005855253af4f68a497John McCall 324279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args, 3250dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const; 3268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 327ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 328ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 3298eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual bool IsBlocksDefault() const { 331ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar // Always allow blocks on Darwin; users interested in versioning are 332ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar // expected to use /usr/include/Blocks.h. 333ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar return true; 3349e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 335eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar virtual bool IsIntegratedAssemblerDefault() const { 33671a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER 33771a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar return false; 33871a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#else 339033d3007b16d7f6c0f0eafd06c7096cfd22d89f5Jim Grosbach // Default integrated assembler to on for Darwin. 340033d3007b16d7f6c0f0eafd06c7096cfd22d89f5Jim Grosbach return true; 34171a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#endif 342eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar } 343398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar virtual bool IsStrictAliasingDefault() const { 344398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#ifdef DISABLE_DEFAULT_STRICT_ALIASING 345398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar return false; 346398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#else 347398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar return ToolChain::IsStrictAliasingDefault(); 348398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#endif 349398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar } 350c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek 351c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek virtual bool IsObjCDefaultSynthPropertiesDefault() const { 3522a253960f0312c9759965a1defb9326d6b2764a4Ted Kremenek return true; 353c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek } 354c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek 3559e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar virtual bool IsObjCNonFragileABIDefault() const { 356f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Non-fragile ABI is default for everything but i386. 357f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return getTriple().getArch() != llvm::Triple::x86; 3589e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 359609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar virtual bool IsObjCLegacyDispatchDefault() const { 360609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar // This is only used with the non-fragile ABI. 361f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 362f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Legacy dispatch is used everywhere except on x86_64. 363f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return getTriple().getArch() != llvm::Triple::x86_64; 364609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar } 365f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar virtual bool UseObjCMixedDispatch() const { 366f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // This is only used with the non-fragile ABI and non-legacy dispatch. 367f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 368f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Mixed dispatch is used everywhere except OS X before 10.6. 369f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6)); 370f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar } 3718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual bool IsUnwindTablesDefault() const; 3722fef11164cbe804f7b808c07757c6f900c08d765Nico Weber virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { 3732fef11164cbe804f7b808c07757c6f900c08d765Nico Weber // Stack protectors default to on for user code on 10.5, 3742fef11164cbe804f7b808c07757c6f900c08d765Nico Weber // and for everything in 10.6 and beyond 375dfba0278ce3b9cd86f5a050163ccb998aeb74aa6Bob Wilson return isTargetIPhoneOS() || 3762fef11164cbe804f7b808c07757c6f900c08d765Nico Weber (!isMacosxVersionLT(10, 6) || 3772fef11164cbe804f7b808c07757c6f900c08d765Nico Weber (!isMacosxVersionLT(10, 5) && !KernelOrKext)); 3789e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 379c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar virtual RuntimeLibType GetDefaultRuntimeLibType() const { 380c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return ToolChain::RLT_CompilerRT; 381c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar } 3828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetDefaultRelocationModel() const; 3838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetForcedPicModel() const; 3846b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 385bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar virtual bool SupportsProfiling() const; 386bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar 38743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar virtual bool SupportsObjCGC() const; 38843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 3895840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis virtual bool SupportsObjCARC() const; 3905840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis 391f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar virtual bool UseDwarfDebugFlags() const; 392f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 393b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar virtual bool UseSjLjExceptions() const; 394b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 3956b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 3968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 3978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3981d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang. 39992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { 4008aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilsonprivate: 4018aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson void AddGCCLibexecPath(unsigned darwinVersion); 4028aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson 4031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic: 4041d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth DarwinClang(const Driver &D, const llvm::Triple& Triple); 4051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// @name Darwin ToolChain Implementation 4071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// { 4081d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkSearchPathArgs(const ArgList &Args, 4101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 4111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar virtual void AddLinkRuntimeLibArgs(const ArgList &Args, 4131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const; 4143404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, 4153404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher const char *DarwinStaticLib) const; 4163404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher 417132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar virtual void AddCXXStdlibLibArgs(const ArgList &Args, 418132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar ArgStringList &CmdArgs) const; 419efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 4207433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen virtual void AddCCKextLibArgs(const ArgList &Args, 4217433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen ArgStringList &CmdArgs) const; 4227433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 423f85e193739c953358c865005855253af4f68a497John McCall virtual void AddLinkARCArgs(const ArgList &Args, 424f85e193739c953358c865005855253af4f68a497John McCall ArgStringList &CmdArgs) const; 4251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// } 4261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}; 4271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc. 42992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC { 4308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 4310e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Darwin_Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 4320e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_GCC(D, Triple, Args) {} 4338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 43461ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier std::string ComputeEffectiveClangTriple(const ArgList &Args, 43561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const; 43600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 4378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar virtual const char *GetDefaultRelocationModel() const { return "pic"; } 4388eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 4398eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 440e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 44199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 44299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 4430e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Generic_ELF(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 4440e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_GCC(D, Triple, Args) {} 445e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola 446e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola virtual bool IsIntegratedAssemblerDefault() const { 447e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola // Default integrated assembler to on for x86. 448e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola return (getTriple().getArch() == llvm::Triple::x86 || 449e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola getTriple().getArch() == llvm::Triple::x86_64); 450e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola } 451e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola}; 452e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola 45392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { 454e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic: 4550e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola AuroraUX(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 456e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 457ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 458ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 459e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}; 460e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 46131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { 46231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallpublic: 4630e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Solaris(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 46431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 46531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 46631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const ActionList &Inputs) const; 46731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 46831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall virtual bool IsIntegratedAssemblerDefault() const { return true; } 46931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}; 47031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 47131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 472e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 473f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic: 4740e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 476ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 477ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 478f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}; 479f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 480e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { 48175358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic: 4820e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 48375358d267256022475371416654b056ad8531cb3Daniel Dunbar 484ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 485ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 48675358d267256022475371416654b056ad8531cb3Daniel Dunbar}; 48775358d267256022475371416654b056ad8531cb3Daniel Dunbar 4888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { 4898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerpublic: 4900e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 4918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 492ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 493ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 4948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}; 4958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 4966d402dc963aa32194f3604af4463b113858291aeEli Friedmanclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { 49738e317d6dce161b249508686cc67eb7176958762Chris Lattnerpublic: 4980e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 49938e317d6dce161b249508686cc67eb7176958762Chris Lattner 500ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 501ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 50238e317d6dce161b249508686cc67eb7176958762Chris Lattner}; 50338e317d6dce161b249508686cc67eb7176958762Chris Lattner 504e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { 50511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic: 5060e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 50711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 508ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 509ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 51011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}; 51111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 512e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { 5136b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic: 5140e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Linux(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); 515ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 516c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola virtual bool HasNativeLLVMSupport() const; 517c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 518ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 519ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 520c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, 5227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth ArgStringList &CC1Args) const; 5237d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 5247d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth ArgStringList &CC1Args) const; 5257d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 526c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Linker; 527c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::vector<std::string> ExtraOpts; 52879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 52979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruthprivate: 53079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 53179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const ArgList &DriverArgs, 53279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args); 5336b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}; 5346b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 5356b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 5363a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 5373a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 53892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { 5393a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerpublic: 5401d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth TCEToolChain(const Driver &D, const llvm::Triple& Triple); 5413a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner ~TCEToolChain(); 5423a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 543ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 544ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 5453a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner bool IsMathErrnoDefault() const; 5463a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner bool IsUnwindTablesDefault() const; 5473a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char* GetDefaultRelocationModel() const; 5483a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char* GetForcedPicModel() const; 5493a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 5503a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerprivate: 5513a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner mutable llvm::DenseMap<unsigned, Tool*> Tools; 5523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 5533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}; 5543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 555ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { 556ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer mutable llvm::DenseMap<unsigned, Tool*> Tools; 557ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 558ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerpublic: 5591d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth Windows(const Driver &D, const llvm::Triple& Triple); 560ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 561ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar virtual Tool &SelectTool(const Compilation &C, const JobAction &JA, 562ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const ActionList &Inputs) const; 563ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 564ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual bool IsIntegratedAssemblerDefault() const; 565ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual bool IsUnwindTablesDefault() const; 566ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual const char *GetDefaultRelocationModel() const; 567ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer virtual const char *GetForcedPicModel() const; 568ca23419b8214654d185d595956e9ddf24984750aChandler Carruth 569ca23419b8214654d185d595956e9ddf24984750aChandler Carruth virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, 570ca23419b8214654d185d595956e9ddf24984750aChandler Carruth ArgStringList &CC1Args) const; 571ca23419b8214654d185d595956e9ddf24984750aChandler Carruth virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 572ca23419b8214654d185d595956e9ddf24984750aChandler Carruth ArgStringList &CC1Args) const; 573ca23419b8214654d185d595956e9ddf24984750aChandler Carruth 574ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}; 575ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 57683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains 57783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver 57883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang 57983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 58083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif 581