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