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