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