]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/Driver/Tools.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / Driver / Tools.h
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/ADT/Triple.h"
18 #include "llvm/Support/Compiler.h"
19
20 namespace clang {
21 namespace driver {
22   class Driver;
23
24 namespace toolchains {
25   class Darwin;
26 }
27
28 namespace tools {
29
30   /// \brief Clang compiler tool.
31   class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
32     void AddPreprocessingOptions(const Driver &D,
33                                  const ArgList &Args,
34                                  ArgStringList &CmdArgs,
35                                  const InputInfo &Output,
36                                  const InputInfoList &Inputs) const;
37
38     void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
39                           bool KernelOrKext) const;
40     void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
41     void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
42     void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
43
44   public:
45     Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
46
47     virtual bool hasGoodDiagnostics() const { return true; }
48     virtual bool hasIntegratedAssembler() const { return true; }
49     virtual bool hasIntegratedCPP() const { return true; }
50
51     virtual void ConstructJob(Compilation &C, const JobAction &JA,
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 hasGoodDiagnostics() const { return true; }
65     virtual bool hasIntegratedAssembler() const { return false; }
66     virtual bool hasIntegratedCPP() const { return false; }
67
68     virtual void ConstructJob(Compilation &C, const JobAction &JA,
69                               const InputInfo &Output,
70                               const InputInfoList &Inputs,
71                               const ArgList &TCArgs,
72                               const char *LinkingOutput) const;
73   };
74
75   /// gcc - Generic GCC tool implementations.
76 namespace gcc {
77   class LLVM_LIBRARY_VISIBILITY Common : public Tool {
78   public:
79     Common(const char *Name, const char *ShortName,
80            const ToolChain &TC) : Tool(Name, ShortName, TC) {}
81
82     virtual void ConstructJob(Compilation &C, const JobAction &JA,
83                               const InputInfo &Output,
84                               const InputInfoList &Inputs,
85                               const ArgList &TCArgs,
86                               const char *LinkingOutput) const;
87
88     /// RenderExtraToolArgs - Render any arguments necessary to force
89     /// the particular tool mode.
90     virtual void RenderExtraToolArgs(const JobAction &JA,
91                                      ArgStringList &CmdArgs) const = 0;
92   };
93
94
95   class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
96   public:
97     Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
98                                              "gcc preprocessor", TC) {}
99
100     virtual bool hasGoodDiagnostics() const { return true; }
101     virtual bool hasIntegratedCPP() const { return false; }
102
103     virtual void RenderExtraToolArgs(const JobAction &JA,
104                                      ArgStringList &CmdArgs) const;
105   };
106
107   class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
108   public:
109     Precompile(const ToolChain &TC) : Common("gcc::Precompile",
110                                              "gcc precompile", TC) {}
111
112     virtual bool hasGoodDiagnostics() const { return true; }
113     virtual bool hasIntegratedCPP() const { return true; }
114
115     virtual void RenderExtraToolArgs(const JobAction &JA,
116                                      ArgStringList &CmdArgs) const;
117   };
118
119   class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
120   public:
121     Compile(const ToolChain &TC) : Common("gcc::Compile",
122                                           "gcc frontend", TC) {}
123
124     virtual bool hasGoodDiagnostics() const { return true; }
125     virtual bool hasIntegratedCPP() const { return true; }
126
127     virtual void RenderExtraToolArgs(const JobAction &JA,
128                                      ArgStringList &CmdArgs) const;
129   };
130
131   class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
132   public:
133     Assemble(const ToolChain &TC) : Common("gcc::Assemble",
134                                            "assembler (via gcc)", TC) {}
135
136     virtual bool hasIntegratedCPP() const { return false; }
137
138     virtual void RenderExtraToolArgs(const JobAction &JA,
139                                      ArgStringList &CmdArgs) const;
140   };
141
142   class LLVM_LIBRARY_VISIBILITY Link : public Common  {
143   public:
144     Link(const ToolChain &TC) : Common("gcc::Link",
145                                        "linker (via gcc)", TC) {}
146
147     virtual bool hasIntegratedCPP() const { return false; }
148
149     virtual void RenderExtraToolArgs(const JobAction &JA,
150                                      ArgStringList &CmdArgs) const;
151   };
152 } // end namespace gcc
153
154 namespace darwin {
155   class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
156   protected:
157     void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
158
159     const toolchains::Darwin &getDarwinToolChain() const {
160       return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
161     }
162
163   public:
164     DarwinTool(const char *Name, const char *ShortName,
165                const ToolChain &TC) : Tool(Name, ShortName, TC) {}
166   };
167
168   class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool  {
169   public:
170     static const char *getBaseInputName(const ArgList &Args,
171                                  const InputInfoList &Input);
172     static const char *getBaseInputStem(const ArgList &Args,
173                                  const InputInfoList &Input);
174     static const char *getDependencyFileName(const ArgList &Args,
175                                              const InputInfoList &Inputs);
176
177   protected:
178     const char *getCC1Name(types::ID Type) const;
179
180     void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
181     void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
182                            const InputInfoList &Inputs,
183                            const ArgStringList &OutputArgs) const;
184     void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
185                            const InputInfoList &Inputs,
186                            const ArgStringList &OutputArgs) const;
187     void AddCPPUniqueOptionsArgs(const ArgList &Args,
188                                  ArgStringList &CmdArgs,
189                                  const InputInfoList &Inputs) const;
190     void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
191
192   public:
193     CC1(const char *Name, const char *ShortName,
194         const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
195
196     virtual bool hasGoodDiagnostics() const { return true; }
197     virtual bool hasIntegratedCPP() const { return true; }
198   };
199
200   class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1  {
201   public:
202     Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
203                                           "gcc preprocessor", TC) {}
204
205     virtual void ConstructJob(Compilation &C, const JobAction &JA,
206                               const InputInfo &Output,
207                               const InputInfoList &Inputs,
208                               const ArgList &TCArgs,
209                               const char *LinkingOutput) const;
210   };
211
212   class LLVM_LIBRARY_VISIBILITY Compile : public CC1  {
213   public:
214     Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
215
216     virtual void ConstructJob(Compilation &C, const JobAction &JA,
217                               const InputInfo &Output,
218                               const InputInfoList &Inputs,
219                               const ArgList &TCArgs,
220                               const char *LinkingOutput) const;
221   };
222
223   class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
224   public:
225     Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
226                                                "assembler", TC) {}
227
228     virtual bool hasIntegratedCPP() const { return false; }
229
230     virtual void ConstructJob(Compilation &C, const JobAction &JA,
231                               const InputInfo &Output,
232                               const InputInfoList &Inputs,
233                               const ArgList &TCArgs,
234                               const char *LinkingOutput) const;
235   };
236
237   class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
238     void AddLinkArgs(Compilation &C, const ArgList &Args,
239                      ArgStringList &CmdArgs) const;
240
241   public:
242     Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
243
244     virtual bool hasIntegratedCPP() const { return false; }
245
246     virtual void ConstructJob(Compilation &C, const JobAction &JA,
247                               const InputInfo &Output,
248                               const InputInfoList &Inputs,
249                               const ArgList &TCArgs,
250                               const char *LinkingOutput) const;
251   };
252
253   class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
254   public:
255     Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
256
257     virtual bool hasIntegratedCPP() const { return false; }
258
259     virtual void ConstructJob(Compilation &C, const JobAction &JA,
260                               const InputInfo &Output,
261                               const InputInfoList &Inputs,
262                               const ArgList &TCArgs,
263                               const char *LinkingOutput) const;
264   };
265
266   class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
267   public:
268     Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
269                                                "dsymutil", TC) {}
270
271     virtual bool hasIntegratedCPP() const { return false; }
272
273     virtual void ConstructJob(Compilation &C, const JobAction &JA,
274                               const InputInfo &Output,
275                               const InputInfoList &Inputs,
276                               const ArgList &TCArgs,
277                               const char *LinkingOutput) const;
278   };
279 }
280
281   /// openbsd -- Directly call GNU Binutils assembler and linker
282 namespace openbsd {
283   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
284   public:
285     Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
286                                          TC) {}
287
288     virtual bool hasIntegratedCPP() const { return false; }
289
290     virtual void ConstructJob(Compilation &C, const JobAction &JA,
291                               const InputInfo &Output,
292                               const InputInfoList &Inputs,
293                               const ArgList &TCArgs,
294                               const char *LinkingOutput) const;
295   };
296   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
297   public:
298     Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
299
300     virtual bool hasIntegratedCPP() const { return false; }
301
302     virtual void ConstructJob(Compilation &C, const JobAction &JA,
303                               const InputInfo &Output,
304                               const InputInfoList &Inputs,
305                               const ArgList &TCArgs,
306                               const char *LinkingOutput) const;
307   };
308 } // end namespace openbsd
309
310   /// freebsd -- Directly call GNU Binutils assembler and linker
311 namespace freebsd {
312   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
313   public:
314     Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
315                                          TC) {}
316
317     virtual bool hasIntegratedCPP() const { return false; }
318
319     virtual void ConstructJob(Compilation &C, const JobAction &JA,
320                               const InputInfo &Output,
321                               const InputInfoList &Inputs,
322                               const ArgList &TCArgs,
323                               const char *LinkingOutput) const;
324   };
325   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
326   public:
327     Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
328
329     virtual bool hasIntegratedCPP() const { return false; }
330
331     virtual void ConstructJob(Compilation &C, const JobAction &JA,
332                               const InputInfo &Output,
333                               const InputInfoList &Inputs,
334                               const ArgList &TCArgs,
335                               const char *LinkingOutput) const;
336   };
337 } // end namespace freebsd
338
339   /// netbsd -- Directly call GNU Binutils assembler and linker
340 namespace netbsd {
341   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
342   private:
343     const llvm::Triple ToolTriple;
344
345   public:
346     Assemble(const ToolChain &TC, const llvm::Triple &ToolTriple)
347       : Tool("netbsd::Assemble", "assembler", TC), ToolTriple(ToolTriple) {}
348
349     virtual bool hasIntegratedCPP() const { return false; }
350
351     virtual void ConstructJob(Compilation &C, const JobAction &JA,
352                               const InputInfo &Output,
353                               const InputInfoList &Inputs,
354                               const ArgList &TCArgs,
355                               const char *LinkingOutput) const;
356   };
357   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
358   private:
359     const llvm::Triple ToolTriple;
360
361   public:
362     Link(const ToolChain &TC, const llvm::Triple &ToolTriple)
363       : Tool("netbsd::Link", "linker", TC), ToolTriple(ToolTriple) {}
364
365     virtual bool hasIntegratedCPP() const { return false; }
366
367     virtual void ConstructJob(Compilation &C, const JobAction &JA,
368                               const InputInfo &Output,
369                               const InputInfoList &Inputs,
370                               const ArgList &TCArgs,
371                               const char *LinkingOutput) const;
372   };
373 } // end namespace netbsd
374
375   /// linux -- Directly call GNU Binutils assembler and linker
376 namespace linuxtools {
377   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
378   public:
379     Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
380                                          TC) {}
381
382     virtual bool hasIntegratedCPP() const { return false; }
383
384     virtual void ConstructJob(Compilation &C, const JobAction &JA,
385                               const InputInfo &Output,
386                               const InputInfoList &Inputs,
387                               const ArgList &TCArgs,
388                               const char *LinkingOutput) const;
389   };
390   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
391   public:
392     Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
393
394     virtual bool hasIntegratedCPP() const { return false; }
395
396     virtual void ConstructJob(Compilation &C, const JobAction &JA,
397                               const InputInfo &Output,
398                               const InputInfoList &Inputs,
399                               const ArgList &TCArgs,
400                               const char *LinkingOutput) const;
401   };
402 }
403   /// minix -- Directly call GNU Binutils assembler and linker
404 namespace minix {
405   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
406   public:
407     Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
408                                          TC) {}
409
410     virtual bool hasIntegratedCPP() const { return false; }
411
412     virtual void ConstructJob(Compilation &C, const JobAction &JA,
413                               const InputInfo &Output,
414                               const InputInfoList &Inputs,
415                               const ArgList &TCArgs,
416                               const char *LinkingOutput) const;
417   };
418   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
419   public:
420     Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
421
422     virtual bool hasIntegratedCPP() const { return false; }
423
424     virtual void ConstructJob(Compilation &C, const JobAction &JA,
425                               const InputInfo &Output,
426                               const InputInfoList &Inputs,
427                               const ArgList &TCArgs,
428                               const char *LinkingOutput) const;
429   };
430 } // end namespace minix
431
432   /// auroraux -- Directly call GNU Binutils assembler and linker
433 namespace auroraux {
434   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
435   public:
436     Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
437                                          TC) {}
438
439     virtual bool hasIntegratedCPP() const { return false; }
440
441     virtual void ConstructJob(Compilation &C, const JobAction &JA,
442                               const InputInfo &Output,
443                               const InputInfoList &Inputs,
444                               const ArgList &TCArgs,
445                               const char *LinkingOutput) const;
446   };
447   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
448   public:
449     Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
450
451     virtual bool hasIntegratedCPP() const { return false; }
452
453     virtual void ConstructJob(Compilation &C, const JobAction &JA,
454                               const InputInfo &Output,
455                               const InputInfoList &Inputs,
456                               const ArgList &TCArgs,
457                               const char *LinkingOutput) const;
458   };
459 } // end namespace auroraux
460
461   /// dragonfly -- Directly call GNU Binutils assembler and linker
462 namespace dragonfly {
463   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
464   public:
465     Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
466                                          TC) {}
467
468     virtual bool hasIntegratedCPP() const { return false; }
469
470     virtual void ConstructJob(Compilation &C, const JobAction &JA,
471                               const InputInfo &Output,
472                               const InputInfoList &Inputs,
473                               const ArgList &TCArgs,
474                               const char *LinkingOutput) const;
475   };
476   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
477   public:
478     Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
479
480     virtual bool hasIntegratedCPP() const { return false; }
481
482     virtual void ConstructJob(Compilation &C, const JobAction &JA,
483                               const InputInfo &Output,
484                               const InputInfoList &Inputs,
485                               const ArgList &TCArgs,
486                               const char *LinkingOutput) const;
487   };
488 } // end namespace dragonfly
489
490   /// Visual studio tools.
491 namespace visualstudio {
492   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
493   public:
494     Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
495
496     virtual bool hasIntegratedCPP() const { return false; }
497
498     virtual void ConstructJob(Compilation &C, const JobAction &JA,
499                               const InputInfo &Output,
500                               const InputInfoList &Inputs,
501                               const ArgList &TCArgs,
502                               const char *LinkingOutput) const;
503   };
504 } // end namespace visualstudio
505
506 } // end namespace toolchains
507 } // end namespace driver
508 } // end namespace clang
509
510 #endif // CLANG_LIB_DRIVER_TOOLS_H_