Tools.h revision dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28
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 AddX86TargetArgs(const llvm::opt::ArgList &Args,
63                          llvm::opt::ArgStringList &CmdArgs) const;
64    void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
65                              llvm::opt::ArgStringList &CmdArgs) const;
66
67    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
68
69    ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
70                                   llvm::opt::ArgStringList &cmdArgs,
71                                   RewriteKind rewrite) const;
72
73  public:
74    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
75
76    virtual bool hasGoodDiagnostics() const { return true; }
77    virtual bool hasIntegratedAssembler() const { return true; }
78    virtual bool hasIntegratedCPP() const { return true; }
79
80    virtual void ConstructJob(Compilation &C, const JobAction &JA,
81                              const InputInfo &Output,
82                              const InputInfoList &Inputs,
83                              const llvm::opt::ArgList &TCArgs,
84                              const char *LinkingOutput) const;
85  };
86
87  /// \brief Clang integrated assembler tool.
88  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
89    void AddARMTargetArgs(const llvm::opt::ArgList &Args,
90                          llvm::opt::ArgStringList &CmdArgs) const;
91    void AddX86TargetArgs(const llvm::opt::ArgList &Args,
92                          llvm::opt::ArgStringList &CmdArgs) const;
93
94  public:
95    ClangAs(const ToolChain &TC) : Tool("clang::as",
96                                        "clang integrated assembler", TC) {}
97
98    virtual bool hasGoodDiagnostics() const { return true; }
99    virtual bool hasIntegratedAssembler() const { return false; }
100    virtual bool hasIntegratedCPP() const { return false; }
101
102    virtual void ConstructJob(Compilation &C, const JobAction &JA,
103                              const InputInfo &Output,
104                              const InputInfoList &Inputs,
105                              const llvm::opt::ArgList &TCArgs,
106                              const char *LinkingOutput) const;
107  };
108
109  /// gcc - Generic GCC tool implementations.
110namespace gcc {
111  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
112  public:
113    Common(const char *Name, const char *ShortName,
114           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
115
116    virtual void ConstructJob(Compilation &C, const JobAction &JA,
117                              const InputInfo &Output,
118                              const InputInfoList &Inputs,
119                              const llvm::opt::ArgList &TCArgs,
120                              const char *LinkingOutput) const;
121
122    /// RenderExtraToolArgs - Render any arguments necessary to force
123    /// the particular tool mode.
124    virtual void
125        RenderExtraToolArgs(const JobAction &JA,
126                            llvm::opt::ArgStringList &CmdArgs) const = 0;
127  };
128
129  class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
130  public:
131    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
132                                             "gcc preprocessor", TC) {}
133
134    virtual bool hasGoodDiagnostics() const { return true; }
135    virtual bool hasIntegratedCPP() const { return false; }
136
137    virtual void RenderExtraToolArgs(const JobAction &JA,
138                                     llvm::opt::ArgStringList &CmdArgs) const;
139  };
140
141  class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
142  public:
143    Precompile(const ToolChain &TC) : Common("gcc::Precompile",
144                                             "gcc precompile", TC) {}
145
146    virtual bool hasGoodDiagnostics() const { return true; }
147    virtual bool hasIntegratedCPP() const { return true; }
148
149    virtual void RenderExtraToolArgs(const JobAction &JA,
150                                     llvm::opt::ArgStringList &CmdArgs) const;
151  };
152
153  class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
154  public:
155    Compile(const ToolChain &TC) : Common("gcc::Compile",
156                                          "gcc frontend", TC) {}
157
158    virtual bool hasGoodDiagnostics() const { return true; }
159    virtual bool hasIntegratedCPP() const { return true; }
160
161    virtual void RenderExtraToolArgs(const JobAction &JA,
162                                     llvm::opt::ArgStringList &CmdArgs) const;
163  };
164
165  class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
166  public:
167    Assemble(const ToolChain &TC) : Common("gcc::Assemble",
168                                           "assembler (via gcc)", TC) {}
169
170    virtual bool hasIntegratedCPP() const { return false; }
171
172    virtual void RenderExtraToolArgs(const JobAction &JA,
173                                     llvm::opt::ArgStringList &CmdArgs) const;
174  };
175
176  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
177  public:
178    Link(const ToolChain &TC) : Common("gcc::Link",
179                                       "linker (via gcc)", TC) {}
180
181    virtual bool hasIntegratedCPP() const { return false; }
182    virtual bool isLinkJob() const { return true; }
183
184    virtual void RenderExtraToolArgs(const JobAction &JA,
185                                     llvm::opt::ArgStringList &CmdArgs) const;
186  };
187} // end namespace gcc
188
189namespace hexagon {
190  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
191  // We simply use "clang -cc1" for those actions.
192  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
193  public:
194    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
195      "hexagon-as", TC) {}
196
197    virtual bool hasIntegratedCPP() const { return false; }
198
199    virtual void RenderExtraToolArgs(const JobAction &JA,
200                                     llvm::opt::ArgStringList &CmdArgs) const;
201    virtual void ConstructJob(Compilation &C, const JobAction &JA,
202                              const InputInfo &Output,
203                              const InputInfoList &Inputs,
204                              const llvm::opt::ArgList &TCArgs,
205                              const char *LinkingOutput) const;
206  };
207
208  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
209  public:
210    Link(const ToolChain &TC) : Tool("hexagon::Link",
211      "hexagon-ld", TC) {}
212
213    virtual bool hasIntegratedCPP() const { return false; }
214    virtual bool isLinkJob() const { return true; }
215
216    virtual void RenderExtraToolArgs(const JobAction &JA,
217                                     llvm::opt::ArgStringList &CmdArgs) const;
218    virtual void ConstructJob(Compilation &C, const JobAction &JA,
219                              const InputInfo &Output,
220                              const InputInfoList &Inputs,
221                              const llvm::opt::ArgList &TCArgs,
222                              const char *LinkingOutput) const;
223  };
224} // end namespace hexagon.
225
226
227namespace darwin {
228  llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
229
230  class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
231    virtual void anchor();
232  protected:
233    void AddDarwinArch(const llvm::opt::ArgList &Args,
234                       llvm::opt::ArgStringList &CmdArgs) const;
235
236    const toolchains::Darwin &getDarwinToolChain() const {
237      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
238    }
239
240  public:
241    DarwinTool(const char *Name, const char *ShortName,
242               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
243  };
244
245  class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
246  public:
247    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
248                                               "assembler", TC) {}
249
250    virtual bool hasIntegratedCPP() const { return false; }
251
252    virtual void ConstructJob(Compilation &C, const JobAction &JA,
253                              const InputInfo &Output,
254                              const InputInfoList &Inputs,
255                              const llvm::opt::ArgList &TCArgs,
256                              const char *LinkingOutput) const;
257  };
258
259  class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
260    bool NeedsTempPath(const InputInfoList &Inputs) const;
261    void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
262                     llvm::opt::ArgStringList &CmdArgs,
263                     const InputInfoList &Inputs) const;
264
265  public:
266    Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
267
268    virtual bool hasIntegratedCPP() const { return false; }
269    virtual bool isLinkJob() const { return true; }
270
271    virtual void ConstructJob(Compilation &C, const JobAction &JA,
272                              const InputInfo &Output,
273                              const InputInfoList &Inputs,
274                              const llvm::opt::ArgList &TCArgs,
275                              const char *LinkingOutput) const;
276  };
277
278  class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
279  public:
280    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
281
282    virtual bool hasIntegratedCPP() const { return false; }
283
284    virtual void ConstructJob(Compilation &C, const JobAction &JA,
285                              const InputInfo &Output,
286                              const InputInfoList &Inputs,
287                              const llvm::opt::ArgList &TCArgs,
288                              const char *LinkingOutput) const;
289  };
290
291  class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
292  public:
293    Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
294                                               "dsymutil", TC) {}
295
296    virtual bool hasIntegratedCPP() const { return false; }
297    virtual bool isDsymutilJob() const { return true; }
298
299    virtual void ConstructJob(Compilation &C, const JobAction &JA,
300                              const InputInfo &Output,
301                              const InputInfoList &Inputs,
302                              const llvm::opt::ArgList &TCArgs,
303                              const char *LinkingOutput) const;
304  };
305
306  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
307  public:
308    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
309                                                  "dwarfdump", 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 llvm::opt::ArgList &TCArgs,
317                              const char *LinkingOutput) const;
318  };
319
320}
321
322  /// openbsd -- Directly call GNU Binutils assembler and linker
323namespace openbsd {
324  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
325  public:
326    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
327                                         TC) {}
328
329    virtual bool hasIntegratedCPP() const { return false; }
330
331    virtual void ConstructJob(Compilation &C, const JobAction &JA,
332                              const InputInfo &Output,
333                              const InputInfoList &Inputs,
334                              const llvm::opt::ArgList &TCArgs,
335                              const char *LinkingOutput) const;
336  };
337  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
338  public:
339    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
340
341    virtual bool hasIntegratedCPP() const { return false; }
342    virtual bool isLinkJob() const { return true; }
343
344    virtual void ConstructJob(Compilation &C, const JobAction &JA,
345                              const InputInfo &Output,
346                              const InputInfoList &Inputs,
347                              const llvm::opt::ArgList &TCArgs,
348                              const char *LinkingOutput) const;
349  };
350} // end namespace openbsd
351
352  /// bitrig -- Directly call GNU Binutils assembler and linker
353namespace bitrig {
354  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
355  public:
356    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
357                                         TC) {}
358
359    virtual bool hasIntegratedCPP() const { return false; }
360
361    virtual void ConstructJob(Compilation &C, const JobAction &JA,
362                              const InputInfo &Output,
363                              const InputInfoList &Inputs,
364                              const llvm::opt::ArgList &TCArgs,
365                              const char *LinkingOutput) const;
366  };
367  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
368  public:
369    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
370
371    virtual bool hasIntegratedCPP() const { return false; }
372    virtual bool isLinkJob() const { return true; }
373
374    virtual void ConstructJob(Compilation &C, const JobAction &JA,
375                              const InputInfo &Output,
376                              const InputInfoList &Inputs,
377                              const llvm::opt::ArgList &TCArgs,
378                              const char *LinkingOutput) const;
379  };
380} // end namespace bitrig
381
382  /// freebsd -- Directly call GNU Binutils assembler and linker
383namespace freebsd {
384  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
385  public:
386    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
387                                         TC) {}
388
389    virtual bool hasIntegratedCPP() const { return false; }
390
391    virtual void ConstructJob(Compilation &C, const JobAction &JA,
392                              const InputInfo &Output,
393                              const InputInfoList &Inputs,
394                              const llvm::opt::ArgList &TCArgs,
395                              const char *LinkingOutput) const;
396  };
397  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
398  public:
399    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
400
401    virtual bool hasIntegratedCPP() const { return false; }
402    virtual bool isLinkJob() const { return true; }
403
404    virtual void ConstructJob(Compilation &C, const JobAction &JA,
405                              const InputInfo &Output,
406                              const InputInfoList &Inputs,
407                              const llvm::opt::ArgList &TCArgs,
408                              const char *LinkingOutput) const;
409  };
410} // end namespace freebsd
411
412  /// netbsd -- Directly call GNU Binutils assembler and linker
413namespace netbsd {
414  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
415
416  public:
417    Assemble(const ToolChain &TC)
418      : Tool("netbsd::Assemble", "assembler", TC) {}
419
420    virtual bool hasIntegratedCPP() const { return false; }
421
422    virtual void ConstructJob(Compilation &C, const JobAction &JA,
423                              const InputInfo &Output,
424                              const InputInfoList &Inputs,
425                              const llvm::opt::ArgList &TCArgs,
426                              const char *LinkingOutput) const;
427  };
428  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
429
430  public:
431    Link(const ToolChain &TC)
432      : Tool("netbsd::Link", "linker", TC) {}
433
434    virtual bool hasIntegratedCPP() const { return false; }
435    virtual bool isLinkJob() const { return true; }
436
437    virtual void ConstructJob(Compilation &C, const JobAction &JA,
438                              const InputInfo &Output,
439                              const InputInfoList &Inputs,
440                              const llvm::opt::ArgList &TCArgs,
441                              const char *LinkingOutput) const;
442  };
443} // end namespace netbsd
444
445  /// Directly call GNU Binutils' assembler and linker.
446namespace gnutools {
447  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
448  public:
449    Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
450
451    virtual bool hasIntegratedCPP() const { return false; }
452
453    virtual void ConstructJob(Compilation &C, const JobAction &JA,
454                              const InputInfo &Output,
455                              const InputInfoList &Inputs,
456                              const llvm::opt::ArgList &TCArgs,
457                              const char *LinkingOutput) const;
458  };
459  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
460  public:
461    Link(const ToolChain &TC) : Tool("GNU::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 llvm::opt::ArgList &TCArgs,
470                              const char *LinkingOutput) const;
471  };
472}
473  /// minix -- Directly call GNU Binutils assembler and linker
474namespace minix {
475  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
476  public:
477    Assemble(const ToolChain &TC) : Tool("minix::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 llvm::opt::ArgList &TCArgs,
486                              const char *LinkingOutput) const;
487  };
488  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
489  public:
490    Link(const ToolChain &TC) : Tool("minix::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 llvm::opt::ArgList &TCArgs,
499                              const char *LinkingOutput) const;
500  };
501} // end namespace minix
502
503  /// solaris -- Directly call Solaris assembler and linker
504namespace solaris {
505  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
506  public:
507    Assemble(const ToolChain &TC) : Tool("solaris::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 llvm::opt::ArgList &TCArgs,
516                              const char *LinkingOutput) const;
517  };
518  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
519  public:
520    Link(const ToolChain &TC) : Tool("solaris::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 llvm::opt::ArgList &TCArgs,
529                              const char *LinkingOutput) const;
530  };
531} // end namespace solaris
532
533  /// auroraux -- Directly call GNU Binutils assembler and linker
534namespace auroraux {
535  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
536  public:
537    Assemble(const ToolChain &TC) : Tool("auroraux::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 llvm::opt::ArgList &TCArgs,
546                              const char *LinkingOutput) const;
547  };
548  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
549  public:
550    Link(const ToolChain &TC) : Tool("auroraux::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 llvm::opt::ArgList &TCArgs,
559                              const char *LinkingOutput) const;
560  };
561} // end namespace auroraux
562
563  /// dragonfly -- Directly call GNU Binutils assembler and linker
564namespace dragonfly {
565  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
566  public:
567    Assemble(const ToolChain &TC) : Tool("dragonfly::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 llvm::opt::ArgList &TCArgs,
576                              const char *LinkingOutput) const;
577  };
578  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
579  public:
580    Link(const ToolChain &TC) : Tool("dragonfly::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 llvm::opt::ArgList &TCArgs,
589                              const char *LinkingOutput) const;
590  };
591} // end namespace dragonfly
592
593  /// Visual studio tools.
594namespace visualstudio {
595  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
596  public:
597    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
598
599    virtual bool hasIntegratedCPP() const { return false; }
600    virtual bool isLinkJob() const { return true; }
601
602    virtual void ConstructJob(Compilation &C, const JobAction &JA,
603                              const InputInfo &Output,
604                              const InputInfoList &Inputs,
605                              const llvm::opt::ArgList &TCArgs,
606                              const char *LinkingOutput) const;
607  };
608} // end namespace visualstudio
609
610} // end namespace toolchains
611} // end namespace driver
612} // end namespace clang
613
614#endif // CLANG_LIB_DRIVER_TOOLS_H_
615