Tools.h revision 5bab9ae87c41148ee2f92d312945c1e9303222e8
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 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str); 206 207 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 208 virtual void anchor(); 209 protected: 210 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const; 211 212 const toolchains::Darwin &getDarwinToolChain() const { 213 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 214 } 215 216 public: 217 DarwinTool(const char *Name, const char *ShortName, 218 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 219 }; 220 221 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool { 222 virtual void anchor(); 223 public: 224 static const char *getBaseInputName(const ArgList &Args, 225 const InputInfoList &Input); 226 static const char *getBaseInputStem(const ArgList &Args, 227 const InputInfoList &Input); 228 static const char *getDependencyFileName(const ArgList &Args, 229 const InputInfoList &Inputs); 230 231 protected: 232 const char *getCC1Name(types::ID Type) const; 233 234 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const; 235 void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const; 236 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 237 const InputInfoList &Inputs, 238 const ArgStringList &OutputArgs) const; 239 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 240 const InputInfoList &Inputs, 241 const ArgStringList &OutputArgs) const; 242 void AddCPPUniqueOptionsArgs(const ArgList &Args, 243 ArgStringList &CmdArgs, 244 const InputInfoList &Inputs) const; 245 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 246 247 public: 248 CC1(const char *Name, const char *ShortName, 249 const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {} 250 251 virtual bool hasGoodDiagnostics() const { return true; } 252 virtual bool hasIntegratedCPP() const { return true; } 253 }; 254 255 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 { 256 public: 257 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", 258 "gcc preprocessor", TC) {} 259 260 virtual void ConstructJob(Compilation &C, const JobAction &JA, 261 const InputInfo &Output, 262 const InputInfoList &Inputs, 263 const ArgList &TCArgs, 264 const char *LinkingOutput) const; 265 }; 266 267 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 { 268 public: 269 Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {} 270 271 virtual void ConstructJob(Compilation &C, const JobAction &JA, 272 const InputInfo &Output, 273 const InputInfoList &Inputs, 274 const ArgList &TCArgs, 275 const char *LinkingOutput) const; 276 }; 277 278 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 279 public: 280 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", 281 "assembler", 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 ArgList &TCArgs, 289 const char *LinkingOutput) const; 290 }; 291 292 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 293 bool NeedsTempPath(const InputInfoList &Inputs) const; 294 void AddLinkArgs(Compilation &C, const ArgList &Args, 295 ArgStringList &CmdArgs, const InputInfoList &Inputs) const; 296 297 public: 298 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} 299 300 virtual bool hasIntegratedCPP() const { return false; } 301 virtual bool isLinkJob() const { return true; } 302 303 virtual void ConstructJob(Compilation &C, const JobAction &JA, 304 const InputInfo &Output, 305 const InputInfoList &Inputs, 306 const ArgList &TCArgs, 307 const char *LinkingOutput) const; 308 }; 309 310 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 311 public: 312 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {} 313 314 virtual bool hasIntegratedCPP() const { return false; } 315 316 virtual void ConstructJob(Compilation &C, const JobAction &JA, 317 const InputInfo &Output, 318 const InputInfoList &Inputs, 319 const ArgList &TCArgs, 320 const char *LinkingOutput) const; 321 }; 322 323 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { 324 public: 325 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", 326 "dsymutil", TC) {} 327 328 virtual bool hasIntegratedCPP() const { return false; } 329 330 virtual void ConstructJob(Compilation &C, const JobAction &JA, 331 const InputInfo &Output, 332 const InputInfoList &Inputs, 333 const ArgList &TCArgs, 334 const char *LinkingOutput) const; 335 }; 336 337 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool { 338 public: 339 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug", 340 "dwarfdump", TC) {} 341 342 virtual bool hasIntegratedCPP() const { return false; } 343 344 virtual void ConstructJob(Compilation &C, const JobAction &JA, 345 const InputInfo &Output, 346 const InputInfoList &Inputs, 347 const ArgList &TCArgs, 348 const char *LinkingOutput) const; 349 }; 350 351} 352 353 /// openbsd -- Directly call GNU Binutils assembler and linker 354namespace openbsd { 355 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 356 public: 357 Assemble(const ToolChain &TC) : Tool("openbsd::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 ArgList &TCArgs, 366 const char *LinkingOutput) const; 367 }; 368 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 369 public: 370 Link(const ToolChain &TC) : Tool("openbsd::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 ArgList &TCArgs, 379 const char *LinkingOutput) const; 380 }; 381} // end namespace openbsd 382 383 /// bitrig -- Directly call GNU Binutils assembler and linker 384namespace bitrig { 385 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 386 public: 387 Assemble(const ToolChain &TC) : Tool("bitrig::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 ArgList &TCArgs, 396 const char *LinkingOutput) const; 397 }; 398 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 399 public: 400 Link(const ToolChain &TC) : Tool("bitrig::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 ArgList &TCArgs, 409 const char *LinkingOutput) const; 410 }; 411} // end namespace bitrig 412 413 /// freebsd -- Directly call GNU Binutils assembler and linker 414namespace freebsd { 415 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 416 public: 417 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 418 TC) {} 419 420 virtual bool hasIntegratedCPP() const { return false; } 421 422 virtual void ConstructJob(Compilation &C, const JobAction &JA, 423 const InputInfo &Output, 424 const InputInfoList &Inputs, 425 const ArgList &TCArgs, 426 const char *LinkingOutput) const; 427 }; 428 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 429 public: 430 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {} 431 432 virtual bool hasIntegratedCPP() const { return false; } 433 virtual bool isLinkJob() const { return true; } 434 435 virtual void ConstructJob(Compilation &C, const JobAction &JA, 436 const InputInfo &Output, 437 const InputInfoList &Inputs, 438 const ArgList &TCArgs, 439 const char *LinkingOutput) const; 440 }; 441} // end namespace freebsd 442 443 /// netbsd -- Directly call GNU Binutils assembler and linker 444namespace netbsd { 445 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 446 447 public: 448 Assemble(const ToolChain &TC) 449 : Tool("netbsd::Assemble", "assembler", TC) {} 450 451 virtual bool hasIntegratedCPP() const { return false; } 452 453 virtual void ConstructJob(Compilation &C, const JobAction &JA, 454 const InputInfo &Output, 455 const InputInfoList &Inputs, 456 const ArgList &TCArgs, 457 const char *LinkingOutput) const; 458 }; 459 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 460 461 public: 462 Link(const ToolChain &TC) 463 : Tool("netbsd::Link", "linker", TC) {} 464 465 virtual bool hasIntegratedCPP() const { return false; } 466 virtual bool isLinkJob() const { return true; } 467 468 virtual void ConstructJob(Compilation &C, const JobAction &JA, 469 const InputInfo &Output, 470 const InputInfoList &Inputs, 471 const ArgList &TCArgs, 472 const char *LinkingOutput) const; 473 }; 474} // end namespace netbsd 475 476 /// linux -- Directly call GNU Binutils assembler and linker 477namespace linuxtools { 478 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 479 public: 480 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler", 481 TC) {} 482 483 virtual bool hasIntegratedCPP() const { return false; } 484 485 virtual void ConstructJob(Compilation &C, const JobAction &JA, 486 const InputInfo &Output, 487 const InputInfoList &Inputs, 488 const ArgList &TCArgs, 489 const char *LinkingOutput) const; 490 }; 491 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 492 public: 493 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {} 494 495 virtual bool hasIntegratedCPP() const { return false; } 496 virtual bool isLinkJob() const { return true; } 497 498 virtual void ConstructJob(Compilation &C, const JobAction &JA, 499 const InputInfo &Output, 500 const InputInfoList &Inputs, 501 const ArgList &TCArgs, 502 const char *LinkingOutput) const; 503 }; 504} 505 /// minix -- Directly call GNU Binutils assembler and linker 506namespace minix { 507 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 508 public: 509 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 510 TC) {} 511 512 virtual bool hasIntegratedCPP() const { return false; } 513 514 virtual void ConstructJob(Compilation &C, const JobAction &JA, 515 const InputInfo &Output, 516 const InputInfoList &Inputs, 517 const ArgList &TCArgs, 518 const char *LinkingOutput) const; 519 }; 520 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 521 public: 522 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 523 524 virtual bool hasIntegratedCPP() const { return false; } 525 virtual bool isLinkJob() const { return true; } 526 527 virtual void ConstructJob(Compilation &C, const JobAction &JA, 528 const InputInfo &Output, 529 const InputInfoList &Inputs, 530 const ArgList &TCArgs, 531 const char *LinkingOutput) const; 532 }; 533} // end namespace minix 534 535 /// solaris -- Directly call Solaris assembler and linker 536namespace solaris { 537 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 538 public: 539 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", 540 TC) {} 541 542 virtual bool hasIntegratedCPP() const { return false; } 543 544 virtual void ConstructJob(Compilation &C, const JobAction &JA, 545 const InputInfo &Output, 546 const InputInfoList &Inputs, 547 const ArgList &TCArgs, 548 const char *LinkingOutput) const; 549 }; 550 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 551 public: 552 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} 553 554 virtual bool hasIntegratedCPP() const { return false; } 555 virtual bool isLinkJob() const { return true; } 556 557 virtual void ConstructJob(Compilation &C, const JobAction &JA, 558 const InputInfo &Output, 559 const InputInfoList &Inputs, 560 const ArgList &TCArgs, 561 const char *LinkingOutput) const; 562 }; 563} // end namespace solaris 564 565 /// auroraux -- Directly call GNU Binutils assembler and linker 566namespace auroraux { 567 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 568 public: 569 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 570 TC) {} 571 572 virtual bool hasIntegratedCPP() const { return false; } 573 574 virtual void ConstructJob(Compilation &C, const JobAction &JA, 575 const InputInfo &Output, 576 const InputInfoList &Inputs, 577 const ArgList &TCArgs, 578 const char *LinkingOutput) const; 579 }; 580 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 581 public: 582 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 583 584 virtual bool hasIntegratedCPP() const { return false; } 585 virtual bool isLinkJob() const { return true; } 586 587 virtual void ConstructJob(Compilation &C, const JobAction &JA, 588 const InputInfo &Output, 589 const InputInfoList &Inputs, 590 const ArgList &TCArgs, 591 const char *LinkingOutput) const; 592 }; 593} // end namespace auroraux 594 595 /// dragonfly -- Directly call GNU Binutils assembler and linker 596namespace dragonfly { 597 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 598 public: 599 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 600 TC) {} 601 602 virtual bool hasIntegratedCPP() const { return false; } 603 604 virtual void ConstructJob(Compilation &C, const JobAction &JA, 605 const InputInfo &Output, 606 const InputInfoList &Inputs, 607 const ArgList &TCArgs, 608 const char *LinkingOutput) const; 609 }; 610 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 611 public: 612 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 613 614 virtual bool hasIntegratedCPP() const { return false; } 615 virtual bool isLinkJob() const { return true; } 616 617 virtual void ConstructJob(Compilation &C, const JobAction &JA, 618 const InputInfo &Output, 619 const InputInfoList &Inputs, 620 const ArgList &TCArgs, 621 const char *LinkingOutput) const; 622 }; 623} // end namespace dragonfly 624 625 /// Visual studio tools. 626namespace visualstudio { 627 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 628 public: 629 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {} 630 631 virtual bool hasIntegratedCPP() const { return false; } 632 virtual bool isLinkJob() const { return true; } 633 634 virtual void ConstructJob(Compilation &C, const JobAction &JA, 635 const InputInfo &Output, 636 const InputInfoList &Inputs, 637 const ArgList &TCArgs, 638 const char *LinkingOutput) const; 639 }; 640} // end namespace visualstudio 641 642} // end namespace toolchains 643} // end namespace driver 644} // end namespace clang 645 646#endif // CLANG_LIB_DRIVER_TOOLS_H_ 647