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/Support/Compiler.h" 18*06c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.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 43bdd1243dSDimitry Andric 0, // ptr64 44bdd1243dSDimitry Andric 3, // hlsl_groupshared 45*06c3fb27SDimitry Andric // Wasm address space values for this target are dummy values, 46*06c3fb27SDimitry Andric // as it is only enabled for Wasm targets. 47*06c3fb27SDimitry Andric 20, // wasm_funcref 4881ad6265SDimitry Andric }; 4981ad6265SDimitry Andric 5081ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo { 5181ad6265SDimitry Andric public: 5281ad6265SDimitry Andric DirectXTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 5381ad6265SDimitry Andric : TargetInfo(Triple) { 5481ad6265SDimitry Andric TLSSupported = false; 5581ad6265SDimitry Andric VLASupported = false; 5681ad6265SDimitry Andric AddrSpaceMap = &DirectXAddrSpaceMap; 5781ad6265SDimitry Andric UseAddrSpaceMapMangling = true; 5881ad6265SDimitry Andric HasLegalHalfType = true; 5981ad6265SDimitry Andric HasFloat16 = true; 6081ad6265SDimitry Andric NoAsmVariants = true; 61bdd1243dSDimitry Andric PlatformMinVersion = Triple.getOSVersion(); 62bdd1243dSDimitry Andric PlatformName = llvm::Triple::getOSTypeName(Triple.getOS()); 6381ad6265SDimitry Andric resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:" 6481ad6265SDimitry Andric "32-f64:64-n8:16:32:64"); 6581ad6265SDimitry Andric TheCXXABI.set(TargetCXXABI::Microsoft); 6681ad6265SDimitry Andric } 6781ad6265SDimitry Andric bool useFP16ConversionIntrinsics() const override { return false; } 6881ad6265SDimitry Andric void getTargetDefines(const LangOptions &Opts, 6981ad6265SDimitry Andric MacroBuilder &Builder) const override; 7081ad6265SDimitry Andric 7181ad6265SDimitry Andric bool hasFeature(StringRef Feature) const override { 7281ad6265SDimitry Andric return Feature == "directx"; 7381ad6265SDimitry Andric } 7481ad6265SDimitry Andric 75bdd1243dSDimitry Andric ArrayRef<Builtin::Info> getTargetBuiltins() const override { 76bdd1243dSDimitry Andric return std::nullopt; 77bdd1243dSDimitry Andric } 7881ad6265SDimitry Andric 79*06c3fb27SDimitry Andric std::string_view getClobbers() const override { return ""; } 8081ad6265SDimitry Andric 81bdd1243dSDimitry Andric ArrayRef<const char *> getGCCRegNames() const override { 82bdd1243dSDimitry Andric return std::nullopt; 83bdd1243dSDimitry Andric } 8481ad6265SDimitry Andric 8581ad6265SDimitry Andric bool validateAsmConstraint(const char *&Name, 8681ad6265SDimitry Andric TargetInfo::ConstraintInfo &info) const override { 8781ad6265SDimitry Andric return true; 8881ad6265SDimitry Andric } 8981ad6265SDimitry Andric 9081ad6265SDimitry Andric ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 91bdd1243dSDimitry Andric return std::nullopt; 9281ad6265SDimitry Andric } 9381ad6265SDimitry Andric 9481ad6265SDimitry Andric BuiltinVaListKind getBuiltinVaListKind() const override { 9581ad6265SDimitry Andric return TargetInfo::VoidPtrBuiltinVaList; 9681ad6265SDimitry Andric } 9781ad6265SDimitry Andric }; 9881ad6265SDimitry Andric 9981ad6265SDimitry Andric } // namespace targets 10081ad6265SDimitry Andric } // namespace clang 10181ad6265SDimitry Andric 10281ad6265SDimitry Andric #endif // LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H 103