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 20namespace clang { 21 class ObjCRuntime; 22 23namespace driver { 24 class Command; 25 class Driver; 26 27namespace toolchains { 28 class Darwin; 29} 30 31namespace tools { 32using 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. 111namespace 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 190namespace 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 228namespace 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 324namespace 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 354namespace 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 384namespace 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 414namespace 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. 447namespace 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 475namespace minix { 476 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 477 public: 478 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 479 TC) {} 480 481 virtual bool hasIntegratedCPP() const { return false; } 482 483 virtual void ConstructJob(Compilation &C, const JobAction &JA, 484 const InputInfo &Output, 485 const InputInfoList &Inputs, 486 const llvm::opt::ArgList &TCArgs, 487 const char *LinkingOutput) const; 488 }; 489 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 490 public: 491 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 492 493 virtual bool hasIntegratedCPP() const { return false; } 494 virtual bool isLinkJob() const { return true; } 495 496 virtual void ConstructJob(Compilation &C, const JobAction &JA, 497 const InputInfo &Output, 498 const InputInfoList &Inputs, 499 const llvm::opt::ArgList &TCArgs, 500 const char *LinkingOutput) const; 501 }; 502} // end namespace minix 503 504 /// solaris -- Directly call Solaris assembler and linker 505namespace solaris { 506 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 507 public: 508 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", 509 TC) {} 510 511 virtual bool hasIntegratedCPP() const { return false; } 512 513 virtual void ConstructJob(Compilation &C, const JobAction &JA, 514 const InputInfo &Output, 515 const InputInfoList &Inputs, 516 const llvm::opt::ArgList &TCArgs, 517 const char *LinkingOutput) const; 518 }; 519 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 520 public: 521 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} 522 523 virtual bool hasIntegratedCPP() const { return false; } 524 virtual bool isLinkJob() const { return true; } 525 526 virtual void ConstructJob(Compilation &C, const JobAction &JA, 527 const InputInfo &Output, 528 const InputInfoList &Inputs, 529 const llvm::opt::ArgList &TCArgs, 530 const char *LinkingOutput) const; 531 }; 532} // end namespace solaris 533 534 /// auroraux -- Directly call GNU Binutils assembler and linker 535namespace auroraux { 536 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 537 public: 538 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 539 TC) {} 540 541 virtual bool hasIntegratedCPP() const { return false; } 542 543 virtual void ConstructJob(Compilation &C, const JobAction &JA, 544 const InputInfo &Output, 545 const InputInfoList &Inputs, 546 const llvm::opt::ArgList &TCArgs, 547 const char *LinkingOutput) const; 548 }; 549 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 550 public: 551 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 552 553 virtual bool hasIntegratedCPP() const { return false; } 554 virtual bool isLinkJob() const { return true; } 555 556 virtual void ConstructJob(Compilation &C, const JobAction &JA, 557 const InputInfo &Output, 558 const InputInfoList &Inputs, 559 const llvm::opt::ArgList &TCArgs, 560 const char *LinkingOutput) const; 561 }; 562} // end namespace auroraux 563 564 /// dragonfly -- Directly call GNU Binutils assembler and linker 565namespace dragonfly { 566 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 567 public: 568 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 569 TC) {} 570 571 virtual bool hasIntegratedCPP() const { return false; } 572 573 virtual void ConstructJob(Compilation &C, const JobAction &JA, 574 const InputInfo &Output, 575 const InputInfoList &Inputs, 576 const llvm::opt::ArgList &TCArgs, 577 const char *LinkingOutput) const; 578 }; 579 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 580 public: 581 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 582 583 virtual bool hasIntegratedCPP() const { return false; } 584 virtual bool isLinkJob() const { return true; } 585 586 virtual void ConstructJob(Compilation &C, const JobAction &JA, 587 const InputInfo &Output, 588 const InputInfoList &Inputs, 589 const llvm::opt::ArgList &TCArgs, 590 const char *LinkingOutput) const; 591 }; 592} // end namespace dragonfly 593 594 /// Visual studio tools. 595namespace visualstudio { 596 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 597 public: 598 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {} 599 600 virtual bool hasIntegratedCPP() const { return false; } 601 virtual bool isLinkJob() const { return true; } 602 603 virtual void ConstructJob(Compilation &C, const JobAction &JA, 604 const InputInfo &Output, 605 const InputInfoList &Inputs, 606 const llvm::opt::ArgList &TCArgs, 607 const char *LinkingOutput) const; 608 }; 609 610 class LLVM_LIBRARY_VISIBILITY Compile : public Tool { 611 public: 612 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {} 613 614 virtual bool hasIntegratedAssembler() const { return true; } 615 virtual bool hasIntegratedCPP() const { return true; } 616 virtual bool isLinkJob() const { return false; } 617 618 virtual void ConstructJob(Compilation &C, const JobAction &JA, 619 const InputInfo &Output, 620 const InputInfoList &Inputs, 621 const llvm::opt::ArgList &TCArgs, 622 const char *LinkingOutput) const; 623 624 Command *GetCommand(Compilation &C, const JobAction &JA, 625 const InputInfo &Output, 626 const InputInfoList &Inputs, 627 const llvm::opt::ArgList &TCArgs, 628 const char *LinkingOutput) const; 629 }; 630} // end namespace visualstudio 631 632namespace XCore { 633 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 634 // We simply use "clang -cc1" for those actions. 635 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 636 public: 637 Assemble(const ToolChain &TC) : Tool("XCore::Assemble", 638 "XCore-as", TC) {} 639 640 virtual bool hasIntegratedCPP() const { return false; } 641 virtual void ConstructJob(Compilation &C, const JobAction &JA, 642 const InputInfo &Output, 643 const InputInfoList &Inputs, 644 const llvm::opt::ArgList &TCArgs, 645 const char *LinkingOutput) const; 646 }; 647 648 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 649 public: 650 Link(const ToolChain &TC) : Tool("XCore::Link", 651 "XCore-ld", TC) {} 652 653 virtual bool hasIntegratedCPP() const { return false; } 654 virtual bool isLinkJob() const { return true; } 655 virtual void ConstructJob(Compilation &C, const JobAction &JA, 656 const InputInfo &Output, 657 const InputInfoList &Inputs, 658 const llvm::opt::ArgList &TCArgs, 659 const char *LinkingOutput) const; 660 }; 661} // end namespace XCore. 662 663 664} // end namespace toolchains 665} // end namespace driver 666} // end namespace clang 667 668#endif // CLANG_LIB_DRIVER_TOOLS_H_ 669