1*67e74705SXin Li //===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li 10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_DRIVER_TOOLS_H 11*67e74705SXin Li #define LLVM_CLANG_LIB_DRIVER_TOOLS_H 12*67e74705SXin Li 13*67e74705SXin Li #include "clang/Basic/DebugInfoOptions.h" 14*67e74705SXin Li #include "clang/Basic/VersionTuple.h" 15*67e74705SXin Li #include "clang/Driver/Tool.h" 16*67e74705SXin Li #include "clang/Driver/Types.h" 17*67e74705SXin Li #include "clang/Driver/Util.h" 18*67e74705SXin Li #include "llvm/ADT/Triple.h" 19*67e74705SXin Li #include "llvm/Option/Option.h" 20*67e74705SXin Li #include "llvm/Support/Compiler.h" 21*67e74705SXin Li 22*67e74705SXin Li namespace clang { 23*67e74705SXin Li class ObjCRuntime; 24*67e74705SXin Li 25*67e74705SXin Li namespace driver { 26*67e74705SXin Li class Command; 27*67e74705SXin Li class Driver; 28*67e74705SXin Li 29*67e74705SXin Li namespace toolchains { 30*67e74705SXin Li class MachO; 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li namespace tools { 34*67e74705SXin Li 35*67e74705SXin Li namespace visualstudio { 36*67e74705SXin Li class Compiler; 37*67e74705SXin Li } 38*67e74705SXin Li 39*67e74705SXin Li using llvm::opt::ArgStringList; 40*67e74705SXin Li 41*67e74705SXin Li SmallString<128> getCompilerRT(const ToolChain &TC, 42*67e74705SXin Li const llvm::opt::ArgList &Args, 43*67e74705SXin Li StringRef Component, bool Shared = false); 44*67e74705SXin Li 45*67e74705SXin Li /// \brief Clang compiler tool. 46*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Clang : public Tool { 47*67e74705SXin Li public: 48*67e74705SXin Li static const char *getBaseInputName(const llvm::opt::ArgList &Args, 49*67e74705SXin Li const InputInfo &Input); 50*67e74705SXin Li static const char *getBaseInputStem(const llvm::opt::ArgList &Args, 51*67e74705SXin Li const InputInfoList &Inputs); 52*67e74705SXin Li static const char *getDependencyFileName(const llvm::opt::ArgList &Args, 53*67e74705SXin Li const InputInfoList &Inputs); 54*67e74705SXin Li 55*67e74705SXin Li private: 56*67e74705SXin Li void AddPreprocessingOptions(Compilation &C, const JobAction &JA, 57*67e74705SXin Li const Driver &D, const llvm::opt::ArgList &Args, 58*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs, 59*67e74705SXin Li const InputInfo &Output, 60*67e74705SXin Li const InputInfoList &Inputs, 61*67e74705SXin Li const ToolChain *AuxToolChain) const; 62*67e74705SXin Li 63*67e74705SXin Li void AddAArch64TargetArgs(const llvm::opt::ArgList &Args, 64*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 65*67e74705SXin Li void AddARMTargetArgs(const llvm::Triple &Triple, 66*67e74705SXin Li const llvm::opt::ArgList &Args, 67*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs, 68*67e74705SXin Li bool KernelOrKext) const; 69*67e74705SXin Li void AddARM64TargetArgs(const llvm::opt::ArgList &Args, 70*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 71*67e74705SXin Li void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 72*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 73*67e74705SXin Li void AddPPCTargetArgs(const llvm::opt::ArgList &Args, 74*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 75*67e74705SXin Li void AddR600TargetArgs(const llvm::opt::ArgList &Args, 76*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 77*67e74705SXin Li void AddSparcTargetArgs(const llvm::opt::ArgList &Args, 78*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 79*67e74705SXin Li void AddSystemZTargetArgs(const llvm::opt::ArgList &Args, 80*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 81*67e74705SXin Li void AddX86TargetArgs(const llvm::opt::ArgList &Args, 82*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 83*67e74705SXin Li void AddHexagonTargetArgs(const llvm::opt::ArgList &Args, 84*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 85*67e74705SXin Li void AddLanaiTargetArgs(const llvm::opt::ArgList &Args, 86*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 87*67e74705SXin Li void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args, 88*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 89*67e74705SXin Li 90*67e74705SXin Li enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile }; 91*67e74705SXin Li 92*67e74705SXin Li ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args, 93*67e74705SXin Li llvm::opt::ArgStringList &cmdArgs, 94*67e74705SXin Li RewriteKind rewrite) const; 95*67e74705SXin Li 96*67e74705SXin Li void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType, 97*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs, 98*67e74705SXin Li codegenoptions::DebugInfoKind *DebugInfoKind, 99*67e74705SXin Li bool *EmitCodeView) const; 100*67e74705SXin Li 101*67e74705SXin Li visualstudio::Compiler *getCLFallback() const; 102*67e74705SXin Li 103*67e74705SXin Li mutable std::unique_ptr<visualstudio::Compiler> CLFallback; 104*67e74705SXin Li 105*67e74705SXin Li public: 106*67e74705SXin Li // CAUTION! The first constructor argument ("clang") is not arbitrary, 107*67e74705SXin Li // as it is for other tools. Some operations on a Tool actually test 108*67e74705SXin Li // whether that tool is Clang based on the Tool's Name as a string. Clang(const ToolChain & TC)109*67e74705SXin Li Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {} 110*67e74705SXin Li hasGoodDiagnostics()111*67e74705SXin Li bool hasGoodDiagnostics() const override { return true; } hasIntegratedAssembler()112*67e74705SXin Li bool hasIntegratedAssembler() const override { return true; } hasIntegratedCPP()113*67e74705SXin Li bool hasIntegratedCPP() const override { return true; } canEmitIR()114*67e74705SXin Li bool canEmitIR() const override { return true; } 115*67e74705SXin Li 116*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 117*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 118*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 119*67e74705SXin Li const char *LinkingOutput) const override; 120*67e74705SXin Li }; 121*67e74705SXin Li 122*67e74705SXin Li /// \brief Clang integrated assembler tool. 123*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 124*67e74705SXin Li public: ClangAs(const ToolChain & TC)125*67e74705SXin Li ClangAs(const ToolChain &TC) 126*67e74705SXin Li : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {} 127*67e74705SXin Li void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, 128*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; hasGoodDiagnostics()129*67e74705SXin Li bool hasGoodDiagnostics() const override { return true; } hasIntegratedAssembler()130*67e74705SXin Li bool hasIntegratedAssembler() const override { return false; } hasIntegratedCPP()131*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 132*67e74705SXin Li 133*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 134*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 135*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 136*67e74705SXin Li const char *LinkingOutput) const override; 137*67e74705SXin Li }; 138*67e74705SXin Li 139*67e74705SXin Li /// \brief Base class for all GNU tools that provide the same behavior when 140*67e74705SXin Li /// it comes to response files support 141*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool { 142*67e74705SXin Li virtual void anchor(); 143*67e74705SXin Li 144*67e74705SXin Li public: GnuTool(const char * Name,const char * ShortName,const ToolChain & TC)145*67e74705SXin Li GnuTool(const char *Name, const char *ShortName, const ToolChain &TC) 146*67e74705SXin Li : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {} 147*67e74705SXin Li }; 148*67e74705SXin Li 149*67e74705SXin Li /// gcc - Generic GCC tool implementations. 150*67e74705SXin Li namespace gcc { 151*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Common : public GnuTool { 152*67e74705SXin Li public: Common(const char * Name,const char * ShortName,const ToolChain & TC)153*67e74705SXin Li Common(const char *Name, const char *ShortName, const ToolChain &TC) 154*67e74705SXin Li : GnuTool(Name, ShortName, TC) {} 155*67e74705SXin Li 156*67e74705SXin Li // A gcc tool has an "integrated" assembler that it will call to produce an 157*67e74705SXin Li // object. Let it use that assembler so that we don't have to deal with 158*67e74705SXin Li // assembly syntax incompatibilities. hasIntegratedAssembler()159*67e74705SXin Li bool hasIntegratedAssembler() const override { return true; } 160*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 161*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 162*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 163*67e74705SXin Li const char *LinkingOutput) const override; 164*67e74705SXin Li 165*67e74705SXin Li /// RenderExtraToolArgs - Render any arguments necessary to force 166*67e74705SXin Li /// the particular tool mode. 167*67e74705SXin Li virtual void RenderExtraToolArgs(const JobAction &JA, 168*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const = 0; 169*67e74705SXin Li }; 170*67e74705SXin Li 171*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common { 172*67e74705SXin Li public: Preprocessor(const ToolChain & TC)173*67e74705SXin Li Preprocessor(const ToolChain &TC) 174*67e74705SXin Li : Common("gcc::Preprocessor", "gcc preprocessor", TC) {} 175*67e74705SXin Li hasGoodDiagnostics()176*67e74705SXin Li bool hasGoodDiagnostics() const override { return true; } hasIntegratedCPP()177*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 178*67e74705SXin Li 179*67e74705SXin Li void RenderExtraToolArgs(const JobAction &JA, 180*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 181*67e74705SXin Li }; 182*67e74705SXin Li 183*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Compiler : public Common { 184*67e74705SXin Li public: Compiler(const ToolChain & TC)185*67e74705SXin Li Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {} 186*67e74705SXin Li hasGoodDiagnostics()187*67e74705SXin Li bool hasGoodDiagnostics() const override { return true; } hasIntegratedCPP()188*67e74705SXin Li bool hasIntegratedCPP() const override { return true; } 189*67e74705SXin Li 190*67e74705SXin Li void RenderExtraToolArgs(const JobAction &JA, 191*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 192*67e74705SXin Li }; 193*67e74705SXin Li 194*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Common { 195*67e74705SXin Li public: Linker(const ToolChain & TC)196*67e74705SXin Li Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {} 197*67e74705SXin Li hasIntegratedCPP()198*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()199*67e74705SXin Li bool isLinkJob() const override { return true; } 200*67e74705SXin Li 201*67e74705SXin Li void RenderExtraToolArgs(const JobAction &JA, 202*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const override; 203*67e74705SXin Li }; 204*67e74705SXin Li } // end namespace gcc 205*67e74705SXin Li 206*67e74705SXin Li namespace hexagon { 207*67e74705SXin Li // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile 208*67e74705SXin Li // and Compile. 209*67e74705SXin Li // We simply use "clang -cc1" for those actions. 210*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 211*67e74705SXin Li public: Assembler(const ToolChain & TC)212*67e74705SXin Li Assembler(const ToolChain &TC) 213*67e74705SXin Li : GnuTool("hexagon::Assembler", "hexagon-as", TC) {} 214*67e74705SXin Li hasIntegratedCPP()215*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 216*67e74705SXin Li 217*67e74705SXin Li void RenderExtraToolArgs(const JobAction &JA, 218*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 219*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 220*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 221*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 222*67e74705SXin Li const char *LinkingOutput) const override; 223*67e74705SXin Li }; 224*67e74705SXin Li 225*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 226*67e74705SXin Li public: Linker(const ToolChain & TC)227*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {} 228*67e74705SXin Li hasIntegratedCPP()229*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()230*67e74705SXin Li bool isLinkJob() const override { return true; } 231*67e74705SXin Li 232*67e74705SXin Li virtual void RenderExtraToolArgs(const JobAction &JA, 233*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 234*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 235*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 236*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 237*67e74705SXin Li const char *LinkingOutput) const override; 238*67e74705SXin Li }; 239*67e74705SXin Li } // end namespace hexagon. 240*67e74705SXin Li 241*67e74705SXin Li namespace amdgpu { 242*67e74705SXin Li 243*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 244*67e74705SXin Li public: Linker(const ToolChain & TC)245*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "ld.lld", TC) {} isLinkJob()246*67e74705SXin Li bool isLinkJob() const override { return true; } hasIntegratedCPP()247*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 248*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 249*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 250*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 251*67e74705SXin Li const char *LinkingOutput) const override; 252*67e74705SXin Li }; 253*67e74705SXin Li 254*67e74705SXin Li } // end namespace amdgpu 255*67e74705SXin Li 256*67e74705SXin Li namespace wasm { 257*67e74705SXin Li 258*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 259*67e74705SXin Li public: 260*67e74705SXin Li explicit Linker(const ToolChain &TC); 261*67e74705SXin Li bool isLinkJob() const override; 262*67e74705SXin Li bool hasIntegratedCPP() const override; 263*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 264*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 265*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 266*67e74705SXin Li const char *LinkingOutput) const override; 267*67e74705SXin Li }; 268*67e74705SXin Li 269*67e74705SXin Li } // end namespace wasm 270*67e74705SXin Li 271*67e74705SXin Li namespace arm { 272*67e74705SXin Li std::string getARMTargetCPU(StringRef CPU, StringRef Arch, 273*67e74705SXin Li const llvm::Triple &Triple); 274*67e74705SXin Li const std::string getARMArch(StringRef Arch, 275*67e74705SXin Li const llvm::Triple &Triple); 276*67e74705SXin Li StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple); 277*67e74705SXin Li StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch, 278*67e74705SXin Li const llvm::Triple &Triple); 279*67e74705SXin Li 280*67e74705SXin Li void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, 281*67e74705SXin Li const llvm::Triple &Triple); 282*67e74705SXin Li } // end namespace arm 283*67e74705SXin Li 284*67e74705SXin Li namespace mips { 285*67e74705SXin Li typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding; 286*67e74705SXin Li 287*67e74705SXin Li enum class FloatABI { 288*67e74705SXin Li Invalid, 289*67e74705SXin Li Soft, 290*67e74705SXin Li Hard, 291*67e74705SXin Li }; 292*67e74705SXin Li 293*67e74705SXin Li NanEncoding getSupportedNanEncoding(StringRef &CPU); 294*67e74705SXin Li bool hasCompactBranches(StringRef &CPU); 295*67e74705SXin Li void getMipsCPUAndABI(const llvm::opt::ArgList &Args, 296*67e74705SXin Li const llvm::Triple &Triple, StringRef &CPUName, 297*67e74705SXin Li StringRef &ABIName); 298*67e74705SXin Li std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args, 299*67e74705SXin Li const llvm::Triple &Triple); 300*67e74705SXin Li bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value); 301*67e74705SXin Li bool isUCLibc(const llvm::opt::ArgList &Args); 302*67e74705SXin Li bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple); 303*67e74705SXin Li bool isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName); 304*67e74705SXin Li bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, 305*67e74705SXin Li StringRef ABIName, mips::FloatABI FloatABI); 306*67e74705SXin Li bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple, 307*67e74705SXin Li StringRef CPUName, StringRef ABIName, 308*67e74705SXin Li mips::FloatABI FloatABI); 309*67e74705SXin Li } // end namespace mips 310*67e74705SXin Li 311*67e74705SXin Li namespace ppc { 312*67e74705SXin Li bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value); 313*67e74705SXin Li } // end namespace ppc 314*67e74705SXin Li 315*67e74705SXin Li /// cloudabi -- Directly call GNU Binutils linker 316*67e74705SXin Li namespace cloudabi { 317*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 318*67e74705SXin Li public: Linker(const ToolChain & TC)319*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {} 320*67e74705SXin Li hasIntegratedCPP()321*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()322*67e74705SXin Li bool isLinkJob() const override { return true; } 323*67e74705SXin Li 324*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 325*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 326*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 327*67e74705SXin Li const char *LinkingOutput) const override; 328*67e74705SXin Li }; 329*67e74705SXin Li } // end namespace cloudabi 330*67e74705SXin Li 331*67e74705SXin Li namespace darwin { 332*67e74705SXin Li llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str); 333*67e74705SXin Li void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str); 334*67e74705SXin Li 335*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool { 336*67e74705SXin Li virtual void anchor(); 337*67e74705SXin Li 338*67e74705SXin Li protected: 339*67e74705SXin Li void AddMachOArch(const llvm::opt::ArgList &Args, 340*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs) const; 341*67e74705SXin Li getMachOToolChain()342*67e74705SXin Li const toolchains::MachO &getMachOToolChain() const { 343*67e74705SXin Li return reinterpret_cast<const toolchains::MachO &>(getToolChain()); 344*67e74705SXin Li } 345*67e74705SXin Li 346*67e74705SXin Li public: 347*67e74705SXin Li MachOTool( 348*67e74705SXin Li const char *Name, const char *ShortName, const ToolChain &TC, 349*67e74705SXin Li ResponseFileSupport ResponseSupport = RF_None, 350*67e74705SXin Li llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8, 351*67e74705SXin Li const char *ResponseFlag = "@") Tool(Name,ShortName,TC,ResponseSupport,ResponseEncoding,ResponseFlag)352*67e74705SXin Li : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding, 353*67e74705SXin Li ResponseFlag) {} 354*67e74705SXin Li }; 355*67e74705SXin Li 356*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool { 357*67e74705SXin Li public: Assembler(const ToolChain & TC)358*67e74705SXin Li Assembler(const ToolChain &TC) 359*67e74705SXin Li : MachOTool("darwin::Assembler", "assembler", TC) {} 360*67e74705SXin Li hasIntegratedCPP()361*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 362*67e74705SXin Li 363*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 364*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 365*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 366*67e74705SXin Li const char *LinkingOutput) const override; 367*67e74705SXin Li }; 368*67e74705SXin Li 369*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool { 370*67e74705SXin Li bool NeedsTempPath(const InputInfoList &Inputs) const; 371*67e74705SXin Li void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args, 372*67e74705SXin Li llvm::opt::ArgStringList &CmdArgs, 373*67e74705SXin Li const InputInfoList &Inputs) const; 374*67e74705SXin Li 375*67e74705SXin Li public: Linker(const ToolChain & TC)376*67e74705SXin Li Linker(const ToolChain &TC) 377*67e74705SXin Li : MachOTool("darwin::Linker", "linker", TC, RF_FileList, 378*67e74705SXin Li llvm::sys::WEM_UTF8, "-filelist") {} 379*67e74705SXin Li hasIntegratedCPP()380*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()381*67e74705SXin Li bool isLinkJob() const override { return true; } 382*67e74705SXin Li 383*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 384*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 385*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 386*67e74705SXin Li const char *LinkingOutput) const override; 387*67e74705SXin Li }; 388*67e74705SXin Li 389*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool { 390*67e74705SXin Li public: Lipo(const ToolChain & TC)391*67e74705SXin Li Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {} 392*67e74705SXin Li hasIntegratedCPP()393*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 394*67e74705SXin Li 395*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 396*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 397*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 398*67e74705SXin Li const char *LinkingOutput) const override; 399*67e74705SXin Li }; 400*67e74705SXin Li 401*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool { 402*67e74705SXin Li public: Dsymutil(const ToolChain & TC)403*67e74705SXin Li Dsymutil(const ToolChain &TC) 404*67e74705SXin Li : MachOTool("darwin::Dsymutil", "dsymutil", TC) {} 405*67e74705SXin Li hasIntegratedCPP()406*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isDsymutilJob()407*67e74705SXin Li bool isDsymutilJob() const override { return true; } 408*67e74705SXin Li 409*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 410*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 411*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 412*67e74705SXin Li const char *LinkingOutput) const override; 413*67e74705SXin Li }; 414*67e74705SXin Li 415*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool { 416*67e74705SXin Li public: VerifyDebug(const ToolChain & TC)417*67e74705SXin Li VerifyDebug(const ToolChain &TC) 418*67e74705SXin Li : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {} 419*67e74705SXin Li hasIntegratedCPP()420*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 421*67e74705SXin Li 422*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 423*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 424*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 425*67e74705SXin Li const char *LinkingOutput) const override; 426*67e74705SXin Li }; 427*67e74705SXin Li } // end namespace darwin 428*67e74705SXin Li 429*67e74705SXin Li /// openbsd -- Directly call GNU Binutils assembler and linker 430*67e74705SXin Li namespace openbsd { 431*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 432*67e74705SXin Li public: Assembler(const ToolChain & TC)433*67e74705SXin Li Assembler(const ToolChain &TC) 434*67e74705SXin Li : GnuTool("openbsd::Assembler", "assembler", TC) {} 435*67e74705SXin Li hasIntegratedCPP()436*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 437*67e74705SXin Li 438*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 439*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 440*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 441*67e74705SXin Li const char *LinkingOutput) const override; 442*67e74705SXin Li }; 443*67e74705SXin Li 444*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 445*67e74705SXin Li public: Linker(const ToolChain & TC)446*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {} 447*67e74705SXin Li hasIntegratedCPP()448*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()449*67e74705SXin Li bool isLinkJob() const override { return true; } 450*67e74705SXin Li 451*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 452*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 453*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 454*67e74705SXin Li const char *LinkingOutput) const override; 455*67e74705SXin Li }; 456*67e74705SXin Li } // end namespace openbsd 457*67e74705SXin Li 458*67e74705SXin Li /// bitrig -- Directly call GNU Binutils assembler and linker 459*67e74705SXin Li namespace bitrig { 460*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 461*67e74705SXin Li public: Assembler(const ToolChain & TC)462*67e74705SXin Li Assembler(const ToolChain &TC) 463*67e74705SXin Li : GnuTool("bitrig::Assembler", "assembler", TC) {} 464*67e74705SXin Li hasIntegratedCPP()465*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 466*67e74705SXin Li 467*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 468*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 469*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 470*67e74705SXin Li const char *LinkingOutput) const override; 471*67e74705SXin Li }; 472*67e74705SXin Li 473*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 474*67e74705SXin Li public: Linker(const ToolChain & TC)475*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {} 476*67e74705SXin Li hasIntegratedCPP()477*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()478*67e74705SXin Li bool isLinkJob() const override { return true; } 479*67e74705SXin Li 480*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 481*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 482*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 483*67e74705SXin Li const char *LinkingOutput) const override; 484*67e74705SXin Li }; 485*67e74705SXin Li } // end namespace bitrig 486*67e74705SXin Li 487*67e74705SXin Li /// freebsd -- Directly call GNU Binutils assembler and linker 488*67e74705SXin Li namespace freebsd { 489*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 490*67e74705SXin Li public: Assembler(const ToolChain & TC)491*67e74705SXin Li Assembler(const ToolChain &TC) 492*67e74705SXin Li : GnuTool("freebsd::Assembler", "assembler", TC) {} 493*67e74705SXin Li hasIntegratedCPP()494*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 495*67e74705SXin Li 496*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 497*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 498*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 499*67e74705SXin Li const char *LinkingOutput) const override; 500*67e74705SXin Li }; 501*67e74705SXin Li 502*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 503*67e74705SXin Li public: Linker(const ToolChain & TC)504*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {} 505*67e74705SXin Li hasIntegratedCPP()506*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()507*67e74705SXin Li bool isLinkJob() const override { return true; } 508*67e74705SXin Li 509*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 510*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 511*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 512*67e74705SXin Li const char *LinkingOutput) const override; 513*67e74705SXin Li }; 514*67e74705SXin Li } // end namespace freebsd 515*67e74705SXin Li 516*67e74705SXin Li /// netbsd -- Directly call GNU Binutils assembler and linker 517*67e74705SXin Li namespace netbsd { 518*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 519*67e74705SXin Li public: Assembler(const ToolChain & TC)520*67e74705SXin Li Assembler(const ToolChain &TC) 521*67e74705SXin Li : GnuTool("netbsd::Assembler", "assembler", TC) {} 522*67e74705SXin Li hasIntegratedCPP()523*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 524*67e74705SXin Li 525*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 526*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 527*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 528*67e74705SXin Li const char *LinkingOutput) const override; 529*67e74705SXin Li }; 530*67e74705SXin Li 531*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 532*67e74705SXin Li public: Linker(const ToolChain & TC)533*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {} 534*67e74705SXin Li hasIntegratedCPP()535*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()536*67e74705SXin Li bool isLinkJob() const override { return true; } 537*67e74705SXin Li 538*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 539*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 540*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 541*67e74705SXin Li const char *LinkingOutput) const override; 542*67e74705SXin Li }; 543*67e74705SXin Li } // end namespace netbsd 544*67e74705SXin Li 545*67e74705SXin Li /// Directly call GNU Binutils' assembler and linker. 546*67e74705SXin Li namespace gnutools { 547*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 548*67e74705SXin Li public: Assembler(const ToolChain & TC)549*67e74705SXin Li Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {} 550*67e74705SXin Li hasIntegratedCPP()551*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 552*67e74705SXin Li 553*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 554*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 555*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 556*67e74705SXin Li const char *LinkingOutput) const override; 557*67e74705SXin Li }; 558*67e74705SXin Li 559*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 560*67e74705SXin Li public: Linker(const ToolChain & TC)561*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {} 562*67e74705SXin Li hasIntegratedCPP()563*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()564*67e74705SXin Li bool isLinkJob() const override { return true; } 565*67e74705SXin Li 566*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 567*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 568*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 569*67e74705SXin Li const char *LinkingOutput) const override; 570*67e74705SXin Li }; 571*67e74705SXin Li } // end namespace gnutools 572*67e74705SXin Li 573*67e74705SXin Li namespace nacltools { 574*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler { 575*67e74705SXin Li public: AssemblerARM(const ToolChain & TC)576*67e74705SXin Li AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {} 577*67e74705SXin Li 578*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 579*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 580*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 581*67e74705SXin Li const char *LinkingOutput) const override; 582*67e74705SXin Li }; 583*67e74705SXin Li 584*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 585*67e74705SXin Li public: Linker(const ToolChain & TC)586*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {} 587*67e74705SXin Li hasIntegratedCPP()588*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()589*67e74705SXin Li bool isLinkJob() const override { return true; } 590*67e74705SXin Li 591*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 592*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 593*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 594*67e74705SXin Li const char *LinkingOutput) const override; 595*67e74705SXin Li }; 596*67e74705SXin Li } // end namespace nacltools 597*67e74705SXin Li 598*67e74705SXin Li /// minix -- Directly call GNU Binutils assembler and linker 599*67e74705SXin Li namespace minix { 600*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 601*67e74705SXin Li public: Assembler(const ToolChain & TC)602*67e74705SXin Li Assembler(const ToolChain &TC) 603*67e74705SXin Li : GnuTool("minix::Assembler", "assembler", TC) {} 604*67e74705SXin Li hasIntegratedCPP()605*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 606*67e74705SXin Li 607*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 608*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 609*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 610*67e74705SXin Li const char *LinkingOutput) const override; 611*67e74705SXin Li }; 612*67e74705SXin Li 613*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 614*67e74705SXin Li public: Linker(const ToolChain & TC)615*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {} 616*67e74705SXin Li hasIntegratedCPP()617*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()618*67e74705SXin Li bool isLinkJob() const override { return true; } 619*67e74705SXin Li 620*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 621*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 622*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 623*67e74705SXin Li const char *LinkingOutput) const override; 624*67e74705SXin Li }; 625*67e74705SXin Li } // end namespace minix 626*67e74705SXin Li 627*67e74705SXin Li /// solaris -- Directly call Solaris assembler and linker 628*67e74705SXin Li namespace solaris { 629*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 630*67e74705SXin Li public: Assembler(const ToolChain & TC)631*67e74705SXin Li Assembler(const ToolChain &TC) 632*67e74705SXin Li : Tool("solaris::Assembler", "assembler", TC) {} 633*67e74705SXin Li hasIntegratedCPP()634*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 635*67e74705SXin Li 636*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 637*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 638*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 639*67e74705SXin Li const char *LinkingOutput) const override; 640*67e74705SXin Li }; 641*67e74705SXin Li 642*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 643*67e74705SXin Li public: Linker(const ToolChain & TC)644*67e74705SXin Li Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {} 645*67e74705SXin Li hasIntegratedCPP()646*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()647*67e74705SXin Li bool isLinkJob() const override { return true; } 648*67e74705SXin Li 649*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 650*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 651*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 652*67e74705SXin Li const char *LinkingOutput) const override; 653*67e74705SXin Li }; 654*67e74705SXin Li } // end namespace solaris 655*67e74705SXin Li 656*67e74705SXin Li /// dragonfly -- Directly call GNU Binutils assembler and linker 657*67e74705SXin Li namespace dragonfly { 658*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool { 659*67e74705SXin Li public: Assembler(const ToolChain & TC)660*67e74705SXin Li Assembler(const ToolChain &TC) 661*67e74705SXin Li : GnuTool("dragonfly::Assembler", "assembler", TC) {} 662*67e74705SXin Li hasIntegratedCPP()663*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 664*67e74705SXin Li 665*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 666*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 667*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 668*67e74705SXin Li const char *LinkingOutput) const override; 669*67e74705SXin Li }; 670*67e74705SXin Li 671*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 672*67e74705SXin Li public: Linker(const ToolChain & TC)673*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {} 674*67e74705SXin Li hasIntegratedCPP()675*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()676*67e74705SXin Li bool isLinkJob() const override { return true; } 677*67e74705SXin Li 678*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 679*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 680*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 681*67e74705SXin Li const char *LinkingOutput) const override; 682*67e74705SXin Li }; 683*67e74705SXin Li } // end namespace dragonfly 684*67e74705SXin Li 685*67e74705SXin Li /// Visual studio tools. 686*67e74705SXin Li namespace visualstudio { 687*67e74705SXin Li VersionTuple getMSVCVersion(const Driver *D, const ToolChain &TC, 688*67e74705SXin Li const llvm::Triple &Triple, 689*67e74705SXin Li const llvm::opt::ArgList &Args, bool IsWindowsMSVC); 690*67e74705SXin Li 691*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 692*67e74705SXin Li public: Linker(const ToolChain & TC)693*67e74705SXin Li Linker(const ToolChain &TC) 694*67e74705SXin Li : Tool("visualstudio::Linker", "linker", TC, RF_Full, 695*67e74705SXin Li llvm::sys::WEM_UTF16) {} 696*67e74705SXin Li hasIntegratedCPP()697*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()698*67e74705SXin Li bool isLinkJob() const override { return true; } 699*67e74705SXin Li 700*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 701*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 702*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 703*67e74705SXin Li const char *LinkingOutput) const override; 704*67e74705SXin Li }; 705*67e74705SXin Li 706*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Compiler : public Tool { 707*67e74705SXin Li public: Compiler(const ToolChain & TC)708*67e74705SXin Li Compiler(const ToolChain &TC) 709*67e74705SXin Li : Tool("visualstudio::Compiler", "compiler", TC, RF_Full, 710*67e74705SXin Li llvm::sys::WEM_UTF16) {} 711*67e74705SXin Li hasIntegratedAssembler()712*67e74705SXin Li bool hasIntegratedAssembler() const override { return true; } hasIntegratedCPP()713*67e74705SXin Li bool hasIntegratedCPP() const override { return true; } isLinkJob()714*67e74705SXin Li bool isLinkJob() const override { return false; } 715*67e74705SXin Li 716*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 717*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 718*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 719*67e74705SXin Li const char *LinkingOutput) const override; 720*67e74705SXin Li 721*67e74705SXin Li std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA, 722*67e74705SXin Li const InputInfo &Output, 723*67e74705SXin Li const InputInfoList &Inputs, 724*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 725*67e74705SXin Li const char *LinkingOutput) const; 726*67e74705SXin Li }; 727*67e74705SXin Li } // end namespace visualstudio 728*67e74705SXin Li 729*67e74705SXin Li /// MinGW -- Directly call GNU Binutils assembler and linker 730*67e74705SXin Li namespace MinGW { 731*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 732*67e74705SXin Li public: Assembler(const ToolChain & TC)733*67e74705SXin Li Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {} 734*67e74705SXin Li hasIntegratedCPP()735*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 736*67e74705SXin Li 737*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 738*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 739*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 740*67e74705SXin Li const char *LinkingOutput) const override; 741*67e74705SXin Li }; 742*67e74705SXin Li 743*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 744*67e74705SXin Li public: Linker(const ToolChain & TC)745*67e74705SXin Li Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {} 746*67e74705SXin Li hasIntegratedCPP()747*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()748*67e74705SXin Li bool isLinkJob() const override { return true; } 749*67e74705SXin Li 750*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 751*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 752*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 753*67e74705SXin Li const char *LinkingOutput) const override; 754*67e74705SXin Li 755*67e74705SXin Li private: 756*67e74705SXin Li void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const; 757*67e74705SXin Li }; 758*67e74705SXin Li } // end namespace MinGW 759*67e74705SXin Li 760*67e74705SXin Li namespace arm { 761*67e74705SXin Li enum class FloatABI { 762*67e74705SXin Li Invalid, 763*67e74705SXin Li Soft, 764*67e74705SXin Li SoftFP, 765*67e74705SXin Li Hard, 766*67e74705SXin Li }; 767*67e74705SXin Li 768*67e74705SXin Li FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args); 769*67e74705SXin Li } // end namespace arm 770*67e74705SXin Li 771*67e74705SXin Li namespace ppc { 772*67e74705SXin Li enum class FloatABI { 773*67e74705SXin Li Invalid, 774*67e74705SXin Li Soft, 775*67e74705SXin Li Hard, 776*67e74705SXin Li }; 777*67e74705SXin Li 778*67e74705SXin Li FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args); 779*67e74705SXin Li } // end namespace ppc 780*67e74705SXin Li 781*67e74705SXin Li namespace sparc { 782*67e74705SXin Li enum class FloatABI { 783*67e74705SXin Li Invalid, 784*67e74705SXin Li Soft, 785*67e74705SXin Li Hard, 786*67e74705SXin Li }; 787*67e74705SXin Li 788*67e74705SXin Li FloatABI getSparcFloatABI(const Driver &D, const llvm::opt::ArgList &Args); 789*67e74705SXin Li } // end namespace sparc 790*67e74705SXin Li 791*67e74705SXin Li namespace XCore { 792*67e74705SXin Li // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and 793*67e74705SXin Li // Compile. 794*67e74705SXin Li // We simply use "clang -cc1" for those actions. 795*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 796*67e74705SXin Li public: Assembler(const ToolChain & TC)797*67e74705SXin Li Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {} 798*67e74705SXin Li hasIntegratedCPP()799*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 800*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 801*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 802*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 803*67e74705SXin Li const char *LinkingOutput) const override; 804*67e74705SXin Li }; 805*67e74705SXin Li 806*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 807*67e74705SXin Li public: Linker(const ToolChain & TC)808*67e74705SXin Li Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {} 809*67e74705SXin Li hasIntegratedCPP()810*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()811*67e74705SXin Li bool isLinkJob() const override { return true; } 812*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 813*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 814*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 815*67e74705SXin Li const char *LinkingOutput) const override; 816*67e74705SXin Li }; 817*67e74705SXin Li } // end namespace XCore. 818*67e74705SXin Li 819*67e74705SXin Li namespace CrossWindows { 820*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 821*67e74705SXin Li public: Assembler(const ToolChain & TC)822*67e74705SXin Li Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {} 823*67e74705SXin Li hasIntegratedCPP()824*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 825*67e74705SXin Li 826*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 827*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 828*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 829*67e74705SXin Li const char *LinkingOutput) const override; 830*67e74705SXin Li }; 831*67e74705SXin Li 832*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 833*67e74705SXin Li public: Linker(const ToolChain & TC)834*67e74705SXin Li Linker(const ToolChain &TC) 835*67e74705SXin Li : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {} 836*67e74705SXin Li hasIntegratedCPP()837*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()838*67e74705SXin Li bool isLinkJob() const override { return true; } 839*67e74705SXin Li 840*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 841*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 842*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 843*67e74705SXin Li const char *LinkingOutput) const override; 844*67e74705SXin Li }; 845*67e74705SXin Li } // end namespace CrossWindows 846*67e74705SXin Li 847*67e74705SXin Li /// SHAVE tools -- Directly call moviCompile and moviAsm 848*67e74705SXin Li namespace SHAVE { 849*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Compiler : public Tool { 850*67e74705SXin Li public: Compiler(const ToolChain & TC)851*67e74705SXin Li Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {} 852*67e74705SXin Li hasIntegratedCPP()853*67e74705SXin Li bool hasIntegratedCPP() const override { return true; } 854*67e74705SXin Li 855*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 856*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 857*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 858*67e74705SXin Li const char *LinkingOutput) const override; 859*67e74705SXin Li }; 860*67e74705SXin Li 861*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 862*67e74705SXin Li public: Assembler(const ToolChain & TC)863*67e74705SXin Li Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {} 864*67e74705SXin Li hasIntegratedCPP()865*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } // not sure. 866*67e74705SXin Li 867*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 868*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 869*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 870*67e74705SXin Li const char *LinkingOutput) const override; 871*67e74705SXin Li }; 872*67e74705SXin Li } // end namespace SHAVE 873*67e74705SXin Li 874*67e74705SXin Li /// The Myriad toolchain uses tools that are in two different namespaces. 875*67e74705SXin Li /// The Compiler and Assembler as defined above are in the SHAVE namespace, 876*67e74705SXin Li /// whereas the linker, which accepts code for a mixture of Sparc and SHAVE, 877*67e74705SXin Li /// is in the Myriad namespace. 878*67e74705SXin Li namespace Myriad { 879*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { 880*67e74705SXin Li public: Linker(const ToolChain & TC)881*67e74705SXin Li Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {} hasIntegratedCPP()882*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()883*67e74705SXin Li bool isLinkJob() const override { return true; } 884*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 885*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 886*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 887*67e74705SXin Li const char *LinkingOutput) const override; 888*67e74705SXin Li }; 889*67e74705SXin Li } // end namespace Myriad 890*67e74705SXin Li 891*67e74705SXin Li namespace PS4cpu { 892*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 893*67e74705SXin Li public: Assemble(const ToolChain & TC)894*67e74705SXin Li Assemble(const ToolChain &TC) 895*67e74705SXin Li : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {} 896*67e74705SXin Li hasIntegratedCPP()897*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 898*67e74705SXin Li 899*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 900*67e74705SXin Li const InputInfo &Output, 901*67e74705SXin Li const InputInfoList &Inputs, 902*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 903*67e74705SXin Li const char *LinkingOutput) const override; 904*67e74705SXin Li }; 905*67e74705SXin Li 906*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Link : public Tool { 907*67e74705SXin Li public: Link(const ToolChain & TC)908*67e74705SXin Li Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {} 909*67e74705SXin Li hasIntegratedCPP()910*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } isLinkJob()911*67e74705SXin Li bool isLinkJob() const override { return true; } 912*67e74705SXin Li 913*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 914*67e74705SXin Li const InputInfo &Output, 915*67e74705SXin Li const InputInfoList &Inputs, 916*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 917*67e74705SXin Li const char *LinkingOutput) const override; 918*67e74705SXin Li }; 919*67e74705SXin Li } // end namespace PS4cpu 920*67e74705SXin Li 921*67e74705SXin Li namespace NVPTX { 922*67e74705SXin Li 923*67e74705SXin Li // Run ptxas, the NVPTX assembler. 924*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 925*67e74705SXin Li public: Assembler(const ToolChain & TC)926*67e74705SXin Li Assembler(const ToolChain &TC) 927*67e74705SXin Li : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8, 928*67e74705SXin Li "--options-file") {} 929*67e74705SXin Li hasIntegratedCPP()930*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 931*67e74705SXin Li 932*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 933*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 934*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 935*67e74705SXin Li const char *LinkingOutput) const override; 936*67e74705SXin Li }; 937*67e74705SXin Li 938*67e74705SXin Li // Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX 939*67e74705SXin Li // assembly into a single output file. 940*67e74705SXin Li class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 941*67e74705SXin Li public: Linker(const ToolChain & TC)942*67e74705SXin Li Linker(const ToolChain &TC) 943*67e74705SXin Li : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8, 944*67e74705SXin Li "--options-file") {} 945*67e74705SXin Li hasIntegratedCPP()946*67e74705SXin Li bool hasIntegratedCPP() const override { return false; } 947*67e74705SXin Li 948*67e74705SXin Li void ConstructJob(Compilation &C, const JobAction &JA, 949*67e74705SXin Li const InputInfo &Output, const InputInfoList &Inputs, 950*67e74705SXin Li const llvm::opt::ArgList &TCArgs, 951*67e74705SXin Li const char *LinkingOutput) const override; 952*67e74705SXin Li }; 953*67e74705SXin Li 954*67e74705SXin Li } // end namespace NVPTX 955*67e74705SXin Li 956*67e74705SXin Li } // end namespace tools 957*67e74705SXin Li } // end namespace driver 958*67e74705SXin Li } // end namespace clang 959*67e74705SXin Li 960*67e74705SXin Li #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H 961