Tools.h revision 75dbc717c21a662b7836ed34cc4e7da7b8fa33c0
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 virtual bool isDsymutilJob() const { return true; } 282 283 virtual void ConstructJob(Compilation &C, const JobAction &JA, 284 const InputInfo &Output, 285 const InputInfoList &Inputs, 286 const ArgList &TCArgs, 287 const char *LinkingOutput) const; 288 }; 289 290 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool { 291 public: 292 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug", 293 "dwarfdump", TC) {} 294 295 virtual bool hasIntegratedCPP() const { return false; } 296 297 virtual void ConstructJob(Compilation &C, const JobAction &JA, 298 const InputInfo &Output, 299 const InputInfoList &Inputs, 300 const ArgList &TCArgs, 301 const char *LinkingOutput) const; 302 }; 303 304} 305 306 /// openbsd -- Directly call GNU Binutils assembler and linker 307namespace openbsd { 308 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 309 public: 310 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler", 311 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 ArgList &TCArgs, 319 const char *LinkingOutput) const; 320 }; 321 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 322 public: 323 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {} 324 325 virtual bool hasIntegratedCPP() const { return false; } 326 virtual bool isLinkJob() const { return true; } 327 328 virtual void ConstructJob(Compilation &C, const JobAction &JA, 329 const InputInfo &Output, 330 const InputInfoList &Inputs, 331 const ArgList &TCArgs, 332 const char *LinkingOutput) const; 333 }; 334} // end namespace openbsd 335 336 /// bitrig -- Directly call GNU Binutils assembler and linker 337namespace bitrig { 338 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 339 public: 340 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler", 341 TC) {} 342 343 virtual bool hasIntegratedCPP() const { return false; } 344 345 virtual void ConstructJob(Compilation &C, const JobAction &JA, 346 const InputInfo &Output, 347 const InputInfoList &Inputs, 348 const ArgList &TCArgs, 349 const char *LinkingOutput) const; 350 }; 351 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 352 public: 353 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {} 354 355 virtual bool hasIntegratedCPP() const { return false; } 356 virtual bool isLinkJob() const { return true; } 357 358 virtual void ConstructJob(Compilation &C, const JobAction &JA, 359 const InputInfo &Output, 360 const InputInfoList &Inputs, 361 const ArgList &TCArgs, 362 const char *LinkingOutput) const; 363 }; 364} // end namespace bitrig 365 366 /// freebsd -- Directly call GNU Binutils assembler and linker 367namespace freebsd { 368 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 369 public: 370 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 371 TC) {} 372 373 virtual bool hasIntegratedCPP() const { return false; } 374 375 virtual void ConstructJob(Compilation &C, const JobAction &JA, 376 const InputInfo &Output, 377 const InputInfoList &Inputs, 378 const ArgList &TCArgs, 379 const char *LinkingOutput) const; 380 }; 381 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 382 public: 383 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {} 384 385 virtual bool hasIntegratedCPP() const { return false; } 386 virtual bool isLinkJob() const { return true; } 387 388 virtual void ConstructJob(Compilation &C, const JobAction &JA, 389 const InputInfo &Output, 390 const InputInfoList &Inputs, 391 const ArgList &TCArgs, 392 const char *LinkingOutput) const; 393 }; 394} // end namespace freebsd 395 396 /// netbsd -- Directly call GNU Binutils assembler and linker 397namespace netbsd { 398 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 399 400 public: 401 Assemble(const ToolChain &TC) 402 : Tool("netbsd::Assemble", "assembler", TC) {} 403 404 virtual bool hasIntegratedCPP() const { return false; } 405 406 virtual void ConstructJob(Compilation &C, const JobAction &JA, 407 const InputInfo &Output, 408 const InputInfoList &Inputs, 409 const ArgList &TCArgs, 410 const char *LinkingOutput) const; 411 }; 412 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 413 414 public: 415 Link(const ToolChain &TC) 416 : Tool("netbsd::Link", "linker", TC) {} 417 418 virtual bool hasIntegratedCPP() const { return false; } 419 virtual bool isLinkJob() const { return true; } 420 421 virtual void ConstructJob(Compilation &C, const JobAction &JA, 422 const InputInfo &Output, 423 const InputInfoList &Inputs, 424 const ArgList &TCArgs, 425 const char *LinkingOutput) const; 426 }; 427} // end namespace netbsd 428 429 /// linux -- Directly call GNU Binutils assembler and linker 430namespace linuxtools { 431 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 432 public: 433 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler", 434 TC) {} 435 436 virtual bool hasIntegratedCPP() const { return false; } 437 438 virtual void ConstructJob(Compilation &C, const JobAction &JA, 439 const InputInfo &Output, 440 const InputInfoList &Inputs, 441 const ArgList &TCArgs, 442 const char *LinkingOutput) const; 443 }; 444 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 445 public: 446 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {} 447 448 virtual bool hasIntegratedCPP() const { return false; } 449 virtual bool isLinkJob() const { return true; } 450 451 virtual void ConstructJob(Compilation &C, const JobAction &JA, 452 const InputInfo &Output, 453 const InputInfoList &Inputs, 454 const ArgList &TCArgs, 455 const char *LinkingOutput) const; 456 }; 457} 458 /// minix -- Directly call GNU Binutils assembler and linker 459namespace minix { 460 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 461 public: 462 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 463 TC) {} 464 465 virtual bool hasIntegratedCPP() const { return false; } 466 467 virtual void ConstructJob(Compilation &C, const JobAction &JA, 468 const InputInfo &Output, 469 const InputInfoList &Inputs, 470 const ArgList &TCArgs, 471 const char *LinkingOutput) const; 472 }; 473 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 474 public: 475 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 476 477 virtual bool hasIntegratedCPP() const { return false; } 478 virtual bool isLinkJob() const { return true; } 479 480 virtual void ConstructJob(Compilation &C, const JobAction &JA, 481 const InputInfo &Output, 482 const InputInfoList &Inputs, 483 const ArgList &TCArgs, 484 const char *LinkingOutput) const; 485 }; 486} // end namespace minix 487 488 /// solaris -- Directly call Solaris assembler and linker 489namespace solaris { 490 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 491 public: 492 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", 493 TC) {} 494 495 virtual bool hasIntegratedCPP() const { return false; } 496 497 virtual void ConstructJob(Compilation &C, const JobAction &JA, 498 const InputInfo &Output, 499 const InputInfoList &Inputs, 500 const ArgList &TCArgs, 501 const char *LinkingOutput) const; 502 }; 503 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 504 public: 505 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} 506 507 virtual bool hasIntegratedCPP() const { return false; } 508 virtual bool isLinkJob() const { return true; } 509 510 virtual void ConstructJob(Compilation &C, const JobAction &JA, 511 const InputInfo &Output, 512 const InputInfoList &Inputs, 513 const ArgList &TCArgs, 514 const char *LinkingOutput) const; 515 }; 516} // end namespace solaris 517 518 /// auroraux -- Directly call GNU Binutils assembler and linker 519namespace auroraux { 520 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 521 public: 522 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 523 TC) {} 524 525 virtual bool hasIntegratedCPP() const { return false; } 526 527 virtual void ConstructJob(Compilation &C, const JobAction &JA, 528 const InputInfo &Output, 529 const InputInfoList &Inputs, 530 const ArgList &TCArgs, 531 const char *LinkingOutput) const; 532 }; 533 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 534 public: 535 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 536 537 virtual bool hasIntegratedCPP() const { return false; } 538 virtual bool isLinkJob() const { return true; } 539 540 virtual void ConstructJob(Compilation &C, const JobAction &JA, 541 const InputInfo &Output, 542 const InputInfoList &Inputs, 543 const ArgList &TCArgs, 544 const char *LinkingOutput) const; 545 }; 546} // end namespace auroraux 547 548 /// dragonfly -- Directly call GNU Binutils assembler and linker 549namespace dragonfly { 550 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 551 public: 552 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 553 TC) {} 554 555 virtual bool hasIntegratedCPP() const { return false; } 556 557 virtual void ConstructJob(Compilation &C, const JobAction &JA, 558 const InputInfo &Output, 559 const InputInfoList &Inputs, 560 const ArgList &TCArgs, 561 const char *LinkingOutput) const; 562 }; 563 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 564 public: 565 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 566 567 virtual bool hasIntegratedCPP() const { return false; } 568 virtual bool isLinkJob() const { return true; } 569 570 virtual void ConstructJob(Compilation &C, const JobAction &JA, 571 const InputInfo &Output, 572 const InputInfoList &Inputs, 573 const ArgList &TCArgs, 574 const char *LinkingOutput) const; 575 }; 576} // end namespace dragonfly 577 578 /// Visual studio tools. 579namespace visualstudio { 580 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 581 public: 582 Link(const ToolChain &TC) : Tool("visualstudio::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 ArgList &TCArgs, 591 const char *LinkingOutput) const; 592 }; 593} // end namespace visualstudio 594 595} // end namespace toolchains 596} // end namespace driver 597} // end namespace clang 598 599#endif // CLANG_LIB_DRIVER_TOOLS_H_ 600