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