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" 17263508Sdim#include "llvm/Option/Option.h" 18193326Sed#include "llvm/Support/Compiler.h" 19193326Sed 20193326Sednamespace clang { 21239462Sdim class ObjCRuntime; 22239462Sdim 23193326Sednamespace driver { 24263508Sdim class Command; 25193326Sed class Driver; 26193326Sed 27193326Sednamespace toolchains { 28198092Srdivacky class Darwin; 29193326Sed} 30193326Sed 31193326Sednamespace tools { 32263508Sdimusing llvm::opt::ArgStringList; 33193326Sed 34208600Srdivacky /// \brief Clang compiler tool. 35208600Srdivacky class LLVM_LIBRARY_VISIBILITY Clang : public Tool { 36249423Sdim public: 37263508Sdim static const char *getBaseInputName(const llvm::opt::ArgList &Args, 38249423Sdim const InputInfoList &Inputs); 39263508Sdim static const char *getBaseInputStem(const llvm::opt::ArgList &Args, 40249423Sdim const InputInfoList &Inputs); 41263508Sdim static const char *getDependencyFileName(const llvm::opt::ArgList &Args, 42249423Sdim const InputInfoList &Inputs); 43249423Sdim 44249423Sdim private: 45263508Sdim void AddPreprocessingOptions(Compilation &C, const JobAction &JA, 46234353Sdim const Driver &D, 47263508Sdim const llvm::opt::ArgList &Args, 48263508Sdim llvm::opt::ArgStringList &CmdArgs, 49193326Sed const InputInfo &Output, 50193326Sed const InputInfoList &Inputs) const; 51193326Sed 52263508Sdim void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, 53263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 54263508Sdim void AddARMTargetArgs(const llvm::opt::ArgList &Args, 55263508Sdim llvm::opt::ArgStringList &CmdArgs, 56221345Sdim bool KernelOrKext) const; 57263508Sdim void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 58263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 59263508Sdim void AddR600TargetArgs(const llvm::opt::ArgList &Args, 60263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 61263508Sdim void AddSparcTargetArgs(const llvm::opt::ArgList &Args, 62263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 63263508Sdim void AddSystemZTargetArgs(const llvm::opt::ArgList &Args, 64263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 65263508Sdim void AddX86TargetArgs(const llvm::opt::ArgList &Args, 66263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 67263508Sdim void AddHexagonTargetArgs(const llvm::opt::ArgList &Args, 68263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 69198092Srdivacky 70239462Sdim enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile }; 71239462Sdim 72263508Sdim ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args, 73263508Sdim llvm::opt::ArgStringList &cmdArgs, 74239462Sdim RewriteKind rewrite) const; 75239462Sdim 76263508Sdim void AddClangCLArgs(const llvm::opt::ArgList &Args, 77263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 78263508Sdim 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, 89263508Sdim 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, 106263508Sdim 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, 120263508Sdim const llvm::opt::ArgList &TCArgs, 121193326Sed const char *LinkingOutput) const; 122193326Sed 123193326Sed /// RenderExtraToolArgs - Render any arguments necessary to force 124193326Sed /// the particular tool mode. 125263508Sdim virtual void 126263508Sdim RenderExtraToolArgs(const JobAction &JA, 127263508Sdim 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, 139263508Sdim 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, 151263508Sdim 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, 163263508Sdim 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, 174263508Sdim 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; } 183234353Sdim virtual bool isLinkJob() const { return true; } 184193326Sed 185203955Srdivacky virtual void RenderExtraToolArgs(const JobAction &JA, 186263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 187193326Sed }; 188193326Sed} // end namespace gcc 189193326Sed 190234353Sdimnamespace hexagon { 191234353Sdim // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 192234353Sdim // We simply use "clang -cc1" for those actions. 193234353Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 194234353Sdim public: 195234353Sdim Assemble(const ToolChain &TC) : Tool("hexagon::Assemble", 196234353Sdim "hexagon-as", TC) {} 197234353Sdim 198234353Sdim virtual bool hasIntegratedCPP() const { return false; } 199234353Sdim 200234353Sdim virtual void RenderExtraToolArgs(const JobAction &JA, 201263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 202234353Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 203234353Sdim const InputInfo &Output, 204234353Sdim const InputInfoList &Inputs, 205263508Sdim const llvm::opt::ArgList &TCArgs, 206234353Sdim const char *LinkingOutput) const; 207234353Sdim }; 208234353Sdim 209234353Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 210234353Sdim public: 211234353Sdim Link(const ToolChain &TC) : Tool("hexagon::Link", 212234353Sdim "hexagon-ld", TC) {} 213234353Sdim 214234353Sdim virtual bool hasIntegratedCPP() const { return false; } 215234353Sdim virtual bool isLinkJob() const { return true; } 216234353Sdim 217234353Sdim virtual void RenderExtraToolArgs(const JobAction &JA, 218263508Sdim llvm::opt::ArgStringList &CmdArgs) const; 219234353Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 220234353Sdim const InputInfo &Output, 221234353Sdim const InputInfoList &Inputs, 222263508Sdim const llvm::opt::ArgList &TCArgs, 223234353Sdim const char *LinkingOutput) const; 224234353Sdim }; 225234353Sdim} // end namespace hexagon. 226234353Sdim 227234353Sdim 228193326Sednamespace darwin { 229243830Sdim llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str); 230243830Sdim 231208600Srdivacky class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 232234353Sdim virtual void anchor(); 233198092Srdivacky protected: 234263508Sdim void AddDarwinArch(const llvm::opt::ArgList &Args, 235263508Sdim 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, 256263508Sdim const llvm::opt::ArgList &TCArgs, 257193326Sed const char *LinkingOutput) const; 258193326Sed }; 259193326Sed 260208600Srdivacky class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 261243830Sdim bool NeedsTempPath(const InputInfoList &Inputs) const; 262263508Sdim void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args, 263263508Sdim llvm::opt::ArgStringList &CmdArgs, 264263508Sdim 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; } 270234353Sdim virtual bool isLinkJob() const { return true; } 271193326Sed 272193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 273198092Srdivacky const InputInfo &Output, 274198092Srdivacky const InputInfoList &Inputs, 275263508Sdim 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, 288263508Sdim 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; } 298249423Sdim virtual bool isDsymutilJob() const { return true; } 299210299Sed 300210299Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 301210299Sed const InputInfo &Output, 302210299Sed const InputInfoList &Inputs, 303263508Sdim const llvm::opt::ArgList &TCArgs, 304210299Sed const char *LinkingOutput) const; 305210299Sed }; 306226633Sdim 307226633Sdim class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool { 308226633Sdim public: 309226633Sdim VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug", 310249423Sdim "dwarfdump", TC) {} 311226633Sdim 312226633Sdim virtual bool hasIntegratedCPP() const { return false; } 313226633Sdim 314226633Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 315249423Sdim const InputInfo &Output, 316249423Sdim const InputInfoList &Inputs, 317263508Sdim const llvm::opt::ArgList &TCArgs, 318249423Sdim const char *LinkingOutput) const; 319226633Sdim }; 320226633Sdim 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, 335263508Sdim 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; } 343234353Sdim virtual bool isLinkJob() const { return true; } 344195341Sed 345195341Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 346198092Srdivacky const InputInfo &Output, 347198092Srdivacky const InputInfoList &Inputs, 348263508Sdim const llvm::opt::ArgList &TCArgs, 349195341Sed const char *LinkingOutput) const; 350195341Sed }; 351198092Srdivacky} // end namespace openbsd 352195341Sed 353239462Sdim /// bitrig -- Directly call GNU Binutils assembler and linker 354239462Sdimnamespace bitrig { 355239462Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 356239462Sdim public: 357239462Sdim Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler", 358239462Sdim TC) {} 359239462Sdim 360239462Sdim virtual bool hasIntegratedCPP() const { return false; } 361239462Sdim 362239462Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 363239462Sdim const InputInfo &Output, 364239462Sdim const InputInfoList &Inputs, 365263508Sdim const llvm::opt::ArgList &TCArgs, 366239462Sdim const char *LinkingOutput) const; 367239462Sdim }; 368239462Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 369239462Sdim public: 370239462Sdim Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {} 371239462Sdim 372239462Sdim virtual bool hasIntegratedCPP() const { return false; } 373239462Sdim virtual bool isLinkJob() const { return true; } 374239462Sdim 375239462Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 376239462Sdim const InputInfo &Output, 377239462Sdim const InputInfoList &Inputs, 378263508Sdim const llvm::opt::ArgList &TCArgs, 379239462Sdim const char *LinkingOutput) const; 380239462Sdim }; 381239462Sdim} // end namespace bitrig 382239462Sdim 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, 395263508Sdim 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; } 403234353Sdim virtual bool isLinkJob() const { return true; } 404193326Sed 405193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 406198092Srdivacky const InputInfo &Output, 407198092Srdivacky const InputInfoList &Inputs, 408263508Sdim 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: 418234353Sdim Assemble(const ToolChain &TC) 419234353Sdim : 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, 426263508Sdim const llvm::opt::ArgList &TCArgs, 427218893Sdim const char *LinkingOutput) const; 428218893Sdim }; 429218893Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 430223017Sdim 431218893Sdim public: 432234353Sdim Link(const ToolChain &TC) 433234353Sdim : Tool("netbsd::Link", "linker", TC) {} 434218893Sdim 435218893Sdim virtual bool hasIntegratedCPP() const { return false; } 436234353Sdim virtual bool isLinkJob() const { return true; } 437218893Sdim 438218893Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 439218893Sdim const InputInfo &Output, 440218893Sdim const InputInfoList &Inputs, 441263508Sdim const llvm::opt::ArgList &TCArgs, 442218893Sdim const char *LinkingOutput) const; 443218893Sdim }; 444218893Sdim} // end namespace netbsd 445218893Sdim 446249423Sdim /// Directly call GNU Binutils' assembler and linker. 447249423Sdimnamespace gnutools { 448212904Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 449212904Sdim public: 450249423Sdim 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, 457263508Sdim const llvm::opt::ArgList &TCArgs, 458212904Sdim const char *LinkingOutput) const; 459212904Sdim }; 460218893Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 461218893Sdim public: 462249423Sdim Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {} 463218893Sdim 464218893Sdim virtual bool hasIntegratedCPP() const { return false; } 465234353Sdim virtual bool isLinkJob() const { return true; } 466218893Sdim 467218893Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 468218893Sdim const InputInfo &Output, 469218893Sdim const InputInfoList &Inputs, 470263508Sdim 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, 486263508Sdim 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; } 494234353Sdim virtual bool isLinkJob() const { return true; } 495210299Sed 496210299Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 497210299Sed const InputInfo &Output, 498210299Sed const InputInfoList &Inputs, 499263508Sdim const llvm::opt::ArgList &TCArgs, 500210299Sed const char *LinkingOutput) const; 501210299Sed }; 502210299Sed} // end namespace minix 503210299Sed 504234353Sdim /// solaris -- Directly call Solaris assembler and linker 505234353Sdimnamespace solaris { 506234353Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 507234353Sdim public: 508234353Sdim Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler", 509234353Sdim TC) {} 510234353Sdim 511234353Sdim virtual bool hasIntegratedCPP() const { return false; } 512234353Sdim 513234353Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 514234353Sdim const InputInfo &Output, 515234353Sdim const InputInfoList &Inputs, 516263508Sdim const llvm::opt::ArgList &TCArgs, 517234353Sdim const char *LinkingOutput) const; 518234353Sdim }; 519234353Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 520234353Sdim public: 521234353Sdim Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {} 522234353Sdim 523234353Sdim virtual bool hasIntegratedCPP() const { return false; } 524234353Sdim virtual bool isLinkJob() const { return true; } 525234353Sdim 526234353Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 527234353Sdim const InputInfo &Output, 528234353Sdim const InputInfoList &Inputs, 529263508Sdim const llvm::opt::ArgList &TCArgs, 530234353Sdim const char *LinkingOutput) const; 531234353Sdim }; 532234353Sdim} // end namespace solaris 533234353Sdim 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, 546263508Sdim 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; } 554234353Sdim virtual bool isLinkJob() const { return true; } 555198092Srdivacky 556198092Srdivacky virtual void ConstructJob(Compilation &C, const JobAction &JA, 557198092Srdivacky const InputInfo &Output, 558198092Srdivacky const InputInfoList &Inputs, 559263508Sdim 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, 576263508Sdim 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; } 584234353Sdim virtual bool isLinkJob() const { return true; } 585193326Sed 586193326Sed virtual void ConstructJob(Compilation &C, const JobAction &JA, 587198092Srdivacky const InputInfo &Output, 588198092Srdivacky const InputInfoList &Inputs, 589263508Sdim const llvm::opt::ArgList &TCArgs, 590193326Sed const char *LinkingOutput) const; 591193326Sed }; 592198092Srdivacky} // end namespace dragonfly 593193326Sed 594212904Sdim /// Visual studio tools. 595212904Sdimnamespace visualstudio { 596263508Sdim 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; } 601234353Sdim virtual bool isLinkJob() const { return true; } 602212904Sdim 603212904Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 604212904Sdim const InputInfo &Output, 605212904Sdim const InputInfoList &Inputs, 606263508Sdim const llvm::opt::ArgList &TCArgs, 607212904Sdim const char *LinkingOutput) const; 608212904Sdim }; 609263508Sdim 610263508Sdim class LLVM_LIBRARY_VISIBILITY Compile : public Tool { 611263508Sdim public: 612263508Sdim Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {} 613263508Sdim 614263508Sdim virtual bool hasIntegratedAssembler() const { return true; } 615263508Sdim virtual bool hasIntegratedCPP() const { return true; } 616263508Sdim virtual bool isLinkJob() const { return false; } 617263508Sdim 618263508Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 619263508Sdim const InputInfo &Output, 620263508Sdim const InputInfoList &Inputs, 621263508Sdim const llvm::opt::ArgList &TCArgs, 622263508Sdim const char *LinkingOutput) const; 623263508Sdim 624263508Sdim Command *GetCommand(Compilation &C, const JobAction &JA, 625263508Sdim const InputInfo &Output, 626263508Sdim const InputInfoList &Inputs, 627263508Sdim const llvm::opt::ArgList &TCArgs, 628263508Sdim const char *LinkingOutput) const; 629263508Sdim }; 630212904Sdim} // end namespace visualstudio 631212904Sdim 632263508Sdimnamespace XCore { 633263508Sdim // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile. 634263508Sdim // We simply use "clang -cc1" for those actions. 635263508Sdim class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 636263508Sdim public: 637263508Sdim Assemble(const ToolChain &TC) : Tool("XCore::Assemble", 638263508Sdim "XCore-as", TC) {} 639263508Sdim 640263508Sdim virtual bool hasIntegratedCPP() const { return false; } 641263508Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 642263508Sdim const InputInfo &Output, 643263508Sdim const InputInfoList &Inputs, 644263508Sdim const llvm::opt::ArgList &TCArgs, 645263508Sdim const char *LinkingOutput) const; 646263508Sdim }; 647263508Sdim 648263508Sdim class LLVM_LIBRARY_VISIBILITY Link : public Tool { 649263508Sdim public: 650263508Sdim Link(const ToolChain &TC) : Tool("XCore::Link", 651263508Sdim "XCore-ld", TC) {} 652263508Sdim 653263508Sdim virtual bool hasIntegratedCPP() const { return false; } 654263508Sdim virtual bool isLinkJob() const { return true; } 655263508Sdim virtual void ConstructJob(Compilation &C, const JobAction &JA, 656263508Sdim const InputInfo &Output, 657263508Sdim const InputInfoList &Inputs, 658263508Sdim const llvm::opt::ArgList &TCArgs, 659263508Sdim const char *LinkingOutput) const; 660263508Sdim }; 661263508Sdim} // end namespace XCore. 662263508Sdim 663263508Sdim 664193326Sed} // end namespace toolchains 665193326Sed} // end namespace driver 666193326Sed} // end namespace clang 667193326Sed 668198092Srdivacky#endif // CLANG_LIB_DRIVER_TOOLS_H_ 669