xref: /llvm-project/clang/lib/CodeGen/Targets/DirectX.cpp (revision becb03f3c624a9570fdb3f2d5dee1ed75922e70b)
1*becb03f3SHelena Kotas //===- DirectX.cpp---------------------------------------------------------===//
2*becb03f3SHelena Kotas //
3*becb03f3SHelena Kotas // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*becb03f3SHelena Kotas // See https://llvm.org/LICENSE.txt for license information.
5*becb03f3SHelena Kotas // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*becb03f3SHelena Kotas //
7*becb03f3SHelena Kotas //===----------------------------------------------------------------------===//
8*becb03f3SHelena Kotas 
9*becb03f3SHelena Kotas #include "ABIInfoImpl.h"
10*becb03f3SHelena Kotas #include "TargetInfo.h"
11*becb03f3SHelena Kotas #include "llvm/IR/DerivedTypes.h"
12*becb03f3SHelena Kotas 
13*becb03f3SHelena Kotas using namespace clang;
14*becb03f3SHelena Kotas using namespace clang::CodeGen;
15*becb03f3SHelena Kotas 
16*becb03f3SHelena Kotas //===----------------------------------------------------------------------===//
17*becb03f3SHelena Kotas // Target codegen info implementation for DirectX.
18*becb03f3SHelena Kotas //===----------------------------------------------------------------------===//
19*becb03f3SHelena Kotas 
20*becb03f3SHelena Kotas namespace {
21*becb03f3SHelena Kotas 
22*becb03f3SHelena Kotas class DirectXTargetCodeGenInfo : public TargetCodeGenInfo {
23*becb03f3SHelena Kotas public:
24*becb03f3SHelena Kotas   DirectXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
25*becb03f3SHelena Kotas       : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
26*becb03f3SHelena Kotas 
27*becb03f3SHelena Kotas   llvm::Type *getHLSLType(CodeGenModule &CGM, const Type *T) const override;
28*becb03f3SHelena Kotas };
29*becb03f3SHelena Kotas 
30*becb03f3SHelena Kotas llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(CodeGenModule &CGM,
31*becb03f3SHelena Kotas                                                   const Type *Ty) const {
32*becb03f3SHelena Kotas   auto *BuiltinTy = dyn_cast<BuiltinType>(Ty);
33*becb03f3SHelena Kotas   if (!BuiltinTy || BuiltinTy->getKind() != BuiltinType::HLSLResource)
34*becb03f3SHelena Kotas     return nullptr;
35*becb03f3SHelena Kotas 
36*becb03f3SHelena Kotas   llvm::LLVMContext &Ctx = CGM.getLLVMContext();
37*becb03f3SHelena Kotas   // FIXME: translate __hlsl_resource_t to target("dx.TypedBuffer", <4 x float>,
38*becb03f3SHelena Kotas   // 1, 0, 0) only for now (RWBuffer<float4>); more work us needed to determine
39*becb03f3SHelena Kotas   // the target ext type and its parameters based on the handle type
40*becb03f3SHelena Kotas   // attributes (not yet implemented)
41*becb03f3SHelena Kotas   llvm::FixedVectorType *ElemType =
42*becb03f3SHelena Kotas       llvm::FixedVectorType::get(llvm::Type::getFloatTy(Ctx), 4);
43*becb03f3SHelena Kotas   unsigned Flags[] = {/*IsWriteable*/ 1, /*IsROV*/ 0, /*IsSigned*/ 0};
44*becb03f3SHelena Kotas   return llvm::TargetExtType::get(Ctx, "dx.TypedBuffer", {ElemType}, Flags);
45*becb03f3SHelena Kotas }
46*becb03f3SHelena Kotas 
47*becb03f3SHelena Kotas } // namespace
48*becb03f3SHelena Kotas 
49*becb03f3SHelena Kotas std::unique_ptr<TargetCodeGenInfo>
50*becb03f3SHelena Kotas CodeGen::createDirectXTargetCodeGenInfo(CodeGenModule &CGM) {
51*becb03f3SHelena Kotas   return std::make_unique<DirectXTargetCodeGenInfo>(CGM.getTypes());
52*becb03f3SHelena Kotas }
53