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