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 {
32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
33ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace visualstudio {
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  class Compile;
35ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
37b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing llvm::opt::ArgStringList;
389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
3920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  /// \brief Clang compiler tool.
4092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
4127e2b983beb8b5a29869639637327725623069a8Eric Christopher  public:
42dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    static const char *getBaseInputName(const llvm::opt::ArgList &Args,
4366b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                        const InputInfoList &Inputs);
44dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
4566b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                        const InputInfoList &Inputs);
46dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
4766b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                             const InputInfoList &Inputs);
4866b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson
4927e2b983beb8b5a29869639637327725623069a8Eric Christopher  private:
50dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
5154db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne                                 const Driver &D,
52dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                 const llvm::opt::ArgList &Args,
53dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                 llvm::opt::ArgStringList &CmdArgs,
54c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfo &Output,
55c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs) const;
56c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
573bb1b5c953fc38d4b87525258cf27b7c908988b1Amara Emerson    void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
583bb1b5c953fc38d4b87525258cf27b7c908988b1Amara Emerson                              llvm::opt::ArgStringList &CmdArgs) const;
59dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddARMTargetArgs(const llvm::opt::ArgList &Args,
60dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                          llvm::opt::ArgStringList &CmdArgs,
61fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar                          bool KernelOrKext) const;
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            llvm::opt::ArgStringList &CmdArgs) const;
64dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
65dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                           llvm::opt::ArgStringList &CmdArgs) const;
66dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddR600TargetArgs(const llvm::opt::ArgList &Args,
67dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                           llvm::opt::ArgStringList &CmdArgs) const;
68dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
69dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                            llvm::opt::ArgStringList &CmdArgs) const;
705c92b9ab4e4dce3233ea3e400a02c443f9afd372Richard Sandiford    void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
715c92b9ab4e4dce3233ea3e400a02c443f9afd372Richard Sandiford                              llvm::opt::ArgStringList &CmdArgs) const;
72dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddX86TargetArgs(const llvm::opt::ArgList &Args,
73dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                          llvm::opt::ArgStringList &CmdArgs) const;
74dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
75dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                              llvm::opt::ArgStringList &CmdArgs) const;
766acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
77260611a32535c851237926bfcf78869b13c07d5bJohn McCall    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
78260611a32535c851237926bfcf78869b13c07d5bJohn McCall
79dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
80dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                   llvm::opt::ArgStringList &cmdArgs,
81260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                   RewriteKind rewrite) const;
82260611a32535c851237926bfcf78869b13c07d5bJohn McCall
83b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg    void AddClangCLArgs(const llvm::opt::ArgList &Args,
84b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg                        llvm::opt::ArgStringList &CmdArgs) const;
85b3574796d7cc0113e54b6516fc16e17ca09459fbHans Wennborg
86ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    visualstudio::Compile *getCLFallback() const;
87ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
88ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    mutable std::unique_ptr<visualstudio::Compile> CLFallback;
89ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
909c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
913038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
929c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedAssembler() const override { return true; }
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return true; }
9647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
10120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  };
10220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
10320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  /// \brief Clang integrated assembler tool.
10420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
10520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  public:
1063038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    ClangAs(const ToolChain &TC) : Tool("clang::as",
1073038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                        "clang integrated assembler", TC) {}
10820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedAssembler() const override { return false; }
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
11220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
1179c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1189c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
11931b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar  /// gcc - Generic GCC tool implementations.
12031b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbarnamespace gcc {
12192dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
1229c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1233038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Common(const char *Name, const char *ShortName,
1243038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
12547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
131b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
132b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// RenderExtraToolArgs - Render any arguments necessary to force
133b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// the particular tool mode.
134dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    virtual void
135dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner        RenderExtraToolArgs(const JobAction &JA,
136dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                            llvm::opt::ArgStringList &CmdArgs) const = 0;
1379c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
13992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
1409c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1413038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
1423038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                             "gcc preprocessor", TC) {}
143b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
14647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const override;
1499c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1509c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
15192dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
1529c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1533038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Compile(const ToolChain &TC) : Common("gcc::Compile",
1543038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                          "gcc frontend", TC) {}
1559c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasGoodDiagnostics() const override { return true; }
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return true; }
15847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const override;
1619c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1629c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
16392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
1649c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
1653038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Common("gcc::Link",
1663038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                       "linker (via gcc)", TC) {}
1679c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
17047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const override;
1739c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
17431b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar} // end namespace gcc
1759c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumnamespace hexagon {
1779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
1789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // We simply use "clang -cc1" for those actions.
1799631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
1809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  public:
1819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
1829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      "hexagon-as", TC) {}
1839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
1859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void RenderExtraToolArgs(const JobAction &JA,
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                             llvm::opt::ArgStringList &CmdArgs) const;
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
1929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  };
1939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
1959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  public:
1969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Link(const ToolChain &TC) : Tool("hexagon::Link",
1979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      "hexagon-ld", TC) {}
1989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
2019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    virtual void RenderExtraToolArgs(const JobAction &JA,
203dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                     llvm::opt::ArgStringList &CmdArgs) const;
204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
2089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  };
2099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} // end namespace hexagon.
2109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace arm {
212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            const llvm::Triple &Triple);
214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                const llvm::Triple &Triple);
216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char* getLLVMArchSuffixForARM(StringRef CPU);
217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace mips {
220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
224ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarnamespace darwin {
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
227cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola
228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
22999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie    virtual void anchor();
230fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  protected:
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void AddMachOArch(const llvm::opt::ArgList &Args,
232dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                       llvm::opt::ArgStringList &CmdArgs) const;
233fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const toolchains::MachO &getMachOToolChain() const {
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return reinterpret_cast<const toolchains::MachO&>(getToolChain());
236fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    }
237fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
238fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  public:
239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    MachOTool(const char *Name, const char *ShortName,
2403038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
241fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  };
242fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool  {
2448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  public:
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              "assembler", TC) {}
2478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
2498cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
25402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  };
25502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Link : public MachOTool  {
2576acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling    bool NeedsTempPath(const InputInfoList &Inputs) const;
258dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner    void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
259dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                     llvm::opt::ArgStringList &CmdArgs,
260dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                     const InputInfoList &Inputs) const;
26102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
26202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  public:
263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC) {}
26402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
26702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
2728cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  };
2738cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool  {
275ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  public:
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
277ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
279ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
2846e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  };
2856e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool  {
2876e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  public:
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              "dsymutil", TC) {}
2906e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isDsymutilJob() const override { return true; }
2936e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
299f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
300f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool  {
302f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  public:
303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                 "dwarfdump", TC) {}
305f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
307f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
312f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  };
313f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
315f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
316f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  /// openbsd -- Directly call GNU Binutils assembler and linker
317f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarnamespace openbsd {
31892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
3203038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
3213038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
324f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
33192dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
3333038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
334f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
337f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
342ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  };
343e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace openbsd
344ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
34542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  /// bitrig -- Directly call GNU Binutils assembler and linker
34642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmannamespace bitrig {
34742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
34842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  public:
34942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
35042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                         TC) {}
35142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
35342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
35842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  };
35942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
36042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  public:
36142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
36242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
36542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
37042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  };
37142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} // end namespace bitrig
37242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
37368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  /// freebsd -- Directly call GNU Binutils assembler and linker
37468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarnamespace freebsd {
37592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
37668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  public:
3773038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
3783038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
37968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
38168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
38668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  };
38792dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
388008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  public:
3893038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
390008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
393008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
398008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  };
399e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace freebsd
400e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  /// netbsd -- Directly call GNU Binutils assembler and linker
4028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramernamespace netbsd {
4038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
404182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
4058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  public:
4061bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger    Assemble(const ToolChain &TC)
4071bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      : Tool("netbsd::Assemble", "assembler", TC) {}
4088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
4108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
4158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  };
4168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
417182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
4188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  public:
4191bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger    Link(const ToolChain &TC)
4201bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      : Tool("netbsd::Link", "linker", TC) {}
4218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
4248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
4298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  };
4308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} // end namespace netbsd
4318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
432577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge  /// Directly call GNU Binutils' assembler and linker.
433577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwingenamespace gnutools {
434ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
435ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  public:
436577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge    Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
437ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
439ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
445ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  };
446c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
447c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  public:
448577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge    Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
449c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
452c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
458c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  };
459ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
46038e317d6dce161b249508686cc67eb7176958762Chris Lattner  /// minix -- Directly call GNU Binutils assembler and linker
46138e317d6dce161b249508686cc67eb7176958762Chris Lattnernamespace minix {
46238e317d6dce161b249508686cc67eb7176958762Chris Lattner  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
46338e317d6dce161b249508686cc67eb7176958762Chris Lattner  public:
46438e317d6dce161b249508686cc67eb7176958762Chris Lattner    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
46538e317d6dce161b249508686cc67eb7176958762Chris Lattner                                         TC) {}
46638e317d6dce161b249508686cc67eb7176958762Chris Lattner
467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
46838e317d6dce161b249508686cc67eb7176958762Chris Lattner
469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
47438e317d6dce161b249508686cc67eb7176958762Chris Lattner  };
47538e317d6dce161b249508686cc67eb7176958762Chris Lattner  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
47638e317d6dce161b249508686cc67eb7176958762Chris Lattner  public:
47738e317d6dce161b249508686cc67eb7176958762Chris Lattner    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
47838e317d6dce161b249508686cc67eb7176958762Chris Lattner
479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
48138e317d6dce161b249508686cc67eb7176958762Chris Lattner
482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
48738e317d6dce161b249508686cc67eb7176958762Chris Lattner  };
48838e317d6dce161b249508686cc67eb7176958762Chris Lattner} // end namespace minix
48938e317d6dce161b249508686cc67eb7176958762Chris Lattner
49031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  /// solaris -- Directly call Solaris assembler and linker
49131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallnamespace solaris {
49231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
49331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  public:
49431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
49531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                         TC) {}
49631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
49831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
50331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  };
50431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
50531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  public:
50631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
50731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
51031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
51531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  };
516badb6cd2007825308208e6c4275ba54e220e4e28David Chisnall} // end namespace solaris
51731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
518e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  /// auroraux -- Directly call GNU Binutils assembler and linker
519e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghannamespace auroraux {
52092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
521e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
5223038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
5233038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
524e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
526e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
531e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
53292dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
5343038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
535e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
538e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
543e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
544e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace auroraux
54568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
54611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  /// dragonfly -- Directly call GNU Binutils assembler and linker
54711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarnamespace dragonfly {
54892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
54911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
5503038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
5513038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar                                         TC) {}
55211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
55411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
55911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
56092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sands  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
56111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
5623038204fd8f6ff22082dd18e4b12ed252b75a5e4Daniel Dunbar    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
56311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
56611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output,
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfoList &Inputs,
570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
57211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
573e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace dragonfly
57411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
575ef8225444452a1486bd721f3285301fe84643b00Stephen Hines/// Visual studio tools.
576ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencernamespace visualstudio {
577c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
578ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  public:
579ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
580ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
583ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
588ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  };
589c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
590c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
591c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  public:
592c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
593c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedAssembler() const override { return true; }
595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return true; }
596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return false; }
597c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
602c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
603c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    Command *GetCommand(Compilation &C, const JobAction &JA,
604c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const InputInfo &Output,
605c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const InputInfoList &Inputs,
606c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const llvm::opt::ArgList &TCArgs,
607c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                        const char *LinkingOutput) const;
608c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  };
609ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} // end namespace visualstudio
610ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace arm {
612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         const llvm::Triple &Triple);
614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
6154e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonnamespace XCore {
6164e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
6174e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // We simply use "clang -cc1" for those actions.
6184e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
6194e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  public:
6204e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
6214e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      "XCore-as", TC) {}
6224e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
6284e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  };
6294e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6304e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
6314e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  public:
6324e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    Link(const ToolChain &TC) : Tool("XCore::Link",
6334e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      "XCore-ld", TC) {}
6344e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool hasIntegratedCPP() const override { return false; }
636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool isLinkJob() const override { return true; }
637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void ConstructJob(Compilation &C, const JobAction &JA,
638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const InputInfo &Output, const InputInfoList &Inputs,
639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const llvm::opt::ArgList &TCArgs,
640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      const char *LinkingOutput) const override;
6414e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  };
6424e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} // end namespace XCore.
6434e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6444e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
6459c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace toolchains
6469c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace driver
6479c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace clang
6489c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
649e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan#endif // CLANG_LIB_DRIVER_TOOLS_H_
650