xref: /freebsd-src/contrib/llvm-project/clang/lib/Basic/Targets/DirectX.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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