PS4CPU.h 6.0 KB

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