1 //===- DirectX.cpp---------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "ABIInfoImpl.h" 10 #include "TargetInfo.h" 11 #include "llvm/IR/DerivedTypes.h" 12 13 using namespace clang; 14 using namespace clang::CodeGen; 15 16 //===----------------------------------------------------------------------===// 17 // Target codegen info implementation for DirectX. 18 //===----------------------------------------------------------------------===// 19 20 namespace { 21 22 class DirectXTargetCodeGenInfo : public TargetCodeGenInfo { 23 public: 24 DirectXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) 25 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {} 26 27 llvm::Type *getHLSLType(CodeGenModule &CGM, const Type *T) const override; 28 }; 29 30 llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(CodeGenModule &CGM, 31 const Type *Ty) const { 32 auto *ResType = dyn_cast<HLSLAttributedResourceType>(Ty); 33 if (!ResType) 34 return nullptr; 35 36 llvm::LLVMContext &Ctx = CGM.getLLVMContext(); 37 const HLSLAttributedResourceType::Attributes &ResAttrs = ResType->getAttrs(); 38 switch (ResAttrs.ResourceClass) { 39 case llvm::dxil::ResourceClass::UAV: 40 case llvm::dxil::ResourceClass::SRV: { 41 // TypedBuffer and RawBuffer both need element type 42 QualType ContainedTy = ResType->getContainedType(); 43 if (ContainedTy.isNull()) 44 return nullptr; 45 46 // convert element type 47 llvm::Type *ElemType = CGM.getTypes().ConvertType(ContainedTy); 48 49 llvm::StringRef TypeName = 50 ResAttrs.RawBuffer ? "dx.RawBuffer" : "dx.TypedBuffer"; 51 SmallVector<unsigned, 3> Ints = {/*IsWriteable*/ ResAttrs.ResourceClass == 52 llvm::dxil::ResourceClass::UAV, 53 /*IsROV*/ ResAttrs.IsROV}; 54 if (!ResAttrs.RawBuffer) 55 Ints.push_back(/*IsSigned*/ ContainedTy->isSignedIntegerType()); 56 57 return llvm::TargetExtType::get(Ctx, TypeName, {ElemType}, Ints); 58 } 59 case llvm::dxil::ResourceClass::CBuffer: 60 llvm_unreachable("dx.CBuffer handles are not implemented yet"); 61 break; 62 case llvm::dxil::ResourceClass::Sampler: 63 llvm_unreachable("dx.Sampler handles are not implemented yet"); 64 break; 65 } 66 llvm_unreachable("Unknown llvm::dxil::ResourceClass enum"); 67 } 68 69 } // namespace 70 71 std::unique_ptr<TargetCodeGenInfo> 72 CodeGen::createDirectXTargetCodeGenInfo(CodeGenModule &CGM) { 73 return std::make_unique<DirectXTargetCodeGenInfo>(CGM.getTypes()); 74 } 75