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