Tools.h revision 02a84277864e5476b12c0ec687ed09f0b2922471
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
20namespace clang {
21namespace driver {
22  class Driver;
23
24namespace toolchains {
25  class Darwin;
26}
27
28namespace tools {
29
30  /// \brief Clang compiler tool.
31  class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
32    void AddPreprocessingOptions(Compilation &C,
33                                 const Driver &D,
34                                 const ArgList &Args,
35                                 ArgStringList &CmdArgs,
36                                 const InputInfo &Output,
37                                 const InputInfoList &Inputs) const;
38
39    void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
40                          bool KernelOrKext) const;
41    void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
42    void AddPPCTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
43    void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
44    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
45    void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
46
47  public:
48    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
49
50    virtual bool hasGoodDiagnostics() const { return true; }
51    virtual bool hasIntegratedAssembler() const { return true; }
52    virtual bool hasIntegratedCPP() const { return true; }
53
54    virtual void ConstructJob(Compilation &C, const JobAction &JA,
55                              const InputInfo &Output,
56                              const InputInfoList &Inputs,
57                              const ArgList &TCArgs,
58                              const char *LinkingOutput) const;
59  };
60
61  /// \brief Clang integrated assembler tool.
62  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
63    void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
64  public:
65    ClangAs(const ToolChain &TC) : Tool("clang::as",
66                                        "clang integrated assembler", TC) {}
67
68    virtual bool hasGoodDiagnostics() const { return true; }
69    virtual bool hasIntegratedAssembler() const { return false; }
70    virtual bool hasIntegratedCPP() const { return false; }
71
72    virtual void ConstructJob(Compilation &C, const JobAction &JA,
73                              const InputInfo &Output,
74                              const InputInfoList &Inputs,
75                              const ArgList &TCArgs,
76                              const char *LinkingOutput) const;
77  };
78
79  /// gcc - Generic GCC tool implementations.
80namespace gcc {
81  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
82  public:
83    Common(const char *Name, const char *ShortName,
84           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
85
86    virtual void ConstructJob(Compilation &C, const JobAction &JA,
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 hasGoodDiagnostics() const { return true; }
105    virtual bool hasIntegratedCPP() const { return false; }
106
107    virtual void RenderExtraToolArgs(const JobAction &JA,
108                                     ArgStringList &CmdArgs) const;
109  };
110
111  class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
112  public:
113    Precompile(const ToolChain &TC) : Common("gcc::Precompile",
114                                             "gcc precompile", TC) {}
115
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",
126                                          "gcc frontend", TC) {}
127
128    virtual bool hasGoodDiagnostics() const { return true; }
129    virtual bool hasIntegratedCPP() const { return true; }
130
131    virtual void RenderExtraToolArgs(const JobAction &JA,
132                                     ArgStringList &CmdArgs) const;
133  };
134
135  class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
136  public:
137    Assemble(const ToolChain &TC) : Common("gcc::Assemble",
138                                           "assembler (via gcc)", TC) {}
139
140    virtual bool hasIntegratedCPP() const { return false; }
141
142    virtual void RenderExtraToolArgs(const JobAction &JA,
143                                     ArgStringList &CmdArgs) const;
144  };
145
146  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
147  public:
148    Link(const ToolChain &TC) : Common("gcc::Link",
149                                       "linker (via gcc)", TC) {}
150
151    virtual bool hasIntegratedCPP() const { return false; }
152    virtual bool isLinkJob() const { return true; }
153
154    virtual void RenderExtraToolArgs(const JobAction &JA,
155                                     ArgStringList &CmdArgs) const;
156  };
157} // end namespace gcc
158
159namespace hexagon {
160  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
161  // We simply use "clang -cc1" for those actions.
162  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
163  public:
164    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
165      "hexagon-as", TC) {}
166
167    virtual bool hasIntegratedCPP() const { return false; }
168
169    virtual void RenderExtraToolArgs(const JobAction &JA,
170                                     ArgStringList &CmdArgs) const;
171    virtual void ConstructJob(Compilation &C, const JobAction &JA,
172                              const InputInfo &Output,
173                              const InputInfoList &Inputs,
174                              const ArgList &TCArgs,
175                              const char *LinkingOutput) const;
176  };
177
178  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
179  public:
180    Link(const ToolChain &TC) : Tool("hexagon::Link",
181      "hexagon-ld", TC) {}
182
183    virtual bool hasIntegratedCPP() const { return false; }
184    virtual bool isLinkJob() const { return true; }
185
186    virtual void RenderExtraToolArgs(const JobAction &JA,
187                                     ArgStringList &CmdArgs) const;
188    virtual void ConstructJob(Compilation &C, const JobAction &JA,
189                              const InputInfo &Output,
190                              const InputInfoList &Inputs,
191                              const ArgList &TCArgs,
192                              const char *LinkingOutput) const;
193  };
194} // end namespace hexagon.
195
196
197namespace darwin {
198  class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
199    virtual void anchor();
200  protected:
201    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
202
203    const toolchains::Darwin &getDarwinToolChain() const {
204      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
205    }
206
207  public:
208    DarwinTool(const char *Name, const char *ShortName,
209               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
210  };
211
212  class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool  {
213    virtual void anchor();
214  public:
215    static const char *getBaseInputName(const ArgList &Args,
216                                 const InputInfoList &Input);
217    static const char *getBaseInputStem(const ArgList &Args,
218                                 const InputInfoList &Input);
219    static const char *getDependencyFileName(const ArgList &Args,
220                                             const InputInfoList &Inputs);
221
222  protected:
223    const char *getCC1Name(types::ID Type) const;
224
225    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
226    void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const;
227    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
228                           const InputInfoList &Inputs,
229                           const ArgStringList &OutputArgs) const;
230    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
231                           const InputInfoList &Inputs,
232                           const ArgStringList &OutputArgs) const;
233    void AddCPPUniqueOptionsArgs(const ArgList &Args,
234                                 ArgStringList &CmdArgs,
235                                 const InputInfoList &Inputs) const;
236    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
237
238  public:
239    CC1(const char *Name, const char *ShortName,
240        const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
241
242    virtual bool hasGoodDiagnostics() const { return true; }
243    virtual bool hasIntegratedCPP() const { return true; }
244  };
245
246  class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1  {
247  public:
248    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
249                                          "gcc preprocessor", TC) {}
250
251    virtual void ConstructJob(Compilation &C, const JobAction &JA,
252                              const InputInfo &Output,
253                              const InputInfoList &Inputs,
254                              const ArgList &TCArgs,
255                              const char *LinkingOutput) const;
256  };
257
258  class LLVM_LIBRARY_VISIBILITY Compile : public CC1  {
259  public:
260    Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
261
262    virtual void ConstructJob(Compilation &C, const JobAction &JA,
263                              const InputInfo &Output,
264                              const InputInfoList &Inputs,
265                              const ArgList &TCArgs,
266                              const char *LinkingOutput) const;
267  };
268
269  class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
270  public:
271    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
272                                               "assembler", TC) {}
273
274    virtual bool hasIntegratedCPP() const { return false; }
275
276    virtual void ConstructJob(Compilation &C, const JobAction &JA,
277                              const InputInfo &Output,
278                              const InputInfoList &Inputs,
279                              const ArgList &TCArgs,
280                              const char *LinkingOutput) const;
281  };
282
283  class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
284    void AddLinkArgs(Compilation &C, const ArgList &Args,
285                     ArgStringList &CmdArgs) const;
286
287  public:
288    Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
289
290    virtual bool hasIntegratedCPP() const { return false; }
291    virtual bool isLinkJob() const { return true; }
292
293    virtual void ConstructJob(Compilation &C, const JobAction &JA,
294                              const InputInfo &Output,
295                              const InputInfoList &Inputs,
296                              const ArgList &TCArgs,
297                              const char *LinkingOutput) const;
298  };
299
300  class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
301  public:
302    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
303
304    virtual bool hasIntegratedCPP() const { return false; }
305
306    virtual void ConstructJob(Compilation &C, const JobAction &JA,
307                              const InputInfo &Output,
308                              const InputInfoList &Inputs,
309                              const ArgList &TCArgs,
310                              const char *LinkingOutput) const;
311  };
312
313  class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
314  public:
315    Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
316                                               "dsymutil", TC) {}
317
318    virtual bool hasIntegratedCPP() const { return false; }
319
320    virtual void ConstructJob(Compilation &C, const JobAction &JA,
321                              const InputInfo &Output,
322                              const InputInfoList &Inputs,
323                              const ArgList &TCArgs,
324                              const char *LinkingOutput) const;
325  };
326
327  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
328  public:
329    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
330						  "dwarfdump", TC) {}
331
332    virtual bool hasIntegratedCPP() const { return false; }
333
334    virtual void ConstructJob(Compilation &C, const JobAction &JA,
335			      const InputInfo &Output,
336			      const InputInfoList &Inputs,
337			      const ArgList &TCArgs,
338			      const char *LinkingOutput) const;
339  };
340
341}
342
343  /// openbsd -- Directly call GNU Binutils assembler and linker
344namespace openbsd {
345  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
346  public:
347    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
348                                         TC) {}
349
350    virtual bool hasIntegratedCPP() const { return false; }
351
352    virtual void ConstructJob(Compilation &C, const JobAction &JA,
353                              const InputInfo &Output,
354                              const InputInfoList &Inputs,
355                              const ArgList &TCArgs,
356                              const char *LinkingOutput) const;
357  };
358  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
359  public:
360    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
361
362    virtual bool hasIntegratedCPP() const { return false; }
363    virtual bool isLinkJob() const { return true; }
364
365    virtual void ConstructJob(Compilation &C, const JobAction &JA,
366                              const InputInfo &Output,
367                              const InputInfoList &Inputs,
368                              const ArgList &TCArgs,
369                              const char *LinkingOutput) const;
370  };
371} // end namespace openbsd
372
373  /// freebsd -- Directly call GNU Binutils assembler and linker
374namespace freebsd {
375  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
376  public:
377    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
378                                         TC) {}
379
380    virtual bool hasIntegratedCPP() const { return false; }
381
382    virtual void ConstructJob(Compilation &C, const JobAction &JA,
383                              const InputInfo &Output,
384                              const InputInfoList &Inputs,
385                              const ArgList &TCArgs,
386                              const char *LinkingOutput) const;
387  };
388  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
389  public:
390    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
391
392    virtual bool hasIntegratedCPP() const { return false; }
393    virtual bool isLinkJob() const { return true; }
394
395    virtual void ConstructJob(Compilation &C, const JobAction &JA,
396                              const InputInfo &Output,
397                              const InputInfoList &Inputs,
398                              const ArgList &TCArgs,
399                              const char *LinkingOutput) const;
400  };
401} // end namespace freebsd
402
403  /// netbsd -- Directly call GNU Binutils assembler and linker
404namespace netbsd {
405  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
406
407  public:
408    Assemble(const ToolChain &TC)
409      : Tool("netbsd::Assemble", "assembler", TC) {}
410
411    virtual bool hasIntegratedCPP() const { return false; }
412
413    virtual void ConstructJob(Compilation &C, const JobAction &JA,
414                              const InputInfo &Output,
415                              const InputInfoList &Inputs,
416                              const ArgList &TCArgs,
417                              const char *LinkingOutput) const;
418  };
419  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
420
421  public:
422    Link(const ToolChain &TC)
423      : Tool("netbsd::Link", "linker", TC) {}
424
425    virtual bool hasIntegratedCPP() const { return false; }
426    virtual bool isLinkJob() const { return true; }
427
428    virtual void ConstructJob(Compilation &C, const JobAction &JA,
429                              const InputInfo &Output,
430                              const InputInfoList &Inputs,
431                              const ArgList &TCArgs,
432                              const char *LinkingOutput) const;
433  };
434} // end namespace netbsd
435
436  /// linux -- Directly call GNU Binutils assembler and linker
437namespace linuxtools {
438  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
439  public:
440    Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
441                                         TC) {}
442
443    virtual bool hasIntegratedCPP() const { return false; }
444
445    virtual void ConstructJob(Compilation &C, const JobAction &JA,
446                              const InputInfo &Output,
447                              const InputInfoList &Inputs,
448                              const ArgList &TCArgs,
449                              const char *LinkingOutput) const;
450  };
451  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
452  public:
453    Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
454
455    virtual bool hasIntegratedCPP() const { return false; }
456    virtual bool isLinkJob() const { return true; }
457
458    virtual void ConstructJob(Compilation &C, const JobAction &JA,
459                              const InputInfo &Output,
460                              const InputInfoList &Inputs,
461                              const ArgList &TCArgs,
462                              const char *LinkingOutput) const;
463  };
464}
465  /// minix -- Directly call GNU Binutils assembler and linker
466namespace minix {
467  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
468  public:
469    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
470                                         TC) {}
471
472    virtual bool hasIntegratedCPP() const { return false; }
473
474    virtual void ConstructJob(Compilation &C, const JobAction &JA,
475                              const InputInfo &Output,
476                              const InputInfoList &Inputs,
477                              const ArgList &TCArgs,
478                              const char *LinkingOutput) const;
479  };
480  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
481  public:
482    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
483
484    virtual bool hasIntegratedCPP() const { return false; }
485    virtual bool isLinkJob() const { return true; }
486
487    virtual void ConstructJob(Compilation &C, const JobAction &JA,
488                              const InputInfo &Output,
489                              const InputInfoList &Inputs,
490                              const ArgList &TCArgs,
491                              const char *LinkingOutput) const;
492  };
493} // end namespace minix
494
495  /// solaris -- Directly call Solaris assembler and linker
496namespace solaris {
497  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
498  public:
499    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
500                                         TC) {}
501
502    virtual bool hasIntegratedCPP() const { return false; }
503
504    virtual void ConstructJob(Compilation &C, const JobAction &JA,
505                              const InputInfo &Output,
506                              const InputInfoList &Inputs,
507                              const ArgList &TCArgs,
508                              const char *LinkingOutput) const;
509  };
510  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
511  public:
512    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
513
514    virtual bool hasIntegratedCPP() const { return false; }
515    virtual bool isLinkJob() const { return true; }
516
517    virtual void ConstructJob(Compilation &C, const JobAction &JA,
518                              const InputInfo &Output,
519                              const InputInfoList &Inputs,
520                              const ArgList &TCArgs,
521                              const char *LinkingOutput) const;
522  };
523} // end namespace solaris
524
525  /// auroraux -- Directly call GNU Binutils assembler and linker
526namespace auroraux {
527  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
528  public:
529    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
530                                         TC) {}
531
532    virtual bool hasIntegratedCPP() const { return false; }
533
534    virtual void ConstructJob(Compilation &C, const JobAction &JA,
535                              const InputInfo &Output,
536                              const InputInfoList &Inputs,
537                              const ArgList &TCArgs,
538                              const char *LinkingOutput) const;
539  };
540  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
541  public:
542    Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
543
544    virtual bool hasIntegratedCPP() const { return false; }
545    virtual bool isLinkJob() const { return true; }
546
547    virtual void ConstructJob(Compilation &C, const JobAction &JA,
548                              const InputInfo &Output,
549                              const InputInfoList &Inputs,
550                              const ArgList &TCArgs,
551                              const char *LinkingOutput) const;
552  };
553} // end namespace auroraux
554
555  /// dragonfly -- Directly call GNU Binutils assembler and linker
556namespace dragonfly {
557  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
558  public:
559    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
560                                         TC) {}
561
562    virtual bool hasIntegratedCPP() const { return false; }
563
564    virtual void ConstructJob(Compilation &C, const JobAction &JA,
565                              const InputInfo &Output,
566                              const InputInfoList &Inputs,
567                              const ArgList &TCArgs,
568                              const char *LinkingOutput) const;
569  };
570  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
571  public:
572    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
573
574    virtual bool hasIntegratedCPP() const { return false; }
575    virtual bool isLinkJob() const { return true; }
576
577    virtual void ConstructJob(Compilation &C, const JobAction &JA,
578                              const InputInfo &Output,
579                              const InputInfoList &Inputs,
580                              const ArgList &TCArgs,
581                              const char *LinkingOutput) const;
582  };
583} // end namespace dragonfly
584
585  /// Visual studio tools.
586namespace visualstudio {
587  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
588  public:
589    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
590
591    virtual bool hasIntegratedCPP() const { return false; }
592    virtual bool isLinkJob() const { return true; }
593
594    virtual void ConstructJob(Compilation &C, const JobAction &JA,
595                              const InputInfo &Output,
596                              const InputInfoList &Inputs,
597                              const ArgList &TCArgs,
598                              const char *LinkingOutput) const;
599  };
600} // end namespace visualstudio
601
602} // end namespace toolchains
603} // end namespace driver
604} // end namespace clang
605
606#endif // CLANG_LIB_DRIVER_TOOLS_H_
607