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