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