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