1e5dd7070Spatrick //===--- PS4CPU.h - PS4CPU ToolChain Implementations ------------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick 9e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H 10e5dd7070Spatrick #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H 11e5dd7070Spatrick 12e5dd7070Spatrick #include "Gnu.h" 13a9ac8606Spatrick #include "clang/Basic/LangOptions.h" 14e5dd7070Spatrick #include "clang/Driver/Tool.h" 15e5dd7070Spatrick #include "clang/Driver/ToolChain.h" 16e5dd7070Spatrick 17e5dd7070Spatrick namespace clang { 18e5dd7070Spatrick namespace driver { 19e5dd7070Spatrick namespace tools { 20e5dd7070Spatrick 21*12c85518Srobert namespace PScpu { 22*12c85518Srobert // Functions/classes in this namespace support both PS4 and PS5. 23e5dd7070Spatrick 24e5dd7070Spatrick void addProfileRTArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, 25e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs); 26e5dd7070Spatrick 27*12c85518Srobert void addSanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, 28*12c85518Srobert llvm::opt::ArgStringList &CmdArgs); 29e5dd7070Spatrick 30*12c85518Srobert class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 31e5dd7070Spatrick public: Assembler(const ToolChain & TC)32*12c85518Srobert Assembler(const ToolChain &TC) : Tool("PScpu::Assembler", "assembler", TC) {} 33e5dd7070Spatrick hasIntegratedCPP()34e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } 35e5dd7070Spatrick 36e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 37*12c85518Srobert const InputInfo &Output, const InputInfoList &Inputs, 38e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 39e5dd7070Spatrick const char *LinkingOutput) const override; 40e5dd7070Spatrick }; 41e5dd7070Spatrick 42*12c85518Srobert class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 43e5dd7070Spatrick public: Linker(const ToolChain & TC)44*12c85518Srobert Linker(const ToolChain &TC) : Tool("PScpu::Linker", "linker", TC) {} 45e5dd7070Spatrick hasIntegratedCPP()46e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } isLinkJob()47e5dd7070Spatrick bool isLinkJob() const override { return true; } 48e5dd7070Spatrick 49e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 50*12c85518Srobert const InputInfo &Output, const InputInfoList &Inputs, 51e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 52e5dd7070Spatrick const char *LinkingOutput) const override; 53e5dd7070Spatrick }; 54*12c85518Srobert } // namespace PScpu 55e5dd7070Spatrick } // namespace tools 56e5dd7070Spatrick 57e5dd7070Spatrick namespace toolchains { 58e5dd7070Spatrick 59*12c85518Srobert // Common Toolchain base class for PS4 and PS5. 60*12c85518Srobert class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF { 61e5dd7070Spatrick public: 62*12c85518Srobert PS4PS5Base(const Driver &D, const llvm::Triple &Triple, 63*12c85518Srobert const llvm::opt::ArgList &Args, StringRef Platform, 64*12c85518Srobert const char *EnvVar); 65e5dd7070Spatrick 66e5dd7070Spatrick // No support for finding a C++ standard library yet. addLibCxxIncludePaths(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args)67*12c85518Srobert void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 68*12c85518Srobert llvm::opt::ArgStringList &CC1Args) const override { 69*12c85518Srobert } 70*12c85518Srobert void addLibStdCxxIncludePaths(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args)71*12c85518Srobert addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 72e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override {} 73e5dd7070Spatrick IsMathErrnoDefault()74e5dd7070Spatrick bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()75e5dd7070Spatrick bool IsObjCNonFragileABIDefault() const override { return true; } HasNativeLLVMSupport()76*12c85518Srobert bool HasNativeLLVMSupport() const override { return true; } isPICDefault()77*12c85518Srobert bool isPICDefault() const override { return true; } 78e5dd7070Spatrick 79a9ac8606Spatrick LangOptions::StackProtectorMode GetDefaultStackProtectorLevel(bool KernelOrKext)80a9ac8606Spatrick GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 81a9ac8606Spatrick return LangOptions::SSPStrong; 82e5dd7070Spatrick } 83e5dd7070Spatrick getDefaultDebuggerTuning()84e5dd7070Spatrick llvm::DebuggerKind getDefaultDebuggerTuning() const override { 85e5dd7070Spatrick return llvm::DebuggerKind::SCE; 86e5dd7070Spatrick } 87e5dd7070Spatrick 88e5dd7070Spatrick SanitizerMask getSupportedSanitizers() const override; 89e5dd7070Spatrick 90ec727ea7Spatrick void addClangTargetOptions( 91*12c85518Srobert const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, 92ec727ea7Spatrick Action::OffloadKind DeviceOffloadingKind) const override; 93ec727ea7Spatrick getDefaultDenormalModeForType(const llvm::opt::ArgList & DriverArgs,const JobAction & JA,const llvm::fltSemantics * FPType)94ec727ea7Spatrick llvm::DenormalMode getDefaultDenormalModeForType( 95ec727ea7Spatrick const llvm::opt::ArgList &DriverArgs, const JobAction &JA, 96ec727ea7Spatrick const llvm::fltSemantics *FPType) const override { 97ec727ea7Spatrick // DAZ and FTZ are on by default. 98ec727ea7Spatrick return llvm::DenormalMode::getPreserveSign(); 99ec727ea7Spatrick } 100ec727ea7Spatrick useRelaxRelocations()101ec727ea7Spatrick bool useRelaxRelocations() const override { return true; } 102ec727ea7Spatrick 103*12c85518Srobert // Helper methods for PS4/PS5. 104*12c85518Srobert virtual const char *getLinkerBaseName() const = 0; 105*12c85518Srobert virtual std::string qualifyPSCmdName(StringRef CmdName) const = 0; 106*12c85518Srobert virtual void addSanitizerArgs(const llvm::opt::ArgList &Args, 107*12c85518Srobert llvm::opt::ArgStringList &CmdArgs, 108*12c85518Srobert const char *Prefix, 109*12c85518Srobert const char *Suffix) const = 0; 110*12c85518Srobert virtual const char *getProfileRTLibName() const = 0; 111*12c85518Srobert 112*12c85518Srobert protected: 113*12c85518Srobert Tool *buildLinker() const override; 114*12c85518Srobert }; 115*12c85518Srobert 116*12c85518Srobert // PS4-specific Toolchain class. 117*12c85518Srobert class LLVM_LIBRARY_VISIBILITY PS4CPU : public PS4PS5Base { 118*12c85518Srobert public: 119*12c85518Srobert PS4CPU(const Driver &D, const llvm::Triple &Triple, 120*12c85518Srobert const llvm::opt::ArgList &Args); 121*12c85518Srobert GetDefaultDwarfVersion()122*12c85518Srobert unsigned GetDefaultDwarfVersion() const override { return 4; } 123*12c85518Srobert 124*12c85518Srobert // PS4 toolchain uses legacy thin LTO API, which is not 125*12c85518Srobert // capable of unit splitting. canSplitThinLTOUnit()126*12c85518Srobert bool canSplitThinLTOUnit() const override { return false; } 127*12c85518Srobert getLinkerBaseName()128*12c85518Srobert const char *getLinkerBaseName() const override { return "ld"; } qualifyPSCmdName(StringRef CmdName)129*12c85518Srobert std::string qualifyPSCmdName(StringRef CmdName) const override { 130*12c85518Srobert return Twine("orbis-", CmdName).str(); 131*12c85518Srobert } 132*12c85518Srobert void addSanitizerArgs(const llvm::opt::ArgList &Args, 133*12c85518Srobert llvm::opt::ArgStringList &CmdArgs, const char *Prefix, 134*12c85518Srobert const char *Suffix) const override; getProfileRTLibName()135*12c85518Srobert const char *getProfileRTLibName() const override { 136*12c85518Srobert return "libclang_rt.profile-x86_64.a"; 137*12c85518Srobert } 138*12c85518Srobert 139e5dd7070Spatrick protected: 140e5dd7070Spatrick Tool *buildAssembler() const override; 141*12c85518Srobert }; 142*12c85518Srobert 143*12c85518Srobert // PS5-specific Toolchain class. 144*12c85518Srobert class LLVM_LIBRARY_VISIBILITY PS5CPU : public PS4PS5Base { 145*12c85518Srobert public: 146*12c85518Srobert PS5CPU(const Driver &D, const llvm::Triple &Triple, 147*12c85518Srobert const llvm::opt::ArgList &Args); 148*12c85518Srobert GetDefaultDwarfVersion()149*12c85518Srobert unsigned GetDefaultDwarfVersion() const override { return 5; } 150*12c85518Srobert 151*12c85518Srobert SanitizerMask getSupportedSanitizers() const override; 152*12c85518Srobert getLinkerBaseName()153*12c85518Srobert const char *getLinkerBaseName() const override { return "lld"; } qualifyPSCmdName(StringRef CmdName)154*12c85518Srobert std::string qualifyPSCmdName(StringRef CmdName) const override { 155*12c85518Srobert return Twine("prospero-", CmdName).str(); 156*12c85518Srobert } 157*12c85518Srobert void addSanitizerArgs(const llvm::opt::ArgList &Args, 158*12c85518Srobert llvm::opt::ArgStringList &CmdArgs, const char *Prefix, 159*12c85518Srobert const char *Suffix) const override; getProfileRTLibName()160*12c85518Srobert const char *getProfileRTLibName() const override { 161*12c85518Srobert return "libclang_rt.profile-x86_64_nosubmission.a"; 162*12c85518Srobert } 163*12c85518Srobert 164*12c85518Srobert protected: 165*12c85518Srobert Tool *buildAssembler() const override; 166e5dd7070Spatrick }; 167e5dd7070Spatrick 168e5dd7070Spatrick } // end namespace toolchains 169e5dd7070Spatrick } // end namespace driver 170e5dd7070Spatrick } // end namespace clang 171e5dd7070Spatrick 172e5dd7070Spatrick #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H 173