Adds target codegen info class for DirectX. For now it always translates
`__hlsl_resource_t` handle to `target("dx.TypedBuffer", i32, 1, 0, 1)`
(`RWBuffer<int>`). More work is needed to determine the actual target
exp type and parameters based on the resource handle attributes.
Part 1/2 of #95952
53 lines
2.0 KiB
C++
53 lines
2.0 KiB
C++
//===- 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<DefaultABIInfo>(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<BuiltinType>(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<float4>); 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<TargetCodeGenInfo>
|
|
CodeGen::createDirectXTargetCodeGenInfo(CodeGenModule &CGM) {
|
|
return std::make_unique<DirectXTargetCodeGenInfo>(CGM.getTypes());
|
|
}
|