Tools.h revision 68a31d406c6dc4382c700d1199b062de2aa7e1da
1//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef CLANG_LIB_DRIVER_TOOLS_H_
11#define CLANG_LIB_DRIVER_TOOLS_H_
12
13#include "clang/Driver/Tool.h"
14#include "clang/Driver/Types.h"
15#include "clang/Driver/Util.h"
16
17#include "llvm/Support/Compiler.h"
18
19namespace clang {
20namespace driver {
21namespace toolchains {
22  class Darwin_X86;
23}
24
25namespace tools {
26
27  class VISIBILITY_HIDDEN Clang : public Tool {
28  public:
29    Clang(const ToolChain &TC) : Tool("clang", TC) {}
30
31    virtual bool acceptsPipedInput() const { return true; }
32    virtual bool canPipeOutput() const { return true; }
33    virtual bool hasIntegratedCPP() const { return true; }
34
35    virtual void ConstructJob(Compilation &C, const JobAction &JA,
36                              Job &Dest,
37                              const InputInfo &Output,
38                              const InputInfoList &Inputs,
39                              const ArgList &TCArgs,
40                              const char *LinkingOutput) const;
41  };
42
43  /// gcc - Generic GCC tool implementations.
44namespace gcc {
45  class VISIBILITY_HIDDEN Common : public Tool {
46  public:
47    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
48
49    virtual void ConstructJob(Compilation &C, const JobAction &JA,
50                              Job &Dest,
51                              const InputInfo &Output,
52                              const InputInfoList &Inputs,
53                              const ArgList &TCArgs,
54                              const char *LinkingOutput) const;
55
56    /// RenderExtraToolArgs - Render any arguments necessary to force
57    /// the particular tool mode.
58    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
59  };
60
61
62  class VISIBILITY_HIDDEN Preprocess : public Common {
63  public:
64    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
65
66    virtual bool acceptsPipedInput() const { return true; }
67    virtual bool canPipeOutput() const { return true; }
68    virtual bool hasIntegratedCPP() const { return false; }
69
70    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
71  };
72
73  class VISIBILITY_HIDDEN Precompile : public Common  {
74  public:
75    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
76
77    virtual bool acceptsPipedInput() const { return true; }
78    virtual bool canPipeOutput() const { return false; }
79    virtual bool hasIntegratedCPP() const { return true; }
80
81    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
82  };
83
84  class VISIBILITY_HIDDEN Compile : public Common  {
85  public:
86    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
87
88    virtual bool acceptsPipedInput() const { return true; }
89    virtual bool canPipeOutput() const { return true; }
90    virtual bool hasIntegratedCPP() const { return true; }
91
92    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
93  };
94
95  class VISIBILITY_HIDDEN Assemble : public Common  {
96  public:
97    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
98
99    virtual bool acceptsPipedInput() const { return true; }
100    virtual bool canPipeOutput() const { return false; }
101    virtual bool hasIntegratedCPP() const { return false; }
102
103    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
104  };
105
106  class VISIBILITY_HIDDEN Link : public Common  {
107  public:
108    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
109
110    virtual bool acceptsPipedInput() const { return false; }
111    virtual bool canPipeOutput() const { return false; }
112    virtual bool hasIntegratedCPP() const { return false; }
113
114    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
115  };
116} // end namespace gcc
117
118namespace darwin {
119  class VISIBILITY_HIDDEN CC1 : public Tool  {
120  public:
121    static const char *getBaseInputName(const ArgList &Args,
122                                 const InputInfoList &Input);
123    static const char *getBaseInputStem(const ArgList &Args,
124                                 const InputInfoList &Input);
125    static const char *getDependencyFileName(const ArgList &Args,
126                                             const InputInfoList &Inputs);
127
128  protected:
129    const char *getCC1Name(types::ID Type) const;
130
131    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
132    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
133                           const InputInfoList &Inputs,
134                           const ArgStringList &OutputArgs) const;
135    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
136                           const InputInfoList &Inputs,
137                           const ArgStringList &OutputArgs) const;
138    void AddCPPUniqueOptionsArgs(const ArgList &Args,
139                                 ArgStringList &CmdArgs,
140                                 const InputInfoList &Inputs) const;
141    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
142
143  public:
144    CC1(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
145
146    virtual bool acceptsPipedInput() const { return true; }
147    virtual bool canPipeOutput() const { return true; }
148    virtual bool hasIntegratedCPP() const { return true; }
149  };
150
151  class VISIBILITY_HIDDEN Preprocess : public CC1  {
152  public:
153    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
154
155    virtual void ConstructJob(Compilation &C, const JobAction &JA,
156                              Job &Dest,
157                              const InputInfo &Output,
158                              const InputInfoList &Inputs,
159                              const ArgList &TCArgs,
160                              const char *LinkingOutput) const;
161  };
162
163  class VISIBILITY_HIDDEN Compile : public CC1  {
164  public:
165    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
166
167    virtual void ConstructJob(Compilation &C, const JobAction &JA,
168                              Job &Dest,
169                              const InputInfo &Output,
170                              const InputInfoList &Inputs,
171                              const ArgList &TCArgs,
172                              const char *LinkingOutput) const;
173  };
174
175  class VISIBILITY_HIDDEN Assemble : public Tool  {
176  public:
177    Assemble(const ToolChain &TC) : Tool("darwin::Assemble", TC) {}
178
179    virtual bool acceptsPipedInput() const { return true; }
180    virtual bool canPipeOutput() const { return false; }
181    virtual bool hasIntegratedCPP() const { return false; }
182
183    virtual void ConstructJob(Compilation &C, const JobAction &JA,
184                              Job &Dest,
185                              const InputInfo &Output,
186                              const InputInfoList &Inputs,
187                              const ArgList &TCArgs,
188                              const char *LinkingOutput) const;
189  };
190
191  class VISIBILITY_HIDDEN Link : public Tool  {
192    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
193    void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
194    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
195
196    /// The default macosx-version-min.
197    const char *MacosxVersionMin;
198
199    const toolchains::Darwin_X86 &getDarwinToolChain() const;
200
201  public:
202    Link(const ToolChain &TC,
203         const char *_MacosxVersionMin)
204      : Tool("darwin::Link", TC), MacosxVersionMin(_MacosxVersionMin) {
205    }
206
207    virtual bool acceptsPipedInput() const { return false; }
208    virtual bool canPipeOutput() const { return false; }
209    virtual bool hasIntegratedCPP() const { return false; }
210
211    virtual void ConstructJob(Compilation &C, const JobAction &JA,
212                              Job &Dest,
213                              const InputInfo &Output,
214                              const InputInfoList &Inputs,
215                              const ArgList &TCArgs,
216                              const char *LinkingOutput) const;
217  };
218
219  class VISIBILITY_HIDDEN Lipo : public Tool  {
220  public:
221    Lipo(const ToolChain &TC) : Tool("darwin::Lipo", TC) {}
222
223    virtual bool acceptsPipedInput() const { return false; }
224    virtual bool canPipeOutput() const { return false; }
225    virtual bool hasIntegratedCPP() const { return false; }
226
227    virtual void ConstructJob(Compilation &C, const JobAction &JA,
228                              Job &Dest,
229                              const InputInfo &Output,
230                              const InputInfoList &Inputs,
231                              const ArgList &TCArgs,
232                              const char *LinkingOutput) const;
233  };
234}
235
236  /// freebsd -- Directly call GNU Binutils assembler and linker
237namespace freebsd {
238  class VISIBILITY_HIDDEN Assemble : public Tool  {
239  public:
240    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
241
242    virtual bool acceptsPipedInput() const { return true; }
243    virtual bool canPipeOutput() const { return true; }
244    virtual bool hasIntegratedCPP() const { return false; }
245
246    virtual void ConstructJob(Compilation &C, const JobAction &JA,
247                              Job &Dest,
248                              const InputInfo &Output,
249                              const InputInfoList &Inputs,
250                              const ArgList &TCArgs,
251                              const char *LinkingOutput) const;
252  };
253}
254
255} // end namespace toolchains
256} // end namespace driver
257} // end namespace clang
258
259#endif
260