clang API Documentation

Tools.h
Go to the documentation of this file.
00001 //===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #ifndef CLANG_LIB_DRIVER_TOOLS_H_
00011 #define CLANG_LIB_DRIVER_TOOLS_H_
00012 
00013 #include "clang/Driver/Tool.h"
00014 #include "clang/Driver/Types.h"
00015 #include "clang/Driver/Util.h"
00016 
00017 #include "llvm/ADT/Triple.h"
00018 #include "llvm/Support/Compiler.h"
00019 
00020 namespace clang {
00021 namespace driver {
00022   class Driver;
00023 
00024 namespace toolchains {
00025   class Darwin;
00026 }
00027 
00028 namespace tools {
00029 
00030   /// \brief Clang compiler tool.
00031   class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
00032     void AddPreprocessingOptions(Compilation &C,
00033                                  const Driver &D,
00034                                  const ArgList &Args,
00035                                  ArgStringList &CmdArgs,
00036                                  const InputInfo &Output,
00037                                  const InputInfoList &Inputs) const;
00038 
00039     void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
00040                           bool KernelOrKext) const;
00041     void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
00042     void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
00043     void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
00044     void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
00045 
00046   public:
00047     Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
00048 
00049     virtual bool hasGoodDiagnostics() const { return true; }
00050     virtual bool hasIntegratedAssembler() const { return true; }
00051     virtual bool hasIntegratedCPP() const { return true; }
00052 
00053     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00054                               const InputInfo &Output,
00055                               const InputInfoList &Inputs,
00056                               const ArgList &TCArgs,
00057                               const char *LinkingOutput) const;
00058   };
00059 
00060   /// \brief Clang integrated assembler tool.
00061   class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
00062     void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
00063   public:
00064     ClangAs(const ToolChain &TC) : Tool("clang::as",
00065                                         "clang integrated assembler", TC) {}
00066 
00067     virtual bool hasGoodDiagnostics() const { return true; }
00068     virtual bool hasIntegratedAssembler() const { return false; }
00069     virtual bool hasIntegratedCPP() const { return false; }
00070 
00071     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00072                               const InputInfo &Output,
00073                               const InputInfoList &Inputs,
00074                               const ArgList &TCArgs,
00075                               const char *LinkingOutput) const;
00076   };
00077 
00078   /// gcc - Generic GCC tool implementations.
00079 namespace gcc {
00080   class LLVM_LIBRARY_VISIBILITY Common : public Tool {
00081   public:
00082     Common(const char *Name, const char *ShortName,
00083            const ToolChain &TC) : Tool(Name, ShortName, TC) {}
00084 
00085     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00086                               const InputInfo &Output,
00087                               const InputInfoList &Inputs,
00088                               const ArgList &TCArgs,
00089                               const char *LinkingOutput) const;
00090 
00091     /// RenderExtraToolArgs - Render any arguments necessary to force
00092     /// the particular tool mode.
00093     virtual void RenderExtraToolArgs(const JobAction &JA,
00094                                      ArgStringList &CmdArgs) const = 0;
00095   };
00096 
00097 
00098   class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
00099   public:
00100     Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
00101                                              "gcc preprocessor", TC) {}
00102 
00103     virtual bool hasGoodDiagnostics() const { return true; }
00104     virtual bool hasIntegratedCPP() const { return false; }
00105 
00106     virtual void RenderExtraToolArgs(const JobAction &JA,
00107                                      ArgStringList &CmdArgs) const;
00108   };
00109 
00110   class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
00111   public:
00112     Precompile(const ToolChain &TC) : Common("gcc::Precompile",
00113                                              "gcc precompile", TC) {}
00114 
00115     virtual bool hasGoodDiagnostics() const { return true; }
00116     virtual bool hasIntegratedCPP() const { return true; }
00117 
00118     virtual void RenderExtraToolArgs(const JobAction &JA,
00119                                      ArgStringList &CmdArgs) const;
00120   };
00121 
00122   class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
00123   public:
00124     Compile(const ToolChain &TC) : Common("gcc::Compile",
00125                                           "gcc frontend", TC) {}
00126 
00127     virtual bool hasGoodDiagnostics() const { return true; }
00128     virtual bool hasIntegratedCPP() const { return true; }
00129 
00130     virtual void RenderExtraToolArgs(const JobAction &JA,
00131                                      ArgStringList &CmdArgs) const;
00132   };
00133 
00134   class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
00135   public:
00136     Assemble(const ToolChain &TC) : Common("gcc::Assemble",
00137                                            "assembler (via gcc)", TC) {}
00138 
00139     virtual bool hasIntegratedCPP() const { return false; }
00140 
00141     virtual void RenderExtraToolArgs(const JobAction &JA,
00142                                      ArgStringList &CmdArgs) const;
00143   };
00144 
00145   class LLVM_LIBRARY_VISIBILITY Link : public Common  {
00146   public:
00147     Link(const ToolChain &TC) : Common("gcc::Link",
00148                                        "linker (via gcc)", TC) {}
00149 
00150     virtual bool hasIntegratedCPP() const { return false; }
00151     virtual bool isLinkJob() const { return true; }
00152 
00153     virtual void RenderExtraToolArgs(const JobAction &JA,
00154                                      ArgStringList &CmdArgs) const;
00155   };
00156 } // end namespace gcc
00157 
00158 namespace hexagon {
00159   // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
00160   // We simply use "clang -cc1" for those actions.
00161   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
00162   public:
00163     Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
00164       "hexagon-as", TC) {}
00165 
00166     virtual bool hasIntegratedCPP() const { return false; }
00167 
00168     virtual void RenderExtraToolArgs(const JobAction &JA,
00169                                      ArgStringList &CmdArgs) const;
00170     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00171                               const InputInfo &Output,
00172                               const InputInfoList &Inputs,
00173                               const ArgList &TCArgs,
00174                               const char *LinkingOutput) const;
00175   };
00176 
00177   class LLVM_LIBRARY_VISIBILITY Link : public Tool {
00178   public:
00179     Link(const ToolChain &TC) : Tool("hexagon::Link",
00180       "hexagon-ld", TC) {}
00181 
00182     virtual bool hasIntegratedCPP() const { return false; }
00183     virtual bool isLinkJob() const { return true; }
00184 
00185     virtual void RenderExtraToolArgs(const JobAction &JA,
00186                                      ArgStringList &CmdArgs) const;
00187     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00188                               const InputInfo &Output,
00189                               const InputInfoList &Inputs,
00190                               const ArgList &TCArgs,
00191                               const char *LinkingOutput) const;
00192   };
00193 } // end namespace hexagon.
00194 
00195 
00196 namespace darwin {
00197   class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
00198     virtual void anchor();
00199   protected:
00200     void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
00201 
00202     const toolchains::Darwin &getDarwinToolChain() const {
00203       return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
00204     }
00205 
00206   public:
00207     DarwinTool(const char *Name, const char *ShortName,
00208                const ToolChain &TC) : Tool(Name, ShortName, TC) {}
00209   };
00210 
00211   class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool  {
00212     virtual void anchor();
00213   public:
00214     static const char *getBaseInputName(const ArgList &Args,
00215                                  const InputInfoList &Input);
00216     static const char *getBaseInputStem(const ArgList &Args,
00217                                  const InputInfoList &Input);
00218     static const char *getDependencyFileName(const ArgList &Args,
00219                                              const InputInfoList &Inputs);
00220 
00221   protected:
00222     const char *getCC1Name(types::ID Type) const;
00223 
00224     void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
00225     void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const;
00226     void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
00227                            const InputInfoList &Inputs,
00228                            const ArgStringList &OutputArgs) const;
00229     void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
00230                            const InputInfoList &Inputs,
00231                            const ArgStringList &OutputArgs) const;
00232     void AddCPPUniqueOptionsArgs(const ArgList &Args,
00233                                  ArgStringList &CmdArgs,
00234                                  const InputInfoList &Inputs) const;
00235     void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
00236 
00237   public:
00238     CC1(const char *Name, const char *ShortName,
00239         const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
00240 
00241     virtual bool hasGoodDiagnostics() const { return true; }
00242     virtual bool hasIntegratedCPP() const { return true; }
00243   };
00244 
00245   class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1  {
00246   public:
00247     Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
00248                                           "gcc preprocessor", TC) {}
00249 
00250     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00251                               const InputInfo &Output,
00252                               const InputInfoList &Inputs,
00253                               const ArgList &TCArgs,
00254                               const char *LinkingOutput) const;
00255   };
00256 
00257   class LLVM_LIBRARY_VISIBILITY Compile : public CC1  {
00258   public:
00259     Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
00260 
00261     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00262                               const InputInfo &Output,
00263                               const InputInfoList &Inputs,
00264                               const ArgList &TCArgs,
00265                               const char *LinkingOutput) const;
00266   };
00267 
00268   class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
00269   public:
00270     Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
00271                                                "assembler", TC) {}
00272 
00273     virtual bool hasIntegratedCPP() const { return false; }
00274 
00275     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00276                               const InputInfo &Output,
00277                               const InputInfoList &Inputs,
00278                               const ArgList &TCArgs,
00279                               const char *LinkingOutput) const;
00280   };
00281 
00282   class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
00283     void AddLinkArgs(Compilation &C, const ArgList &Args,
00284                      ArgStringList &CmdArgs) const;
00285 
00286   public:
00287     Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
00288 
00289     virtual bool hasIntegratedCPP() const { return false; }
00290     virtual bool isLinkJob() const { return true; }
00291 
00292     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00293                               const InputInfo &Output,
00294                               const InputInfoList &Inputs,
00295                               const ArgList &TCArgs,
00296                               const char *LinkingOutput) const;
00297   };
00298 
00299   class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
00300   public:
00301     Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
00302 
00303     virtual bool hasIntegratedCPP() const { return false; }
00304 
00305     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00306                               const InputInfo &Output,
00307                               const InputInfoList &Inputs,
00308                               const ArgList &TCArgs,
00309                               const char *LinkingOutput) const;
00310   };
00311 
00312   class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
00313   public:
00314     Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
00315                                                "dsymutil", TC) {}
00316 
00317     virtual bool hasIntegratedCPP() const { return false; }
00318 
00319     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00320                               const InputInfo &Output,
00321                               const InputInfoList &Inputs,
00322                               const ArgList &TCArgs,
00323                               const char *LinkingOutput) const;
00324   };
00325 
00326   class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
00327   public:
00328     VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
00329               "dwarfdump", TC) {}
00330 
00331     virtual bool hasIntegratedCPP() const { return false; }
00332 
00333     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00334             const InputInfo &Output,
00335             const InputInfoList &Inputs,
00336             const ArgList &TCArgs,
00337             const char *LinkingOutput) const;
00338   };
00339 
00340 }
00341 
00342   /// openbsd -- Directly call GNU Binutils assembler and linker
00343 namespace openbsd {
00344   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00345   public:
00346     Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
00347                                          TC) {}
00348 
00349     virtual bool hasIntegratedCPP() const { return false; }
00350 
00351     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00352                               const InputInfo &Output,
00353                               const InputInfoList &Inputs,
00354                               const ArgList &TCArgs,
00355                               const char *LinkingOutput) const;
00356   };
00357   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00358   public:
00359     Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
00360 
00361     virtual bool hasIntegratedCPP() const { return false; }
00362     virtual bool isLinkJob() const { return true; }
00363 
00364     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00365                               const InputInfo &Output,
00366                               const InputInfoList &Inputs,
00367                               const ArgList &TCArgs,
00368                               const char *LinkingOutput) const;
00369   };
00370 } // end namespace openbsd
00371 
00372   /// freebsd -- Directly call GNU Binutils assembler and linker
00373 namespace freebsd {
00374   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00375   public:
00376     Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
00377                                          TC) {}
00378 
00379     virtual bool hasIntegratedCPP() const { return false; }
00380 
00381     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00382                               const InputInfo &Output,
00383                               const InputInfoList &Inputs,
00384                               const ArgList &TCArgs,
00385                               const char *LinkingOutput) const;
00386   };
00387   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00388   public:
00389     Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
00390 
00391     virtual bool hasIntegratedCPP() const { return false; }
00392     virtual bool isLinkJob() const { return true; }
00393 
00394     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00395                               const InputInfo &Output,
00396                               const InputInfoList &Inputs,
00397                               const ArgList &TCArgs,
00398                               const char *LinkingOutput) const;
00399   };
00400 } // end namespace freebsd
00401 
00402   /// netbsd -- Directly call GNU Binutils assembler and linker
00403 namespace netbsd {
00404   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00405 
00406   public:
00407     Assemble(const ToolChain &TC)
00408       : Tool("netbsd::Assemble", "assembler", TC) {}
00409 
00410     virtual bool hasIntegratedCPP() const { return false; }
00411 
00412     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00413                               const InputInfo &Output,
00414                               const InputInfoList &Inputs,
00415                               const ArgList &TCArgs,
00416                               const char *LinkingOutput) const;
00417   };
00418   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00419 
00420   public:
00421     Link(const ToolChain &TC)
00422       : Tool("netbsd::Link", "linker", TC) {}
00423 
00424     virtual bool hasIntegratedCPP() const { return false; }
00425     virtual bool isLinkJob() const { return true; }
00426 
00427     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00428                               const InputInfo &Output,
00429                               const InputInfoList &Inputs,
00430                               const ArgList &TCArgs,
00431                               const char *LinkingOutput) const;
00432   };
00433 } // end namespace netbsd
00434 
00435   /// linux -- Directly call GNU Binutils assembler and linker
00436 namespace linuxtools {
00437   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00438   public:
00439     Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
00440                                          TC) {}
00441 
00442     virtual bool hasIntegratedCPP() const { return false; }
00443 
00444     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00445                               const InputInfo &Output,
00446                               const InputInfoList &Inputs,
00447                               const ArgList &TCArgs,
00448                               const char *LinkingOutput) const;
00449   };
00450   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00451   public:
00452     Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
00453 
00454     virtual bool hasIntegratedCPP() const { return false; }
00455     virtual bool isLinkJob() const { return true; }
00456 
00457     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00458                               const InputInfo &Output,
00459                               const InputInfoList &Inputs,
00460                               const ArgList &TCArgs,
00461                               const char *LinkingOutput) const;
00462   };
00463 }
00464   /// minix -- Directly call GNU Binutils assembler and linker
00465 namespace minix {
00466   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00467   public:
00468     Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
00469                                          TC) {}
00470 
00471     virtual bool hasIntegratedCPP() const { return false; }
00472 
00473     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00474                               const InputInfo &Output,
00475                               const InputInfoList &Inputs,
00476                               const ArgList &TCArgs,
00477                               const char *LinkingOutput) const;
00478   };
00479   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00480   public:
00481     Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
00482 
00483     virtual bool hasIntegratedCPP() const { return false; }
00484     virtual bool isLinkJob() const { return true; }
00485 
00486     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00487                               const InputInfo &Output,
00488                               const InputInfoList &Inputs,
00489                               const ArgList &TCArgs,
00490                               const char *LinkingOutput) const;
00491   };
00492 } // end namespace minix
00493 
00494   /// solaris -- Directly call Solaris assembler and linker
00495 namespace solaris {
00496   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00497   public:
00498     Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
00499                                          TC) {}
00500 
00501     virtual bool hasIntegratedCPP() const { return false; }
00502 
00503     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00504                               const InputInfo &Output,
00505                               const InputInfoList &Inputs,
00506                               const ArgList &TCArgs,
00507                               const char *LinkingOutput) const;
00508   };
00509   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00510   public:
00511     Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
00512 
00513     virtual bool hasIntegratedCPP() const { return false; }
00514     virtual bool isLinkJob() const { return true; }
00515 
00516     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00517                               const InputInfo &Output,
00518                               const InputInfoList &Inputs,
00519                               const ArgList &TCArgs,
00520                               const char *LinkingOutput) const;
00521   };
00522 } // end namespace solaris
00523 
00524   /// auroraux -- Directly call GNU Binutils assembler and linker
00525 namespace auroraux {
00526   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00527   public:
00528     Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
00529                                          TC) {}
00530 
00531     virtual bool hasIntegratedCPP() const { return false; }
00532 
00533     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00534                               const InputInfo &Output,
00535                               const InputInfoList &Inputs,
00536                               const ArgList &TCArgs,
00537                               const char *LinkingOutput) const;
00538   };
00539   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00540   public:
00541     Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
00542 
00543     virtual bool hasIntegratedCPP() const { return false; }
00544     virtual bool isLinkJob() const { return true; }
00545 
00546     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00547                               const InputInfo &Output,
00548                               const InputInfoList &Inputs,
00549                               const ArgList &TCArgs,
00550                               const char *LinkingOutput) const;
00551   };
00552 } // end namespace auroraux
00553 
00554   /// dragonfly -- Directly call GNU Binutils assembler and linker
00555 namespace dragonfly {
00556   class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
00557   public:
00558     Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
00559                                          TC) {}
00560 
00561     virtual bool hasIntegratedCPP() const { return false; }
00562 
00563     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00564                               const InputInfo &Output,
00565                               const InputInfoList &Inputs,
00566                               const ArgList &TCArgs,
00567                               const char *LinkingOutput) const;
00568   };
00569   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00570   public:
00571     Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
00572 
00573     virtual bool hasIntegratedCPP() const { return false; }
00574     virtual bool isLinkJob() const { return true; }
00575 
00576     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00577                               const InputInfo &Output,
00578                               const InputInfoList &Inputs,
00579                               const ArgList &TCArgs,
00580                               const char *LinkingOutput) const;
00581   };
00582 } // end namespace dragonfly
00583 
00584   /// Visual studio tools.
00585 namespace visualstudio {
00586   class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
00587   public:
00588     Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
00589 
00590     virtual bool hasIntegratedCPP() const { return false; }
00591     virtual bool isLinkJob() const { return true; }
00592 
00593     virtual void ConstructJob(Compilation &C, const JobAction &JA,
00594                               const InputInfo &Output,
00595                               const InputInfoList &Inputs,
00596                               const ArgList &TCArgs,
00597                               const char *LinkingOutput) const;
00598   };
00599 } // end namespace visualstudio
00600 
00601 } // end namespace toolchains
00602 } // end namespace driver
00603 } // end namespace clang
00604 
00605 #endif // CLANG_LIB_DRIVER_TOOLS_H_