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/ADT/Triple.h"
20 #include "llvm/Support/Compiler.h"
25 static const unsigned NVPTXAddrSpaceMap[] = {
31 // FIXME: generic has to be added to the target
38 /// The DWARF address class. Taken from
39 /// https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
40 static const int NVPTXDWARFAddrSpaceMap[] = {
41 -1, // Default, opencl_private or opencl_generic - not defined
44 8, // opencl_local or cuda_shared
45 4, // opencl_constant or cuda_constant
48 class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {
49 static const char *const GCCRegNames[];
50 static const Builtin::Info BuiltinInfo[];
53 std::unique_ptr<TargetInfo> HostTarget;
56 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
57 unsigned TargetPointerWidth);
59 void getTargetDefines(const LangOptions &Opts,
60 MacroBuilder &Builder) const override;
62 ArrayRef<Builtin::Info> getTargetBuiltins() const override;
65 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
67 const std::vector<std::string> &FeaturesVec) const override {
68 Features[CudaArchToString(GPU)] = true;
69 Features["ptx" + std::to_string(PTXVersion)] = true;
70 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
73 bool hasFeature(StringRef Feature) const override;
75 ArrayRef<const char *> getGCCRegNames() const override;
77 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
82 bool validateAsmConstraint(const char *&Name,
83 TargetInfo::ConstraintInfo &Info) const override {
93 Info.setAllowsRegister();
98 const char *getClobbers() const override {
99 // FIXME: Is this really right?
103 BuiltinVaListKind getBuiltinVaListKind() const override {
105 return TargetInfo::CharPtrBuiltinVaList;
108 bool isValidCPUName(StringRef Name) const override {
109 return StringToCudaArch(Name) != CudaArch::UNKNOWN;
112 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override {
113 for (int i = static_cast<int>(CudaArch::SM_20);
114 i < static_cast<int>(CudaArch::LAST); ++i)
115 Values.emplace_back(CudaArchToString(static_cast<CudaArch>(i)));
118 bool setCPU(const std::string &Name) override {
119 GPU = StringToCudaArch(Name);
120 return GPU != CudaArch::UNKNOWN;
123 void setSupportedOpenCLOpts() override {
124 auto &Opts = getSupportedOpenCLOpts();
125 Opts.support("cl_clang_storage_class_specifiers");
126 Opts.support("cl_khr_gl_sharing");
127 Opts.support("cl_khr_icd");
129 Opts.support("cl_khr_fp64");
130 Opts.support("cl_khr_byte_addressable_store");
131 Opts.support("cl_khr_global_int32_base_atomics");
132 Opts.support("cl_khr_global_int32_extended_atomics");
133 Opts.support("cl_khr_local_int32_base_atomics");
134 Opts.support("cl_khr_local_int32_extended_atomics");
137 /// \returns If a target requires an address within a target specific address
138 /// space \p AddressSpace to be converted in order to be used, then return the
139 /// corresponding target specific DWARF address space.
141 /// \returns Otherwise return None and no conversion will be emitted in the
144 getDWARFAddressSpace(unsigned AddressSpace) const override {
145 if (AddressSpace >= llvm::array_lengthof(NVPTXDWARFAddrSpaceMap) ||
146 NVPTXDWARFAddrSpaceMap[AddressSpace] < 0)
148 return NVPTXDWARFAddrSpaceMap[AddressSpace];
151 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
152 // CUDA compilations support all of the host's calling conventions.
154 // TODO: We should warn if you apply a non-default CC to anything other than
157 return HostTarget->checkCallingConvention(CC);
161 } // namespace targets
163 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H