Tools.h revision 285f9a284704c07cd50e4597408d5f93518cd7c3
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(const Driver &D, 33 const ArgList &Args, 34 ArgStringList &CmdArgs, 35 const InputInfo &Output, 36 const InputInfoList &Inputs) const; 37 38 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs, 39 bool KernelOrKext) const; 40 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 41 void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 42 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 43 44 public: 45 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {} 46 47 virtual bool hasGoodDiagnostics() const { return true; } 48 virtual bool hasIntegratedAssembler() const { return true; } 49 virtual bool hasIntegratedCPP() const { return true; } 50 51 virtual void ConstructJob(Compilation &C, const JobAction &JA, 52 const InputInfo &Output, 53 const InputInfoList &Inputs, 54 const ArgList &TCArgs, 55 const char *LinkingOutput) const; 56 }; 57 58 /// \brief Clang integrated assembler tool. 59 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 60 public: 61 ClangAs(const ToolChain &TC) : Tool("clang::as", 62 "clang integrated assembler", TC) {} 63 64 virtual bool hasGoodDiagnostics() const { return true; } 65 virtual bool hasIntegratedAssembler() const { return false; } 66 virtual bool hasIntegratedCPP() const { return false; } 67 68 virtual void ConstructJob(Compilation &C, const JobAction &JA, 69 const InputInfo &Output, 70 const InputInfoList &Inputs, 71 const ArgList &TCArgs, 72 const char *LinkingOutput) const; 73 }; 74 75 /// gcc - Generic GCC tool implementations. 76namespace gcc { 77 class LLVM_LIBRARY_VISIBILITY Common : public Tool { 78 public: 79 Common(const char *Name, const char *ShortName, 80 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 81 82 virtual void ConstructJob(Compilation &C, const JobAction &JA, 83 const InputInfo &Output, 84 const InputInfoList &Inputs, 85 const ArgList &TCArgs, 86 const char *LinkingOutput) const; 87 88 /// RenderExtraToolArgs - Render any arguments necessary to force 89 /// the particular tool mode. 90 virtual void RenderExtraToolArgs(const JobAction &JA, 91 ArgStringList &CmdArgs) const = 0; 92 }; 93 94 95 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common { 96 public: 97 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", 98 "gcc preprocessor", TC) {} 99 100 virtual bool hasGoodDiagnostics() const { return true; } 101 virtual bool hasIntegratedCPP() const { return false; } 102 103 virtual void RenderExtraToolArgs(const JobAction &JA, 104 ArgStringList &CmdArgs) const; 105 }; 106 107 class LLVM_LIBRARY_VISIBILITY Precompile : public Common { 108 public: 109 Precompile(const ToolChain &TC) : Common("gcc::Precompile", 110 "gcc precompile", TC) {} 111 112 virtual bool hasGoodDiagnostics() const { return true; } 113 virtual bool hasIntegratedCPP() const { return true; } 114 115 virtual void RenderExtraToolArgs(const JobAction &JA, 116 ArgStringList &CmdArgs) const; 117 }; 118 119 class LLVM_LIBRARY_VISIBILITY Compile : public Common { 120 public: 121 Compile(const ToolChain &TC) : Common("gcc::Compile", 122 "gcc frontend", TC) {} 123 124 virtual bool hasGoodDiagnostics() const { return true; } 125 virtual bool hasIntegratedCPP() const { return true; } 126 127 virtual void RenderExtraToolArgs(const JobAction &JA, 128 ArgStringList &CmdArgs) const; 129 }; 130 131 class LLVM_LIBRARY_VISIBILITY Assemble : public Common { 132 public: 133 Assemble(const ToolChain &TC) : Common("gcc::Assemble", 134 "assembler (via gcc)", TC) {} 135 136 virtual bool hasIntegratedCPP() const { return false; } 137 138 virtual void RenderExtraToolArgs(const JobAction &JA, 139 ArgStringList &CmdArgs) const; 140 }; 141 142 class LLVM_LIBRARY_VISIBILITY Link : public Common { 143 public: 144 Link(const ToolChain &TC) : Common("gcc::Link", 145 "linker (via gcc)", TC) {} 146 147 virtual bool hasIntegratedCPP() const { return false; } 148 149 virtual void RenderExtraToolArgs(const JobAction &JA, 150 ArgStringList &CmdArgs) const; 151 }; 152} // end namespace gcc 153 154namespace darwin { 155 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 156 protected: 157 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const; 158 159 const toolchains::Darwin &getDarwinToolChain() const { 160 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 161 } 162 163 public: 164 DarwinTool(const char *Name, const char *ShortName, 165 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 166 }; 167 168 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool { 169 public: 170 static const char *getBaseInputName(const ArgList &Args, 171 const InputInfoList &Input); 172 static const char *getBaseInputStem(const ArgList &Args, 173 const InputInfoList &Input); 174 static const char *getDependencyFileName(const ArgList &Args, 175 const InputInfoList &Inputs); 176 177 protected: 178 const char *getCC1Name(types::ID Type) const; 179 180 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const; 181 void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const; 182 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 183 const InputInfoList &Inputs, 184 const ArgStringList &OutputArgs) const; 185 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 186 const InputInfoList &Inputs, 187 const ArgStringList &OutputArgs) const; 188 void AddCPPUniqueOptionsArgs(const ArgList &Args, 189 ArgStringList &CmdArgs, 190 const InputInfoList &Inputs) const; 191 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 192 193 public: 194 CC1(const char *Name, const char *ShortName, 195 const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {} 196 197 virtual bool hasGoodDiagnostics() const { return true; } 198 virtual bool hasIntegratedCPP() const { return true; } 199 }; 200 201 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 { 202 public: 203 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", 204 "gcc preprocessor", TC) {} 205 206 virtual void ConstructJob(Compilation &C, const JobAction &JA, 207 const InputInfo &Output, 208 const InputInfoList &Inputs, 209 const ArgList &TCArgs, 210 const char *LinkingOutput) const; 211 }; 212 213 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 { 214 public: 215 Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {} 216 217 virtual void ConstructJob(Compilation &C, const JobAction &JA, 218 const InputInfo &Output, 219 const InputInfoList &Inputs, 220 const ArgList &TCArgs, 221 const char *LinkingOutput) const; 222 }; 223 224 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 225 public: 226 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", 227 "assembler", TC) {} 228 229 virtual bool hasIntegratedCPP() const { return false; } 230 231 virtual void ConstructJob(Compilation &C, const JobAction &JA, 232 const InputInfo &Output, 233 const InputInfoList &Inputs, 234 const ArgList &TCArgs, 235 const char *LinkingOutput) const; 236 }; 237 238 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 239 void AddLinkArgs(Compilation &C, const ArgList &Args, 240 ArgStringList &CmdArgs) const; 241 242 public: 243 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} 244 245 virtual bool hasIntegratedCPP() const { return false; } 246 247 virtual void ConstructJob(Compilation &C, const JobAction &JA, 248 const InputInfo &Output, 249 const InputInfoList &Inputs, 250 const ArgList &TCArgs, 251 const char *LinkingOutput) const; 252 }; 253 254 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 255 public: 256 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {} 257 258 virtual bool hasIntegratedCPP() const { return false; } 259 260 virtual void ConstructJob(Compilation &C, const JobAction &JA, 261 const InputInfo &Output, 262 const InputInfoList &Inputs, 263 const ArgList &TCArgs, 264 const char *LinkingOutput) const; 265 }; 266 267 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { 268 public: 269 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", 270 "dsymutil", TC) {} 271 272 virtual bool hasIntegratedCPP() const { return false; } 273 274 virtual void ConstructJob(Compilation &C, const JobAction &JA, 275 const InputInfo &Output, 276 const InputInfoList &Inputs, 277 const ArgList &TCArgs, 278 const char *LinkingOutput) const; 279 }; 280} 281 282 /// openbsd -- Directly call GNU Binutils assembler and linker 283namespace openbsd { 284 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 285 public: 286 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler", 287 TC) {} 288 289 virtual bool hasIntegratedCPP() const { return false; } 290 291 virtual void ConstructJob(Compilation &C, const JobAction &JA, 292 const InputInfo &Output, 293 const InputInfoList &Inputs, 294 const ArgList &TCArgs, 295 const char *LinkingOutput) const; 296 }; 297 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 298 public: 299 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {} 300 301 virtual bool hasIntegratedCPP() const { return false; } 302 303 virtual void ConstructJob(Compilation &C, const JobAction &JA, 304 const InputInfo &Output, 305 const InputInfoList &Inputs, 306 const ArgList &TCArgs, 307 const char *LinkingOutput) const; 308 }; 309} // end namespace openbsd 310 311 /// freebsd -- Directly call GNU Binutils assembler and linker 312namespace freebsd { 313 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 314 public: 315 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 316 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 327 public: 328 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {} 329 330 virtual bool hasIntegratedCPP() const { return false; } 331 332 virtual void ConstructJob(Compilation &C, const JobAction &JA, 333 const InputInfo &Output, 334 const InputInfoList &Inputs, 335 const ArgList &TCArgs, 336 const char *LinkingOutput) const; 337 }; 338} // end namespace freebsd 339 340 /// netbsd -- Directly call GNU Binutils assembler and linker 341namespace netbsd { 342 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 343 private: 344 const llvm::Triple ToolTriple; 345 346 public: 347 Assemble(const ToolChain &TC, const llvm::Triple &ToolTriple) 348 : Tool("netbsd::Assemble", "assembler", TC), ToolTriple(ToolTriple) {} 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 private: 360 const llvm::Triple ToolTriple; 361 362 public: 363 Link(const ToolChain &TC, const llvm::Triple &ToolTriple) 364 : Tool("netbsd::Link", "linker", TC), ToolTriple(ToolTriple) {} 365 366 virtual bool hasIntegratedCPP() const { return false; } 367 368 virtual void ConstructJob(Compilation &C, const JobAction &JA, 369 const InputInfo &Output, 370 const InputInfoList &Inputs, 371 const ArgList &TCArgs, 372 const char *LinkingOutput) const; 373 }; 374} // end namespace netbsd 375 376 /// linux -- Directly call GNU Binutils assembler and linker 377namespace linuxtools { 378 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 379 public: 380 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler", 381 TC) {} 382 383 virtual bool hasIntegratedCPP() const { return false; } 384 385 virtual void ConstructJob(Compilation &C, const JobAction &JA, 386 const InputInfo &Output, 387 const InputInfoList &Inputs, 388 const ArgList &TCArgs, 389 const char *LinkingOutput) const; 390 }; 391 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 392 public: 393 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {} 394 395 virtual bool hasIntegratedCPP() const { return false; } 396 397 virtual void ConstructJob(Compilation &C, const JobAction &JA, 398 const InputInfo &Output, 399 const InputInfoList &Inputs, 400 const ArgList &TCArgs, 401 const char *LinkingOutput) const; 402 }; 403} 404 /// minix -- Directly call GNU Binutils assembler and linker 405namespace minix { 406 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 407 public: 408 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 409 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 public: 421 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 422 423 virtual bool hasIntegratedCPP() const { return false; } 424 425 virtual void ConstructJob(Compilation &C, const JobAction &JA, 426 const InputInfo &Output, 427 const InputInfoList &Inputs, 428 const ArgList &TCArgs, 429 const char *LinkingOutput) const; 430 }; 431} // end namespace minix 432 433 /// auroraux -- Directly call GNU Binutils assembler and linker 434namespace auroraux { 435 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 436 public: 437 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 438 TC) {} 439 440 virtual bool hasIntegratedCPP() const { return false; } 441 442 virtual void ConstructJob(Compilation &C, const JobAction &JA, 443 const InputInfo &Output, 444 const InputInfoList &Inputs, 445 const ArgList &TCArgs, 446 const char *LinkingOutput) const; 447 }; 448 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 449 public: 450 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 451 452 virtual bool hasIntegratedCPP() const { return false; } 453 454 virtual void ConstructJob(Compilation &C, const JobAction &JA, 455 const InputInfo &Output, 456 const InputInfoList &Inputs, 457 const ArgList &TCArgs, 458 const char *LinkingOutput) const; 459 }; 460} // end namespace auroraux 461 462 /// dragonfly -- Directly call GNU Binutils assembler and linker 463namespace dragonfly { 464 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 465 public: 466 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 467 TC) {} 468 469 virtual bool hasIntegratedCPP() const { return false; } 470 471 virtual void ConstructJob(Compilation &C, const JobAction &JA, 472 const InputInfo &Output, 473 const InputInfoList &Inputs, 474 const ArgList &TCArgs, 475 const char *LinkingOutput) const; 476 }; 477 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 478 public: 479 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 480 481 virtual bool hasIntegratedCPP() const { return false; } 482 483 virtual void ConstructJob(Compilation &C, const JobAction &JA, 484 const InputInfo &Output, 485 const InputInfoList &Inputs, 486 const ArgList &TCArgs, 487 const char *LinkingOutput) const; 488 }; 489} // end namespace dragonfly 490 491 /// Visual studio tools. 492namespace visualstudio { 493 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 494 public: 495 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {} 496 497 virtual bool hasIntegratedCPP() const { return false; } 498 499 virtual void ConstructJob(Compilation &C, const JobAction &JA, 500 const InputInfo &Output, 501 const InputInfoList &Inputs, 502 const ArgList &TCArgs, 503 const char *LinkingOutput) const; 504 }; 505} // end namespace visualstudio 506 507} // end namespace toolchains 508} // end namespace driver 509} // end namespace clang 510 511#endif // CLANG_LIB_DRIVER_TOOLS_H_ 512