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 1355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "Tools.h" 1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/VersionTuple.h" 15670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "clang/Driver/Action.h" 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Driver/Multilib.h" 1783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "clang/Driver/ToolChain.h" 18670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h" 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/ADT/Optional.h" 2083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h" 21f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer#include <set> 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <vector> 23a265461d113ced2e6f0db684ed6f6cb0c66c0f24Rafael Espindola 2483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang { 2583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver { 26985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains { 2783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// all subcommands; this relies on gcc translating the majority of 301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// command line options. 3192dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { 3275358d267256022475371416654b056ad8531cb3Daniel Dunbarprotected: 3319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Struct to store and manipulate GCC versions. 3419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 3519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// We rely on assumptions about the form and structure of GCC version 3619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// numbers: they consist of at most three '.'-separated components, and each 3719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// component is a non-negative integer except for the last component. For 3819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// the last component we are very flexible in order to tolerate release 3919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// candidates or 'x' wildcards. 4019347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 4119347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Note that the ordering established among GCCVersions is based on the 4219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// preferred version string to use. For example we prefer versions without 4319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// a hard-coded patch number to those with a hard coded patch number. 4419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 4519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Currently this doesn't provide any logic for textual suffixes to patches 4619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// in the way that (for example) Debian's version format does. If that ever 4719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// becomes necessary, it can be added. 4819347edf7809866350750a1997ec4db009832fa4Chandler Carruth struct GCCVersion { 4919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief The unparsed text of the version. 5019347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::string Text; 5119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 5219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief The parsed major, minor, and patch numbers. 5319347edf7809866350750a1997ec4db009832fa4Chandler Carruth int Major, Minor, Patch; 5419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 550affc67389171834adf113e3a0422a32218a6192Chandler Carruth /// \brief The text of the parsed major, and major+minor versions. 560affc67389171834adf113e3a0422a32218a6192Chandler Carruth std::string MajorStr, MinorStr; 570affc67389171834adf113e3a0422a32218a6192Chandler Carruth 5819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Any textual suffix on the patch number. 5919347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::string PatchSuffix; 6019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 6119347edf7809866350750a1997ec4db009832fa4Chandler Carruth static GCCVersion Parse(StringRef VersionText); 62ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch, 63ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer StringRef RHSPatchSuffix = StringRef()) const; 64ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer bool operator<(const GCCVersion &RHS) const { 65ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix); 66ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer } 6719347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator>(const GCCVersion &RHS) const { return RHS < *this; } 6819347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); } 6919347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); } 7019347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 7119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 7219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief This is a class to find a viable GCC installation for Clang to 7319347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// use. 7419347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// 7519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// This class tries to find a GCC installation on the system, and report 7619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// information about it. It starts from the host information provided to the 7719347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// Driver, and has logic for fuzzing that where appropriate. 7819347edf7809866350750a1997ec4db009832fa4Chandler Carruth class GCCInstallationDetector { 7919347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool IsValid; 80fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth llvm::Triple GCCTriple; 8119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 8219347edf7809866350750a1997ec4db009832fa4Chandler Carruth // FIXME: These might be better as path objects. 835d84bb418405e1256020a66895d163756886b102Chandler Carruth std::string GCCInstallPath; 845d84bb418405e1256020a66895d163756886b102Chandler Carruth std::string GCCParentLibPath; 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// The primary multilib appropriate for the given flags. 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib SelectedMultilib; 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// On Biarch systems, this corresponds to the default multilib when 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// targeting the non-default multilib. Otherwise, it is empty. 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Optional<Multilib> BiarchSibling; 9119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 9219347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCVersion Version; 9319347edf7809866350750a1997ec4db009832fa4Chandler Carruth 946365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth // We retain the list of install paths that were considered and rejected in 956365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth // order to print out detailed information in verbose mode. 96f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer std::set<std::string> CandidateGCCInstallPaths; 976365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// The set of multilibs that the detected installation supports. 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MultilibSet Multilibs; 100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 10119347edf7809866350750a1997ec4db009832fa4Chandler Carruth public: 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GCCInstallationDetector() : IsValid(false) {} 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void init(const Driver &D, const llvm::Triple &TargetTriple, 104dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 10519347edf7809866350750a1997ec4db009832fa4Chandler Carruth 10619347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Check whether we detected a valid GCC install. 10719347edf7809866350750a1997ec4db009832fa4Chandler Carruth bool isValid() const { return IsValid; } 10819347edf7809866350750a1997ec4db009832fa4Chandler Carruth 10919347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the GCC triple for the detected install. 110fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth const llvm::Triple &getTriple() const { return GCCTriple; } 11119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 11219347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC installation path. 1135d84bb418405e1256020a66895d163756886b102Chandler Carruth StringRef getInstallPath() const { return GCCInstallPath; } 11419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 11519347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC parent lib path. 1165d84bb418405e1256020a66895d163756886b102Chandler Carruth StringRef getParentLibPath() const { return GCCParentLibPath; } 11719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Get the detected Multilib 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Multilib &getMultilib() const { return SelectedMultilib; } 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Get the whole MultilibSet 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MultilibSet &getMultilibs() const { return Multilibs; } 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Get the biarch sibling multilib (if it exists). 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \return true iff such a sibling exists 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool getBiarchSibling(Multilib &M) const; 1275c805e92a5f70a913bc3bfcd15c44875974c2111Simon Atanasyan 12819347edf7809866350750a1997ec4db009832fa4Chandler Carruth /// \brief Get the detected GCC version string. 1298af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola const GCCVersion &getVersion() const { return Version; } 13019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 1316365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth /// \brief Print information about the detected GCC installation. 1326365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth void print(raw_ostream &OS) const; 1336365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth 13419347edf7809866350750a1997ec4db009832fa4Chandler Carruth private: 135d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth static void 136d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth CollectLibDirsAndTriples(const llvm::Triple &TargetTriple, 137d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth const llvm::Triple &BiarchTriple, 138d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVectorImpl<StringRef> &LibDirs, 139d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVectorImpl<StringRef> &TripleAliases, 140d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVectorImpl<StringRef> &BiarchLibDirs, 141d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVectorImpl<StringRef> &BiarchTripleAliases); 1421c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void ScanLibDirForGCCTriple(const llvm::Triple &TargetArch, 144dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args, 145d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth const std::string &LibDir, 1461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth StringRef CandidateTriple, 147d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth bool NeedsBiarchSuffix = false); 14819347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 14919347edf7809866350750a1997ec4db009832fa4Chandler Carruth 15019347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCInstallationDetector GCCInstallation; 15119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 15283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic: 153dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Generic_GCC(const Driver &D, const llvm::Triple &Triple, 154dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 1553917608370583fa30c466b6c3893448229aea9adDaniel Dunbar ~Generic_GCC(); 15683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void printVerboseInfo(raw_ostream &OS) const override; 1586365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsUnwindTablesDefault() const override; 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefault() const override; 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefaultForced() const override; 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsIntegratedAssemblerDefault() const override; 164b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 165b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruthprotected: 166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *getTool(Action::ActionClass AC) const override; 167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 169f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 170b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \name ToolChain Implementation Helper Functions 171b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// @{ 172b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 173b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \brief Check whether the target triple's architecture is 64-bits. 174d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth bool isTarget64Bit() const { return getTriple().isArch64Bit(); } 175d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth 176b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// \brief Check whether the target triple's architecture is 32-bits. 177d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth bool isTarget32Bit() const { return getTriple().isArch32Bit(); } 178b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth 179b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth /// @} 180f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 181f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprivate: 182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mutable std::unique_ptr<tools::gcc::Preprocess> Preprocess; 183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mutable std::unique_ptr<tools::gcc::Compile> Compile; 184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass LLVM_LIBRARY_VISIBILITY MachO : public ToolChain { 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprotected: 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *getTool(Action::ActionClass AC) const override; 191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprivate: 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mutable std::unique_ptr<tools::darwin::Lipo> Lipo; 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil; 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug; 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MachO(const Driver &D, const llvm::Triple &Triple, 198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const llvm::opt::ArgList &Args); 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ~MachO(); 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// @name MachO specific toolchain API 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// { 203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Get the "MachO" arch name for a particular compiler invocation. For 205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// example, Apple treats different ARM variations as distinct architectures. 206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef getMachOArchName(const llvm::opt::ArgList &Args) const; 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Add the linker arguments to link the ARC runtime library. 210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, 211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const {} 212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Add the linker arguments to link the compiler runtime library. 214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const; 216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void 218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addStartObjectFileArgs(const llvm::opt::ArgList &Args, 219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const {} 220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void addMinVersionArgs(const llvm::opt::ArgList &Args, 222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const {} 223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// On some iOS platforms, kernel and kernel modules were built statically. Is 225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// this such a target? 226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual bool isKernelStatic() const { 227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Is the target either iOS or an iOS simulator? 231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isTargetIOSBased() const { 232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, 236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs, 237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef DarwinStaticLib, 238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool AlwaysLink = false, 239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsEmbedded = false) const; 240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// } 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// @name ToolChain Implementation 243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// { 244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines types::ID InputType) const override; 247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines types::ID LookupTypeForExtension(const char *Ext) const override; 249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HasNativeLLVMSupport() const override; 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::DerivedArgList * 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TranslateArgs(const llvm::opt::DerivedArgList &Args, 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *BoundArch) const override; 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsBlocksDefault() const override { 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Always allow blocks on Apple; users interested in versioning are 258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected to use /usr/include/Blocks.h. 259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsIntegratedAssemblerDefault() const override { 262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Default integrated assembler to on for Apple's MachO targets. 263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override { 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsEncodeExtendedBlockSignatureDefault() const override { 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsObjCNonFragileABIDefault() const override { 275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Non-fragile ABI is default for everything but i386. 276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getTriple().getArch() != llvm::Triple::x86; 277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseObjCMixedDispatch() const override { 280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsUnwindTablesDefault() const override; 284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RuntimeLibType GetDefaultRuntimeLibType() const override { 286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ToolChain::RLT_CompilerRT; 287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefault() const override; 290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefaultForced() const override; 292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool SupportsProfiling() const override; 294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool SupportsObjCGC() const override { 296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseDwarfDebugFlags() const override; 300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseSjLjExceptions() const override { 302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// } 30683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar}; 30783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 3089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum /// Darwin - The base Darwin tool chain. 309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass LLVM_LIBRARY_VISIBILITY Darwin : public MachO { 31025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarpublic: 31125b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar /// The host version. 31225b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar unsigned DarwinVersion[3]; 31325b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar 3142603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar /// Whether the information on the target has been initialized. 3152603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // 3162603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: This should be eliminated. What we want to do is make this part of 3172603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the "default target for arguments" selection process, once we get out of 3182603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // the argument translation business. 3192603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar mutable bool TargetInitialized; 3202603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum DarwinPlatformKind { 322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MacOS, 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IPhoneOS, 324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IPhoneOSSimulator 325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 326eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar 327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mutable DarwinPlatformKind TargetPlatform; 3285f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 329fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner /// The OS version we are targeting. 33009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer mutable VersionTuple TargetVersion; 3312603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 332260611a32535c851237926bfcf78869b13c07d5bJohn McCallprivate: 33302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// The default macosx-version-min of this tool chain; empty until 33402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar /// initialized. 335816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar std::string MacosxVersionMin; 33602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 3374ec2678021a4621228321958b3641540f27a834aChad Rosier /// The default ios-version-min of this tool chain; empty until 3384ec2678021a4621228321958b3641540f27a834aChad Rosier /// initialized. 3394ec2678021a4621228321958b3641540f27a834aChad Rosier std::string iOSVersionMin; 3404ec2678021a4621228321958b3641540f27a834aChad Rosier 341c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbarprivate: 342dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const; 343c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 3448eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic: 345dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Darwin(const Driver &D, const llvm::Triple &Triple, 346dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 347f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar ~Darwin(); 3488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 349dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines types::ID InputType) const override; 351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// @name Apple Specific Toolchain Implementation 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// { 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMinVersionArgs(const llvm::opt::ArgList &Args, 357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 35800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addStartObjectFileArgs(const llvm::opt::ArgList &Args, 361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isKernelStatic() const override { 364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return !isTargetIPhoneOS() || isIPhoneOSVersionLT(6, 0) || 365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::arm64; 366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprotected: 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// } 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// @name Darwin specific Toolchain functions 3716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 3726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 3732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: Eliminate these ...Target functions and derive separate tool chains 3742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // for these targets and put version in constructor. 375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setTarget(DarwinPlatformKind Platform, unsigned Major, unsigned Minor, 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Micro) const { 3772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // FIXME: For now, allow reinitialization as long as values don't 3782603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // change. This will go away when we move away from argument translation. 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TargetInitialized && TargetPlatform == Platform && 38009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer TargetVersion == VersionTuple(Major, Minor, Micro)) 3812603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar return; 3822603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 3832603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(!TargetInitialized && "Target already initialized!"); 3842603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar TargetInitialized = true; 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TargetPlatform = Platform; 38609c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer TargetVersion = VersionTuple(Major, Minor, Micro); 3872603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 3882603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 3892603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool isTargetIPhoneOS() const { 3902603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return TargetPlatform == IPhoneOS; 3922603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 3932603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 3944035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar bool isTargetIOSSimulator() const { 3955f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return TargetPlatform == IPhoneOSSimulator; 397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isTargetIOSBased() const { 400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(TargetInitialized && "Target not initialized!"); 401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return isTargetIPhoneOS() || isTargetIOSSimulator(); 4024035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar } 4034035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar 404ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek bool isTargetMacOS() const { 405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return TargetPlatform == MacOS; 406ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 407ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 40803d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar bool isTargetInitialized() const { return TargetInitialized; } 40903d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar 41009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer VersionTuple getTargetVersion() const { 4112603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(TargetInitialized && "Target not initialized!"); 41209c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer return TargetVersion; 4132603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 4142603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 415ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTargetIOSBased() && "Unexpected call for non iOS target!"); 41709c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer return TargetVersion < VersionTuple(V0, V1, V2); 418608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } 419608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 420ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const { 421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTargetMacOS() && "Unexpected call for non OS X target!"); 42209c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer return TargetVersion < VersionTuple(V0, V1, V2); 423cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 424cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar 425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 4266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// } 4276b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// @name ToolChain Implementation 4286b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar /// { 4296b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::DerivedArgList * 431dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner TranslateArgs(const llvm::opt::DerivedArgList &Args, 432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *BoundArch) const override; 4338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const override; 435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool hasBlocksRuntime() const override; 436f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseObjCMixedDispatch() const override { 438f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // This is only used with the non-fragile ABI and non-legacy dispatch. 439f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar 440f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar // Mixed dispatch is used everywhere except OS X before 10.6. 441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return !(isTargetMacOS() && isMacosxVersionLT(10, 6)); 442f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar } 443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 4452fef11164cbe804f7b808c07757c6f900c08d765Nico Weber // Stack protectors default to on for user code on 10.5, 4462fef11164cbe804f7b808c07757c6f900c08d765Nico Weber // and for everything in 10.6 and beyond 447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()) 448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1; 449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isTargetMacOS() && !isMacosxVersionLT(10, 6)) 450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1; 451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isTargetMacOS() && !isMacosxVersionLT(10, 5) && !KernelOrKext) 452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1; 453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 0; 4559e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 4565840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool SupportsObjCGC() const override; 458f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void CheckObjCARC() const override; 460b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseSjLjExceptions() const override; 4628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 4638eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 4641d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang. 46592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin { 4661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic: 467dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner DarwinClang(const Driver &D, const llvm::Triple &Triple, 468dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 4691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// @name Apple ToolChain Implementation 4711d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar /// { 4721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 47669b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov 477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 480efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddCCKextLibArgs(const llvm::opt::ArgList &Args, 483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 4847433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const; 4861d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddLinkARCArgs(const llvm::opt::ArgList &Args, 489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// } 4918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}; 4928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 493e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC { 49499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 49599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic: 496dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Generic_ELF(const Driver &D, const llvm::Triple &Triple, 497dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args) 498dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner : Generic_GCC(D, Triple, Args) {} 499e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola 500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 502e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola}; 503e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola 50492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { 505e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic: 506dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AuroraUX(const Driver &D, const llvm::Triple &Triple, 507dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 508e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 509f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 512e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}; 513e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 51431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { 51531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallpublic: 516dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Solaris(const Driver &D, const llvm::Triple &Triple, 517dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 51831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsIntegratedAssemblerDefault() const override { return true; } 520f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 523f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 52431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}; 52531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 52631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 527e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 528f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic: 529dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner OpenBSD(const Driver &D, const llvm::Triple &Triple, 530dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 531f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override { return false; } 533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsObjCNonFragileABIDefault() const override { return true; } 534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override { return true; } 5359adba39460dfa5282b75dbd27db44ccfb4d1f511Rafael Espindola 536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return 2; 5389adba39460dfa5282b75dbd27db44ccfb4d1f511Rafael Espindola } 539c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall 540ef8225444452a1486bd721f3285301fe84643b00Stephen Hines virtual bool IsIntegratedAssemblerDefault() const { 541ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (getTriple().getArch() == llvm::Triple::ppc) 542ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 543ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return Generic_ELF::IsIntegratedAssemblerDefault(); 544ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 545ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 546f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 549f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}; 550f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 55142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanclass LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF { 55242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanpublic: 553dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Bitrig(const Driver &D, const llvm::Triple &Triple, 554dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 55542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override { return false; } 557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsObjCNonFragileABIDefault() const override { return true; } 55842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 5596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 561dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 56642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman return 1; 56742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 568f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 569f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 57242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}; 57342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 574e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { 57575358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic: 576dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner FreeBSD(const Driver &D, const llvm::Triple &Triple, 577dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HasNativeLLVMSupport() const override; 57975358d267256022475371416654b056ad8531cb3Daniel Dunbar 580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override { return false; } 581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsObjCNonFragileABIDefault() const override { return true; } 582c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall 583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 5851cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsIntegratedAssemblerDefault() const override { 588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (getTriple().getArch() == llvm::Triple::ppc || 589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::ppc64) 590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Generic_ELF::IsIntegratedAssemblerDefault(); 592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 5931cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall 594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseSjLjExceptions() const override; 595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 596f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 59975358d267256022475371416654b056ad8531cb3Daniel Dunbar}; 60075358d267256022475371416654b056ad8531cb3Daniel Dunbar 6018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { 6028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerpublic: 603dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner NetBSD(const Driver &D, const llvm::Triple &Triple, 604dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 6058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override { return false; } 607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsObjCNonFragileABIDefault() const override { return true; } 608c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall 609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 610a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 612dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsUnwindTablesDefault() const override { 615ba7fd42d78f67d085f90c307a013dc37ef8e791aJoerg Sonnenberger return true; 616ba7fd42d78f67d085f90c307a013dc37ef8e791aJoerg Sonnenberger } 617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsIntegratedAssemblerDefault() const override { 61814605ff6affc04191a0064f688c56082b1c93791Joerg Sonnenberger if (getTriple().getArch() == llvm::Triple::ppc) 61914605ff6affc04191a0064f688c56082b1c93791Joerg Sonnenberger return true; 62014605ff6affc04191a0064f688c56082b1c93791Joerg Sonnenberger return Generic_ELF::IsIntegratedAssemblerDefault(); 62114605ff6affc04191a0064f688c56082b1c93791Joerg Sonnenberger } 622a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 623f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 6268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}; 6278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 6286d402dc963aa32194f3604af4463b113858291aeEli Friedmanclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { 62938e317d6dce161b249508686cc67eb7176958762Chris Lattnerpublic: 630dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Minix(const Driver &D, const llvm::Triple &Triple, 631dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 63238e317d6dce161b249508686cc67eb7176958762Chris Lattner 633f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 63638e317d6dce161b249508686cc67eb7176958762Chris Lattner}; 63738e317d6dce161b249508686cc67eb7176958762Chris Lattner 638e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { 63911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic: 640dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner DragonFly(const Driver &D, const llvm::Triple &Triple, 641dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 64211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override { return false; } 644769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer 645f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 64811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}; 64911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 650e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { 6516b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic: 652dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Linux(const Driver &D, const llvm::Triple &Triple, 653dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 654ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool HasNativeLLVMSupport() const override; 656c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 658dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 660651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 661dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 6647d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 665c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Linker; 666c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::vector<std::string> ExtraOpts; 66779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 668f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 671f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 67279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruthprivate: 673f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, 674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Twine TargetArchDir, Twine IncludeSuffix, 675dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &DriverArgs, 676dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner llvm::opt::ArgStringList &CC1Args); 67779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 678dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &DriverArgs, 679dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner llvm::opt::ArgStringList &CC1Args); 6808e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 681ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyan std::string computeSysRoot() const; 6826b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}; 6836b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 684b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux { 685b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisprotected: 686b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis GCCVersion GCCLibAndIncVersion; 687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 689b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 690b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtispublic: 691b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis Hexagon_TC(const Driver &D, const llvm::Triple &Triple, 692dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 693b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis ~Hexagon_TC(); 694b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 696dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 697651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 699dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 701651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 702b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 703b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } 704b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 705b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis static std::string GetGnuDir(const std::string &InstalledDir); 7066781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis 707dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner static StringRef GetTargetCPU(const llvm::opt::ArgList &Args); 708b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis}; 7096b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 7103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 7113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 71292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain { 7133a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerpublic: 714dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner TCEToolChain(const Driver &D, const llvm::Triple &Triple, 715dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 7163a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner ~TCEToolChain(); 7173a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMathErrnoDefault() const override; 719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefault() const override; 720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefaultForced() const override; 7223a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}; 7233a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 724ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { 725ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerpublic: 726dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner Windows(const Driver &D, const llvm::Triple &Triple, 727dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner const llvm::opt::ArgList &Args); 728ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsIntegratedAssemblerDefault() const override; 730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsUnwindTablesDefault() const override; 731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefault() const override; 732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefaultForced() const override; 734ca23419b8214654d185d595956e9ddf24984750aChandler Carruth 735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 736dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void 739dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 741dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner 742f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindolaprotected: 743651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 745ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}; 746ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 7474e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 7484e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonclass LLVM_LIBRARY_VISIBILITY XCore : public ToolChain { 7494e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonpublic: 7504e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton XCore(const Driver &D, const llvm::Triple &Triple, 7514e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton const llvm::opt::ArgList &Args); 7524e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonprotected: 753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildAssembler() const override; 754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Tool *buildLinker() const override; 7554e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonpublic: 756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefault() const override; 757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPIEDefault() const override; 758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isPICDefaultForced() const override; 759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool SupportsProfiling() const override; 760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool hasBlocksRuntime() const override; 761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, 766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CC1Args) const override; 767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const override; 7694e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}; 7704e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 77183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains 77283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver 77383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang 77483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar 77583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif 776