//===- DirectX.cpp---------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "ABIInfoImpl.h" #include "TargetInfo.h" #include "llvm/IR/DerivedTypes.h" using namespace clang; using namespace clang::CodeGen; //===----------------------------------------------------------------------===// // Target codegen info implementation for DirectX. //===----------------------------------------------------------------------===// namespace { class DirectXTargetCodeGenInfo : public TargetCodeGenInfo { public: DirectXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) : TargetCodeGenInfo(std::make_unique(CGT)) {} llvm::Type *getHLSLType(CodeGenModule &CGM, const Type *T) const override; }; llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(CodeGenModule &CGM, const Type *Ty) const { auto *BuiltinTy = dyn_cast(Ty); if (!BuiltinTy || BuiltinTy->getKind() != BuiltinType::HLSLResource) return nullptr; llvm::LLVMContext &Ctx = CGM.getLLVMContext(); // FIXME: translate __hlsl_resource_t to target("dx.TypedBuffer", <4 x float>, // 1, 0, 0) only for now (RWBuffer); more work us needed to determine // the target ext type and its parameters based on the handle type // attributes (not yet implemented) llvm::FixedVectorType *ElemType = llvm::FixedVectorType::get(llvm::Type::getFloatTy(Ctx), 4); unsigned Flags[] = {/*IsWriteable*/ 1, /*IsROV*/ 0, /*IsSigned*/ 0}; return llvm::TargetExtType::get(Ctx, "dx.TypedBuffer", {ElemType}, Flags); } } // namespace std::unique_ptr CodeGen::createDirectXTargetCodeGenInfo(CodeGenModule &CGM) { return std::make_unique(CGM.getTypes()); }