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