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