xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/DirectX.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
1*12c85518Srobert //===--- DirectX.h - Declare DirectX target feature support -----*- C++ -*-===//
2*12c85518Srobert //
3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information.
5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*12c85518Srobert //
7*12c85518Srobert //===----------------------------------------------------------------------===//
8*12c85518Srobert //
9*12c85518Srobert // This file declares DXIL TargetInfo objects.
10*12c85518Srobert //
11*12c85518Srobert //===----------------------------------------------------------------------===//
12*12c85518Srobert 
13*12c85518Srobert #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H
14*12c85518Srobert #define LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H
15*12c85518Srobert #include "clang/Basic/TargetInfo.h"
16*12c85518Srobert #include "clang/Basic/TargetOptions.h"
17*12c85518Srobert #include "llvm/ADT/Triple.h"
18*12c85518Srobert #include "llvm/Support/Compiler.h"
19*12c85518Srobert 
20*12c85518Srobert namespace clang {
21*12c85518Srobert namespace targets {
22*12c85518Srobert 
23*12c85518Srobert static const unsigned DirectXAddrSpaceMap[] = {
24*12c85518Srobert     0, // Default
25*12c85518Srobert     1, // opencl_global
26*12c85518Srobert     3, // opencl_local
27*12c85518Srobert     2, // opencl_constant
28*12c85518Srobert     0, // opencl_private
29*12c85518Srobert     4, // opencl_generic
30*12c85518Srobert     5, // opencl_global_device
31*12c85518Srobert     6, // opencl_global_host
32*12c85518Srobert     0, // cuda_device
33*12c85518Srobert     0, // cuda_constant
34*12c85518Srobert     0, // cuda_shared
35*12c85518Srobert     // SYCL address space values for this map are dummy
36*12c85518Srobert     0, // sycl_global
37*12c85518Srobert     0, // sycl_global_device
38*12c85518Srobert     0, // sycl_global_host
39*12c85518Srobert     0, // sycl_local
40*12c85518Srobert     0, // sycl_private
41*12c85518Srobert     0, // ptr32_sptr
42*12c85518Srobert     0, // ptr32_uptr
43*12c85518Srobert     0, // ptr64
44*12c85518Srobert     3, // hlsl_groupshared
45*12c85518Srobert };
46*12c85518Srobert 
47*12c85518Srobert class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
48*12c85518Srobert public:
DirectXTargetInfo(const llvm::Triple & Triple,const TargetOptions &)49*12c85518Srobert   DirectXTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
50*12c85518Srobert       : TargetInfo(Triple) {
51*12c85518Srobert     TLSSupported = false;
52*12c85518Srobert     VLASupported = false;
53*12c85518Srobert     LongWidth = LongAlign = 64;
54*12c85518Srobert     AddrSpaceMap = &DirectXAddrSpaceMap;
55*12c85518Srobert     UseAddrSpaceMapMangling = true;
56*12c85518Srobert     HasLegalHalfType = true;
57*12c85518Srobert     HasFloat16 = true;
58*12c85518Srobert     NoAsmVariants = true;
59*12c85518Srobert     PlatformMinVersion = Triple.getOSVersion();
60*12c85518Srobert     PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
61*12c85518Srobert     resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:"
62*12c85518Srobert                     "32-f64:64-n8:16:32:64");
63*12c85518Srobert     TheCXXABI.set(TargetCXXABI::Microsoft);
64*12c85518Srobert   }
useFP16ConversionIntrinsics()65*12c85518Srobert   bool useFP16ConversionIntrinsics() const override { return false; }
66*12c85518Srobert   void getTargetDefines(const LangOptions &Opts,
67*12c85518Srobert                         MacroBuilder &Builder) const override;
68*12c85518Srobert 
hasFeature(StringRef Feature)69*12c85518Srobert   bool hasFeature(StringRef Feature) const override {
70*12c85518Srobert     return Feature == "directx";
71*12c85518Srobert   }
72*12c85518Srobert 
getTargetBuiltins()73*12c85518Srobert   ArrayRef<Builtin::Info> getTargetBuiltins() const override {
74*12c85518Srobert     return std::nullopt;
75*12c85518Srobert   }
76*12c85518Srobert 
getClobbers()77*12c85518Srobert   const char *getClobbers() const override { return ""; }
78*12c85518Srobert 
getGCCRegNames()79*12c85518Srobert   ArrayRef<const char *> getGCCRegNames() const override {
80*12c85518Srobert     return std::nullopt;
81*12c85518Srobert   }
82*12c85518Srobert 
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info)83*12c85518Srobert   bool validateAsmConstraint(const char *&Name,
84*12c85518Srobert                              TargetInfo::ConstraintInfo &info) const override {
85*12c85518Srobert     return true;
86*12c85518Srobert   }
87*12c85518Srobert 
getGCCRegAliases()88*12c85518Srobert   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
89*12c85518Srobert     return std::nullopt;
90*12c85518Srobert   }
91*12c85518Srobert 
getBuiltinVaListKind()92*12c85518Srobert   BuiltinVaListKind getBuiltinVaListKind() const override {
93*12c85518Srobert     return TargetInfo::VoidPtrBuiltinVaList;
94*12c85518Srobert   }
95*12c85518Srobert };
96*12c85518Srobert 
97*12c85518Srobert } // namespace targets
98*12c85518Srobert } // namespace clang
99*12c85518Srobert 
100*12c85518Srobert #endif // LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H
101