NVPTX.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //===--- NVPTX.h - Declare NVPTX target feature support ---------*- 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. // This file declares NVPTX TargetInfo objects.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H
  13. #define LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H
  14. #include "clang/Basic/Cuda.h"
  15. #include "clang/Basic/TargetInfo.h"
  16. #include "clang/Basic/TargetOptions.h"
  17. #include "llvm/ADT/Triple.h"
  18. #include "llvm/Support/Compiler.h"
  19. namespace clang {
  20. namespace targets {
  21. static const unsigned NVPTXAddrSpaceMap[] = {
  22. 0, // Default
  23. 1, // opencl_global
  24. 3, // opencl_local
  25. 4, // opencl_constant
  26. 0, // opencl_private
  27. // FIXME: generic has to be added to the target
  28. 0, // opencl_generic
  29. 1, // cuda_device
  30. 4, // cuda_constant
  31. 3, // cuda_shared
  32. };
  33. /// The DWARF address class. Taken from
  34. /// https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
  35. static const int NVPTXDWARFAddrSpaceMap[] = {
  36. -1, // Default, opencl_private or opencl_generic - not defined
  37. 5, // opencl_global
  38. -1,
  39. 8, // opencl_local or cuda_shared
  40. 4, // opencl_constant or cuda_constant
  41. };
  42. class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {
  43. static const char *const GCCRegNames[];
  44. static const Builtin::Info BuiltinInfo[];
  45. CudaArch GPU;
  46. uint32_t PTXVersion;
  47. std::unique_ptr<TargetInfo> HostTarget;
  48. public:
  49. NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
  50. unsigned TargetPointerWidth);
  51. void getTargetDefines(const LangOptions &Opts,
  52. MacroBuilder &Builder) const override;
  53. ArrayRef<Builtin::Info> getTargetBuiltins() const override;
  54. bool
  55. initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
  56. StringRef CPU,
  57. const std::vector<std::string> &FeaturesVec) const override {
  58. Features[CudaArchToString(GPU)] = true;
  59. Features["ptx" + std::to_string(PTXVersion)] = true;
  60. return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
  61. }
  62. bool hasFeature(StringRef Feature) const override;
  63. ArrayRef<const char *> getGCCRegNames() const override;
  64. ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
  65. // No aliases.
  66. return None;
  67. }
  68. bool validateAsmConstraint(const char *&Name,
  69. TargetInfo::ConstraintInfo &Info) const override {
  70. switch (*Name) {
  71. default:
  72. return false;
  73. case 'c':
  74. case 'h':
  75. case 'r':
  76. case 'l':
  77. case 'f':
  78. case 'd':
  79. Info.setAllowsRegister();
  80. return true;
  81. }
  82. }
  83. const char *getClobbers() const override {
  84. // FIXME: Is this really right?
  85. return "";
  86. }
  87. BuiltinVaListKind getBuiltinVaListKind() const override {
  88. // FIXME: implement
  89. return TargetInfo::CharPtrBuiltinVaList;
  90. }
  91. bool isValidCPUName(StringRef Name) const override {
  92. return StringToCudaArch(Name) != CudaArch::UNKNOWN;
  93. }
  94. void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override {
  95. for (int i = static_cast<int>(CudaArch::SM_20);
  96. i < static_cast<int>(CudaArch::LAST); ++i)
  97. Values.emplace_back(CudaArchToString(static_cast<CudaArch>(i)));
  98. }
  99. bool setCPU(const std::string &Name) override {
  100. GPU = StringToCudaArch(Name);
  101. return GPU != CudaArch::UNKNOWN;
  102. }
  103. void setSupportedOpenCLOpts() override {
  104. auto &Opts = getSupportedOpenCLOpts();
  105. Opts.support("cl_clang_storage_class_specifiers");
  106. Opts.support("cl_khr_gl_sharing");
  107. Opts.support("cl_khr_icd");
  108. Opts.support("cl_khr_fp64");
  109. Opts.support("cl_khr_byte_addressable_store");
  110. Opts.support("cl_khr_global_int32_base_atomics");
  111. Opts.support("cl_khr_global_int32_extended_atomics");
  112. Opts.support("cl_khr_local_int32_base_atomics");
  113. Opts.support("cl_khr_local_int32_extended_atomics");
  114. }
  115. /// \returns If a target requires an address within a target specific address
  116. /// space \p AddressSpace to be converted in order to be used, then return the
  117. /// corresponding target specific DWARF address space.
  118. ///
  119. /// \returns Otherwise return None and no conversion will be emitted in the
  120. /// DWARF.
  121. Optional<unsigned>
  122. getDWARFAddressSpace(unsigned AddressSpace) const override {
  123. if (AddressSpace >= llvm::array_lengthof(NVPTXDWARFAddrSpaceMap) ||
  124. NVPTXDWARFAddrSpaceMap[AddressSpace] < 0)
  125. return llvm::None;
  126. return NVPTXDWARFAddrSpaceMap[AddressSpace];
  127. }
  128. CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
  129. // CUDA compilations support all of the host's calling conventions.
  130. //
  131. // TODO: We should warn if you apply a non-default CC to anything other than
  132. // a host function.
  133. if (HostTarget)
  134. return HostTarget->checkCallingConvention(CC);
  135. return CCCR_Warning;
  136. }
  137. };
  138. } // namespace targets
  139. } // namespace clang
  140. #endif // LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H