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 Driver; 25 26 namespace toolchains { 27 class Darwin; 28 } 29 30 namespace tools { 31 using llvm::opt::ArgStringList; 32 33 /// \brief Clang compiler tool. 34 class LLVM_LIBRARY_VISIBILITY Clang : public Tool { 35 public: 36 static const char *getBaseInputName(const llvm::opt::ArgList &Args, 37 const InputInfoList &Inputs); 38 static const char *getBaseInputStem(const llvm::opt::ArgList &Args, 39 const InputInfoList &Inputs); 40 static const char *getDependencyFileName(const llvm::opt::ArgList &Args, 41 const InputInfoList &Inputs); 42 43 private: 44 void AddPreprocessingOptions(Compilation &C, const JobAction &JA, 45 const Driver &D, 46 const llvm::opt::ArgList &Args, 47 llvm::opt::ArgStringList &CmdArgs, 48 const InputInfo &Output, 49 const InputInfoList &Inputs) const; 50 51 void AddARMTargetArgs(const llvm::opt::ArgList &Args, 52 llvm::opt::ArgStringList &CmdArgs, 53 bool KernelOrKext) const; 54 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 55 llvm::opt::ArgStringList &CmdArgs) const; 56 void AddPPCTargetArgs(const llvm::opt::ArgList &Args, 57 llvm::opt::ArgStringList &CmdArgs) const; 58 void AddR600TargetArgs(const llvm::opt::ArgList &Args, 59 llvm::opt::ArgStringList &CmdArgs) const; 60 void AddSparcTargetArgs(const llvm::opt::ArgList &Args, 61 llvm::opt::ArgStringList &CmdArgs) const; 62 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args, 63 llvm::opt::ArgStringList &CmdArgs) const; 64 void AddX86TargetArgs(const llvm::opt::ArgList &Args, 65 llvm::opt::ArgStringList &CmdArgs) const; 66 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args, 67 llvm::opt::ArgStringList &CmdArgs) const; 68 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, 69 llvm::opt::ArgStringList &CmdArgs) const; 70 71 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile }; 72 73 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args, 74 llvm::opt::ArgStringList &cmdArgs, 75 RewriteKind rewrite) const; 76 77 public: Clang(const ToolChain & TC)78 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {} 79 hasGoodDiagnostics()80 virtual bool hasGoodDiagnostics() const { return true; } hasIntegratedAssembler()81 virtual bool hasIntegratedAssembler() const { return true; } hasIntegratedCPP()82 virtual bool hasIntegratedCPP() const { return true; } 83 84 virtual void ConstructJob(Compilation &C, const JobAction &JA, 85 const InputInfo &Output, 86 const InputInfoList &Inputs, 87 const llvm::opt::ArgList &TCArgs, 88 const char *LinkingOutput) const; 89 }; 90 91 /// \brief Clang integrated assembler tool. 92 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 93 void AddARMTargetArgs(const llvm::opt::ArgList &Args, 94 llvm::opt::ArgStringList &CmdArgs) const; 95 void AddX86TargetArgs(const llvm::opt::ArgList &Args, 96 llvm::opt::ArgStringList &CmdArgs) const; 97 98 public: ClangAs(const ToolChain & TC)99 ClangAs(const ToolChain &TC) : Tool("clang::as", 100 "clang integrated assembler", TC) {} 101 hasGoodDiagnostics()102 virtual bool hasGoodDiagnostics() const { return true; } hasIntegratedAssembler()103 virtual bool hasIntegratedAssembler() const { return false; } hasIntegratedCPP()104 virtual bool hasIntegratedCPP() const { return false; } 105 106 virtual void ConstructJob(Compilation &C, const JobAction &JA, 107 const InputInfo &Output, 108 const InputInfoList &Inputs, 109 const llvm::opt::ArgList &TCArgs, 110 const char *LinkingOutput) const; 111 }; 112 113 /// gcc - Generic GCC tool implementations. 114 namespace gcc { 115 class LLVM_LIBRARY_VISIBILITY Common : public Tool { 116 public: Common(const char * Name,const char * ShortName,const ToolChain & TC)117 Common(const char *Name, const char *ShortName, 118 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 119 120 virtual void ConstructJob(Compilation &C, const JobAction &JA, 121 const InputInfo &Output, 122 const InputInfoList &Inputs, 123 const llvm::opt::ArgList &TCArgs, 124 const char *LinkingOutput) const; 125 126 /// RenderExtraToolArgs - Render any arguments necessary to force 127 /// the particular tool mode. 128 virtual void 129 RenderExtraToolArgs(const JobAction &JA, 130 llvm::opt::ArgStringList &CmdArgs) const = 0; 131 }; 132 133 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common { 134 public: Preprocess(const ToolChain & TC)135 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", 136 "gcc preprocessor", TC) {} 137 hasGoodDiagnostics()138 virtual bool hasGoodDiagnostics() const { return true; } hasIntegratedCPP()139 virtual bool hasIntegratedCPP() const { return false; } 140 141 virtual void RenderExtraToolArgs(const JobAction &JA, 142 llvm::opt::ArgStringList &CmdArgs) const; 143 }; 144 145 class LLVM_LIBRARY_VISIBILITY Precompile : public Common { 146 public: Precompile(const ToolChain & TC)147 Precompile(const ToolChain &TC) : Common("gcc::Precompile", 148 "gcc precompile", TC) {} 149 hasGoodDiagnostics()150 virtual bool hasGoodDiagnostics() const { return true; } hasIntegratedCPP()151 virtual bool hasIntegratedCPP() const { return true; } 152 153 virtual void RenderExtraToolArgs(const JobAction &JA, 154 llvm::opt::ArgStringList &CmdArgs) const; 155 }; 156 157 class LLVM_LIBRARY_VISIBILITY Compile : public Common { 158 public: Compile(const ToolChain & TC)159 Compile(const ToolChain &TC) : Common("gcc::Compile", 160 "gcc frontend", TC) {} 161 hasGoodDiagnostics()162 virtual bool hasGoodDiagnostics() const { return true; } hasIntegratedCPP()163 virtual bool hasIntegratedCPP() const { return true; } 164 165 virtual void RenderExtraToolArgs(const JobAction &JA, 166 llvm::opt::ArgStringList &CmdArgs) const; 167 }; 168 169 class LLVM_LIBRARY_VISIBILITY Assemble : public Common { 170 public: Assemble(const ToolChain & TC)171 Assemble(const ToolChain &TC) : Common("gcc::Assemble", 172 "assembler (via gcc)", TC) {} 173 hasIntegratedCPP()174 virtual bool hasIntegratedCPP() const { return false; } 175 176 virtual void RenderExtraToolArgs(const JobAction &JA, 177 llvm::opt::ArgStringList &CmdArgs) const; 178 }; 179 180 class LLVM_LIBRARY_VISIBILITY Link : public Common { 181 public: Link(const ToolChain & TC)182 Link(const ToolChain &TC) : Common("gcc::Link", 183 "linker (via gcc)", TC) {} 184 hasIntegratedCPP()185 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()186 virtual bool isLinkJob() const { return true; } 187 188 virtual void RenderExtraToolArgs(const JobAction &JA, 189 llvm::opt::ArgStringList &CmdArgs) const; 190 }; 191 } // end namespace gcc 192 193 namespace hexagon { 194 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 195 // We simply use "clang -cc1" for those actions. 196 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 197 public: Assemble(const ToolChain & TC)198 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble", 199 "hexagon-as", TC) {} 200 hasIntegratedCPP()201 virtual bool hasIntegratedCPP() const { return false; } 202 203 virtual void RenderExtraToolArgs(const JobAction &JA, 204 llvm::opt::ArgStringList &CmdArgs) const; 205 virtual void ConstructJob(Compilation &C, const JobAction &JA, 206 const InputInfo &Output, 207 const InputInfoList &Inputs, 208 const llvm::opt::ArgList &TCArgs, 209 const char *LinkingOutput) const; 210 }; 211 212 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 213 public: Link(const ToolChain & TC)214 Link(const ToolChain &TC) : Tool("hexagon::Link", 215 "hexagon-ld", TC) {} 216 hasIntegratedCPP()217 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()218 virtual bool isLinkJob() const { return true; } 219 220 virtual void RenderExtraToolArgs(const JobAction &JA, 221 llvm::opt::ArgStringList &CmdArgs) const; 222 virtual void ConstructJob(Compilation &C, const JobAction &JA, 223 const InputInfo &Output, 224 const InputInfoList &Inputs, 225 const llvm::opt::ArgList &TCArgs, 226 const char *LinkingOutput) const; 227 }; 228 } // end namespace hexagon. 229 230 231 namespace darwin { 232 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str); 233 234 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 235 virtual void anchor(); 236 protected: 237 void AddDarwinArch(const llvm::opt::ArgList &Args, 238 llvm::opt::ArgStringList &CmdArgs) const; 239 getDarwinToolChain()240 const toolchains::Darwin &getDarwinToolChain() const { 241 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 242 } 243 244 public: DarwinTool(const char * Name,const char * ShortName,const ToolChain & TC)245 DarwinTool(const char *Name, const char *ShortName, 246 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 247 }; 248 249 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 250 public: Assemble(const ToolChain & TC)251 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", 252 "assembler", TC) {} 253 hasIntegratedCPP()254 virtual bool hasIntegratedCPP() const { return false; } 255 256 virtual void ConstructJob(Compilation &C, const JobAction &JA, 257 const InputInfo &Output, 258 const InputInfoList &Inputs, 259 const llvm::opt::ArgList &TCArgs, 260 const char *LinkingOutput) const; 261 }; 262 263 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 264 bool NeedsTempPath(const InputInfoList &Inputs) const; 265 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args, 266 llvm::opt::ArgStringList &CmdArgs, 267 const InputInfoList &Inputs) const; 268 269 public: Link(const ToolChain & TC)270 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} 271 hasIntegratedCPP()272 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()273 virtual bool isLinkJob() const { return true; } 274 275 virtual void ConstructJob(Compilation &C, const JobAction &JA, 276 const InputInfo &Output, 277 const InputInfoList &Inputs, 278 const llvm::opt::ArgList &TCArgs, 279 const char *LinkingOutput) const; 280 }; 281 282 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 283 public: Lipo(const ToolChain & TC)284 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {} 285 hasIntegratedCPP()286 virtual bool hasIntegratedCPP() const { return false; } 287 288 virtual void ConstructJob(Compilation &C, const JobAction &JA, 289 const InputInfo &Output, 290 const InputInfoList &Inputs, 291 const llvm::opt::ArgList &TCArgs, 292 const char *LinkingOutput) const; 293 }; 294 295 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { 296 public: Dsymutil(const ToolChain & TC)297 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", 298 "dsymutil", TC) {} 299 hasIntegratedCPP()300 virtual bool hasIntegratedCPP() const { return false; } isDsymutilJob()301 virtual bool isDsymutilJob() const { return true; } 302 303 virtual void ConstructJob(Compilation &C, const JobAction &JA, 304 const InputInfo &Output, 305 const InputInfoList &Inputs, 306 const llvm::opt::ArgList &TCArgs, 307 const char *LinkingOutput) const; 308 }; 309 310 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool { 311 public: VerifyDebug(const ToolChain & TC)312 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug", 313 "dwarfdump", TC) {} 314 hasIntegratedCPP()315 virtual bool hasIntegratedCPP() const { return false; } 316 317 virtual void ConstructJob(Compilation &C, const JobAction &JA, 318 const InputInfo &Output, 319 const InputInfoList &Inputs, 320 const llvm::opt::ArgList &TCArgs, 321 const char *LinkingOutput) const; 322 }; 323 324 } 325 326 /// openbsd -- Directly call GNU Binutils assembler and linker 327 namespace openbsd { 328 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 329 public: Assemble(const ToolChain & TC)330 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler", 331 TC) {} 332 hasIntegratedCPP()333 virtual bool hasIntegratedCPP() const { return false; } 334 335 virtual void ConstructJob(Compilation &C, const JobAction &JA, 336 const InputInfo &Output, 337 const InputInfoList &Inputs, 338 const llvm::opt::ArgList &TCArgs, 339 const char *LinkingOutput) const; 340 }; 341 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 342 public: Link(const ToolChain & TC)343 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {} 344 hasIntegratedCPP()345 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()346 virtual bool isLinkJob() const { return true; } 347 348 virtual void ConstructJob(Compilation &C, const JobAction &JA, 349 const InputInfo &Output, 350 const InputInfoList &Inputs, 351 const llvm::opt::ArgList &TCArgs, 352 const char *LinkingOutput) const; 353 }; 354 } // end namespace openbsd 355 356 /// bitrig -- Directly call GNU Binutils assembler and linker 357 namespace bitrig { 358 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 359 public: Assemble(const ToolChain & TC)360 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler", 361 TC) {} 362 hasIntegratedCPP()363 virtual bool hasIntegratedCPP() const { return false; } 364 365 virtual void ConstructJob(Compilation &C, const JobAction &JA, 366 const InputInfo &Output, 367 const InputInfoList &Inputs, 368 const llvm::opt::ArgList &TCArgs, 369 const char *LinkingOutput) const; 370 }; 371 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 372 public: Link(const ToolChain & TC)373 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {} 374 hasIntegratedCPP()375 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()376 virtual bool isLinkJob() const { return true; } 377 378 virtual void ConstructJob(Compilation &C, const JobAction &JA, 379 const InputInfo &Output, 380 const InputInfoList &Inputs, 381 const llvm::opt::ArgList &TCArgs, 382 const char *LinkingOutput) const; 383 }; 384 } // end namespace bitrig 385 386 /// freebsd -- Directly call GNU Binutils assembler and linker 387 namespace freebsd { 388 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 389 public: Assemble(const ToolChain & TC)390 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 391 TC) {} 392 hasIntegratedCPP()393 virtual bool hasIntegratedCPP() const { return false; } 394 395 virtual void ConstructJob(Compilation &C, const JobAction &JA, 396 const InputInfo &Output, 397 const InputInfoList &Inputs, 398 const llvm::opt::ArgList &TCArgs, 399 const char *LinkingOutput) const; 400 }; 401 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 402 public: Link(const ToolChain & TC)403 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {} 404 hasIntegratedCPP()405 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()406 virtual bool isLinkJob() const { return true; } 407 408 virtual void ConstructJob(Compilation &C, const JobAction &JA, 409 const InputInfo &Output, 410 const InputInfoList &Inputs, 411 const llvm::opt::ArgList &TCArgs, 412 const char *LinkingOutput) const; 413 }; 414 } // end namespace freebsd 415 416 /// netbsd -- Directly call GNU Binutils assembler and linker 417 namespace netbsd { 418 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 419 420 public: Assemble(const ToolChain & TC)421 Assemble(const ToolChain &TC) 422 : Tool("netbsd::Assemble", "assembler", TC) {} 423 hasIntegratedCPP()424 virtual bool hasIntegratedCPP() const { return false; } 425 426 virtual void ConstructJob(Compilation &C, const JobAction &JA, 427 const InputInfo &Output, 428 const InputInfoList &Inputs, 429 const llvm::opt::ArgList &TCArgs, 430 const char *LinkingOutput) const; 431 }; 432 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 433 434 public: Link(const ToolChain & TC)435 Link(const ToolChain &TC) 436 : Tool("netbsd::Link", "linker", TC) {} 437 hasIntegratedCPP()438 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()439 virtual bool isLinkJob() const { return true; } 440 441 virtual void ConstructJob(Compilation &C, const JobAction &JA, 442 const InputInfo &Output, 443 const InputInfoList &Inputs, 444 const llvm::opt::ArgList &TCArgs, 445 const char *LinkingOutput) const; 446 }; 447 } // end namespace netbsd 448 449 /// Directly call GNU Binutils' assembler and linker. 450 namespace gnutools { 451 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 452 public: Assemble(const ToolChain & TC)453 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {} 454 hasIntegratedCPP()455 virtual bool hasIntegratedCPP() const { return false; } 456 457 virtual void ConstructJob(Compilation &C, const JobAction &JA, 458 const InputInfo &Output, 459 const InputInfoList &Inputs, 460 const llvm::opt::ArgList &TCArgs, 461 const char *LinkingOutput) const; 462 }; 463 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 464 public: Link(const ToolChain & TC)465 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {} 466 hasIntegratedCPP()467 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()468 virtual bool isLinkJob() const { return true; } 469 470 virtual void ConstructJob(Compilation &C, const JobAction &JA, 471 const InputInfo &Output, 472 const InputInfoList &Inputs, 473 const llvm::opt::ArgList &TCArgs, 474 const char *LinkingOutput) const; 475 }; 476 } 477 /// minix -- Directly call GNU Binutils assembler and linker 478 namespace minix { 479 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 480 public: Assemble(const ToolChain & TC)481 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 482 TC) {} 483 hasIntegratedCPP()484 virtual bool hasIntegratedCPP() const { return false; } 485 486 virtual void ConstructJob(Compilation &C, const JobAction &JA, 487 const InputInfo &Output, 488 const InputInfoList &Inputs, 489 const llvm::opt::ArgList &TCArgs, 490 const char *LinkingOutput) const; 491 }; 492 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 493 public: Link(const ToolChain & TC)494 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 495 hasIntegratedCPP()496 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()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: Assemble(const ToolChain & TC)511 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", 512 TC) {} 513 hasIntegratedCPP()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: Link(const ToolChain & TC)524 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} 525 hasIntegratedCPP()526 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()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: Assemble(const ToolChain & TC)541 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 542 TC) {} 543 hasIntegratedCPP()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: Link(const ToolChain & TC)554 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 555 hasIntegratedCPP()556 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()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: Assemble(const ToolChain & TC)571 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 572 TC) {} 573 hasIntegratedCPP()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: Link(const ToolChain & TC)584 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 585 hasIntegratedCPP()586 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()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: Link(const ToolChain & TC)601 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {} 602 hasIntegratedCPP()603 virtual bool hasIntegratedCPP() const { return false; } isLinkJob()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 } // end namespace visualstudio 613 614 } // end namespace toolchains 615 } // end namespace driver 616 } // end namespace clang 617 618 #endif // CLANG_LIB_DRIVER_TOOLS_H_ 619