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 };
410b57cec5SDimitry Andric 
425f757f3fSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
430b57cec5SDimitry Andric public:
Linker(const ToolChain & TC)4481ad6265SDimitry Andric   Linker(const ToolChain &TC) : Tool("PScpu::Linker", "linker", TC) {}
450b57cec5SDimitry Andric 
hasIntegratedCPP()460b57cec5SDimitry Andric   bool hasIntegratedCPP() const override { return false; }
isLinkJob()470b57cec5SDimitry Andric   bool isLinkJob() const override { return true; }
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric   void ConstructJob(Compilation &C, const JobAction &JA,
5081ad6265SDimitry Andric                     const InputInfo &Output, const InputInfoList &Inputs,
510b57cec5SDimitry Andric                     const llvm::opt::ArgList &TCArgs,
520b57cec5SDimitry Andric                     const char *LinkingOutput) const override;
530b57cec5SDimitry Andric };
5481ad6265SDimitry Andric } // namespace PScpu
550b57cec5SDimitry Andric } // namespace tools
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric namespace toolchains {
580b57cec5SDimitry Andric 
5981ad6265SDimitry Andric // Common Toolchain base class for PS4 and PS5.
6081ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY PS4PS5Base : public Generic_ELF {
610b57cec5SDimitry Andric public:
6281ad6265SDimitry Andric   PS4PS5Base(const Driver &D, const llvm::Triple &Triple,
6381ad6265SDimitry Andric              const llvm::opt::ArgList &Args, StringRef Platform,
6481ad6265SDimitry Andric              const char *EnvVar);
650b57cec5SDimitry Andric 
6606c3fb27SDimitry Andric   void
6706c3fb27SDimitry Andric   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
6806c3fb27SDimitry Andric                             llvm::opt::ArgStringList &CC1Args) const override;
690b57cec5SDimitry Andric   // No support for finding a C++ standard library yet.
addLibCxxIncludePaths(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args)7081ad6265SDimitry Andric   void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
7181ad6265SDimitry Andric                              llvm::opt::ArgStringList &CC1Args) const override {
7281ad6265SDimitry Andric   }
7381ad6265SDimitry Andric   void
addLibStdCxxIncludePaths(const llvm::opt::ArgList & DriverArgs,llvm::opt::ArgStringList & CC1Args)7481ad6265SDimitry Andric   addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
750b57cec5SDimitry Andric                            llvm::opt::ArgStringList &CC1Args) const override {}
760b57cec5SDimitry Andric 
IsMathErrnoDefault()770b57cec5SDimitry Andric   bool IsMathErrnoDefault() const override { return false; }
IsObjCNonFragileABIDefault()780b57cec5SDimitry Andric   bool IsObjCNonFragileABIDefault() const override { return true; }
HasNativeLLVMSupport()7981ad6265SDimitry Andric   bool HasNativeLLVMSupport() const override { return true; }
isPICDefault()8081ad6265SDimitry Andric   bool isPICDefault() const override { return true; }
810b57cec5SDimitry Andric 
82e8d8bef9SDimitry Andric   LangOptions::StackProtectorMode
GetDefaultStackProtectorLevel(bool KernelOrKext)83e8d8bef9SDimitry Andric   GetDefaultStackProtectorLevel(bool KernelOrKext) const override {
84e8d8bef9SDimitry Andric     return LangOptions::SSPStrong;
850b57cec5SDimitry Andric   }
860b57cec5SDimitry Andric 
getDefaultDebuggerTuning()870b57cec5SDimitry Andric   llvm::DebuggerKind getDefaultDebuggerTuning() const override {
880b57cec5SDimitry Andric     return llvm::DebuggerKind::SCE;
890b57cec5SDimitry Andric   }
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric   SanitizerMask getSupportedSanitizers() const override;
920b57cec5SDimitry Andric 
935ffd83dbSDimitry Andric   void addClangTargetOptions(
9481ad6265SDimitry Andric       const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
955ffd83dbSDimitry Andric       Action::OffloadKind DeviceOffloadingKind) const override;
965ffd83dbSDimitry Andric 
getDefaultDenormalModeForType(const llvm::opt::ArgList & DriverArgs,const JobAction & JA,const llvm::fltSemantics * FPType)975ffd83dbSDimitry Andric   llvm::DenormalMode getDefaultDenormalModeForType(
985ffd83dbSDimitry Andric       const llvm::opt::ArgList &DriverArgs, const JobAction &JA,
995ffd83dbSDimitry Andric       const llvm::fltSemantics *FPType) const override {
1005ffd83dbSDimitry Andric     // DAZ and FTZ are on by default.
1015ffd83dbSDimitry Andric     return llvm::DenormalMode::getPreserveSign();
1025ffd83dbSDimitry Andric   }
1035ffd83dbSDimitry Andric 
10481ad6265SDimitry Andric   // Helper methods for PS4/PS5.
10581ad6265SDimitry Andric   virtual const char *getLinkerBaseName() const = 0;
10681ad6265SDimitry Andric   virtual std::string qualifyPSCmdName(StringRef CmdName) const = 0;
10781ad6265SDimitry Andric   virtual void addSanitizerArgs(const llvm::opt::ArgList &Args,
10881ad6265SDimitry Andric                                 llvm::opt::ArgStringList &CmdArgs,
10981ad6265SDimitry Andric                                 const char *Prefix,
11081ad6265SDimitry Andric                                 const char *Suffix) const = 0;
11181ad6265SDimitry Andric   virtual const char *getProfileRTLibName() const = 0;
11281ad6265SDimitry Andric 
11381ad6265SDimitry Andric protected:
11481ad6265SDimitry Andric   Tool *buildLinker() const override;
11506c3fb27SDimitry Andric 
11606c3fb27SDimitry Andric private:
11706c3fb27SDimitry Andric   // We compute the SDK root dir in the ctor, and use it later.
11806c3fb27SDimitry Andric   std::string SDKRootDir;
11981ad6265SDimitry Andric };
12081ad6265SDimitry Andric 
12181ad6265SDimitry Andric // PS4-specific Toolchain class.
12281ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY PS4CPU : public PS4PS5Base {
12381ad6265SDimitry Andric public:
12481ad6265SDimitry Andric   PS4CPU(const Driver &D, const llvm::Triple &Triple,
12581ad6265SDimitry Andric          const llvm::opt::ArgList &Args);
12681ad6265SDimitry Andric 
GetDefaultDwarfVersion()12781ad6265SDimitry Andric   unsigned GetDefaultDwarfVersion() const override { return 4; }
12881ad6265SDimitry Andric 
12981ad6265SDimitry Andric   // PS4 toolchain uses legacy thin LTO API, which is not
13081ad6265SDimitry Andric   // capable of unit splitting.
canSplitThinLTOUnit()13181ad6265SDimitry Andric   bool canSplitThinLTOUnit() const override { return false; }
13281ad6265SDimitry Andric 
getLinkerBaseName()13381ad6265SDimitry Andric   const char *getLinkerBaseName() const override { return "ld"; }
qualifyPSCmdName(StringRef CmdName)13481ad6265SDimitry Andric   std::string qualifyPSCmdName(StringRef CmdName) const override {
13581ad6265SDimitry Andric     return Twine("orbis-", CmdName).str();
13681ad6265SDimitry Andric   }
13781ad6265SDimitry Andric   void addSanitizerArgs(const llvm::opt::ArgList &Args,
13881ad6265SDimitry Andric                         llvm::opt::ArgStringList &CmdArgs, const char *Prefix,
13981ad6265SDimitry Andric                         const char *Suffix) const override;
getProfileRTLibName()14081ad6265SDimitry Andric   const char *getProfileRTLibName() const override {
14181ad6265SDimitry Andric     return "libclang_rt.profile-x86_64.a";
14281ad6265SDimitry Andric   }
14381ad6265SDimitry Andric 
1440b57cec5SDimitry Andric protected:
1450b57cec5SDimitry Andric   Tool *buildAssembler() const override;
14681ad6265SDimitry Andric };
14781ad6265SDimitry Andric 
14881ad6265SDimitry Andric // PS5-specific Toolchain class.
14981ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY PS5CPU : public PS4PS5Base {
15081ad6265SDimitry Andric public:
15181ad6265SDimitry Andric   PS5CPU(const Driver &D, const llvm::Triple &Triple,
15281ad6265SDimitry Andric          const llvm::opt::ArgList &Args);
15381ad6265SDimitry Andric 
GetDefaultDwarfVersion()15481ad6265SDimitry Andric   unsigned GetDefaultDwarfVersion() const override { return 5; }
15581ad6265SDimitry Andric 
15681ad6265SDimitry Andric   SanitizerMask getSupportedSanitizers() const override;
15781ad6265SDimitry Andric 
getLinkerBaseName()15881ad6265SDimitry Andric   const char *getLinkerBaseName() const override { return "lld"; }
qualifyPSCmdName(StringRef CmdName)15981ad6265SDimitry Andric   std::string qualifyPSCmdName(StringRef CmdName) const override {
16081ad6265SDimitry Andric     return Twine("prospero-", CmdName).str();
16181ad6265SDimitry Andric   }
16281ad6265SDimitry Andric   void addSanitizerArgs(const llvm::opt::ArgList &Args,
16381ad6265SDimitry Andric                         llvm::opt::ArgStringList &CmdArgs, const char *Prefix,
16481ad6265SDimitry Andric                         const char *Suffix) const override;
getProfileRTLibName()16581ad6265SDimitry Andric   const char *getProfileRTLibName() const override {
16681ad6265SDimitry Andric     return "libclang_rt.profile-x86_64_nosubmission.a";
16781ad6265SDimitry Andric   }
16881ad6265SDimitry Andric 
16981ad6265SDimitry Andric protected:
17081ad6265SDimitry Andric   Tool *buildAssembler() const override;
1710b57cec5SDimitry Andric };
1720b57cec5SDimitry Andric 
1730b57cec5SDimitry Andric } // end namespace toolchains
1740b57cec5SDimitry Andric } // end namespace driver
1750b57cec5SDimitry Andric } // end namespace clang
1760b57cec5SDimitry Andric 
1770b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_PS4CPU_H
178