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