Tools.h revision 5c92b9ab4e4dce3233ea3e400a02c443f9afd372
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 Driver; 25 26namespace toolchains { 27 class Darwin; 28} 29 30namespace tools { 31using 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 69 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile }; 70 71 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args, 72 llvm::opt::ArgStringList &cmdArgs, 73 RewriteKind rewrite) const; 74 75 public: 76 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {} 77 78 virtual bool hasGoodDiagnostics() const { return true; } 79 virtual bool hasIntegratedAssembler() const { return true; } 80 virtual bool hasIntegratedCPP() const { return true; } 81 82 virtual void ConstructJob(Compilation &C, const JobAction &JA, 83 const InputInfo &Output, 84 const InputInfoList &Inputs, 85 const llvm::opt::ArgList &TCArgs, 86 const char *LinkingOutput) const; 87 }; 88 89 /// \brief Clang integrated assembler tool. 90 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 91 void AddARMTargetArgs(const llvm::opt::ArgList &Args, 92 llvm::opt::ArgStringList &CmdArgs) const; 93 void AddX86TargetArgs(const llvm::opt::ArgList &Args, 94 llvm::opt::ArgStringList &CmdArgs) const; 95 96 public: 97 ClangAs(const ToolChain &TC) : Tool("clang::as", 98 "clang integrated assembler", TC) {} 99 100 virtual bool hasGoodDiagnostics() const { return true; } 101 virtual bool hasIntegratedAssembler() const { return false; } 102 virtual bool hasIntegratedCPP() const { return false; } 103 104 virtual void ConstructJob(Compilation &C, const JobAction &JA, 105 const InputInfo &Output, 106 const InputInfoList &Inputs, 107 const llvm::opt::ArgList &TCArgs, 108 const char *LinkingOutput) const; 109 }; 110 111 /// gcc - Generic GCC tool implementations. 112namespace gcc { 113 class LLVM_LIBRARY_VISIBILITY Common : public Tool { 114 public: 115 Common(const char *Name, const char *ShortName, 116 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 117 118 virtual void ConstructJob(Compilation &C, const JobAction &JA, 119 const InputInfo &Output, 120 const InputInfoList &Inputs, 121 const llvm::opt::ArgList &TCArgs, 122 const char *LinkingOutput) const; 123 124 /// RenderExtraToolArgs - Render any arguments necessary to force 125 /// the particular tool mode. 126 virtual void 127 RenderExtraToolArgs(const JobAction &JA, 128 llvm::opt::ArgStringList &CmdArgs) const = 0; 129 }; 130 131 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common { 132 public: 133 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", 134 "gcc preprocessor", TC) {} 135 136 virtual bool hasGoodDiagnostics() const { return true; } 137 virtual bool hasIntegratedCPP() const { return false; } 138 139 virtual void RenderExtraToolArgs(const JobAction &JA, 140 llvm::opt::ArgStringList &CmdArgs) const; 141 }; 142 143 class LLVM_LIBRARY_VISIBILITY Precompile : public Common { 144 public: 145 Precompile(const ToolChain &TC) : Common("gcc::Precompile", 146 "gcc precompile", TC) {} 147 148 virtual bool hasGoodDiagnostics() const { return true; } 149 virtual bool hasIntegratedCPP() const { return true; } 150 151 virtual void RenderExtraToolArgs(const JobAction &JA, 152 llvm::opt::ArgStringList &CmdArgs) const; 153 }; 154 155 class LLVM_LIBRARY_VISIBILITY Compile : public Common { 156 public: 157 Compile(const ToolChain &TC) : Common("gcc::Compile", 158 "gcc frontend", TC) {} 159 160 virtual bool hasGoodDiagnostics() const { return true; } 161 virtual bool hasIntegratedCPP() const { return true; } 162 163 virtual void RenderExtraToolArgs(const JobAction &JA, 164 llvm::opt::ArgStringList &CmdArgs) const; 165 }; 166 167 class LLVM_LIBRARY_VISIBILITY Assemble : public Common { 168 public: 169 Assemble(const ToolChain &TC) : Common("gcc::Assemble", 170 "assembler (via gcc)", TC) {} 171 172 virtual bool hasIntegratedCPP() const { return false; } 173 174 virtual void RenderExtraToolArgs(const JobAction &JA, 175 llvm::opt::ArgStringList &CmdArgs) const; 176 }; 177 178 class LLVM_LIBRARY_VISIBILITY Link : public Common { 179 public: 180 Link(const ToolChain &TC) : Common("gcc::Link", 181 "linker (via gcc)", TC) {} 182 183 virtual bool hasIntegratedCPP() const { return false; } 184 virtual bool isLinkJob() const { return true; } 185 186 virtual void RenderExtraToolArgs(const JobAction &JA, 187 llvm::opt::ArgStringList &CmdArgs) const; 188 }; 189} // end namespace gcc 190 191namespace hexagon { 192 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 193 // We simply use "clang -cc1" for those actions. 194 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 195 public: 196 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble", 197 "hexagon-as", TC) {} 198 199 virtual bool hasIntegratedCPP() const { return false; } 200 201 virtual void RenderExtraToolArgs(const JobAction &JA, 202 llvm::opt::ArgStringList &CmdArgs) const; 203 virtual void ConstructJob(Compilation &C, const JobAction &JA, 204 const InputInfo &Output, 205 const InputInfoList &Inputs, 206 const llvm::opt::ArgList &TCArgs, 207 const char *LinkingOutput) const; 208 }; 209 210 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 211 public: 212 Link(const ToolChain &TC) : Tool("hexagon::Link", 213 "hexagon-ld", TC) {} 214 215 virtual bool hasIntegratedCPP() const { return false; } 216 virtual bool isLinkJob() const { return true; } 217 218 virtual void RenderExtraToolArgs(const JobAction &JA, 219 llvm::opt::ArgStringList &CmdArgs) const; 220 virtual void ConstructJob(Compilation &C, const JobAction &JA, 221 const InputInfo &Output, 222 const InputInfoList &Inputs, 223 const llvm::opt::ArgList &TCArgs, 224 const char *LinkingOutput) const; 225 }; 226} // end namespace hexagon. 227 228 229namespace darwin { 230 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str); 231 232 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 233 virtual void anchor(); 234 protected: 235 void AddDarwinArch(const llvm::opt::ArgList &Args, 236 llvm::opt::ArgStringList &CmdArgs) const; 237 238 const toolchains::Darwin &getDarwinToolChain() const { 239 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 240 } 241 242 public: 243 DarwinTool(const char *Name, const char *ShortName, 244 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 245 }; 246 247 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 248 public: 249 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", 250 "assembler", TC) {} 251 252 virtual bool hasIntegratedCPP() const { return false; } 253 254 virtual void ConstructJob(Compilation &C, const JobAction &JA, 255 const InputInfo &Output, 256 const InputInfoList &Inputs, 257 const llvm::opt::ArgList &TCArgs, 258 const char *LinkingOutput) const; 259 }; 260 261 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 262 bool NeedsTempPath(const InputInfoList &Inputs) const; 263 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args, 264 llvm::opt::ArgStringList &CmdArgs, 265 const InputInfoList &Inputs) const; 266 267 public: 268 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} 269 270 virtual bool hasIntegratedCPP() const { return false; } 271 virtual bool isLinkJob() const { return true; } 272 273 virtual void ConstructJob(Compilation &C, const JobAction &JA, 274 const InputInfo &Output, 275 const InputInfoList &Inputs, 276 const llvm::opt::ArgList &TCArgs, 277 const char *LinkingOutput) const; 278 }; 279 280 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 281 public: 282 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {} 283 284 virtual bool hasIntegratedCPP() const { return false; } 285 286 virtual void ConstructJob(Compilation &C, const JobAction &JA, 287 const InputInfo &Output, 288 const InputInfoList &Inputs, 289 const llvm::opt::ArgList &TCArgs, 290 const char *LinkingOutput) const; 291 }; 292 293 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { 294 public: 295 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", 296 "dsymutil", TC) {} 297 298 virtual bool hasIntegratedCPP() const { return false; } 299 virtual bool isDsymutilJob() const { return true; } 300 301 virtual void ConstructJob(Compilation &C, const JobAction &JA, 302 const InputInfo &Output, 303 const InputInfoList &Inputs, 304 const llvm::opt::ArgList &TCArgs, 305 const char *LinkingOutput) const; 306 }; 307 308 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool { 309 public: 310 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug", 311 "dwarfdump", TC) {} 312 313 virtual bool hasIntegratedCPP() const { return false; } 314 315 virtual void ConstructJob(Compilation &C, const JobAction &JA, 316 const InputInfo &Output, 317 const InputInfoList &Inputs, 318 const llvm::opt::ArgList &TCArgs, 319 const char *LinkingOutput) const; 320 }; 321 322} 323 324 /// openbsd -- Directly call GNU Binutils assembler and linker 325namespace openbsd { 326 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 327 public: 328 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler", 329 TC) {} 330 331 virtual bool hasIntegratedCPP() const { return false; } 332 333 virtual void ConstructJob(Compilation &C, const JobAction &JA, 334 const InputInfo &Output, 335 const InputInfoList &Inputs, 336 const llvm::opt::ArgList &TCArgs, 337 const char *LinkingOutput) const; 338 }; 339 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 340 public: 341 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {} 342 343 virtual bool hasIntegratedCPP() const { return false; } 344 virtual bool isLinkJob() const { return true; } 345 346 virtual void ConstructJob(Compilation &C, const JobAction &JA, 347 const InputInfo &Output, 348 const InputInfoList &Inputs, 349 const llvm::opt::ArgList &TCArgs, 350 const char *LinkingOutput) const; 351 }; 352} // end namespace openbsd 353 354 /// bitrig -- Directly call GNU Binutils assembler and linker 355namespace bitrig { 356 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 357 public: 358 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler", 359 TC) {} 360 361 virtual bool hasIntegratedCPP() const { return false; } 362 363 virtual void ConstructJob(Compilation &C, const JobAction &JA, 364 const InputInfo &Output, 365 const InputInfoList &Inputs, 366 const llvm::opt::ArgList &TCArgs, 367 const char *LinkingOutput) const; 368 }; 369 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 370 public: 371 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {} 372 373 virtual bool hasIntegratedCPP() const { return false; } 374 virtual bool isLinkJob() const { return true; } 375 376 virtual void ConstructJob(Compilation &C, const JobAction &JA, 377 const InputInfo &Output, 378 const InputInfoList &Inputs, 379 const llvm::opt::ArgList &TCArgs, 380 const char *LinkingOutput) const; 381 }; 382} // end namespace bitrig 383 384 /// freebsd -- Directly call GNU Binutils assembler and linker 385namespace freebsd { 386 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 387 public: 388 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 389 TC) {} 390 391 virtual bool hasIntegratedCPP() const { return false; } 392 393 virtual void ConstructJob(Compilation &C, const JobAction &JA, 394 const InputInfo &Output, 395 const InputInfoList &Inputs, 396 const llvm::opt::ArgList &TCArgs, 397 const char *LinkingOutput) const; 398 }; 399 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 400 public: 401 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {} 402 403 virtual bool hasIntegratedCPP() const { return false; } 404 virtual bool isLinkJob() const { return true; } 405 406 virtual void ConstructJob(Compilation &C, const JobAction &JA, 407 const InputInfo &Output, 408 const InputInfoList &Inputs, 409 const llvm::opt::ArgList &TCArgs, 410 const char *LinkingOutput) const; 411 }; 412} // end namespace freebsd 413 414 /// netbsd -- Directly call GNU Binutils assembler and linker 415namespace netbsd { 416 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 417 418 public: 419 Assemble(const ToolChain &TC) 420 : Tool("netbsd::Assemble", "assembler", TC) {} 421 422 virtual bool hasIntegratedCPP() const { return false; } 423 424 virtual void ConstructJob(Compilation &C, const JobAction &JA, 425 const InputInfo &Output, 426 const InputInfoList &Inputs, 427 const llvm::opt::ArgList &TCArgs, 428 const char *LinkingOutput) const; 429 }; 430 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 431 432 public: 433 Link(const ToolChain &TC) 434 : Tool("netbsd::Link", "linker", TC) {} 435 436 virtual bool hasIntegratedCPP() const { return false; } 437 virtual bool isLinkJob() const { return true; } 438 439 virtual void ConstructJob(Compilation &C, const JobAction &JA, 440 const InputInfo &Output, 441 const InputInfoList &Inputs, 442 const llvm::opt::ArgList &TCArgs, 443 const char *LinkingOutput) const; 444 }; 445} // end namespace netbsd 446 447 /// Directly call GNU Binutils' assembler and linker. 448namespace gnutools { 449 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 450 public: 451 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {} 452 453 virtual bool hasIntegratedCPP() const { return false; } 454 455 virtual void ConstructJob(Compilation &C, const JobAction &JA, 456 const InputInfo &Output, 457 const InputInfoList &Inputs, 458 const llvm::opt::ArgList &TCArgs, 459 const char *LinkingOutput) const; 460 }; 461 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 462 public: 463 Link(const ToolChain &TC) : Tool("GNU::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 llvm::opt::ArgList &TCArgs, 472 const char *LinkingOutput) const; 473 }; 474} 475 /// minix -- Directly call GNU Binutils assembler and linker 476namespace minix { 477 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 478 public: 479 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 480 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 public: 492 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 493 494 virtual bool hasIntegratedCPP() const { return false; } 495 virtual bool isLinkJob() const { return true; } 496 497 virtual void ConstructJob(Compilation &C, const JobAction &JA, 498 const InputInfo &Output, 499 const InputInfoList &Inputs, 500 const llvm::opt::ArgList &TCArgs, 501 const char *LinkingOutput) const; 502 }; 503} // end namespace minix 504 505 /// solaris -- Directly call Solaris assembler and linker 506namespace solaris { 507 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 508 public: 509 Assemble(const ToolChain &TC) : Tool("solaris::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 llvm::opt::ArgList &TCArgs, 518 const char *LinkingOutput) const; 519 }; 520 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 521 public: 522 Link(const ToolChain &TC) : Tool("solaris::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 llvm::opt::ArgList &TCArgs, 531 const char *LinkingOutput) const; 532 }; 533} // end namespace solaris 534 535 /// auroraux -- Directly call GNU Binutils assembler and linker 536namespace auroraux { 537 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 538 public: 539 Assemble(const ToolChain &TC) : Tool("auroraux::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 llvm::opt::ArgList &TCArgs, 548 const char *LinkingOutput) const; 549 }; 550 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 551 public: 552 Link(const ToolChain &TC) : Tool("auroraux::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 llvm::opt::ArgList &TCArgs, 561 const char *LinkingOutput) const; 562 }; 563} // end namespace auroraux 564 565 /// dragonfly -- Directly call GNU Binutils assembler and linker 566namespace dragonfly { 567 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 568 public: 569 Assemble(const ToolChain &TC) : Tool("dragonfly::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 llvm::opt::ArgList &TCArgs, 578 const char *LinkingOutput) const; 579 }; 580 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 581 public: 582 Link(const ToolChain &TC) : Tool("dragonfly::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 llvm::opt::ArgList &TCArgs, 591 const char *LinkingOutput) const; 592 }; 593} // end namespace dragonfly 594 595 /// Visual studio tools. 596namespace visualstudio { 597 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 598 public: 599 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {} 600 601 virtual bool hasIntegratedCPP() const { return false; } 602 virtual bool isLinkJob() const { return true; } 603 604 virtual void ConstructJob(Compilation &C, const JobAction &JA, 605 const InputInfo &Output, 606 const InputInfoList &Inputs, 607 const llvm::opt::ArgList &TCArgs, 608 const char *LinkingOutput) const; 609 }; 610} // end namespace visualstudio 611 612} // end namespace toolchains 613} // end namespace driver 614} // end namespace clang 615 616#endif // CLANG_LIB_DRIVER_TOOLS_H_ 617