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