]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Basic/Targets/SPIR.h
MFV: r335802
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Basic / Targets / SPIR.h
1 //===--- SPIR.h - Declare SPIR target feature support -----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares SPIR TargetInfo objects.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_SPIR_H
15 #define LLVM_CLANG_LIB_BASIC_TARGETS_SPIR_H
16
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/TargetOptions.h"
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/Support/Compiler.h"
21
22 namespace clang {
23 namespace targets {
24
25 static const unsigned SPIRAddrSpaceMap[] = {
26     0, // Default
27     1, // opencl_global
28     3, // opencl_local
29     2, // opencl_constant
30     0, // opencl_private
31     4, // opencl_generic
32     0, // cuda_device
33     0, // cuda_constant
34     0  // cuda_shared
35 };
36
37 class LLVM_LIBRARY_VISIBILITY SPIRTargetInfo : public TargetInfo {
38 public:
39   SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
40       : TargetInfo(Triple) {
41     assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
42            "SPIR target must use unknown OS");
43     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
44            "SPIR target must use unknown environment type");
45     TLSSupported = false;
46     VLASupported = false;
47     LongWidth = LongAlign = 64;
48     AddrSpaceMap = &SPIRAddrSpaceMap;
49     UseAddrSpaceMapMangling = true;
50     // Define available target features
51     // These must be defined in sorted order!
52     NoAsmVariants = true;
53   }
54
55   void getTargetDefines(const LangOptions &Opts,
56                         MacroBuilder &Builder) const override;
57
58   bool hasFeature(StringRef Feature) const override {
59     return Feature == "spir";
60   }
61
62   ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
63
64   const char *getClobbers() const override { return ""; }
65
66   ArrayRef<const char *> getGCCRegNames() const override { return None; }
67
68   bool validateAsmConstraint(const char *&Name,
69                              TargetInfo::ConstraintInfo &info) const override {
70     return true;
71   }
72
73   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
74     return None;
75   }
76
77   BuiltinVaListKind getBuiltinVaListKind() const override {
78     return TargetInfo::VoidPtrBuiltinVaList;
79   }
80
81   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
82     return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
83                                                             : CCCR_Warning;
84   }
85
86   CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
87     return CC_SpirFunction;
88   }
89
90   void setSupportedOpenCLOpts() override {
91     // Assume all OpenCL extensions and optional core features are supported
92     // for SPIR since it is a generic target.
93     getSupportedOpenCLOpts().supportAll();
94   }
95 };
96 class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo {
97 public:
98   SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
99       : SPIRTargetInfo(Triple, Opts) {
100     PointerWidth = PointerAlign = 32;
101     SizeType = TargetInfo::UnsignedInt;
102     PtrDiffType = IntPtrType = TargetInfo::SignedInt;
103     resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
104                     "v96:128-v192:256-v256:256-v512:512-v1024:1024");
105   }
106
107   void getTargetDefines(const LangOptions &Opts,
108                         MacroBuilder &Builder) const override;
109 };
110
111 class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
112 public:
113   SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
114       : SPIRTargetInfo(Triple, Opts) {
115     PointerWidth = PointerAlign = 64;
116     SizeType = TargetInfo::UnsignedLong;
117     PtrDiffType = IntPtrType = TargetInfo::SignedLong;
118     resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
119                     "v96:128-v192:256-v256:256-v512:512-v1024:1024");
120   }
121
122   void getTargetDefines(const LangOptions &Opts,
123                         MacroBuilder &Builder) const override;
124 };
125 } // namespace targets
126 } // namespace clang
127 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_SPIR_H