xref: /llvm-project/clang/lib/CodeGen/Targets/DirectX.cpp (revision cf5e295ec0e05058d0e10a3779fe4093d96074b2)
1becb03f3SHelena Kotas //===- DirectX.cpp---------------------------------------------------------===//
2becb03f3SHelena Kotas //
3becb03f3SHelena Kotas // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4becb03f3SHelena Kotas // See https://llvm.org/LICENSE.txt for license information.
5becb03f3SHelena Kotas // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6becb03f3SHelena Kotas //
7becb03f3SHelena Kotas //===----------------------------------------------------------------------===//
8becb03f3SHelena Kotas 
9becb03f3SHelena Kotas #include "ABIInfoImpl.h"
10becb03f3SHelena Kotas #include "TargetInfo.h"
11becb03f3SHelena Kotas #include "llvm/IR/DerivedTypes.h"
12becb03f3SHelena Kotas 
13becb03f3SHelena Kotas using namespace clang;
14becb03f3SHelena Kotas using namespace clang::CodeGen;
15becb03f3SHelena Kotas 
16becb03f3SHelena Kotas //===----------------------------------------------------------------------===//
17becb03f3SHelena Kotas // Target codegen info implementation for DirectX.
18becb03f3SHelena Kotas //===----------------------------------------------------------------------===//
19becb03f3SHelena Kotas 
20becb03f3SHelena Kotas namespace {
21becb03f3SHelena Kotas 
22becb03f3SHelena Kotas class DirectXTargetCodeGenInfo : public TargetCodeGenInfo {
23becb03f3SHelena Kotas public:
24becb03f3SHelena Kotas   DirectXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
25becb03f3SHelena Kotas       : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
26becb03f3SHelena Kotas 
27becb03f3SHelena Kotas   llvm::Type *getHLSLType(CodeGenModule &CGM, const Type *T) const override;
28becb03f3SHelena Kotas };
29becb03f3SHelena Kotas 
30becb03f3SHelena Kotas llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(CodeGenModule &CGM,
31becb03f3SHelena Kotas                                                   const Type *Ty) const {
323b451207SHelena Kotas   auto *ResType = dyn_cast<HLSLAttributedResourceType>(Ty);
333b451207SHelena Kotas   if (!ResType)
34becb03f3SHelena Kotas     return nullptr;
35becb03f3SHelena Kotas 
36becb03f3SHelena Kotas   llvm::LLVMContext &Ctx = CGM.getLLVMContext();
373b451207SHelena Kotas   const HLSLAttributedResourceType::Attributes &ResAttrs = ResType->getAttrs();
383b451207SHelena Kotas   switch (ResAttrs.ResourceClass) {
393b451207SHelena Kotas   case llvm::dxil::ResourceClass::UAV:
403b451207SHelena Kotas   case llvm::dxil::ResourceClass::SRV: {
413b451207SHelena Kotas     // TypedBuffer and RawBuffer both need element type
423b451207SHelena Kotas     QualType ContainedTy = ResType->getContainedType();
433b451207SHelena Kotas     if (ContainedTy.isNull())
443b451207SHelena Kotas       return nullptr;
453b451207SHelena Kotas 
463b451207SHelena Kotas     // convert element type
473b451207SHelena Kotas     llvm::Type *ElemType = CGM.getTypes().ConvertType(ContainedTy);
483b451207SHelena Kotas 
493b451207SHelena Kotas     llvm::StringRef TypeName =
503b451207SHelena Kotas         ResAttrs.RawBuffer ? "dx.RawBuffer" : "dx.TypedBuffer";
513b451207SHelena Kotas     SmallVector<unsigned, 3> Ints = {/*IsWriteable*/ ResAttrs.ResourceClass ==
523b451207SHelena Kotas                                          llvm::dxil::ResourceClass::UAV,
533b451207SHelena Kotas                                      /*IsROV*/ ResAttrs.IsROV};
543b451207SHelena Kotas     if (!ResAttrs.RawBuffer)
553b451207SHelena Kotas       Ints.push_back(/*IsSigned*/ ContainedTy->isSignedIntegerType());
563b451207SHelena Kotas 
573b451207SHelena Kotas     return llvm::TargetExtType::get(Ctx, TypeName, {ElemType}, Ints);
583b451207SHelena Kotas   }
593b451207SHelena Kotas   case llvm::dxil::ResourceClass::CBuffer:
603b451207SHelena Kotas     llvm_unreachable("dx.CBuffer handles are not implemented yet");
613b451207SHelena Kotas     break;
623b451207SHelena Kotas   case llvm::dxil::ResourceClass::Sampler:
633b451207SHelena Kotas     llvm_unreachable("dx.Sampler handles are not implemented yet");
643b451207SHelena Kotas     break;
653b451207SHelena Kotas   }
66*cf5e295eSSimon Pilgrim   llvm_unreachable("Unknown llvm::dxil::ResourceClass enum");
67becb03f3SHelena Kotas }
68becb03f3SHelena Kotas 
69becb03f3SHelena Kotas } // namespace
70becb03f3SHelena Kotas 
71becb03f3SHelena Kotas std::unique_ptr<TargetCodeGenInfo>
72becb03f3SHelena Kotas CodeGen::createDirectXTargetCodeGenInfo(CodeGenModule &CGM) {
73becb03f3SHelena Kotas   return std::make_unique<DirectXTargetCodeGenInfo>(CGM.getTypes());
74becb03f3SHelena Kotas }
75