xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/PS4CPU.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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