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