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