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