Tools.h revision 6acda16e9c194dcbd0dea64341e182bdb65d0f41
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 {
21  class Driver;
22
23namespace toolchains {
24  class Darwin;
25}
26
27namespace tools {
28
29  class VISIBILITY_HIDDEN Clang : public Tool {
30    void AddPreprocessingOptions(const Driver &D,
31                                 const ArgList &Args,
32                                 ArgStringList &CmdArgs,
33                                 const InputInfo &Output,
34                                 const InputInfoList &Inputs) const;
35
36    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
37
38  public:
39    Clang(const ToolChain &TC) : Tool("clang", TC) {}
40
41    virtual bool acceptsPipedInput() const { return true; }
42    virtual bool canPipeOutput() const { return true; }
43    virtual bool hasIntegratedCPP() const { return true; }
44
45    virtual void ConstructJob(Compilation &C, const JobAction &JA,
46                              Job &Dest,
47                              const InputInfo &Output,
48                              const InputInfoList &Inputs,
49                              const ArgList &TCArgs,
50                              const char *LinkingOutput) const;
51  };
52
53  /// gcc - Generic GCC tool implementations.
54namespace gcc {
55  class VISIBILITY_HIDDEN Common : public Tool {
56  public:
57    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
58
59    virtual void ConstructJob(Compilation &C, const JobAction &JA,
60                              Job &Dest,
61                              const InputInfo &Output,
62                              const InputInfoList &Inputs,
63                              const ArgList &TCArgs,
64                              const char *LinkingOutput) const;
65
66    /// RenderExtraToolArgs - Render any arguments necessary to force
67    /// the particular tool mode.
68    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
69  };
70
71
72  class VISIBILITY_HIDDEN Preprocess : public Common {
73  public:
74    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
75
76    virtual bool acceptsPipedInput() const { return true; }
77    virtual bool canPipeOutput() const { return true; }
78    virtual bool hasIntegratedCPP() const { return false; }
79
80    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
81  };
82
83  class VISIBILITY_HIDDEN Precompile : public Common  {
84  public:
85    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
86
87    virtual bool acceptsPipedInput() const { return true; }
88    virtual bool canPipeOutput() const { return false; }
89    virtual bool hasIntegratedCPP() const { return true; }
90
91    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
92  };
93
94  class VISIBILITY_HIDDEN Compile : public Common  {
95  public:
96    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
97
98    virtual bool acceptsPipedInput() const { return true; }
99    virtual bool canPipeOutput() const { return true; }
100    virtual bool hasIntegratedCPP() const { return true; }
101
102    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
103  };
104
105  class VISIBILITY_HIDDEN Assemble : public Common  {
106  public:
107    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
108
109    virtual bool acceptsPipedInput() const { return true; }
110    virtual bool canPipeOutput() const { return false; }
111    virtual bool hasIntegratedCPP() const { return false; }
112
113    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
114  };
115
116  class VISIBILITY_HIDDEN Link : public Common  {
117  public:
118    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
119
120    virtual bool acceptsPipedInput() const { return false; }
121    virtual bool canPipeOutput() const { return false; }
122    virtual bool hasIntegratedCPP() const { return false; }
123
124    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
125  };
126} // end namespace gcc
127
128namespace darwin {
129  class VISIBILITY_HIDDEN DarwinTool : public Tool {
130  protected:
131    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
132    void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
133
134    const toolchains::Darwin &getDarwinToolChain() const {
135      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
136    }
137
138  public:
139    DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {};
140  };
141
142  class VISIBILITY_HIDDEN CC1 : public DarwinTool  {
143  public:
144    static const char *getBaseInputName(const ArgList &Args,
145                                 const InputInfoList &Input);
146    static const char *getBaseInputStem(const ArgList &Args,
147                                 const InputInfoList &Input);
148    static const char *getDependencyFileName(const ArgList &Args,
149                                             const InputInfoList &Inputs);
150
151  protected:
152    const char *getCC1Name(types::ID Type) const;
153
154    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
155    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
156                           const InputInfoList &Inputs,
157                           const ArgStringList &OutputArgs) const;
158    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
159                           const InputInfoList &Inputs,
160                           const ArgStringList &OutputArgs) const;
161    void AddCPPUniqueOptionsArgs(const ArgList &Args,
162                                 ArgStringList &CmdArgs,
163                                 const InputInfoList &Inputs) const;
164    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
165
166  public:
167    CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
168
169    virtual bool acceptsPipedInput() const { return true; }
170    virtual bool canPipeOutput() const { return true; }
171    virtual bool hasIntegratedCPP() const { return true; }
172  };
173
174  class VISIBILITY_HIDDEN Preprocess : public CC1  {
175  public:
176    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
177
178    virtual void ConstructJob(Compilation &C, const JobAction &JA,
179                              Job &Dest,
180                              const InputInfo &Output,
181                              const InputInfoList &Inputs,
182                              const ArgList &TCArgs,
183                              const char *LinkingOutput) const;
184  };
185
186  class VISIBILITY_HIDDEN Compile : public CC1  {
187  public:
188    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
189
190    virtual void ConstructJob(Compilation &C, const JobAction &JA,
191                              Job &Dest,
192                              const InputInfo &Output,
193                              const InputInfoList &Inputs,
194                              const ArgList &TCArgs,
195                              const char *LinkingOutput) const;
196  };
197
198  class VISIBILITY_HIDDEN Assemble : public DarwinTool  {
199  public:
200    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
201
202    virtual bool acceptsPipedInput() const { return true; }
203    virtual bool canPipeOutput() const { return false; }
204    virtual bool hasIntegratedCPP() const { return false; }
205
206    virtual void ConstructJob(Compilation &C, const JobAction &JA,
207                              Job &Dest,
208                              const InputInfo &Output,
209                              const InputInfoList &Inputs,
210                              const ArgList &TCArgs,
211                              const char *LinkingOutput) const;
212  };
213
214  class VISIBILITY_HIDDEN Link : public DarwinTool  {
215    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
216
217  public:
218    Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
219
220    virtual bool acceptsPipedInput() const { return false; }
221    virtual bool canPipeOutput() const { return false; }
222    virtual bool hasIntegratedCPP() const { return false; }
223
224    virtual void ConstructJob(Compilation &C, const JobAction &JA,
225                              Job &Dest,
226                              const InputInfo &Output,
227                              const InputInfoList &Inputs,
228                              const ArgList &TCArgs,
229                              const char *LinkingOutput) const;
230  };
231
232  class VISIBILITY_HIDDEN Lipo : public DarwinTool  {
233  public:
234    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
235
236    virtual bool acceptsPipedInput() const { return false; }
237    virtual bool canPipeOutput() const { return false; }
238    virtual bool hasIntegratedCPP() const { return false; }
239
240    virtual void ConstructJob(Compilation &C, const JobAction &JA,
241                              Job &Dest,
242                              const InputInfo &Output,
243                              const InputInfoList &Inputs,
244                              const ArgList &TCArgs,
245                              const char *LinkingOutput) const;
246  };
247}
248
249  /// openbsd -- Directly call GNU Binutils assembler and linker
250namespace openbsd {
251  class VISIBILITY_HIDDEN Assemble : public Tool  {
252  public:
253    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
254
255    virtual bool acceptsPipedInput() const { return true; }
256    virtual bool canPipeOutput() const { return true; }
257    virtual bool hasIntegratedCPP() const { return false; }
258
259    virtual void ConstructJob(Compilation &C, const JobAction &JA,
260                              Job &Dest,
261                              const InputInfo &Output,
262                              const InputInfoList &Inputs,
263                              const ArgList &TCArgs,
264                              const char *LinkingOutput) const;
265  };
266  class VISIBILITY_HIDDEN Link : public Tool  {
267  public:
268    Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
269
270    virtual bool acceptsPipedInput() const { return true; }
271    virtual bool canPipeOutput() const { return true; }
272    virtual bool hasIntegratedCPP() const { return false; }
273
274    virtual void ConstructJob(Compilation &C, const JobAction &JA,
275                              Job &Dest,
276                              const InputInfo &Output,
277                              const InputInfoList &Inputs,
278                              const ArgList &TCArgs,
279                              const char *LinkingOutput) const;
280  };
281} // end namespace openbsd
282
283  /// freebsd -- Directly call GNU Binutils assembler and linker
284namespace freebsd {
285  class VISIBILITY_HIDDEN Assemble : public Tool  {
286  public:
287    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
288
289    virtual bool acceptsPipedInput() const { return true; }
290    virtual bool canPipeOutput() const { return true; }
291    virtual bool hasIntegratedCPP() const { return false; }
292
293    virtual void ConstructJob(Compilation &C, const JobAction &JA,
294                              Job &Dest,
295                              const InputInfo &Output,
296                              const InputInfoList &Inputs,
297                              const ArgList &TCArgs,
298                              const char *LinkingOutput) const;
299  };
300  class VISIBILITY_HIDDEN Link : public Tool  {
301  public:
302    Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
303
304    virtual bool acceptsPipedInput() const { return true; }
305    virtual bool canPipeOutput() const { return true; }
306    virtual bool hasIntegratedCPP() const { return false; }
307
308    virtual void ConstructJob(Compilation &C, const JobAction &JA,
309                              Job &Dest,
310                              const InputInfo &Output,
311                              const InputInfoList &Inputs,
312                              const ArgList &TCArgs,
313                              const char *LinkingOutput) const;
314  };
315} // end namespace freebsd
316
317  /// auroraux -- Directly call GNU Binutils assembler and linker
318namespace auroraux {
319  class VISIBILITY_HIDDEN Assemble : public Tool  {
320  public:
321    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
322
323    virtual bool acceptsPipedInput() const { return true; }
324    virtual bool canPipeOutput() const { return true; }
325    virtual bool hasIntegratedCPP() const { return false; }
326
327    virtual void ConstructJob(Compilation &C, const JobAction &JA,
328                              Job &Dest,
329                              const InputInfo &Output,
330                              const InputInfoList &Inputs,
331                              const ArgList &TCArgs,
332                              const char *LinkingOutput) const;
333  };
334  class VISIBILITY_HIDDEN Link : public Tool  {
335  public:
336    Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
337
338    virtual bool acceptsPipedInput() const { return true; }
339    virtual bool canPipeOutput() const { return true; }
340    virtual bool hasIntegratedCPP() const { return false; }
341
342    virtual void ConstructJob(Compilation &C, const JobAction &JA,
343                              Job &Dest,
344                              const InputInfo &Output,
345                              const InputInfoList &Inputs,
346                              const ArgList &TCArgs,
347                              const char *LinkingOutput) const;
348  };
349} // end namespace auroraux
350
351  /// dragonfly -- Directly call GNU Binutils assembler and linker
352namespace dragonfly {
353  class VISIBILITY_HIDDEN Assemble : public Tool  {
354  public:
355    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
356
357    virtual bool acceptsPipedInput() const { return true; }
358    virtual bool canPipeOutput() const { return true; }
359    virtual bool hasIntegratedCPP() const { return false; }
360
361    virtual void ConstructJob(Compilation &C, const JobAction &JA,
362                              Job &Dest,
363                              const InputInfo &Output,
364                              const InputInfoList &Inputs,
365                              const ArgList &TCArgs,
366                              const char *LinkingOutput) const;
367  };
368  class VISIBILITY_HIDDEN Link : public Tool  {
369  public:
370    Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
371
372    virtual bool acceptsPipedInput() const { return true; }
373    virtual bool canPipeOutput() const { return true; }
374    virtual bool hasIntegratedCPP() const { return false; }
375
376    virtual void ConstructJob(Compilation &C, const JobAction &JA,
377                              Job &Dest,
378                              const InputInfo &Output,
379                              const InputInfoList &Inputs,
380                              const ArgList &TCArgs,
381                              const char *LinkingOutput) const;
382  };
383} // end namespace dragonfly
384
385} // end namespace toolchains
386} // end namespace driver
387} // end namespace clang
388
389#endif // CLANG_LIB_DRIVER_TOOLS_H_
390