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