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