Tools.h revision e7925a075f110ab21afeae084670a155dea568e3
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 {
2402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  class Darwin_X86;
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
369c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
3731b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar    Clang(const ToolChain &TC) : Tool("clang", TC) {}
389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
399c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
409c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
419c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
4247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
4347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
44871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                              Job &Dest,
4562cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                              const InputInfo &Output,
4662cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                              const InputInfoList &Inputs,
4747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const ArgList &TCArgs,
4847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
499c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
509c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
5131b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar  /// gcc - Generic GCC tool implementations.
5231b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbarnamespace gcc {
53b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Common : public Tool {
549c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
55b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
5647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
5747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
58871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                              Job &Dest,
5962cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                              const InputInfo &Output,
6062cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                              const InputInfoList &Inputs,
6147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const ArgList &TCArgs,
6247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
63b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
64b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// RenderExtraToolArgs - Render any arguments necessary to force
65b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// the particular tool mode.
66b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
679c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
689c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
69b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
70b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Preprocess : public Common {
719c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
72b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
73b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
74b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
75b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
76b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
77b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
78b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
79b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  };
80b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
81b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Precompile : public Common  {
82b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  public:
83b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
849c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
859c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
869c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
879c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
8847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
89b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
909c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
919c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
92b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Compile : public Common  {
939c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
94b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
959c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
969c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
979c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
989c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
9947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
100b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
1019c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1029c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
103b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Common  {
1049c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
105b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
1069c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1079c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
1089c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1099c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
11047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
111b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
1129c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1139c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
114b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Common  {
1159c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
116b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
1179c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1189c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
1199c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1209c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
12147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
122b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
1239c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
12431b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar} // end namespace gcc
1259c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
126ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarnamespace darwin {
12740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN CC1 : public Tool  {
128a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  public:
129a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    static const char *getBaseInputName(const ArgList &Args,
130a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                 const InputInfoList &Input);
131a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    static const char *getBaseInputStem(const ArgList &Args,
132a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                 const InputInfoList &Input);
133a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    static const char *getDependencyFileName(const ArgList &Args,
134a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                             const InputInfoList &Inputs);
135a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
13640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  protected:
13740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    const char *getCC1Name(types::ID Type) const;
138a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
139a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
14040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
14140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                           const InputInfoList &Inputs,
142a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                           const ArgStringList &OutputArgs) const;
14340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
14440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                           const InputInfoList &Inputs,
145a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                           const ArgStringList &OutputArgs) const;
146a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCPPUniqueOptionsArgs(const ArgList &Args,
147a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                 ArgStringList &CmdArgs,
148a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                 const InputInfoList &Inputs) const;
149a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
15040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
15240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CC1(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
15340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
15540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
15640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
15740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
15840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN Preprocess : public CC1  {
16040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
16140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
16240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
16340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
16440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              Job &Dest,
16540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const InputInfo &Output,
16640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const InputInfoList &Inputs,
16740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const ArgList &TCArgs,
16840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const char *LinkingOutput) const;
16940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
17040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
17140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN Compile : public CC1  {
17240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
17340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
17440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
17540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
17640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              Job &Dest,
17740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const InputInfo &Output,
17840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const InputInfoList &Inputs,
17940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const ArgList &TCArgs,
18040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const char *LinkingOutput) const;
18140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
18240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
1838cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
1848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  public:
1858cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("darwin::Assemble", TC) {}
1868cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
1878cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
1888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1898cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
1908cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
1918cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
19202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              Job &Dest,
19302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const InputInfo &Output,
19402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const InputInfoList &Inputs,
19502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const ArgList &TCArgs,
19602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const char *LinkingOutput) const;
19702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  };
19802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
19902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
20002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
20102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
20202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
20302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    /// The default macosx-version-min.
20502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const char *MacosxVersionMin;
20602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const toolchains::Darwin_X86 &getDarwinToolChain() const;
20802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  public:
21002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Link(const ToolChain &TC,
21102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         const char *_MacosxVersionMin)
21202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      : Tool("darwin::Link", TC), MacosxVersionMin(_MacosxVersionMin) {
21302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
21402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
21602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
21702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
21802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              Job &Dest,
2218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const InputInfo &Output,
2228cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const InputInfoList &Inputs,
2238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const ArgList &TCArgs,
2248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const char *LinkingOutput) const;
2258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  };
2268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
227ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  class VISIBILITY_HIDDEN Lipo : public Tool  {
228ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  public:
2298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    Lipo(const ToolChain &TC) : Tool("darwin::Lipo", TC) {}
230ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
231ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
232ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
233ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
234ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
235ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
236ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              Job &Dest,
237ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const InputInfo &Output,
238f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const InputInfoList &Inputs,
239f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const ArgList &TCArgs,
240f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
241f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
242f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
243f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
244f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  /// openbsd -- Directly call GNU Binutils assembler and linker
245f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarnamespace openbsd {
246f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
247f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
248f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
249f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
250f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
251f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
252f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
253f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
254f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
255f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              Job &Dest,
256f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const InputInfo &Output,
257f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const InputInfoList &Inputs,
258f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const ArgList &TCArgs,
259f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
260f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
261f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
262f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
263f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
264f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
265f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
266f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
267f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
268f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
269f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
270f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              Job &Dest,
271f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const InputInfo &Output,
272ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const InputInfoList &Inputs,
273ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const ArgList &TCArgs,
274ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const char *LinkingOutput) const;
275ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  };
276e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace openbsd
277ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
27868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  /// freebsd -- Directly call GNU Binutils assembler and linker
27968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarnamespace freebsd {
28068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
28168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  public:
28268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
28368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
28468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
28568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
28668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
28768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
28868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
28968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              Job &Dest,
29068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const InputInfo &Output,
29168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const InputInfoList &Inputs,
29268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const ArgList &TCArgs,
29368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const char *LinkingOutput) const;
29468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  };
295008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
296008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  public:
297008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
298008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
299008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
300008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
301008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
302008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
303008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
304008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              Job &Dest,
305008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const InputInfo &Output,
306008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const InputInfoList &Inputs,
307008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const ArgList &TCArgs,
308008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const char *LinkingOutput) const;
309008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  };
310e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace freebsd
311e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
312e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  /// auroraux -- Directly call GNU Binutils assembler and linker
313e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghannamespace auroraux {
314e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  class VISIBILITY_HIDDEN Assemble : public Tool  {
315e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
316e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
317e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
318e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool acceptsPipedInput() const { return true; }
319e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool canPipeOutput() const { return true; }
320e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
321e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
322e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
323e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              Job &Dest,
324e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const InputInfo &Output,
325e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const InputInfoList &Inputs,
326e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const ArgList &TCArgs,
327e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
328e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
329e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  class VISIBILITY_HIDDEN Link : public Tool  {
330e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
331e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
332e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
333e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool acceptsPipedInput() const { return true; }
334e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool canPipeOutput() const { return true; }
335e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
336e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
337e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
338e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              Job &Dest,
339e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const InputInfo &Output,
340e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const InputInfoList &Inputs,
341e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const ArgList &TCArgs,
342e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
343e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
344e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace auroraux
34568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
34611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  /// dragonfly -- Directly call GNU Binutils assembler and linker
34711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarnamespace dragonfly {
34811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
34911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
35011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
35111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
35211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
35311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
35411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
35511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
35611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
35711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              Job &Dest,
35811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const InputInfo &Output,
35911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const InputInfoList &Inputs,
36011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const ArgList &TCArgs,
36111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
36211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
36311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
36411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
36511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
36611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
36711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
36811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
36911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
37011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
37111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
37211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              Job &Dest,
37311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const InputInfo &Output,
37411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const InputInfoList &Inputs,
37511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const ArgList &TCArgs,
37611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
37711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
378e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace dragonfly
37911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3809c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace toolchains
3819c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace driver
3829c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace clang
3839c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
384e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan#endif // CLANG_LIB_DRIVER_TOOLS_H_
385