1 //===--- SPIR.h - Declare SPIR 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 SPIR TargetInfo objects.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_SPIR_H
15 #define LLVM_CLANG_LIB_BASIC_TARGETS_SPIR_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 SPIRAddrSpaceMap[] = {
37 class LLVM_LIBRARY_VISIBILITY SPIRTargetInfo : public TargetInfo {
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");
47 LongWidth = LongAlign = 64;
48 AddrSpaceMap = &SPIRAddrSpaceMap;
49 UseAddrSpaceMapMangling = true;
50 // Define available target features
51 // These must be defined in sorted order!
55 void getTargetDefines(const LangOptions &Opts,
56 MacroBuilder &Builder) const override;
58 bool hasFeature(StringRef Feature) const override {
59 return Feature == "spir";
62 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
64 const char *getClobbers() const override { return ""; }
66 ArrayRef<const char *> getGCCRegNames() const override { return None; }
68 bool validateAsmConstraint(const char *&Name,
69 TargetInfo::ConstraintInfo &info) const override {
73 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
77 BuiltinVaListKind getBuiltinVaListKind() const override {
78 return TargetInfo::VoidPtrBuiltinVaList;
81 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
82 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
86 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
87 return CC_SpirFunction;
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();
96 class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo {
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");
107 void getTargetDefines(const LangOptions &Opts,
108 MacroBuilder &Builder) const override;
111 class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
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");
122 void getTargetDefines(const LangOptions &Opts,
123 MacroBuilder &Builder) const override;
125 } // namespace targets
127 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_SPIR_H