1 //===--- NVPTX.h - Declare NVPTX target feature support ---------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares NVPTX TargetInfo objects.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H
14 #define LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H
16 #include "clang/Basic/Cuda.h"
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/TargetOptions.h"
19 #include "llvm/Support/Compiler.h"
20 #include "llvm/TargetParser/Triple.h"
26 static const unsigned NVPTXAddrSpaceMap
[] = {
32 // FIXME: generic has to be added to the target
34 1, // opencl_global_device
35 1, // opencl_global_host
40 1, // sycl_global_device
41 1, // sycl_global_host
47 0, // hlsl_groupshared
48 // Wasm address space values for this target are dummy values,
49 // as it is only enabled for Wasm targets.
53 /// The DWARF address class. Taken from
54 /// https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
55 static const int NVPTXDWARFAddrSpaceMap
[] = {
56 -1, // Default, opencl_private or opencl_generic - not defined
59 8, // opencl_local or cuda_shared
60 4, // opencl_constant or cuda_constant
63 class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo
: public TargetInfo
{
64 static const char *const GCCRegNames
[];
67 std::unique_ptr
<TargetInfo
> HostTarget
;
70 NVPTXTargetInfo(const llvm::Triple
&Triple
, const TargetOptions
&Opts
,
71 unsigned TargetPointerWidth
);
73 void getTargetDefines(const LangOptions
&Opts
,
74 MacroBuilder
&Builder
) const override
;
76 ArrayRef
<Builtin::Info
> getTargetBuiltins() const override
;
79 initFeatureMap(llvm::StringMap
<bool> &Features
, DiagnosticsEngine
&Diags
,
81 const std::vector
<std::string
> &FeaturesVec
) const override
{
82 Features
[CudaArchToString(GPU
)] = true;
83 Features
["ptx" + std::to_string(PTXVersion
)] = true;
84 return TargetInfo::initFeatureMap(Features
, Diags
, CPU
, FeaturesVec
);
87 bool hasFeature(StringRef Feature
) const override
;
89 ArrayRef
<const char *> getGCCRegNames() const override
;
91 ArrayRef
<TargetInfo::GCCRegAlias
> getGCCRegAliases() const override
{
96 bool validateAsmConstraint(const char *&Name
,
97 TargetInfo::ConstraintInfo
&Info
) const override
{
107 Info
.setAllowsRegister();
112 std::string_view
getClobbers() const override
{
113 // FIXME: Is this really right?
117 BuiltinVaListKind
getBuiltinVaListKind() const override
{
119 return TargetInfo::CharPtrBuiltinVaList
;
122 bool isValidCPUName(StringRef Name
) const override
{
123 return StringToCudaArch(Name
) != CudaArch::UNKNOWN
;
126 void fillValidCPUList(SmallVectorImpl
<StringRef
> &Values
) const override
{
127 for (int i
= static_cast<int>(CudaArch::SM_20
);
128 i
< static_cast<int>(CudaArch::Generic
); ++i
)
129 Values
.emplace_back(CudaArchToString(static_cast<CudaArch
>(i
)));
132 bool setCPU(const std::string
&Name
) override
{
133 GPU
= StringToCudaArch(Name
);
134 return GPU
!= CudaArch::UNKNOWN
;
137 void setSupportedOpenCLOpts() override
{
138 auto &Opts
= getSupportedOpenCLOpts();
139 Opts
["cl_clang_storage_class_specifiers"] = true;
140 Opts
["__cl_clang_function_pointers"] = true;
141 Opts
["__cl_clang_variadic_functions"] = true;
142 Opts
["__cl_clang_non_portable_kernel_param_types"] = true;
143 Opts
["__cl_clang_bitfields"] = true;
145 Opts
["cl_khr_fp64"] = true;
146 Opts
["__opencl_c_fp64"] = true;
147 Opts
["cl_khr_byte_addressable_store"] = true;
148 Opts
["cl_khr_global_int32_base_atomics"] = true;
149 Opts
["cl_khr_global_int32_extended_atomics"] = true;
150 Opts
["cl_khr_local_int32_base_atomics"] = true;
151 Opts
["cl_khr_local_int32_extended_atomics"] = true;
154 const llvm::omp::GV
&getGridValue() const override
{
155 return llvm::omp::NVPTXGridValues
;
158 /// \returns If a target requires an address within a target specific address
159 /// space \p AddressSpace to be converted in order to be used, then return the
160 /// corresponding target specific DWARF address space.
162 /// \returns Otherwise return std::nullopt and no conversion will be emitted
164 std::optional
<unsigned>
165 getDWARFAddressSpace(unsigned AddressSpace
) const override
{
166 if (AddressSpace
>= std::size(NVPTXDWARFAddrSpaceMap
) ||
167 NVPTXDWARFAddrSpaceMap
[AddressSpace
] < 0)
169 return NVPTXDWARFAddrSpaceMap
[AddressSpace
];
172 CallingConvCheckResult
checkCallingConvention(CallingConv CC
) const override
{
173 // CUDA compilations support all of the host's calling conventions.
175 // TODO: We should warn if you apply a non-default CC to anything other than
178 return HostTarget
->checkCallingConvention(CC
);
182 bool hasBitIntType() const override
{ return true; }
183 bool hasBFloat16Type() const override
{ return true; }
185 CudaArch
getGPU() const { return GPU
; }
187 } // namespace targets
189 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H