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