1 //===--- NVPTX.h - Declare NVPTX target feature support ---------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares NVPTX TargetInfo objects.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H
15 #define LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H
17 #include "clang/Basic/Cuda.h"
18 #include "clang/Basic/TargetInfo.h"
19 #include "clang/Basic/TargetOptions.h"
20 #include "llvm/ADT/Triple.h"
21 #include "llvm/Support/Compiler.h"
26 static const unsigned NVPTXAddrSpaceMap[] = {
32 // FIXME: generic has to be added to the target
39 class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {
40 static const char *const GCCRegNames[];
41 static const Builtin::Info BuiltinInfo[];
44 std::unique_ptr<TargetInfo> HostTarget;
47 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
48 unsigned TargetPointerWidth);
50 void getTargetDefines(const LangOptions &Opts,
51 MacroBuilder &Builder) const override;
53 ArrayRef<Builtin::Info> getTargetBuiltins() const override;
56 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
58 const std::vector<std::string> &FeaturesVec) const override {
59 Features[CudaArchToString(GPU)] = true;
60 Features["ptx" + std::to_string(PTXVersion)] = true;
61 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
64 bool hasFeature(StringRef Feature) const override;
66 ArrayRef<const char *> getGCCRegNames() const override;
68 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
73 bool validateAsmConstraint(const char *&Name,
74 TargetInfo::ConstraintInfo &Info) const override {
84 Info.setAllowsRegister();
89 const char *getClobbers() const override {
90 // FIXME: Is this really right?
94 BuiltinVaListKind getBuiltinVaListKind() const override {
96 return TargetInfo::CharPtrBuiltinVaList;
99 bool isValidCPUName(StringRef Name) const override {
100 return StringToCudaArch(Name) != CudaArch::UNKNOWN;
103 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override {
104 for (int i = static_cast<int>(CudaArch::SM_20);
105 i < static_cast<int>(CudaArch::LAST); ++i)
106 Values.emplace_back(CudaArchToString(static_cast<CudaArch>(i)));
109 bool setCPU(const std::string &Name) override {
110 GPU = StringToCudaArch(Name);
111 return GPU != CudaArch::UNKNOWN;
114 void setSupportedOpenCLOpts() override {
115 auto &Opts = getSupportedOpenCLOpts();
116 Opts.support("cl_clang_storage_class_specifiers");
117 Opts.support("cl_khr_gl_sharing");
118 Opts.support("cl_khr_icd");
120 Opts.support("cl_khr_fp64");
121 Opts.support("cl_khr_byte_addressable_store");
122 Opts.support("cl_khr_global_int32_base_atomics");
123 Opts.support("cl_khr_global_int32_extended_atomics");
124 Opts.support("cl_khr_local_int32_base_atomics");
125 Opts.support("cl_khr_local_int32_extended_atomics");
128 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
129 // CUDA compilations support all of the host's calling conventions.
131 // TODO: We should warn if you apply a non-default CC to anything other than
134 return HostTarget->checkCallingConvention(CC);
138 } // namespace targets
140 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H