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[];
43 std::unique_ptr<TargetInfo> HostTarget;
46 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
47 unsigned TargetPointerWidth);
49 void getTargetDefines(const LangOptions &Opts,
50 MacroBuilder &Builder) const override;
52 ArrayRef<Builtin::Info> getTargetBuiltins() const override;
55 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
57 const std::vector<std::string> &FeaturesVec) const override {
58 Features["satom"] = GPU >= CudaArch::SM_60;
59 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
62 bool hasFeature(StringRef Feature) const override;
64 ArrayRef<const char *> getGCCRegNames() const override;
66 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
71 bool validateAsmConstraint(const char *&Name,
72 TargetInfo::ConstraintInfo &Info) const override {
82 Info.setAllowsRegister();
87 const char *getClobbers() const override {
88 // FIXME: Is this really right?
92 BuiltinVaListKind getBuiltinVaListKind() const override {
94 return TargetInfo::CharPtrBuiltinVaList;
97 bool isValidCPUName(StringRef Name) const override {
98 return StringToCudaArch(Name) != CudaArch::UNKNOWN;
101 bool setCPU(const std::string &Name) override {
102 GPU = StringToCudaArch(Name);
103 return GPU != CudaArch::UNKNOWN;
106 void setSupportedOpenCLOpts() override {
107 auto &Opts = getSupportedOpenCLOpts();
108 Opts.support("cl_clang_storage_class_specifiers");
109 Opts.support("cl_khr_gl_sharing");
110 Opts.support("cl_khr_icd");
112 Opts.support("cl_khr_fp64");
113 Opts.support("cl_khr_byte_addressable_store");
114 Opts.support("cl_khr_global_int32_base_atomics");
115 Opts.support("cl_khr_global_int32_extended_atomics");
116 Opts.support("cl_khr_local_int32_base_atomics");
117 Opts.support("cl_khr_local_int32_extended_atomics");
120 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
121 // CUDA compilations support all of the host's calling conventions.
123 // TODO: We should warn if you apply a non-default CC to anything other than
126 return HostTarget->checkCallingConvention(CC);
130 } // namespace targets
132 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_NVPTX_H