1193326Sed//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===// 2193326Sed// 3193326Sed// The LLVM Compiler Infrastructure 4193326Sed// 5193326Sed// This file is distributed under the University of Illinois Open Source 6193326Sed// License. See LICENSE.TXT for details. 7193326Sed// 8193326Sed//===----------------------------------------------------------------------===// 9193326Sed 10193326Sed#ifndef CLANG_LIB_DRIVER_TOOLS_H_ 11193326Sed#define CLANG_LIB_DRIVER_TOOLS_H_ 12193326Sed 13193326Sed#include "clang/Driver/Tool.h" 14193326Sed#include "clang/Driver/Types.h" 15193326Sed#include "clang/Driver/Util.h" 16223017Sdim#include "llvm/ADT/Triple.h" 17263509Sdim#include "llvm/Option/Option.h" 18193326Sed#include "llvm/Support/Compiler.h" 19193326Sed 20193326Sednamespace clang { 21245431Sdim class ObjCRuntime; 22245431Sdim 23193326Sednamespace driver { 24263509Sdim class Command; 25193326Sed class Driver; 26193326Sed 27193326Sednamespace toolchains { 28198092Srdivacky class Darwin; 29193326Sed} 30193326Sed 31193326Sednamespace tools { 32263509Sdimusing llvm::opt::ArgStringList; 33193326Sed 34208600Srdivacky /// \brief Clang compiler tool. 35208600Srdivacky class LLVM_LIBRARY_VISIBILITY Clang : public Tool { 36252723Sdim public: 37263509Sdim static const char *getBaseInputName(const llvm::opt::ArgList &Args, 38252723Sdim const InputInfoList &Inputs); 39263509Sdim static const char *getBaseInputStem(const llvm::opt::ArgList &Args, 40252723Sdim const InputInfoList &Inputs); 41263509Sdim static const char *getDependencyFileName(const llvm::opt::ArgList &Args, 42252723Sdim const InputInfoList &Inputs); 43252723Sdim 44252723Sdim private: 45263509Sdim void AddPreprocessingOptions(Compilation &C, const JobAction &JA, 46235633Sdim const Driver &D, 47263509Sdim const llvm::opt::ArgList &Args, 48263509Sdim llvm::opt::ArgStringList &CmdArgs, 49193326Sed const InputInfo &Output, 50193326Sed const InputInfoList &Inputs) const; 51193326Sed 52263509Sdim void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, 53263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 54263509Sdim void AddARMTargetArgs(const llvm::opt::ArgList &Args, 55263509Sdim llvm::opt::ArgStringList &CmdArgs, 56221345Sdim bool KernelOrKext) const; 57263509Sdim void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 58263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 59263509Sdim void AddR600TargetArgs(const llvm::opt::ArgList &Args, 60263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 61263509Sdim void AddSparcTargetArgs(const llvm::opt::ArgList &Args, 62263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 63263509Sdim void AddSystemZTargetArgs(const llvm::opt::ArgList &Args, 64263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 65263509Sdim void AddX86TargetArgs(const llvm::opt::ArgList &Args, 66263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 67263509Sdim void AddHexagonTargetArgs(const llvm::opt::ArgList &Args, 68263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 69198092Srdivacky 70245431Sdim enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile }; 71245431Sdim 72263509Sdim ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args, 73263509Sdim llvm::opt::ArgStringList &cmdArgs, 74245431Sdim RewriteKind rewrite) const; 75245431Sdim 76263509Sdim void AddClangCLArgs(const llvm::opt::ArgList &Args, 77263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 78263509Sdim 79193326Sed public: 80208600Srdivacky Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {} 81193326Sed 82207619Srdivacky virtual bool hasGoodDiagnostics() const { return true; } 83203955Srdivacky virtual bool hasIntegratedAssembler() const { return true; } 84193326Sed virtual bool hasIntegratedCPP() const { return true; } 85193326Sed 86193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 87198092Srdivacky const InputInfo &Output, 88198092Srdivacky const InputInfoList &Inputs, 89263509Sdim const llvm::opt::ArgList &TCArgs, 90193326Sed const char *LinkingOutput) const; 91193326Sed }; 92193326Sed 93208600Srdivacky /// \brief Clang integrated assembler tool. 94208600Srdivacky class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 95208600Srdivacky public: 96208600Srdivacky ClangAs(const ToolChain &TC) : Tool("clang::as", 97208600Srdivacky "clang integrated assembler", TC) {} 98208600Srdivacky 99208600Srdivacky virtual bool hasGoodDiagnostics() const { return true; } 100208600Srdivacky virtual bool hasIntegratedAssembler() const { return false; } 101208600Srdivacky virtual bool hasIntegratedCPP() const { return false; } 102208600Srdivacky 103208600Srdivacky virtual void ConstructJob(Compilation &C, const JobAction &JA, 104208600Srdivacky const InputInfo &Output, 105208600Srdivacky const InputInfoList &Inputs, 106263509Sdim const llvm::opt::ArgList &TCArgs, 107208600Srdivacky const char *LinkingOutput) const; 108208600Srdivacky }; 109208600Srdivacky 110193326Sed /// gcc - Generic GCC tool implementations. 111193326Sednamespace gcc { 112208600Srdivacky class LLVM_LIBRARY_VISIBILITY Common : public Tool { 113193326Sed public: 114208600Srdivacky Common(const char *Name, const char *ShortName, 115208600Srdivacky const ToolChain &TC) : Tool(Name, ShortName, TC) {} 116193326Sed 117193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 118198092Srdivacky const InputInfo &Output, 119198092Srdivacky const InputInfoList &Inputs, 120263509Sdim const llvm::opt::ArgList &TCArgs, 121193326Sed const char *LinkingOutput) const; 122193326Sed 123193326Sed /// RenderExtraToolArgs - Render any arguments necessary to force 124193326Sed /// the particular tool mode. 125263509Sdim virtual void 126263509Sdim RenderExtraToolArgs(const JobAction &JA, 127263509Sdim llvm::opt::ArgStringList &CmdArgs) const = 0; 128193326Sed }; 129193326Sed 130208600Srdivacky class LLVM_LIBRARY_VISIBILITY Preprocess : public Common { 131193326Sed public: 132208600Srdivacky Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", 133208600Srdivacky "gcc preprocessor", TC) {} 134193326Sed 135207619Srdivacky virtual bool hasGoodDiagnostics() const { return true; } 136193326Sed virtual bool hasIntegratedCPP() const { return false; } 137193326Sed 138203955Srdivacky virtual void RenderExtraToolArgs(const JobAction &JA, 139263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 140193326Sed }; 141193326Sed 142208600Srdivacky class LLVM_LIBRARY_VISIBILITY Precompile : public Common { 143193326Sed public: 144208600Srdivacky Precompile(const ToolChain &TC) : Common("gcc::Precompile", 145208600Srdivacky "gcc precompile", TC) {} 146193326Sed 147207619Srdivacky virtual bool hasGoodDiagnostics() const { return true; } 148193326Sed virtual bool hasIntegratedCPP() const { return true; } 149193326Sed 150203955Srdivacky virtual void RenderExtraToolArgs(const JobAction &JA, 151263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 152193326Sed }; 153193326Sed 154208600Srdivacky class LLVM_LIBRARY_VISIBILITY Compile : public Common { 155193326Sed public: 156208600Srdivacky Compile(const ToolChain &TC) : Common("gcc::Compile", 157208600Srdivacky "gcc frontend", TC) {} 158193326Sed 159207619Srdivacky virtual bool hasGoodDiagnostics() const { return true; } 160193326Sed virtual bool hasIntegratedCPP() const { return true; } 161193326Sed 162203955Srdivacky virtual void RenderExtraToolArgs(const JobAction &JA, 163263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 164193326Sed }; 165193326Sed 166208600Srdivacky class LLVM_LIBRARY_VISIBILITY Assemble : public Common { 167193326Sed public: 168208600Srdivacky Assemble(const ToolChain &TC) : Common("gcc::Assemble", 169208600Srdivacky "assembler (via gcc)", TC) {} 170193326Sed 171193326Sed virtual bool hasIntegratedCPP() const { return false; } 172193326Sed 173203955Srdivacky virtual void RenderExtraToolArgs(const JobAction &JA, 174263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 175193326Sed }; 176193326Sed 177208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public Common { 178193326Sed public: 179208600Srdivacky Link(const ToolChain &TC) : Common("gcc::Link", 180208600Srdivacky "linker (via gcc)", TC) {} 181193326Sed 182193326Sed virtual bool hasIntegratedCPP() const { return false; } 183235633Sdim virtual bool isLinkJob() const { return true; } 184193326Sed 185203955Srdivacky virtual void RenderExtraToolArgs(const JobAction &JA, 186263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 187193326Sed }; 188193326Sed} // end namespace gcc 189193326Sed 190235633Sdimnamespace hexagon { 191235633Sdim // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 192235633Sdim // We simply use "clang -cc1" for those actions. 193235633Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 194235633Sdim public: 195235633Sdim Assemble(const ToolChain &TC) : Tool("hexagon::Assemble", 196235633Sdim "hexagon-as", TC) {} 197235633Sdim 198235633Sdim virtual bool hasIntegratedCPP() const { return false; } 199235633Sdim 200235633Sdim virtual void RenderExtraToolArgs(const JobAction &JA, 201263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 202235633Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 203235633Sdim const InputInfo &Output, 204235633Sdim const InputInfoList &Inputs, 205263509Sdim const llvm::opt::ArgList &TCArgs, 206235633Sdim const char *LinkingOutput) const; 207235633Sdim }; 208235633Sdim 209235633Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 210235633Sdim public: 211235633Sdim Link(const ToolChain &TC) : Tool("hexagon::Link", 212235633Sdim "hexagon-ld", TC) {} 213235633Sdim 214235633Sdim virtual bool hasIntegratedCPP() const { return false; } 215235633Sdim virtual bool isLinkJob() const { return true; } 216235633Sdim 217235633Sdim virtual void RenderExtraToolArgs(const JobAction &JA, 218263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 219235633Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 220235633Sdim const InputInfo &Output, 221235633Sdim const InputInfoList &Inputs, 222263509Sdim const llvm::opt::ArgList &TCArgs, 223235633Sdim const char *LinkingOutput) const; 224235633Sdim }; 225235633Sdim} // end namespace hexagon. 226235633Sdim 227235633Sdim 228193326Sednamespace darwin { 229245431Sdim llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str); 230245431Sdim 231208600Srdivacky class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 232235633Sdim virtual void anchor(); 233198092Srdivacky protected: 234263509Sdim void AddDarwinArch(const llvm::opt::ArgList &Args, 235263509Sdim llvm::opt::ArgStringList &CmdArgs) const; 236198092Srdivacky 237198092Srdivacky const toolchains::Darwin &getDarwinToolChain() const { 238198092Srdivacky return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 239198092Srdivacky } 240198092Srdivacky 241193326Sed public: 242208600Srdivacky DarwinTool(const char *Name, const char *ShortName, 243208600Srdivacky const ToolChain &TC) : Tool(Name, ShortName, TC) {} 244198092Srdivacky }; 245198092Srdivacky 246208600Srdivacky class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 247193326Sed public: 248208600Srdivacky Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", 249208600Srdivacky "assembler", TC) {} 250193326Sed 251193326Sed virtual bool hasIntegratedCPP() const { return false; } 252193326Sed 253193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 254198092Srdivacky const InputInfo &Output, 255198092Srdivacky const InputInfoList &Inputs, 256263509Sdim const llvm::opt::ArgList &TCArgs, 257193326Sed const char *LinkingOutput) const; 258193326Sed }; 259193326Sed 260208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 261245431Sdim bool NeedsTempPath(const InputInfoList &Inputs) const; 262263509Sdim void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args, 263263509Sdim llvm::opt::ArgStringList &CmdArgs, 264263509Sdim const InputInfoList &Inputs) const; 265193326Sed 266193326Sed public: 267208600Srdivacky Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} 268193326Sed 269193326Sed virtual bool hasIntegratedCPP() const { return false; } 270235633Sdim virtual bool isLinkJob() const { return true; } 271193326Sed 272193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 273198092Srdivacky const InputInfo &Output, 274198092Srdivacky const InputInfoList &Inputs, 275263509Sdim const llvm::opt::ArgList &TCArgs, 276193326Sed const char *LinkingOutput) const; 277193326Sed }; 278193326Sed 279208600Srdivacky class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 280193326Sed public: 281208600Srdivacky Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {} 282193326Sed 283193326Sed virtual bool hasIntegratedCPP() const { return false; } 284193326Sed 285193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 286198092Srdivacky const InputInfo &Output, 287198092Srdivacky const InputInfoList &Inputs, 288263509Sdim const llvm::opt::ArgList &TCArgs, 289193326Sed const char *LinkingOutput) const; 290193326Sed }; 291210299Sed 292210299Sed class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { 293210299Sed public: 294210299Sed Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", 295210299Sed "dsymutil", TC) {} 296210299Sed 297210299Sed virtual bool hasIntegratedCPP() const { return false; } 298252723Sdim virtual bool isDsymutilJob() const { return true; } 299210299Sed 300210299Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 301210299Sed const InputInfo &Output, 302210299Sed const InputInfoList &Inputs, 303263509Sdim const llvm::opt::ArgList &TCArgs, 304210299Sed const char *LinkingOutput) const; 305210299Sed }; 306226890Sdim 307226890Sdim class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool { 308226890Sdim public: 309226890Sdim VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug", 310252723Sdim "dwarfdump", TC) {} 311226890Sdim 312226890Sdim virtual bool hasIntegratedCPP() const { return false; } 313226890Sdim 314226890Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 315252723Sdim const InputInfo &Output, 316252723Sdim const InputInfoList &Inputs, 317263509Sdim const llvm::opt::ArgList &TCArgs, 318252723Sdim const char *LinkingOutput) const; 319226890Sdim }; 320226890Sdim 321193326Sed} 322193326Sed 323195341Sed /// openbsd -- Directly call GNU Binutils assembler and linker 324195341Sednamespace openbsd { 325208600Srdivacky class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 326195341Sed public: 327208600Srdivacky Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler", 328208600Srdivacky TC) {} 329195341Sed 330195341Sed virtual bool hasIntegratedCPP() const { return false; } 331195341Sed 332195341Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 333198092Srdivacky const InputInfo &Output, 334198092Srdivacky const InputInfoList &Inputs, 335263509Sdim const llvm::opt::ArgList &TCArgs, 336195341Sed const char *LinkingOutput) const; 337195341Sed }; 338208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public Tool { 339195341Sed public: 340208600Srdivacky Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {} 341195341Sed 342195341Sed virtual bool hasIntegratedCPP() const { return false; } 343235633Sdim virtual bool isLinkJob() const { return true; } 344195341Sed 345195341Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 346198092Srdivacky const InputInfo &Output, 347198092Srdivacky const InputInfoList &Inputs, 348263509Sdim const llvm::opt::ArgList &TCArgs, 349195341Sed const char *LinkingOutput) const; 350195341Sed }; 351198092Srdivacky} // end namespace openbsd 352195341Sed 353245431Sdim /// bitrig -- Directly call GNU Binutils assembler and linker 354245431Sdimnamespace bitrig { 355245431Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 356245431Sdim public: 357245431Sdim Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler", 358245431Sdim TC) {} 359245431Sdim 360245431Sdim virtual bool hasIntegratedCPP() const { return false; } 361245431Sdim 362245431Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 363245431Sdim const InputInfo &Output, 364245431Sdim const InputInfoList &Inputs, 365263509Sdim const llvm::opt::ArgList &TCArgs, 366245431Sdim const char *LinkingOutput) const; 367245431Sdim }; 368245431Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 369245431Sdim public: 370245431Sdim Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {} 371245431Sdim 372245431Sdim virtual bool hasIntegratedCPP() const { return false; } 373245431Sdim virtual bool isLinkJob() const { return true; } 374245431Sdim 375245431Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 376245431Sdim const InputInfo &Output, 377245431Sdim const InputInfoList &Inputs, 378263509Sdim const llvm::opt::ArgList &TCArgs, 379245431Sdim const char *LinkingOutput) const; 380245431Sdim }; 381245431Sdim} // end namespace bitrig 382245431Sdim 383193326Sed /// freebsd -- Directly call GNU Binutils assembler and linker 384193326Sednamespace freebsd { 385208600Srdivacky class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 386193326Sed public: 387208600Srdivacky Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 388208600Srdivacky TC) {} 389193326Sed 390193326Sed virtual bool hasIntegratedCPP() const { return false; } 391193326Sed 392193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 393198092Srdivacky const InputInfo &Output, 394198092Srdivacky const InputInfoList &Inputs, 395263509Sdim const llvm::opt::ArgList &TCArgs, 396193326Sed const char *LinkingOutput) const; 397193326Sed }; 398208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public Tool { 399193326Sed public: 400208600Srdivacky Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {} 401193326Sed 402193326Sed virtual bool hasIntegratedCPP() const { return false; } 403235633Sdim virtual bool isLinkJob() const { return true; } 404193326Sed 405193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 406198092Srdivacky const InputInfo &Output, 407198092Srdivacky const InputInfoList &Inputs, 408263509Sdim const llvm::opt::ArgList &TCArgs, 409193326Sed const char *LinkingOutput) const; 410193326Sed }; 411198092Srdivacky} // end namespace freebsd 412193326Sed 413218893Sdim /// netbsd -- Directly call GNU Binutils assembler and linker 414218893Sdimnamespace netbsd { 415218893Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 416223017Sdim 417218893Sdim public: 418235633Sdim Assemble(const ToolChain &TC) 419235633Sdim : Tool("netbsd::Assemble", "assembler", TC) {} 420218893Sdim 421218893Sdim virtual bool hasIntegratedCPP() const { return false; } 422218893Sdim 423218893Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 424218893Sdim const InputInfo &Output, 425218893Sdim const InputInfoList &Inputs, 426263509Sdim const llvm::opt::ArgList &TCArgs, 427218893Sdim const char *LinkingOutput) const; 428218893Sdim }; 429218893Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 430223017Sdim 431218893Sdim public: 432235633Sdim Link(const ToolChain &TC) 433235633Sdim : Tool("netbsd::Link", "linker", TC) {} 434218893Sdim 435218893Sdim virtual bool hasIntegratedCPP() const { return false; } 436235633Sdim virtual bool isLinkJob() const { return true; } 437218893Sdim 438218893Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 439218893Sdim const InputInfo &Output, 440218893Sdim const InputInfoList &Inputs, 441263509Sdim const llvm::opt::ArgList &TCArgs, 442218893Sdim const char *LinkingOutput) const; 443218893Sdim }; 444218893Sdim} // end namespace netbsd 445218893Sdim 446252723Sdim /// Directly call GNU Binutils' assembler and linker. 447252723Sdimnamespace gnutools { 448212904Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 449212904Sdim public: 450252723Sdim Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {} 451212904Sdim 452212904Sdim virtual bool hasIntegratedCPP() const { return false; } 453212904Sdim 454212904Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 455212904Sdim const InputInfo &Output, 456212904Sdim const InputInfoList &Inputs, 457263509Sdim const llvm::opt::ArgList &TCArgs, 458212904Sdim const char *LinkingOutput) const; 459212904Sdim }; 460218893Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 461218893Sdim public: 462252723Sdim Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {} 463218893Sdim 464218893Sdim virtual bool hasIntegratedCPP() const { return false; } 465235633Sdim virtual bool isLinkJob() const { return true; } 466218893Sdim 467218893Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 468218893Sdim const InputInfo &Output, 469218893Sdim const InputInfoList &Inputs, 470263509Sdim const llvm::opt::ArgList &TCArgs, 471218893Sdim const char *LinkingOutput) const; 472218893Sdim }; 473212904Sdim} 474210299Sed /// minix -- Directly call GNU Binutils assembler and linker 475210299Sednamespace minix { 476210299Sed class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 477210299Sed public: 478210299Sed Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 479210299Sed TC) {} 480210299Sed 481210299Sed virtual bool hasIntegratedCPP() const { return false; } 482210299Sed 483210299Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 484210299Sed const InputInfo &Output, 485210299Sed const InputInfoList &Inputs, 486263509Sdim const llvm::opt::ArgList &TCArgs, 487210299Sed const char *LinkingOutput) const; 488210299Sed }; 489210299Sed class LLVM_LIBRARY_VISIBILITY Link : public Tool { 490210299Sed public: 491210299Sed Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 492210299Sed 493210299Sed virtual bool hasIntegratedCPP() const { return false; } 494235633Sdim virtual bool isLinkJob() const { return true; } 495210299Sed 496210299Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 497210299Sed const InputInfo &Output, 498210299Sed const InputInfoList &Inputs, 499263509Sdim const llvm::opt::ArgList &TCArgs, 500210299Sed const char *LinkingOutput) const; 501210299Sed }; 502210299Sed} // end namespace minix 503210299Sed 504235633Sdim /// solaris -- Directly call Solaris assembler and linker 505235633Sdimnamespace solaris { 506235633Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 507235633Sdim public: 508235633Sdim Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", 509235633Sdim TC) {} 510235633Sdim 511235633Sdim virtual bool hasIntegratedCPP() const { return false; } 512235633Sdim 513235633Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 514235633Sdim const InputInfo &Output, 515235633Sdim const InputInfoList &Inputs, 516263509Sdim const llvm::opt::ArgList &TCArgs, 517235633Sdim const char *LinkingOutput) const; 518235633Sdim }; 519235633Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 520235633Sdim public: 521235633Sdim Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} 522235633Sdim 523235633Sdim virtual bool hasIntegratedCPP() const { return false; } 524235633Sdim virtual bool isLinkJob() const { return true; } 525235633Sdim 526235633Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 527235633Sdim const InputInfo &Output, 528235633Sdim const InputInfoList &Inputs, 529263509Sdim const llvm::opt::ArgList &TCArgs, 530235633Sdim const char *LinkingOutput) const; 531235633Sdim }; 532235633Sdim} // end namespace solaris 533235633Sdim 534198092Srdivacky /// auroraux -- Directly call GNU Binutils assembler and linker 535198092Srdivackynamespace auroraux { 536208600Srdivacky class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 537198092Srdivacky public: 538208600Srdivacky Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 539208600Srdivacky TC) {} 540198092Srdivacky 541198092Srdivacky virtual bool hasIntegratedCPP() const { return false; } 542198092Srdivacky 543198092Srdivacky virtual void ConstructJob(Compilation &C, const JobAction &JA, 544198092Srdivacky const InputInfo &Output, 545198092Srdivacky const InputInfoList &Inputs, 546263509Sdim const llvm::opt::ArgList &TCArgs, 547198092Srdivacky const char *LinkingOutput) const; 548198092Srdivacky }; 549208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public Tool { 550198092Srdivacky public: 551208600Srdivacky Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 552198092Srdivacky 553198092Srdivacky virtual bool hasIntegratedCPP() const { return false; } 554235633Sdim virtual bool isLinkJob() const { return true; } 555198092Srdivacky 556198092Srdivacky virtual void ConstructJob(Compilation &C, const JobAction &JA, 557198092Srdivacky const InputInfo &Output, 558198092Srdivacky const InputInfoList &Inputs, 559263509Sdim const llvm::opt::ArgList &TCArgs, 560198092Srdivacky const char *LinkingOutput) const; 561198092Srdivacky }; 562198092Srdivacky} // end namespace auroraux 563198092Srdivacky 564193326Sed /// dragonfly -- Directly call GNU Binutils assembler and linker 565193326Sednamespace dragonfly { 566208600Srdivacky class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 567193326Sed public: 568208600Srdivacky Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 569208600Srdivacky TC) {} 570193326Sed 571193326Sed virtual bool hasIntegratedCPP() const { return false; } 572193326Sed 573193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 574198092Srdivacky const InputInfo &Output, 575198092Srdivacky const InputInfoList &Inputs, 576263509Sdim const llvm::opt::ArgList &TCArgs, 577193326Sed const char *LinkingOutput) const; 578193326Sed }; 579208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public Tool { 580193326Sed public: 581208600Srdivacky Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 582193326Sed 583193326Sed virtual bool hasIntegratedCPP() const { return false; } 584235633Sdim virtual bool isLinkJob() const { return true; } 585193326Sed 586193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 587198092Srdivacky const InputInfo &Output, 588198092Srdivacky const InputInfoList &Inputs, 589263509Sdim const llvm::opt::ArgList &TCArgs, 590193326Sed const char *LinkingOutput) const; 591193326Sed }; 592198092Srdivacky} // end namespace dragonfly 593193326Sed 594212904Sdim /// Visual studio tools. 595212904Sdimnamespace visualstudio { 596263509Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 597212904Sdim public: 598212904Sdim Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {} 599212904Sdim 600212904Sdim virtual bool hasIntegratedCPP() const { return false; } 601235633Sdim virtual bool isLinkJob() const { return true; } 602212904Sdim 603212904Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 604212904Sdim const InputInfo &Output, 605212904Sdim const InputInfoList &Inputs, 606263509Sdim const llvm::opt::ArgList &TCArgs, 607212904Sdim const char *LinkingOutput) const; 608212904Sdim }; 609263509Sdim 610263509Sdim class LLVM_LIBRARY_VISIBILITY Compile : public Tool { 611263509Sdim public: 612263509Sdim Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {} 613263509Sdim 614263509Sdim virtual bool hasIntegratedAssembler() const { return true; } 615263509Sdim virtual bool hasIntegratedCPP() const { return true; } 616263509Sdim virtual bool isLinkJob() const { return false; } 617263509Sdim 618263509Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 619263509Sdim const InputInfo &Output, 620263509Sdim const InputInfoList &Inputs, 621263509Sdim const llvm::opt::ArgList &TCArgs, 622263509Sdim const char *LinkingOutput) const; 623263509Sdim 624263509Sdim Command *GetCommand(Compilation &C, const JobAction &JA, 625263509Sdim const InputInfo &Output, 626263509Sdim const InputInfoList &Inputs, 627263509Sdim const llvm::opt::ArgList &TCArgs, 628263509Sdim const char *LinkingOutput) const; 629263509Sdim }; 630212904Sdim} // end namespace visualstudio 631212904Sdim 632263509Sdimnamespace XCore { 633263509Sdim // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 634263509Sdim // We simply use "clang -cc1" for those actions. 635263509Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 636263509Sdim public: 637263509Sdim Assemble(const ToolChain &TC) : Tool("XCore::Assemble", 638263509Sdim "XCore-as", TC) {} 639263509Sdim 640263509Sdim virtual bool hasIntegratedCPP() const { return false; } 641263509Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 642263509Sdim const InputInfo &Output, 643263509Sdim const InputInfoList &Inputs, 644263509Sdim const llvm::opt::ArgList &TCArgs, 645263509Sdim const char *LinkingOutput) const; 646263509Sdim }; 647263509Sdim 648263509Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 649263509Sdim public: 650263509Sdim Link(const ToolChain &TC) : Tool("XCore::Link", 651263509Sdim "XCore-ld", TC) {} 652263509Sdim 653263509Sdim virtual bool hasIntegratedCPP() const { return false; } 654263509Sdim virtual bool isLinkJob() const { return true; } 655263509Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 656263509Sdim const InputInfo &Output, 657263509Sdim const InputInfoList &Inputs, 658263509Sdim const llvm::opt::ArgList &TCArgs, 659263509Sdim const char *LinkingOutput) const; 660263509Sdim }; 661263509Sdim} // end namespace XCore. 662263509Sdim 663263509Sdim 664193326Sed} // end namespace toolchains 665193326Sed} // end namespace driver 666193326Sed} // end namespace clang 667193326Sed 668198092Srdivacky#endif // CLANG_LIB_DRIVER_TOOLS_H_ 669