198 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H11 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} // namespace PScpu42 43namespace PS4cpu {44class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {45public:46 Linker(const ToolChain &TC) : Tool("PS4cpu::Linker", "linker", TC) {}47 48 bool hasIntegratedCPP() const override { return false; }49 bool isLinkJob() const override { return true; }50 51 void ConstructJob(Compilation &C, const JobAction &JA,52 const InputInfo &Output, const InputInfoList &Inputs,53 const llvm::opt::ArgList &TCArgs,54 const char *LinkingOutput) const override;55};56} // namespace PS4cpu57 58namespace PS5cpu {59class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {60public:61 Linker(const ToolChain &TC) : Tool("PS5cpu::Linker", "linker", TC) {}62 63 bool hasIntegratedCPP() const override { return false; }64 bool isLinkJob() const override { return true; }65 66 void ConstructJob(Compilation &C, const JobAction &JA,67 const InputInfo &Output, const InputInfoList &Inputs,68 const llvm::opt::ArgList &TCArgs,69 const char *LinkingOutput) const override;70};71} // namespace PS5cpu72 73} // namespace tools74 75namespace toolchains {76 77// Common Toolchain base class for PS4 and PS5.78class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF {79public:80 PS4PS5Base(const Driver &D, const llvm::Triple &Triple,81 const llvm::opt::ArgList &Args, StringRef Platform,82 const char *EnvVar);83 84 void85 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,86 llvm::opt::ArgStringList &CC1Args) const override;87 // No support for finding a C++ standard library yet.88 void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,89 llvm::opt::ArgStringList &CC1Args) const override {90 }91 void92 addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,93 llvm::opt::ArgStringList &CC1Args) const override {}94 95 bool IsMathErrnoDefault() const override { return false; }96 bool IsObjCNonFragileABIDefault() const override { return true; }97 bool HasNativeLLVMSupport() const override { return true; }98 bool isPICDefault() const override { return true; }99 100 LangOptions::StackProtectorMode101 GetDefaultStackProtectorLevel(bool KernelOrKext) const override {102 return LangOptions::SSPStrong;103 }104 105 llvm::DebuggerKind getDefaultDebuggerTuning() const override {106 return llvm::DebuggerKind::SCE;107 }108 109 SanitizerMask getSupportedSanitizers() const override;110 111 void addClangTargetOptions(112 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,113 Action::OffloadKind DeviceOffloadingKind) const override;114 115 llvm::DenormalMode getDefaultDenormalModeForType(116 const llvm::opt::ArgList &DriverArgs, const JobAction &JA,117 const llvm::fltSemantics *FPType) const override {118 // DAZ and FTZ are on by default.119 return llvm::DenormalMode::getPreserveSign();120 }121 122 // Helper methods for PS4/PS5.123 virtual const char *getLinkerBaseName() const = 0;124 virtual std::string qualifyPSCmdName(StringRef CmdName) const = 0;125 virtual void addSanitizerArgs(const llvm::opt::ArgList &Args,126 llvm::opt::ArgStringList &CmdArgs,127 const char *Prefix,128 const char *Suffix) const = 0;129 virtual const char *getProfileRTLibName() const = 0;130 131 StringRef getSDKLibraryRootDir() const { return SDKLibraryRootDir; }132 133private:134 // We compute the SDK locations in the ctor, and use them later.135 std::string SDKHeaderRootDir;136 std::string SDKLibraryRootDir;137};138 139// PS4-specific Toolchain class.140class LLVM_LIBRARY_VISIBILITY PS4CPU : public PS4PS5Base {141public:142 PS4CPU(const Driver &D, const llvm::Triple &Triple,143 const llvm::opt::ArgList &Args);144 145 unsigned GetDefaultDwarfVersion() const override { return 4; }146 147 // PS4 toolchain uses legacy thin LTO API, which is not148 // capable of unit splitting.149 bool canSplitThinLTOUnit() const override { return false; }150 151 const char *getLinkerBaseName() const override { return "ld"; }152 std::string qualifyPSCmdName(StringRef CmdName) const override {153 return Twine("orbis-", CmdName).str();154 }155 void addSanitizerArgs(const llvm::opt::ArgList &Args,156 llvm::opt::ArgStringList &CmdArgs, const char *Prefix,157 const char *Suffix) const override;158 const char *getProfileRTLibName() const override {159 return "libclang_rt.profile-x86_64.a";160 }161 162protected:163 Tool *buildAssembler() const override;164 Tool *buildLinker() const override;165};166 167// PS5-specific Toolchain class.168class LLVM_LIBRARY_VISIBILITY PS5CPU : public PS4PS5Base {169public:170 PS5CPU(const Driver &D, const llvm::Triple &Triple,171 const llvm::opt::ArgList &Args);172 173 unsigned GetDefaultDwarfVersion() const override { return 5; }174 175 SanitizerMask getSupportedSanitizers() const override;176 177 const char *getLinkerBaseName() const override { return "lld"; }178 std::string qualifyPSCmdName(StringRef CmdName) const override {179 return Twine("prospero-", CmdName).str();180 }181 void addSanitizerArgs(const llvm::opt::ArgList &Args,182 llvm::opt::ArgStringList &CmdArgs, const char *Prefix,183 const char *Suffix) const override;184 const char *getProfileRTLibName() const override {185 return "libclang_rt.profile_nosubmission.a";186 }187 188protected:189 Tool *buildAssembler() const override;190 Tool *buildLinker() const override;191};192 193} // end namespace toolchains194} // end namespace driver195} // end namespace clang196 197#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H198