Tools.h revision 4e490e271ce3f0d4289b5115e000b55333c1b829
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 {
28f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar  class Darwin;
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
52dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddARMTargetArgs(const llvm::opt::ArgList &Args,
53dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                          llvm::opt::ArgStringList &CmdArgs,
54fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar                          bool KernelOrKext) const;
55dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
56dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                           llvm::opt::ArgStringList &CmdArgs) const;
57dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddR600TargetArgs(const llvm::opt::ArgList &Args,
58dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                           llvm::opt::ArgStringList &CmdArgs) const;
59dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
60dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                            llvm::opt::ArgStringList &CmdArgs) const;
615c92b9ab4e4dce3233ea3e400a02c443f9afd372Richard Sandiford    void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
625c92b9ab4e4dce3233ea3e400a02c443f9afd372Richard Sandiford                              llvm::opt::ArgStringList &CmdArgs) const;
63dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddX86TargetArgs(const llvm::opt::ArgList &Args,
64dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                          llvm::opt::ArgStringList &CmdArgs) const;
65dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
66dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              llvm::opt::ArgStringList &CmdArgs) const;
676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
68260611a32535c851237926bfcf78869b13c07d5bJohn McCall    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
69260611a32535c851237926bfcf78869b13c07d5bJohn McCall
70dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
71dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                   llvm::opt::ArgStringList &cmdArgs,
72260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                   RewriteKind rewrite) const;
73260611a32535c851237926bfcf78869b13c07d5bJohn McCall
74b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg    void AddClangCLArgs(const llvm::opt::ArgList &Args,
75b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg                        llvm::opt::ArgStringList &CmdArgs) const;
76b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg
779c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
783038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
799c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
8060a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
818767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    virtual bool hasIntegratedAssembler() const { return true; }
829c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
8347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
8447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
8520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                              const InputInfo &Output,
8620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                              const InputInfoList &Inputs,
87dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
8820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                              const char *LinkingOutput) const;
8920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  };
9020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
9120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  /// \brief Clang integrated assembler tool.
9220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
9320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  public:
943038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    ClangAs(const ToolChain &TC) : Tool("clang::as",
953038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                        "clang integrated assembler", TC) {}
9620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
9720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
9820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar    virtual bool hasIntegratedAssembler() const { return false; }
9920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
10020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
10120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
104dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
10547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
1069c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1079c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
10831b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar  /// gcc - Generic GCC tool implementations.
10931b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbarnamespace gcc {
11092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
1119c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1123038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Common(const char *Name, const char *ShortName,
1133038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
11447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
11547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
118dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
11947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
120b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
121b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// RenderExtraToolArgs - Render any arguments necessary to force
122b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// the particular tool mode.
123dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    virtual void
124dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner        RenderExtraToolArgs(const JobAction &JA,
125dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                            llvm::opt::ArgStringList &CmdArgs) const = 0;
1269c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1279c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
12892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
1299c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1303038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
1313038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                             "gcc preprocessor", TC) {}
132b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
13360a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
134b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
135b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
13682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
137dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
138b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  };
139b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
14092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
141b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  public:
1423038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Precompile(const ToolChain &TC) : Common("gcc::Precompile",
1433038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                             "gcc precompile", TC) {}
1449c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
14560a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
1469c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
14747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
14882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
149dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
1509c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1519c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
15292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
1539c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1543038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Compile(const ToolChain &TC) : Common("gcc::Compile",
1553038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                          "gcc frontend", TC) {}
1569c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
15760a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
1589c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
15947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
16082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
161dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
1629c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1639c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
16492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
1659c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1663038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Common("gcc::Assemble",
1673038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                           "assembler (via gcc)", TC) {}
1689c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1699c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
17047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
17182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
172dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
1739c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1749c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
17592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
1769c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1773038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Common("gcc::Link",
1783038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                       "linker (via gcc)", TC) {}
1799c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1809c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
1818ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
18247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
18382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
184dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
1859c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
18631b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar} // end namespace gcc
1879c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumnamespace hexagon {
1899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
1909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // We simply use "clang -cc1" for those actions.
1919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
1929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  public:
1939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
1949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      "hexagon-as", TC) {}
1959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual bool hasIntegratedCPP() const { return false; }
1979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual void RenderExtraToolArgs(const JobAction &JA,
199dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
2009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                              const InputInfo &Output,
2029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                              const InputInfoList &Inputs,
203dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
2049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                              const char *LinkingOutput) const;
2059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  };
2069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
2089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  public:
2099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Link(const ToolChain &TC) : Tool("hexagon::Link",
2109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      "hexagon-ld", TC) {}
2119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual bool hasIntegratedCPP() const { return false; }
2138ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
2149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual void RenderExtraToolArgs(const JobAction &JA,
216dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
2179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                              const InputInfo &Output,
2199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                              const InputInfoList &Inputs,
220dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
2219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                              const char *LinkingOutput) const;
2229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  };
2239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} // end namespace hexagon.
2249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
226ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarnamespace darwin {
227cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
228cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola
22992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
23099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie    virtual void anchor();
231fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  protected:
232dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddDarwinArch(const llvm::opt::ArgList &Args,
233dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                       llvm::opt::ArgStringList &CmdArgs) const;
234fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
235fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    const toolchains::Darwin &getDarwinToolChain() const {
236fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
237fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    }
238fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
239fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  public:
2403038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    DarwinTool(const char *Name, const char *ShortName,
2413038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
242fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  };
243fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
24492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
2458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  public:
2463038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
2473038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                               "assembler", TC) {}
2488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2498cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
2508cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2518cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
254dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
25502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const char *LinkingOutput) const;
25602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  };
25702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
25892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
2596acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling    bool NeedsTempPath(const InputInfoList &Inputs) const;
260dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
261dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                     llvm::opt::ArgStringList &CmdArgs,
262dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                     const InputInfoList &Inputs) const;
26302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
26402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  public:
2653038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
26602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
26702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
2688ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
26902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
27002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
273dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
2748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const char *LinkingOutput) const;
2758cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  };
2768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
27792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
278ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  public:
2793038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
280ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
281ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
282ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
283ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
286dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
2876e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                              const char *LinkingOutput) const;
2886e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  };
2896e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
2906e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
2916e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  public:
2926e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
2936e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                               "dsymutil", TC) {}
2946e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
2956e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
29675dbc717c21a662b7836ed34cc4e7da7b8fa33c0Chad Rosier    virtual bool isDsymutilJob() const { return true; }
2976e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
2986e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2996e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                              const InputInfo &Output,
3006e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                              const InputInfoList &Inputs,
301dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
302f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
303f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
304f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
305f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
306f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  public:
307f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
30827e2b983beb8b5a29869639637327725623069a8Eric Christopher                                                  "dwarfdump", TC) {}
309f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
310f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    virtual bool hasIntegratedCPP() const { return false; }
311f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
312f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    virtual void ConstructJob(Compilation &C, const JobAction &JA,
31327e2b983beb8b5a29869639637327725623069a8Eric Christopher                              const InputInfo &Output,
31427e2b983beb8b5a29869639637327725623069a8Eric Christopher                              const InputInfoList &Inputs,
315dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
31627e2b983beb8b5a29869639637327725623069a8Eric Christopher                              const char *LinkingOutput) const;
317f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  };
318f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
321f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  /// openbsd -- Directly call GNU Binutils assembler and linker
322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarnamespace openbsd {
32392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
324f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
3253038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
3263038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
327f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
328f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
329f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
333dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
334f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
335f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
33692dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
337f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
3383038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
339f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
340f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
3418ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
342f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
343f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
346dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
347ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const char *LinkingOutput) const;
348ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  };
349e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace openbsd
350ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
35142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  /// bitrig -- Directly call GNU Binutils assembler and linker
35242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmannamespace bitrig {
35342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
35442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  public:
35542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
35642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                         TC) {}
35742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
35842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    virtual bool hasIntegratedCPP() const { return false; }
35942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
36042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    virtual void ConstructJob(Compilation &C, const JobAction &JA,
36142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              const InputInfo &Output,
36242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              const InputInfoList &Inputs,
363dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
36442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              const char *LinkingOutput) const;
36542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  };
36642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
36742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  public:
36842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
36942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
37042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    virtual bool hasIntegratedCPP() const { return false; }
37142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    virtual bool isLinkJob() const { return true; }
37242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
37342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    virtual void ConstructJob(Compilation &C, const JobAction &JA,
37442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              const InputInfo &Output,
37542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              const InputInfoList &Inputs,
376dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
37742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              const char *LinkingOutput) const;
37842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  };
37942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} // end namespace bitrig
38042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
38168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  /// freebsd -- Directly call GNU Binutils assembler and linker
38268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarnamespace freebsd {
38392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
38468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  public:
3853038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
3863038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
38768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
38868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
38968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
39068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
393dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
39468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const char *LinkingOutput) const;
39568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  };
39692dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
397008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  public:
3983038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
399008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
400008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
4018ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
402008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
403008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
406dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
407008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const char *LinkingOutput) const;
408008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  };
409e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace freebsd
410e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  /// netbsd -- Directly call GNU Binutils assembler and linker
4128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramernamespace netbsd {
4138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
414182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
4158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  public:
4161bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger    Assemble(const ToolChain &TC)
4171bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      : Tool("netbsd::Assemble", "assembler", TC) {}
4188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
4198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    virtual bool hasIntegratedCPP() const { return false; }
4208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
4218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    virtual void ConstructJob(Compilation &C, const JobAction &JA,
4228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              const InputInfo &Output,
4238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              const InputInfoList &Inputs,
424dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
4258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              const char *LinkingOutput) const;
4268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  };
4278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
428182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
4298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  public:
4301bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger    Link(const ToolChain &TC)
4311bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      : Tool("netbsd::Link", "linker", TC) {}
4328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
4338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    virtual bool hasIntegratedCPP() const { return false; }
4348ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
4358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
4368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    virtual void ConstructJob(Compilation &C, const JobAction &JA,
4378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              const InputInfo &Output,
4388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              const InputInfoList &Inputs,
439dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
4408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              const char *LinkingOutput) const;
4418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  };
4428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} // end namespace netbsd
4438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
444577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge  /// Directly call GNU Binutils' assembler and linker.
445577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwingenamespace gnutools {
446ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
447ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  public:
448577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge    Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
449ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
450ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    virtual bool hasIntegratedCPP() const { return false; }
451ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
452ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    virtual void ConstructJob(Compilation &C, const JobAction &JA,
453ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                              const InputInfo &Output,
454ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                              const InputInfoList &Inputs,
455dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
456ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                              const char *LinkingOutput) const;
457ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  };
458c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
459c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  public:
460577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge    Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
461c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
462c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    virtual bool hasIntegratedCPP() const { return false; }
4638ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
464c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
465c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    virtual void ConstructJob(Compilation &C, const JobAction &JA,
466c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                              const InputInfo &Output,
467c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                              const InputInfoList &Inputs,
468dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
469c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                              const char *LinkingOutput) const;
470c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  };
471ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
47238e317d6dce161b249508686cc67eb7176958762Chris Lattner  /// minix -- Directly call GNU Binutils assembler and linker
47338e317d6dce161b249508686cc67eb7176958762Chris Lattnernamespace minix {
47438e317d6dce161b249508686cc67eb7176958762Chris Lattner  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
47538e317d6dce161b249508686cc67eb7176958762Chris Lattner  public:
47638e317d6dce161b249508686cc67eb7176958762Chris Lattner    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
47738e317d6dce161b249508686cc67eb7176958762Chris Lattner                                         TC) {}
47838e317d6dce161b249508686cc67eb7176958762Chris Lattner
47938e317d6dce161b249508686cc67eb7176958762Chris Lattner    virtual bool hasIntegratedCPP() const { return false; }
48038e317d6dce161b249508686cc67eb7176958762Chris Lattner
48138e317d6dce161b249508686cc67eb7176958762Chris Lattner    virtual void ConstructJob(Compilation &C, const JobAction &JA,
48238e317d6dce161b249508686cc67eb7176958762Chris Lattner                              const InputInfo &Output,
48338e317d6dce161b249508686cc67eb7176958762Chris Lattner                              const InputInfoList &Inputs,
484dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
48538e317d6dce161b249508686cc67eb7176958762Chris Lattner                              const char *LinkingOutput) const;
48638e317d6dce161b249508686cc67eb7176958762Chris Lattner  };
48738e317d6dce161b249508686cc67eb7176958762Chris Lattner  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
48838e317d6dce161b249508686cc67eb7176958762Chris Lattner  public:
48938e317d6dce161b249508686cc67eb7176958762Chris Lattner    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
49038e317d6dce161b249508686cc67eb7176958762Chris Lattner
49138e317d6dce161b249508686cc67eb7176958762Chris Lattner    virtual bool hasIntegratedCPP() const { return false; }
4928ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
49338e317d6dce161b249508686cc67eb7176958762Chris Lattner
49438e317d6dce161b249508686cc67eb7176958762Chris Lattner    virtual void ConstructJob(Compilation &C, const JobAction &JA,
49538e317d6dce161b249508686cc67eb7176958762Chris Lattner                              const InputInfo &Output,
49638e317d6dce161b249508686cc67eb7176958762Chris Lattner                              const InputInfoList &Inputs,
497dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
49838e317d6dce161b249508686cc67eb7176958762Chris Lattner                              const char *LinkingOutput) const;
49938e317d6dce161b249508686cc67eb7176958762Chris Lattner  };
50038e317d6dce161b249508686cc67eb7176958762Chris Lattner} // end namespace minix
50138e317d6dce161b249508686cc67eb7176958762Chris Lattner
50231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  /// solaris -- Directly call Solaris assembler and linker
50331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallnamespace solaris {
50431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
50531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  public:
50631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
50731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                         TC) {}
50831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
50931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    virtual bool hasIntegratedCPP() const { return false; }
51031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
51131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    virtual void ConstructJob(Compilation &C, const JobAction &JA,
51231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                              const InputInfo &Output,
51331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                              const InputInfoList &Inputs,
514dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
51531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                              const char *LinkingOutput) const;
51631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  };
51731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
51831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  public:
51931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
52031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
52131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    virtual bool hasIntegratedCPP() const { return false; }
5228ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
52331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
52431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    virtual void ConstructJob(Compilation &C, const JobAction &JA,
52531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                              const InputInfo &Output,
52631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                              const InputInfoList &Inputs,
527dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
52831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                              const char *LinkingOutput) const;
52931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  };
530badb6cd2007825308208e6c4275ba54e220e4e28David Chisnall} // end namespace solaris
53131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
532e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  /// auroraux -- Directly call GNU Binutils assembler and linker
533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghannamespace auroraux {
53492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
535e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
5363038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
5373038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
538e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
539e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
540e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
541e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
5421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
544dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
545e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
546e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
54792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
548e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
5493038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
550e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
551e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
5528ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
553e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
554e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
5551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
5561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
557dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
558e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
559e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
560e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace auroraux
56168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
56211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  /// dragonfly -- Directly call GNU Binutils assembler and linker
56311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarnamespace dragonfly {
56492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
56511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
5663038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
5673038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
56811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
56911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
57011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
57111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
5721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
5731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
574dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
57511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
57611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
57792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
57811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
5793038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
58011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
58111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
5828ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
58311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
58411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
5861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
587dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
58811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
58911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
590e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace dragonfly
59111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
592ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  /// Visual studio tools.
593ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencernamespace visualstudio {
594c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
595ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  public:
596ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
597ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
598ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    virtual bool hasIntegratedCPP() const { return false; }
5998ba9a6244c56b19bc2a24de5d0c32ff37d50177bChad Rosier    virtual bool isLinkJob() const { return true; }
600ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
601ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    virtual void ConstructJob(Compilation &C, const JobAction &JA,
602ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                              const InputInfo &Output,
603ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                              const InputInfoList &Inputs,
604dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              const llvm::opt::ArgList &TCArgs,
605ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                              const char *LinkingOutput) const;
606ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  };
607c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
608c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
609c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  public:
610c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
611c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
612c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    virtual bool hasIntegratedAssembler() const { return true; }
613c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    virtual bool hasIntegratedCPP() const { return true; }
614c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    virtual bool isLinkJob() const { return false; }
615c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
616c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    virtual void ConstructJob(Compilation &C, const JobAction &JA,
617c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                              const InputInfo &Output,
618c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                              const InputInfoList &Inputs,
619c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                              const llvm::opt::ArgList &TCArgs,
620c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                              const char *LinkingOutput) const;
621c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
622c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    Command *GetCommand(Compilation &C, const JobAction &JA,
623c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const InputInfo &Output,
624c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const InputInfoList &Inputs,
625c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const llvm::opt::ArgList &TCArgs,
626c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const char *LinkingOutput) const;
627c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  };
628ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} // end namespace visualstudio
629ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6304e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonnamespace XCore {
6314e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
6324e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // We simply use "clang -cc1" for those actions.
6334e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
6344e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  public:
6354e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
6364e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      "XCore-as", TC) {}
6374e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6384e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    virtual bool hasIntegratedCPP() const { return false; }
6394e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    virtual void ConstructJob(Compilation &C, const JobAction &JA,
6404e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const InputInfo &Output,
6414e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const InputInfoList &Inputs,
6424e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const llvm::opt::ArgList &TCArgs,
6434e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const char *LinkingOutput) const;
6444e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  };
6454e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6464e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
6474e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  public:
6484e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    Link(const ToolChain &TC) : Tool("XCore::Link",
6494e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      "XCore-ld", TC) {}
6504e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6514e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    virtual bool hasIntegratedCPP() const { return false; }
6524e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    virtual bool isLinkJob() const { return true; }
6534e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    virtual void ConstructJob(Compilation &C, const JobAction &JA,
6544e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const InputInfo &Output,
6554e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const InputInfoList &Inputs,
6564e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const llvm::opt::ArgList &TCArgs,
6574e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                              const char *LinkingOutput) const;
6584e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  };
6594e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} // end namespace XCore.
6604e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6614e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6629c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace toolchains
6639c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace driver
6649c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace clang
6659c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
666e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan#endif // CLANG_LIB_DRIVER_TOOLS_H_
667