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