Tools.h revision 651f13cea278ec967336033dd032faef0e9fc2ec
19c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
29c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar//
39c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar//                     The LLVM Compiler Infrastructure
49c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar//
59c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar// This file is distributed under the University of Illinois Open Source
69c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar// License. See LICENSE.TXT for details.
79c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar//
89c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar//===----------------------------------------------------------------------===//
99c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
109c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#ifndef CLANG_LIB_DRIVER_TOOLS_H_
119c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#define CLANG_LIB_DRIVER_TOOLS_H_
129c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
139c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#include "clang/Driver/Tool.h"
1440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar#include "clang/Driver/Types.h"
15b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Util.h"
16182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger#include "llvm/ADT/Triple.h"
17b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h"
189c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#include "llvm/Support/Compiler.h"
199c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
209c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbarnamespace clang {
21260611a32535c851237926bfcf78869b13c07d5bJohn McCall  class ObjCRuntime;
22260611a32535c851237926bfcf78869b13c07d5bJohn McCall
239c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbarnamespace driver {
24c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class Command;
25df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  class Driver;
26df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
2702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarnamespace toolchains {
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class MachO;
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
3002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
31985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace tools {
32b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing llvm::opt::ArgStringList;
339c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
3420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  /// \brief Clang compiler tool.
3592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
3627e2b983beb8b5a29869639637327725623069a8Eric Christopher  public:
37dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    static const char *getBaseInputName(const llvm::opt::ArgList &Args,
3866b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                        const InputInfoList &Inputs);
39dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
4066b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                        const InputInfoList &Inputs);
41dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
4266b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                             const InputInfoList &Inputs);
4366b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson
4427e2b983beb8b5a29869639637327725623069a8Eric Christopher  private:
45dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
4654db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne                                 const Driver &D,
47dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                 const llvm::opt::ArgList &Args,
48dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                 llvm::opt::ArgStringList &CmdArgs,
49c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfo &Output,
50c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs) const;
51c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
523bb1b5c953fc38d4b87525258cf27b7c908988b1Amara Emerson    void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
533bb1b5c953fc38d4b87525258cf27b7c908988b1Amara Emerson                              llvm::opt::ArgStringList &CmdArgs) const;
54dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddARMTargetArgs(const llvm::opt::ArgList &Args,
55dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                          llvm::opt::ArgStringList &CmdArgs,
56fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar                          bool KernelOrKext) const;
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            llvm::opt::ArgStringList &CmdArgs) const;
59dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
60dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                           llvm::opt::ArgStringList &CmdArgs) const;
61dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddR600TargetArgs(const llvm::opt::ArgList &Args,
62dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                           llvm::opt::ArgStringList &CmdArgs) const;
63dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
64dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                            llvm::opt::ArgStringList &CmdArgs) const;
655c92b9ab4e4dce3233ea3e400a02c443f9afd372Richard Sandiford    void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
665c92b9ab4e4dce3233ea3e400a02c443f9afd372Richard Sandiford                              llvm::opt::ArgStringList &CmdArgs) const;
67dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddX86TargetArgs(const llvm::opt::ArgList &Args,
68dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                          llvm::opt::ArgStringList &CmdArgs) const;
69dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
70dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              llvm::opt::ArgStringList &CmdArgs) const;
716acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
72260611a32535c851237926bfcf78869b13c07d5bJohn McCall    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
73260611a32535c851237926bfcf78869b13c07d5bJohn McCall
74dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
75dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                   llvm::opt::ArgStringList &cmdArgs,
76260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                   RewriteKind rewrite) const;
77260611a32535c851237926bfcf78869b13c07d5bJohn McCall
78b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg    void AddClangCLArgs(const llvm::opt::ArgList &Args,
79b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg                        llvm::opt::ArgStringList &CmdArgs) const;
80b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg
819c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
823038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
839c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedAssembler() const override { return true; }
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return true; }
8747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
9220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  };
9320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
9420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  /// \brief Clang integrated assembler tool.
9520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
9620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  public:
973038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    ClangAs(const ToolChain &TC) : Tool("clang::as",
983038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                        "clang integrated assembler", TC) {}
9920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedAssembler() const override { return false; }
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
10320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
1089c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1099c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
11031b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar  /// gcc - Generic GCC tool implementations.
11131b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbarnamespace gcc {
11292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
1139c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1143038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Common(const char *Name, const char *ShortName,
1153038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
11647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
122b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
123b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// RenderExtraToolArgs - Render any arguments necessary to force
124b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// the particular tool mode.
125dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    virtual void
126dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner        RenderExtraToolArgs(const JobAction &JA,
127dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                            llvm::opt::ArgStringList &CmdArgs) const = 0;
1289c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1299c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
13092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
1319c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1323038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
1333038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                             "gcc preprocessor", TC) {}
134b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
13747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const override;
1409c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1419c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
14292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
1439c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1443038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Compile(const ToolChain &TC) : Common("gcc::Compile",
1453038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                          "gcc frontend", TC) {}
1469c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return true; }
14947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const override;
1529c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1539c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
15492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
1559c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1563038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Common("gcc::Link",
1573038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                       "linker (via gcc)", TC) {}
1589c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
16147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const override;
1649c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
16531b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar} // end namespace gcc
1669c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumnamespace hexagon {
1689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
1699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // We simply use "clang -cc1" for those actions.
1709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
1719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  public:
1729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
1739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      "hexagon-as", TC) {}
1749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
1769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const;
179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
1839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  };
1849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
1869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  public:
1879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Link(const ToolChain &TC) : Tool("hexagon::Link",
1889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      "hexagon-ld", TC) {}
1899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
1929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual void RenderExtraToolArgs(const JobAction &JA,
194dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
1999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  };
2009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} // end namespace hexagon.
2019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace arm {
203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            const llvm::Triple &Triple);
205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                const llvm::Triple &Triple);
207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char* getLLVMArchSuffixForARM(StringRef CPU);
208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace mips {
211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
214ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarnamespace darwin {
215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
217cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
21999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie    virtual void anchor();
220fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  protected:
221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void AddMachOArch(const llvm::opt::ArgList &Args,
222dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                       llvm::opt::ArgStringList &CmdArgs) const;
223fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const toolchains::MachO &getMachOToolChain() const {
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return reinterpret_cast<const toolchains::MachO&>(getToolChain());
226fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    }
227fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
228fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  public:
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    MachOTool(const char *Name, const char *ShortName,
2303038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
231fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  };
232fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool  {
2348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  public:
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              "assembler", TC) {}
2378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
2398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
24402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  };
24502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Link : public MachOTool  {
2476acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling    bool NeedsTempPath(const InputInfoList &Inputs) const;
248dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
249dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                     llvm::opt::ArgStringList &CmdArgs,
250dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                     const InputInfoList &Inputs) const;
25102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
25202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  public:
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC) {}
25402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
25702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
2628cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  };
2638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool  {
265ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  public:
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
267ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
269ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
2746e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  };
2756e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool  {
2776e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  public:
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              "dsymutil", TC) {}
2806e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isDsymutilJob() const override { return true; }
2836e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
289f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
290f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool  {
292f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  public:
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                 "dwarfdump", TC) {}
295f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
297f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
302f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  };
303f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
304f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
305f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
306f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  /// openbsd -- Directly call GNU Binutils assembler and linker
307f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarnamespace openbsd {
30892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
309f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
3103038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
3113038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
312f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
32192dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
3233038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
324f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
327f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
332ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  };
333e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace openbsd
334ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
33542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  /// bitrig -- Directly call GNU Binutils assembler and linker
33642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmannamespace bitrig {
33742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
33842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  public:
33942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
34042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                         TC) {}
34142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
34342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
34842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  };
34942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
35042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  public:
35142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
35242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
35542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
36042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  };
36142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} // end namespace bitrig
36242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
36368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  /// freebsd -- Directly call GNU Binutils assembler and linker
36468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarnamespace freebsd {
36592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
36668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  public:
3673038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
3683038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
36968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
37168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
37668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  };
37792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
378008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  public:
3793038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
380008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
383008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
388008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  };
389e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace freebsd
390e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  /// netbsd -- Directly call GNU Binutils assembler and linker
3928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramernamespace netbsd {
3938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
394182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
3958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  public:
3961bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger    Assemble(const ToolChain &TC)
3971bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      : Tool("netbsd::Assemble", "assembler", TC) {}
3988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
4008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
4058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  };
4068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
407182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
4088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  public:
4091bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger    Link(const ToolChain &TC)
4101bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      : Tool("netbsd::Link", "linker", TC) {}
4118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
4148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
4198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  };
4208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} // end namespace netbsd
4218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
422577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge  /// Directly call GNU Binutils' assembler and linker.
423577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwingenamespace gnutools {
424ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
425ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  public:
426577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge    Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
427ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
429ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
435ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  };
436c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
437c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  public:
438577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge    Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
439c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
442c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
448c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  };
449ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
45038e317d6dce161b249508686cc67eb7176958762Chris Lattner  /// minix -- Directly call GNU Binutils assembler and linker
45138e317d6dce161b249508686cc67eb7176958762Chris Lattnernamespace minix {
45238e317d6dce161b249508686cc67eb7176958762Chris Lattner  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
45338e317d6dce161b249508686cc67eb7176958762Chris Lattner  public:
45438e317d6dce161b249508686cc67eb7176958762Chris Lattner    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
45538e317d6dce161b249508686cc67eb7176958762Chris Lattner                                         TC) {}
45638e317d6dce161b249508686cc67eb7176958762Chris Lattner
457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
45838e317d6dce161b249508686cc67eb7176958762Chris Lattner
459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
46438e317d6dce161b249508686cc67eb7176958762Chris Lattner  };
46538e317d6dce161b249508686cc67eb7176958762Chris Lattner  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
46638e317d6dce161b249508686cc67eb7176958762Chris Lattner  public:
46738e317d6dce161b249508686cc67eb7176958762Chris Lattner    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
46838e317d6dce161b249508686cc67eb7176958762Chris Lattner
469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
47138e317d6dce161b249508686cc67eb7176958762Chris Lattner
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
47738e317d6dce161b249508686cc67eb7176958762Chris Lattner  };
47838e317d6dce161b249508686cc67eb7176958762Chris Lattner} // end namespace minix
47938e317d6dce161b249508686cc67eb7176958762Chris Lattner
48031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  /// solaris -- Directly call Solaris assembler and linker
48131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallnamespace solaris {
48231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
48331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  public:
48431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
48531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                         TC) {}
48631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
48831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
49331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  };
49431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
49531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  public:
49631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
49731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
50031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
50531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  };
506badb6cd2007825308208e6c4275ba54e220e4e28David Chisnall} // end namespace solaris
50731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
508e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  /// auroraux -- Directly call GNU Binutils assembler and linker
509e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghannamespace auroraux {
51092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
511e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
5123038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
5133038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
514e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
516e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
521e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
52292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
523e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
5243038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
525e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
528e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
534e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace auroraux
53568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
53611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  /// dragonfly -- Directly call GNU Binutils assembler and linker
53711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarnamespace dragonfly {
53892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
53911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
5403038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
5413038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
54211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
54411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
54911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
55092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
55111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
5523038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
55311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
55611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
56211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
563e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace dragonfly
56411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
565ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  /// Visual studio tools.
566ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencernamespace visualstudio {
567c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
568ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  public:
569ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
570ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
573ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
578ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  };
579c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
580c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
581c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  public:
582c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
583c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedAssembler() const override { return true; }
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return true; }
586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return false; }
587c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
592c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
593c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    Command *GetCommand(Compilation &C, const JobAction &JA,
594c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const InputInfo &Output,
595c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const InputInfoList &Inputs,
596c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const llvm::opt::ArgList &TCArgs,
597c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const char *LinkingOutput) const;
598c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  };
599ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} // end namespace visualstudio
600ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace arm {
602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         const llvm::Triple &Triple);
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
6054e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonnamespace XCore {
6064e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
6074e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // We simply use "clang -cc1" for those actions.
6084e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
6094e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  public:
6104e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
6114e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      "XCore-as", TC) {}
6124e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
6184e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  };
6194e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6204e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
6214e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  public:
6224e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    Link(const ToolChain &TC) : Tool("XCore::Link",
6234e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      "XCore-ld", TC) {}
6244e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
6314e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  };
6324e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} // end namespace XCore.
6334e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6344e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6359c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace toolchains
6369c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace driver
6379c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace clang
6389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
639e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan#endif // CLANG_LIB_DRIVER_TOOLS_H_
640