Skip to content

Commit

Permalink
[DirectX] Add DirectXTargetCodeGenInfo (llvm#104856)
Browse files Browse the repository at this point in the history
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 llvm#95952
  • Loading branch information
hekota authored Sep 10, 2024
1 parent 5b4100c commit becb03f
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/lib/CodeGen/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ add_clang_library(clangCodeGen
Targets/AVR.cpp
Targets/BPF.cpp
Targets/CSKY.cpp
Targets/DirectX.cpp
Targets/Hexagon.cpp
Targets/Lanai.cpp
Targets/LoongArch.cpp
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,8 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
case llvm::Triple::spirv32:
case llvm::Triple::spirv64:
return createSPIRVTargetCodeGenInfo(CGM);
case llvm::Triple::dxil:
return createDirectXTargetCodeGenInfo(CGM);
case llvm::Triple::ve:
return createVETargetCodeGenInfo(CGM);
case llvm::Triple::csky: {
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/CodeGen/TargetInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,9 @@ createTCETargetCodeGenInfo(CodeGenModule &CGM);
std::unique_ptr<TargetCodeGenInfo>
createVETargetCodeGenInfo(CodeGenModule &CGM);

std::unique_ptr<TargetCodeGenInfo>
createDirectXTargetCodeGenInfo(CodeGenModule &CGM);

enum class WebAssemblyABIKind {
MVP = 0,
ExperimentalMV = 1,
Expand Down
52 changes: 52 additions & 0 deletions clang/lib/CodeGen/Targets/DirectX.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
//===- 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());
}
9 changes: 9 additions & 0 deletions clang/test/CodeGenHLSL/builtins/hlsl_resource_t.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -O1 -o - %s | FileCheck %s

void foo(__hlsl_resource_t res);

// CHECK: define void @"?bar@@YAXU__hlsl_resource_t@@@Z"(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %[[PARAM:[a-zA-Z0-9]+]])
// CHECK: call void @"?foo@@YAXU__hlsl_resource_t@@@Z"(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %[[PARAM]])
void bar(__hlsl_resource_t a) {
foo(a);
}
4 changes: 4 additions & 0 deletions llvm/lib/IR/Type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,10 @@ static TargetTypeInfo getTargetTypeInfo(const TargetExtType *Ty) {
ScalableVectorType::get(Type::getInt8Ty(C), TotalNumElts));
}

// DirectX resources
if (Name.starts_with("dx."))
return TargetTypeInfo(PointerType::get(C, 0));

return TargetTypeInfo(Type::getVoidTy(C));
}

Expand Down

0 comments on commit becb03f

Please sign in to comment.