Tools.h revision 42f74f21ece01dc8573d5377859d327fbb23b26c
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    void AddLinkArgs(Compilation &C, const ArgList &Args,
292                     ArgStringList &CmdArgs) const;
293
294  public:
295    Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
296
297    virtual bool hasIntegratedCPP() const { return false; }
298    virtual bool isLinkJob() const { return true; }
299
300    virtual void ConstructJob(Compilation &C, const JobAction &JA,
301                              const InputInfo &Output,
302                              const InputInfoList &Inputs,
303                              const ArgList &TCArgs,
304                              const char *LinkingOutput) const;
305  };
306
307  class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
308  public:
309    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
310
311    virtual bool hasIntegratedCPP() const { return false; }
312
313    virtual void ConstructJob(Compilation &C, const JobAction &JA,
314                              const InputInfo &Output,
315                              const InputInfoList &Inputs,
316                              const ArgList &TCArgs,
317                              const char *LinkingOutput) const;
318  };
319
320  class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
321  public:
322    Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
323                                               "dsymutil", TC) {}
324
325    virtual bool hasIntegratedCPP() const { return false; }
326
327    virtual void ConstructJob(Compilation &C, const JobAction &JA,
328                              const InputInfo &Output,
329                              const InputInfoList &Inputs,
330                              const ArgList &TCArgs,
331                              const char *LinkingOutput) const;
332  };
333
334  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
335  public:
336    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
337						  "dwarfdump", 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
348}
349
350  /// openbsd -- Directly call GNU Binutils assembler and linker
351namespace openbsd {
352  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
353  public:
354    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
355                                         TC) {}
356
357    virtual bool hasIntegratedCPP() const { return false; }
358
359    virtual void ConstructJob(Compilation &C, const JobAction &JA,
360                              const InputInfo &Output,
361                              const InputInfoList &Inputs,
362                              const ArgList &TCArgs,
363                              const char *LinkingOutput) const;
364  };
365  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
366  public:
367    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
368
369    virtual bool hasIntegratedCPP() const { return false; }
370    virtual bool isLinkJob() const { return true; }
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} // end namespace openbsd
379
380  /// bitrig -- Directly call GNU Binutils assembler and linker
381namespace bitrig {
382  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
383  public:
384    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
385                                         TC) {}
386
387    virtual bool hasIntegratedCPP() const { return false; }
388
389    virtual void ConstructJob(Compilation &C, const JobAction &JA,
390                              const InputInfo &Output,
391                              const InputInfoList &Inputs,
392                              const ArgList &TCArgs,
393                              const char *LinkingOutput) const;
394  };
395  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
396  public:
397    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
398
399    virtual bool hasIntegratedCPP() const { return false; }
400    virtual bool isLinkJob() const { return true; }
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} // end namespace bitrig
409
410  /// freebsd -- Directly call GNU Binutils assembler and linker
411namespace freebsd {
412  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
413  public:
414    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
415                                         TC) {}
416
417    virtual bool hasIntegratedCPP() const { return false; }
418
419    virtual void ConstructJob(Compilation &C, const JobAction &JA,
420                              const InputInfo &Output,
421                              const InputInfoList &Inputs,
422                              const ArgList &TCArgs,
423                              const char *LinkingOutput) const;
424  };
425  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
426  public:
427    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
428
429    virtual bool hasIntegratedCPP() const { return false; }
430    virtual bool isLinkJob() const { return true; }
431
432    virtual void ConstructJob(Compilation &C, const JobAction &JA,
433                              const InputInfo &Output,
434                              const InputInfoList &Inputs,
435                              const ArgList &TCArgs,
436                              const char *LinkingOutput) const;
437  };
438} // end namespace freebsd
439
440  /// netbsd -- Directly call GNU Binutils assembler and linker
441namespace netbsd {
442  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
443
444  public:
445    Assemble(const ToolChain &TC)
446      : Tool("netbsd::Assemble", "assembler", TC) {}
447
448    virtual bool hasIntegratedCPP() const { return false; }
449
450    virtual void ConstructJob(Compilation &C, const JobAction &JA,
451                              const InputInfo &Output,
452                              const InputInfoList &Inputs,
453                              const ArgList &TCArgs,
454                              const char *LinkingOutput) const;
455  };
456  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
457
458  public:
459    Link(const ToolChain &TC)
460      : Tool("netbsd::Link", "linker", TC) {}
461
462    virtual bool hasIntegratedCPP() const { return false; }
463    virtual bool isLinkJob() const { return true; }
464
465    virtual void ConstructJob(Compilation &C, const JobAction &JA,
466                              const InputInfo &Output,
467                              const InputInfoList &Inputs,
468                              const ArgList &TCArgs,
469                              const char *LinkingOutput) const;
470  };
471} // end namespace netbsd
472
473  /// linux -- Directly call GNU Binutils assembler and linker
474namespace linuxtools {
475  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
476  public:
477    Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
478                                         TC) {}
479
480    virtual bool hasIntegratedCPP() const { return false; }
481
482    virtual void ConstructJob(Compilation &C, const JobAction &JA,
483                              const InputInfo &Output,
484                              const InputInfoList &Inputs,
485                              const ArgList &TCArgs,
486                              const char *LinkingOutput) const;
487  };
488  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
489  public:
490    Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
491
492    virtual bool hasIntegratedCPP() const { return false; }
493    virtual bool isLinkJob() const { return true; }
494
495    virtual void ConstructJob(Compilation &C, const JobAction &JA,
496                              const InputInfo &Output,
497                              const InputInfoList &Inputs,
498                              const ArgList &TCArgs,
499                              const char *LinkingOutput) const;
500  };
501}
502  /// minix -- Directly call GNU Binutils assembler and linker
503namespace minix {
504  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
505  public:
506    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
507                                         TC) {}
508
509    virtual bool hasIntegratedCPP() const { return false; }
510
511    virtual void ConstructJob(Compilation &C, const JobAction &JA,
512                              const InputInfo &Output,
513                              const InputInfoList &Inputs,
514                              const ArgList &TCArgs,
515                              const char *LinkingOutput) const;
516  };
517  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
518  public:
519    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
520
521    virtual bool hasIntegratedCPP() const { return false; }
522    virtual bool isLinkJob() const { return true; }
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} // end namespace minix
531
532  /// solaris -- Directly call Solaris assembler and linker
533namespace solaris {
534  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
535  public:
536    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
537                                         TC) {}
538
539    virtual bool hasIntegratedCPP() const { return false; }
540
541    virtual void ConstructJob(Compilation &C, const JobAction &JA,
542                              const InputInfo &Output,
543                              const InputInfoList &Inputs,
544                              const ArgList &TCArgs,
545                              const char *LinkingOutput) const;
546  };
547  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
548  public:
549    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
550
551    virtual bool hasIntegratedCPP() const { return false; }
552    virtual bool isLinkJob() const { return true; }
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} // end namespace solaris
561
562  /// auroraux -- Directly call GNU Binutils assembler and linker
563namespace auroraux {
564  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
565  public:
566    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
567                                         TC) {}
568
569    virtual bool hasIntegratedCPP() const { return false; }
570
571    virtual void ConstructJob(Compilation &C, const JobAction &JA,
572                              const InputInfo &Output,
573                              const InputInfoList &Inputs,
574                              const ArgList &TCArgs,
575                              const char *LinkingOutput) const;
576  };
577  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
578  public:
579    Link(const ToolChain &TC) : Tool("auroraux::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 auroraux
591
592  /// dragonfly -- Directly call GNU Binutils assembler and linker
593namespace dragonfly {
594  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
595  public:
596    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
597                                         TC) {}
598
599    virtual bool hasIntegratedCPP() const { return false; }
600
601    virtual void ConstructJob(Compilation &C, const JobAction &JA,
602                              const InputInfo &Output,
603                              const InputInfoList &Inputs,
604                              const ArgList &TCArgs,
605                              const char *LinkingOutput) const;
606  };
607  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
608  public:
609    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
610
611    virtual bool hasIntegratedCPP() const { return false; }
612    virtual bool isLinkJob() const { return true; }
613
614    virtual void ConstructJob(Compilation &C, const JobAction &JA,
615                              const InputInfo &Output,
616                              const InputInfoList &Inputs,
617                              const ArgList &TCArgs,
618                              const char *LinkingOutput) const;
619  };
620} // end namespace dragonfly
621
622  /// Visual studio tools.
623namespace visualstudio {
624  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
625  public:
626    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
627
628    virtual bool hasIntegratedCPP() const { return false; }
629    virtual bool isLinkJob() const { return true; }
630
631    virtual void ConstructJob(Compilation &C, const JobAction &JA,
632                              const InputInfo &Output,
633                              const InputInfoList &Inputs,
634                              const ArgList &TCArgs,
635                              const char *LinkingOutput) const;
636  };
637} // end namespace visualstudio
638
639} // end namespace toolchains
640} // end namespace driver
641} // end namespace clang
642
643#endif // CLANG_LIB_DRIVER_TOOLS_H_
644