Tools.h revision 60a53f24b160724de0e8dd0e142009981540fd26
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
36b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
37ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
409c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
4131b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar    Clang(const ToolChain &TC) : Tool("clang", TC) {}
429c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
439c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
449c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
4560a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
468767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    virtual bool hasIntegratedAssembler() const { return true; }
479c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
4847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
4947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
50871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                              Job &Dest,
511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
5447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
559c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
569c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
5731b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar  /// gcc - Generic GCC tool implementations.
5831b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbarnamespace gcc {
59b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Common : public Tool {
609c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
61b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
6247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
6347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
64871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                              Job &Dest,
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
6847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                              const char *LinkingOutput) const;
69b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
70b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// RenderExtraToolArgs - Render any arguments necessary to force
71b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    /// the particular tool mode.
7282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
7382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
749c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
759c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Preprocess : public Common {
789c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
79b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
80b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
81b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
82b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
8360a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
84b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
85b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
8682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
8782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                     ArgStringList &CmdArgs) const;
88b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  };
89b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
90b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Precompile : public Common  {
91b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  public:
92b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
939c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
949c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
959c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
9660a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
979c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
9847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
9982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
10082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                     ArgStringList &CmdArgs) const;
1019c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1029c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
103b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Compile : public Common  {
1049c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
105b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
1069c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1079c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
1089c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
10960a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
1109c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
11147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
11282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
11382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                     ArgStringList &CmdArgs) const;
1149c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1159c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
116b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Common  {
1179c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
118b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
1199c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1209c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
1219c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1229c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
12347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
12482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
12582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                     ArgStringList &CmdArgs) const;
1269c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
1279c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
128b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Common  {
1299c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  public:
130b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
1319c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
1329c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
1339c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
1349c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
13547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
13682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    virtual void RenderExtraToolArgs(const JobAction &JA,
13782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                     ArgStringList &CmdArgs) const;
1389c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar  };
13931b1e5437e7435879fc044afb77ff27096008e72Daniel Dunbar} // end namespace gcc
1409c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
141ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarnamespace darwin {
142fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN DarwinTool : public Tool {
143fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  protected:
144fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
145fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
146fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    const toolchains::Darwin &getDarwinToolChain() const {
147fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
148fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    }
149fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
150fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  public:
1517177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar    DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
152fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  };
153fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar
154fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN CC1 : public DarwinTool  {
155a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  public:
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static const char *getBaseInputName(const ArgList &Args,
157a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                 const InputInfoList &Input);
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static const char *getBaseInputStem(const ArgList &Args,
159a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                 const InputInfoList &Input);
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static const char *getDependencyFileName(const ArgList &Args,
161a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                             const InputInfoList &Inputs);
162a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
16340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  protected:
16440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    const char *getCC1Name(types::ID Type) const;
165a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
166a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
16740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
16840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                           const InputInfoList &Inputs,
169a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                           const ArgStringList &OutputArgs) const;
17040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
17140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                           const InputInfoList &Inputs,
172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                           const ArgStringList &OutputArgs) const;
1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void AddCPPUniqueOptionsArgs(const ArgList &Args,
174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                 ArgStringList &CmdArgs,
175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                 const InputInfoList &Inputs) const;
176a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
17740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
17840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
179fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
18040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
18140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
18240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
18360a53f24b160724de0e8dd0e142009981540fd26Daniel Dunbar    virtual bool hasGoodDiagnostics() const { return true; }
18440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual bool hasIntegratedCPP() const { return true; }
18540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
18640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
18740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN Preprocess : public CC1  {
18840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
18940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
19040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
19140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
19240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              Job &Dest,
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
19640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const char *LinkingOutput) const;
19740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
19840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
19940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  class VISIBILITY_HIDDEN Compile : public CC1  {
20040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  public:
20140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
20240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
20340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
20440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              Job &Dest,
2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
20840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                              const char *LinkingOutput) const;
20940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  };
21040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
211fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public DarwinTool  {
2128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  public:
213fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
2148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
2168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
2178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
2188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
22002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              Job &Dest,
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
22402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              const char *LinkingOutput) const;
22502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  };
22602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
227fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN Link : public DarwinTool  {
22802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
22902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
23002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  public:
231fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
23202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
23302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
23402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
23502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
23602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
23702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
2388cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              Job &Dest,
2391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
2428cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                              const char *LinkingOutput) const;
2438cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  };
2448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
245fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar  class VISIBILITY_HIDDEN Lipo : public DarwinTool  {
246ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  public:
247fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
248ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
249ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool acceptsPipedInput() const { return false; }
250ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool canPipeOutput() const { return false; }
251ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
252ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
253ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
254ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              Job &Dest,
2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
258f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
259f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
260f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
261f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
262f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  /// openbsd -- Directly call GNU Binutils assembler and linker
263f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarnamespace openbsd {
264f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
265f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
266f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
267f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
268f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
269f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
270f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
271f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
272f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
273f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              Job &Dest,
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
277f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              const char *LinkingOutput) const;
278f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  };
279f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
280f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  public:
281f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
282f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
283f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
284f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
285f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
286f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
287f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
288f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                              Job &Dest,
2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
292ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                              const char *LinkingOutput) const;
293ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  };
294e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace openbsd
295ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
29668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  /// freebsd -- Directly call GNU Binutils assembler and linker
29768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarnamespace freebsd {
29868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
29968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  public:
30068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
30168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
30268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
30368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
30468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
30568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
30668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
30768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              Job &Dest,
3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
31168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                              const char *LinkingOutput) const;
31268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  };
313008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
314008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  public:
315008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
316008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
317008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
318008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool canPipeOutput() const { return true; }
319008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
320008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
321008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
322008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              Job &Dest,
3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
326008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                              const char *LinkingOutput) const;
327008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  };
328e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace freebsd
329e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
330e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  /// auroraux -- Directly call GNU Binutils assembler and linker
331e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghannamespace auroraux {
332e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  class VISIBILITY_HIDDEN Assemble : public Tool  {
333e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
334e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
335e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
336e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool acceptsPipedInput() const { return true; }
337e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool canPipeOutput() const { return true; }
338e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
339e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
340e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
341e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              Job &Dest,
3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
345e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
346e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
347e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  class VISIBILITY_HIDDEN Link : public Tool  {
348e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  public:
349e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
350e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
351e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool acceptsPipedInput() const { return true; }
352e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool canPipeOutput() const { return true; }
353e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual bool hasIntegratedCPP() const { return false; }
354e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
355e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    virtual void ConstructJob(Compilation &C, const JobAction &JA,
356e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              Job &Dest,
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
360e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                              const char *LinkingOutput) const;
361e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  };
362e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace auroraux
36368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
36411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  /// dragonfly -- Directly call GNU Binutils assembler and linker
36511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarnamespace dragonfly {
36611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  class VISIBILITY_HIDDEN Assemble : public Tool  {
36711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
36811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
36911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
37011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
37111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
37211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
37311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
37411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
37511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              Job &Dest,
3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
37911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
38011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
38111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  class VISIBILITY_HIDDEN Link : public Tool  {
38211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  public:
38311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
38411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
38511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool acceptsPipedInput() const { return true; }
38611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool canPipeOutput() const { return true; }
38711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual bool hasIntegratedCPP() const { return false; }
38811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
38911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    virtual void ConstructJob(Compilation &C, const JobAction &JA,
39011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              Job &Dest,
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfo &Output,
3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const InputInfoList &Inputs,
3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                              const ArgList &TCArgs,
39411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                              const char *LinkingOutput) const;
39511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  };
396e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} // end namespace dragonfly
39711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3989c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace toolchains
3999c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace driver
4009c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar} // end namespace clang
4019c073ff462eb75ccbb1c4446e21c148f3fc618e1Daniel Dunbar
402e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan#endif // CLANG_LIB_DRIVER_TOOLS_H_
403