181ad6265SDimitry Andric //===--- DirectX.h - Declare DirectX target feature support -----*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This file declares DXIL TargetInfo objects. 1081ad6265SDimitry Andric // 1181ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1281ad6265SDimitry Andric 1381ad6265SDimitry Andric #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H 1481ad6265SDimitry Andric #define LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H 1581ad6265SDimitry Andric #include "clang/Basic/TargetInfo.h" 1681ad6265SDimitry Andric #include "clang/Basic/TargetOptions.h" 1781ad6265SDimitry Andric #include "llvm/ADT/Triple.h" 1881ad6265SDimitry Andric #include "llvm/Support/Compiler.h" 1981ad6265SDimitry Andric 2081ad6265SDimitry Andric namespace clang { 2181ad6265SDimitry Andric namespace targets { 2281ad6265SDimitry Andric 2381ad6265SDimitry Andric static const unsigned DirectXAddrSpaceMap[] = { 2481ad6265SDimitry Andric 0, // Default 2581ad6265SDimitry Andric 1, // opencl_global 2681ad6265SDimitry Andric 3, // opencl_local 2781ad6265SDimitry Andric 2, // opencl_constant 2881ad6265SDimitry Andric 0, // opencl_private 2981ad6265SDimitry Andric 4, // opencl_generic 3081ad6265SDimitry Andric 5, // opencl_global_device 3181ad6265SDimitry Andric 6, // opencl_global_host 3281ad6265SDimitry Andric 0, // cuda_device 3381ad6265SDimitry Andric 0, // cuda_constant 3481ad6265SDimitry Andric 0, // cuda_shared 3581ad6265SDimitry Andric // SYCL address space values for this map are dummy 3681ad6265SDimitry Andric 0, // sycl_global 3781ad6265SDimitry Andric 0, // sycl_global_device 3881ad6265SDimitry Andric 0, // sycl_global_host 3981ad6265SDimitry Andric 0, // sycl_local 4081ad6265SDimitry Andric 0, // sycl_private 4181ad6265SDimitry Andric 0, // ptr32_sptr 4281ad6265SDimitry Andric 0, // ptr32_uptr 43*bdd1243dSDimitry Andric 0, // ptr64 44*bdd1243dSDimitry Andric 3, // hlsl_groupshared 4581ad6265SDimitry Andric }; 4681ad6265SDimitry Andric 4781ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo { 4881ad6265SDimitry Andric public: 4981ad6265SDimitry Andric DirectXTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 5081ad6265SDimitry Andric : TargetInfo(Triple) { 5181ad6265SDimitry Andric TLSSupported = false; 5281ad6265SDimitry Andric VLASupported = false; 5381ad6265SDimitry Andric LongWidth = LongAlign = 64; 5481ad6265SDimitry Andric AddrSpaceMap = &DirectXAddrSpaceMap; 5581ad6265SDimitry Andric UseAddrSpaceMapMangling = true; 5681ad6265SDimitry Andric HasLegalHalfType = true; 5781ad6265SDimitry Andric HasFloat16 = true; 5881ad6265SDimitry Andric NoAsmVariants = true; 59*bdd1243dSDimitry Andric PlatformMinVersion = Triple.getOSVersion(); 60*bdd1243dSDimitry Andric PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 6181ad6265SDimitry Andric resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:" 6281ad6265SDimitry Andric "32-f64:64-n8:16:32:64"); 6381ad6265SDimitry Andric TheCXXABI.set(TargetCXXABI::Microsoft); 6481ad6265SDimitry Andric } 6581ad6265SDimitry Andric bool useFP16ConversionIntrinsics() const override { return false; } 6681ad6265SDimitry Andric void getTargetDefines(const LangOptions &Opts, 6781ad6265SDimitry Andric MacroBuilder &Builder) const override; 6881ad6265SDimitry Andric 6981ad6265SDimitry Andric bool hasFeature(StringRef Feature) const override { 7081ad6265SDimitry Andric return Feature == "directx"; 7181ad6265SDimitry Andric } 7281ad6265SDimitry Andric 73*bdd1243dSDimitry Andric ArrayRef<Builtin::Info> getTargetBuiltins() const override { 74*bdd1243dSDimitry Andric return std::nullopt; 75*bdd1243dSDimitry Andric } 7681ad6265SDimitry Andric 7781ad6265SDimitry Andric const char *getClobbers() const override { return ""; } 7881ad6265SDimitry Andric 79*bdd1243dSDimitry Andric ArrayRef<const char *> getGCCRegNames() const override { 80*bdd1243dSDimitry Andric return std::nullopt; 81*bdd1243dSDimitry Andric } 8281ad6265SDimitry Andric 8381ad6265SDimitry Andric bool validateAsmConstraint(const char *&Name, 8481ad6265SDimitry Andric TargetInfo::ConstraintInfo &info) const override { 8581ad6265SDimitry Andric return true; 8681ad6265SDimitry Andric } 8781ad6265SDimitry Andric 8881ad6265SDimitry Andric ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 89*bdd1243dSDimitry Andric return std::nullopt; 9081ad6265SDimitry Andric } 9181ad6265SDimitry Andric 9281ad6265SDimitry Andric BuiltinVaListKind getBuiltinVaListKind() const override { 9381ad6265SDimitry Andric return TargetInfo::VoidPtrBuiltinVaList; 9481ad6265SDimitry Andric } 9581ad6265SDimitry Andric }; 9681ad6265SDimitry Andric 9781ad6265SDimitry Andric } // namespace targets 9881ad6265SDimitry Andric } // namespace clang 9981ad6265SDimitry Andric 10081ad6265SDimitry Andric #endif // LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H 101