Tools.h revision a6d38494d18e260958e73bfe5e2b3f1dc4160459
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 AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
37    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
38
39  public:
40    Clang(const ToolChain &TC) : Tool("clang", TC) {}
41
42    virtual bool acceptsPipedInput() const { return true; }
43    virtual bool canPipeOutput() const { return true; }
44    virtual bool hasIntegratedCPP() const { return true; }
45
46    virtual void ConstructJob(Compilation &C, const JobAction &JA,
47                              Job &Dest,
48                              const InputInfo &Output,
49                              const InputInfoList &Inputs,
50                              const ArgList &TCArgs,
51                              const char *LinkingOutput) const;
52  };
53
54  /// gcc - Generic GCC tool implementations.
55namespace gcc {
56  class VISIBILITY_HIDDEN Common : public Tool {
57  public:
58    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
59
60    virtual void ConstructJob(Compilation &C, const JobAction &JA,
61                              Job &Dest,
62                              const InputInfo &Output,
63                              const InputInfoList &Inputs,
64                              const ArgList &TCArgs,
65                              const char *LinkingOutput) const;
66
67    /// RenderExtraToolArgs - Render any arguments necessary to force
68    /// the particular tool mode.
69    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
70  };
71
72
73  class VISIBILITY_HIDDEN Preprocess : public Common {
74  public:
75    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
76
77    virtual bool acceptsPipedInput() const { return true; }
78    virtual bool canPipeOutput() const { return true; }
79    virtual bool hasIntegratedCPP() const { return false; }
80
81    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
82  };
83
84  class VISIBILITY_HIDDEN Precompile : public Common  {
85  public:
86    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
87
88    virtual bool acceptsPipedInput() const { return true; }
89    virtual bool canPipeOutput() const { return false; }
90    virtual bool hasIntegratedCPP() const { return true; }
91
92    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
93  };
94
95  class VISIBILITY_HIDDEN Compile : public Common  {
96  public:
97    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
98
99    virtual bool acceptsPipedInput() const { return true; }
100    virtual bool canPipeOutput() const { return true; }
101    virtual bool hasIntegratedCPP() const { return true; }
102
103    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
104  };
105
106  class VISIBILITY_HIDDEN Assemble : public Common  {
107  public:
108    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
109
110    virtual bool acceptsPipedInput() const { return true; }
111    virtual bool canPipeOutput() const { return false; }
112    virtual bool hasIntegratedCPP() const { return false; }
113
114    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
115  };
116
117  class VISIBILITY_HIDDEN Link : public Common  {
118  public:
119    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
120
121    virtual bool acceptsPipedInput() const { return false; }
122    virtual bool canPipeOutput() const { return false; }
123    virtual bool hasIntegratedCPP() const { return false; }
124
125    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
126  };
127} // end namespace gcc
128
129namespace darwin {
130  class VISIBILITY_HIDDEN DarwinTool : public Tool {
131  protected:
132    void AddDarwinArch(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