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