clang API Documentation
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_