Tools.h revision 6acda16e9c194dcbd0dea64341e182bdb65d0f41
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"
169c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
179c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar#include "llvm/Support/Compiler.h"
189c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
199c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbarnamespace clang {
209c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbarnamespace driver {
21df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  class Driver;
22df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
2302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarnamespace toolchains {
24f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar  class Darwin;
2502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
27985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace tools {
289c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
29985b825eea7387be10478de0430815ed6a673326Daniel Dunbar  class VISIBILITY_HIDDEN Clang : public Tool {
30df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    void AddPreprocessingOptions(const Driver &D,
31df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                 const ArgList &Args,
32c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 ArgStringList &CmdArgs,
33c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfo &Output,
34c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs) const;
35c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
366acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
3931b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar    Clang(const ToolChain &TC) : Tool("clang", TC) {}
409c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
419c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
429c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
439c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
4447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
4547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
46871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                              Job &Dest,
471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
5047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
519c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
529c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
5331b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar  /// gcc - Generic GCC tool implementations.
5431b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbarnamespace gcc {
55b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Common : public Tool {
569c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
57b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
5847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
5947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
60871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                              Job &Dest,
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
6447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
65b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
66b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// RenderExtraToolArgs - Render any arguments necessary to force
67b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// the particular tool mode.
68b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
699c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
709c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Preprocess : public Common {
739c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
74b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
75b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
76b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
77b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
78b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
79b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
80b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
81b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  };
82b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
83b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Precompile : public Common  {
84b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  public:
85b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
869c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
879c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
889c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
899c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
9047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
91b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
929c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
939c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
94b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Compile : public Common  {
959c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
96b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
979c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
989c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
999c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
1009c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
10147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
102b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
1039c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1049c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
105b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Common  {
1069c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
107b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
1089c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1099c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
1109c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1119c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
11247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
113b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
1149c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1159c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
116b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Common  {
1179c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
118b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
1199c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1209c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
1219c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1229c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
12347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
124b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
1259c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
12631b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar} // end namespace gcc
1279c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
128ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarnamespace darwin {
129fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN DarwinTool : public Tool {
130fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  protected:
131fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
132fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
133fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
134fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    const toolchains::Darwin &getDarwinToolChain() const {
135fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
136fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    }
137fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
138fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  public:
139fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {};
140fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  };
141fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
142fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN CC1 : public DarwinTool  {
143a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  public:
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static const char *getBaseInputName(const ArgList &Args,
145a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                 const InputInfoList &Input);
1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static const char *getBaseInputStem(const ArgList &Args,
147a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                 const InputInfoList &Input);
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static const char *getDependencyFileName(const ArgList &Args,
149a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                             const InputInfoList &Inputs);
150a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
15140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  protected:
15240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    const char *getCC1Name(types::ID Type) const;
153a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
154a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
15540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
15640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                           const InputInfoList &Inputs,
157a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                           const ArgStringList &OutputArgs) const;
15840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
15940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                           const InputInfoList &Inputs,
160a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                           const ArgStringList &OutputArgs) const;
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void AddCPPUniqueOptionsArgs(const ArgList &Args,
162a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                 ArgStringList &CmdArgs,
163a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                 const InputInfoList &Inputs) const;
164a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
16540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
16640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
167fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
16840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
16940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
17040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
17140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
17240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
17340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
17440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN Preprocess : public CC1  {
17540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
17640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
17740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
17840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
17940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              Job &Dest,
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
18340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const char *LinkingOutput) const;
18440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
18540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
18640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN Compile : public CC1  {
18740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
18840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
18940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
19040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
19140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              Job &Dest,
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
19540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const char *LinkingOutput) const;
19640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
19740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
198fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public DarwinTool  {
1998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  public:
200fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
2018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
2038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
2048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
2058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
20702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              Job &Dest,
2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
21102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const char *LinkingOutput) const;
21202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  };
21302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
214fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN Link : public DarwinTool  {
21502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
21602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  public:
218fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
21902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
22002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
22102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
22202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
22302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
22402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              Job &Dest,
2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
2298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const char *LinkingOutput) const;
2308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  };
2318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
232fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN Lipo : public DarwinTool  {
233ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  public:
234fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
235ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
236ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
237ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
238ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
239ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
240ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
241ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              Job &Dest,
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
245f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
246f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
247f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
248f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
249f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  /// openbsd -- Directly call GNU Binutils assembler and linker
250f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarnamespace openbsd {
251f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
252f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
253f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
254f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
255f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
256f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
257f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
258f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
259f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
260f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              Job &Dest,
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
264f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
265f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
266f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
267f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
268f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
269f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
270f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
271f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
272f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
273f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
274f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
275f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              Job &Dest,
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
279ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const char *LinkingOutput) const;
280ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  };
281e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace openbsd
282ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
28368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  /// freebsd -- Directly call GNU Binutils assembler and linker
28468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarnamespace freebsd {
28568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
28668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  public:
28768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
28868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
28968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
29068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
29168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
29268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
29368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
29468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              Job &Dest,
2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
29868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const char *LinkingOutput) const;
29968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  };
300008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
301008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  public:
302008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
303008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
304008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
305008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
306008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
307008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
308008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
309008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              Job &Dest,
3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
313008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const char *LinkingOutput) const;
314008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  };
315e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace freebsd
316e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
317e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  /// auroraux -- Directly call GNU Binutils assembler and linker
318e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghannamespace auroraux {
319e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  class VISIBILITY_HIDDEN Assemble : public Tool  {
320e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
321e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
322e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
323e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool acceptsPipedInput() const { return true; }
324e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool canPipeOutput() const { return true; }
325e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
326e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
327e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
328e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              Job &Dest,
3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
332e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
333e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
334e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  class VISIBILITY_HIDDEN Link : public Tool  {
335e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
336e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
337e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
338e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool acceptsPipedInput() const { return true; }
339e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool canPipeOutput() const { return true; }
340e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
341e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
342e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
343e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              Job &Dest,
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
347e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
348e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
349e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace auroraux
35068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
35111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  /// dragonfly -- Directly call GNU Binutils assembler and linker
35211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarnamespace dragonfly {
35311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
35411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
35511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
35611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
35711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
35811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
35911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
36011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
36111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
36211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              Job &Dest,
3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
36611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
36711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
36811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
36911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
37011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
37111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
37211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
37311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
37411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
37511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
37611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
37711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              Job &Dest,
3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
38111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
38211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
383e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace dragonfly
38411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3859c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace toolchains
3869c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace driver
3879c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace clang
3889c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
389e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan#endif // CLANG_LIB_DRIVER_TOOLS_H_
390