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