10b57cec5SDimitry Andric //===--- PS4CPU.h - PS4CPU ToolChain Implementations ------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H 100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "Gnu.h" 13e8d8bef9SDimitry Andric #include "clang/Basic/LangOptions.h" 140b57cec5SDimitry Andric #include "clang/Driver/Tool.h" 150b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric namespace clang { 180b57cec5SDimitry Andric namespace driver { 190b57cec5SDimitry Andric namespace tools { 200b57cec5SDimitry Andric 2181ad6265SDimitry Andric namespace PScpu { 2281ad6265SDimitry Andric // Functions/classes in this namespace support both PS4 and PS5. 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric void addProfileRTArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, 250b57cec5SDimitry Andric llvm::opt::ArgStringList &CmdArgs); 260b57cec5SDimitry Andric 27349cc55cSDimitry Andric void addSanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, 28349cc55cSDimitry Andric llvm::opt::ArgStringList &CmdArgs); 290b57cec5SDimitry Andric 305f757f3fSDimitry Andric class LLVM_LIBRARY_VISIBILITY Assembler final : public Tool { 310b57cec5SDimitry Andric public: Assembler(const ToolChain & TC)3281ad6265SDimitry Andric Assembler(const ToolChain &TC) : Tool("PScpu::Assembler", "assembler", TC) {} 330b57cec5SDimitry Andric hasIntegratedCPP()340b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 3781ad6265SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 380b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 390b57cec5SDimitry Andric const char *LinkingOutput) const override; 400b57cec5SDimitry Andric }; 41*0fca6ea1SDimitry Andric } // namespace PScpu 420b57cec5SDimitry Andric 43*0fca6ea1SDimitry Andric namespace PS4cpu { 445f757f3fSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { 450b57cec5SDimitry Andric public: Linker(const ToolChain & TC)46*0fca6ea1SDimitry Andric Linker(const ToolChain &TC) : Tool("PS4cpu::Linker", "linker", TC) {} 470b57cec5SDimitry Andric hasIntegratedCPP()480b57cec5SDimitry Andric bool hasIntegratedCPP() const override { return false; } isLinkJob()490b57cec5SDimitry Andric bool isLinkJob() const override { return true; } 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 5281ad6265SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 530b57cec5SDimitry Andric const llvm::opt::ArgList &TCArgs, 540b57cec5SDimitry Andric const char *LinkingOutput) const override; 550b57cec5SDimitry Andric }; 56*0fca6ea1SDimitry Andric } // namespace PS4cpu 57*0fca6ea1SDimitry Andric 58*0fca6ea1SDimitry Andric namespace PS5cpu { 59*0fca6ea1SDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { 60*0fca6ea1SDimitry Andric public: Linker(const ToolChain & TC)61*0fca6ea1SDimitry Andric Linker(const ToolChain &TC) : Tool("PS5cpu::Linker", "linker", TC) {} 62*0fca6ea1SDimitry Andric hasIntegratedCPP()63*0fca6ea1SDimitry Andric bool hasIntegratedCPP() const override { return false; } isLinkJob()64*0fca6ea1SDimitry Andric bool isLinkJob() const override { return true; } 65*0fca6ea1SDimitry Andric 66*0fca6ea1SDimitry Andric void ConstructJob(Compilation &C, const JobAction &JA, 67*0fca6ea1SDimitry Andric const InputInfo &Output, const InputInfoList &Inputs, 68*0fca6ea1SDimitry Andric const llvm::opt::ArgList &TCArgs, 69*0fca6ea1SDimitry Andric const char *LinkingOutput) const override; 70*0fca6ea1SDimitry Andric }; 71*0fca6ea1SDimitry Andric } // namespace PS5cpu 72*0fca6ea1SDimitry Andric 730b57cec5SDimitry Andric } // namespace tools 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric namespace toolchains { 760b57cec5SDimitry Andric 7781ad6265SDimitry Andric // Common Toolchain base class for PS4 and PS5. 7881ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF { 790b57cec5SDimitry Andric public: 8081ad6265SDimitry Andric PS4PS5Base(const Driver &D, const llvm::Triple &Triple, 8181ad6265SDimitry Andric const llvm::opt::ArgList &Args, StringRef Platform, 8281ad6265SDimitry Andric const char *EnvVar); 830b57cec5SDimitry Andric 8406c3fb27SDimitry Andric void 8506c3fb27SDimitry Andric AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 8606c3fb27SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override; 870b57cec5SDimitry Andric // No support for finding a C++ standard library yet. addLibCxxIncludePaths(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args)8881ad6265SDimitry Andric void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 8981ad6265SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override { 9081ad6265SDimitry Andric } 9181ad6265SDimitry Andric void addLibStdCxxIncludePaths(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args)9281ad6265SDimitry Andric addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 930b57cec5SDimitry Andric llvm::opt::ArgStringList &CC1Args) const override {} 940b57cec5SDimitry Andric IsMathErrnoDefault()950b57cec5SDimitry Andric bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()960b57cec5SDimitry Andric bool IsObjCNonFragileABIDefault() const override { return true; } HasNativeLLVMSupport()9781ad6265SDimitry Andric bool HasNativeLLVMSupport() const override { return true; } isPICDefault()9881ad6265SDimitry Andric bool isPICDefault() const override { return true; } 990b57cec5SDimitry Andric 100e8d8bef9SDimitry Andric LangOptions::StackProtectorMode GetDefaultStackProtectorLevel(bool KernelOrKext)101e8d8bef9SDimitry Andric GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 102e8d8bef9SDimitry Andric return LangOptions::SSPStrong; 1030b57cec5SDimitry Andric } 1040b57cec5SDimitry Andric getDefaultDebuggerTuning()1050b57cec5SDimitry Andric llvm::DebuggerKind getDefaultDebuggerTuning() const override { 1060b57cec5SDimitry Andric return llvm::DebuggerKind::SCE; 1070b57cec5SDimitry Andric } 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric SanitizerMask getSupportedSanitizers() const override; 1100b57cec5SDimitry Andric 1115ffd83dbSDimitry Andric void addClangTargetOptions( 11281ad6265SDimitry Andric const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, 1135ffd83dbSDimitry Andric Action::OffloadKind DeviceOffloadingKind) const override; 1145ffd83dbSDimitry Andric getDefaultDenormalModeForType(const llvm::opt::ArgList & DriverArgs,const JobAction & JA,const llvm::fltSemantics * FPType)1155ffd83dbSDimitry Andric llvm::DenormalMode getDefaultDenormalModeForType( 1165ffd83dbSDimitry Andric const llvm::opt::ArgList &DriverArgs, const JobAction &JA, 1175ffd83dbSDimitry Andric const llvm::fltSemantics *FPType) const override { 1185ffd83dbSDimitry Andric // DAZ and FTZ are on by default. 1195ffd83dbSDimitry Andric return llvm::DenormalMode::getPreserveSign(); 1205ffd83dbSDimitry Andric } 1215ffd83dbSDimitry Andric 12281ad6265SDimitry Andric // Helper methods for PS4/PS5. 12381ad6265SDimitry Andric virtual const char *getLinkerBaseName() const = 0; 12481ad6265SDimitry Andric virtual std::string qualifyPSCmdName(StringRef CmdName) const = 0; 12581ad6265SDimitry Andric virtual void addSanitizerArgs(const llvm::opt::ArgList &Args, 12681ad6265SDimitry Andric llvm::opt::ArgStringList &CmdArgs, 12781ad6265SDimitry Andric const char *Prefix, 12881ad6265SDimitry Andric const char *Suffix) const = 0; 12981ad6265SDimitry Andric virtual const char *getProfileRTLibName() const = 0; 13081ad6265SDimitry Andric 13106c3fb27SDimitry Andric private: 13206c3fb27SDimitry Andric // We compute the SDK root dir in the ctor, and use it later. 13306c3fb27SDimitry Andric std::string SDKRootDir; 13481ad6265SDimitry Andric }; 13581ad6265SDimitry Andric 13681ad6265SDimitry Andric // PS4-specific Toolchain class. 13781ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY PS4CPU : public PS4PS5Base { 13881ad6265SDimitry Andric public: 13981ad6265SDimitry Andric PS4CPU(const Driver &D, const llvm::Triple &Triple, 14081ad6265SDimitry Andric const llvm::opt::ArgList &Args); 14181ad6265SDimitry Andric GetDefaultDwarfVersion()14281ad6265SDimitry Andric unsigned GetDefaultDwarfVersion() const override { return 4; } 14381ad6265SDimitry Andric 14481ad6265SDimitry Andric // PS4 toolchain uses legacy thin LTO API, which is not 14581ad6265SDimitry Andric // capable of unit splitting. canSplitThinLTOUnit()14681ad6265SDimitry Andric bool canSplitThinLTOUnit() const override { return false; } 14781ad6265SDimitry Andric getLinkerBaseName()14881ad6265SDimitry Andric const char *getLinkerBaseName() const override { return "ld"; } qualifyPSCmdName(StringRef CmdName)14981ad6265SDimitry Andric std::string qualifyPSCmdName(StringRef CmdName) const override { 15081ad6265SDimitry Andric return Twine("orbis-", CmdName).str(); 15181ad6265SDimitry Andric } 15281ad6265SDimitry Andric void addSanitizerArgs(const llvm::opt::ArgList &Args, 15381ad6265SDimitry Andric llvm::opt::ArgStringList &CmdArgs, const char *Prefix, 15481ad6265SDimitry Andric const char *Suffix) const override; getProfileRTLibName()15581ad6265SDimitry Andric const char *getProfileRTLibName() const override { 15681ad6265SDimitry Andric return "libclang_rt.profile-x86_64.a"; 15781ad6265SDimitry Andric } 15881ad6265SDimitry Andric 1590b57cec5SDimitry Andric protected: 1600b57cec5SDimitry Andric Tool *buildAssembler() const override; 161*0fca6ea1SDimitry Andric Tool *buildLinker() const override; 16281ad6265SDimitry Andric }; 16381ad6265SDimitry Andric 16481ad6265SDimitry Andric // PS5-specific Toolchain class. 16581ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY PS5CPU : public PS4PS5Base { 16681ad6265SDimitry Andric public: 16781ad6265SDimitry Andric PS5CPU(const Driver &D, const llvm::Triple &Triple, 16881ad6265SDimitry Andric const llvm::opt::ArgList &Args); 16981ad6265SDimitry Andric GetDefaultDwarfVersion()17081ad6265SDimitry Andric unsigned GetDefaultDwarfVersion() const override { return 5; } 17181ad6265SDimitry Andric 17281ad6265SDimitry Andric SanitizerMask getSupportedSanitizers() const override; 17381ad6265SDimitry Andric getLinkerBaseName()17481ad6265SDimitry Andric const char *getLinkerBaseName() const override { return "lld"; } qualifyPSCmdName(StringRef CmdName)17581ad6265SDimitry Andric std::string qualifyPSCmdName(StringRef CmdName) const override { 17681ad6265SDimitry Andric return Twine("prospero-", CmdName).str(); 17781ad6265SDimitry Andric } 17881ad6265SDimitry Andric void addSanitizerArgs(const llvm::opt::ArgList &Args, 17981ad6265SDimitry Andric llvm::opt::ArgStringList &CmdArgs, const char *Prefix, 18081ad6265SDimitry Andric const char *Suffix) const override; getProfileRTLibName()18181ad6265SDimitry Andric const char *getProfileRTLibName() const override { 18281ad6265SDimitry Andric return "libclang_rt.profile-x86_64_nosubmission.a"; 18381ad6265SDimitry Andric } 18481ad6265SDimitry Andric 18581ad6265SDimitry Andric protected: 18681ad6265SDimitry Andric Tool *buildAssembler() const override; 187*0fca6ea1SDimitry Andric Tool *buildLinker() const override; 1880b57cec5SDimitry Andric }; 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric } // end namespace toolchains 1910b57cec5SDimitry Andric } // end namespace driver 1920b57cec5SDimitry Andric } // end namespace clang 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H 195