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