Skip to content

Commit becb03f

Browse files
authored
[DirectX] Add DirectXTargetCodeGenInfo (#104856)
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
1 parent 5b4100c commit becb03f

File tree

6 files changed

+71
-0
lines changed

6 files changed

+71
-0
lines changed

clang/lib/CodeGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ add_clang_library(clangCodeGen
122122
Targets/AVR.cpp
123123
Targets/BPF.cpp
124124
Targets/CSKY.cpp
125+
Targets/DirectX.cpp
125126
Targets/Hexagon.cpp
126127
Targets/Lanai.cpp
127128
Targets/LoongArch.cpp

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
298298
case llvm::Triple::spirv32:
299299
case llvm::Triple::spirv64:
300300
return createSPIRVTargetCodeGenInfo(CGM);
301+
case llvm::Triple::dxil:
302+
return createDirectXTargetCodeGenInfo(CGM);
301303
case llvm::Triple::ve:
302304
return createVETargetCodeGenInfo(CGM);
303305
case llvm::Triple::csky: {

clang/lib/CodeGen/TargetInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,9 @@ createTCETargetCodeGenInfo(CodeGenModule &CGM);
555555
std::unique_ptr<TargetCodeGenInfo>
556556
createVETargetCodeGenInfo(CodeGenModule &CGM);
557557

558+
std::unique_ptr<TargetCodeGenInfo>
559+
createDirectXTargetCodeGenInfo(CodeGenModule &CGM);
560+
558561
enum class WebAssemblyABIKind {
559562
MVP = 0,
560563
ExperimentalMV = 1,

clang/lib/CodeGen/Targets/DirectX.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//===- DirectX.cpp---------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "ABIInfoImpl.h"
10+
#include "TargetInfo.h"
11+
#include "llvm/IR/DerivedTypes.h"
12+
13+
using namespace clang;
14+
using namespace clang::CodeGen;
15+
16+
//===----------------------------------------------------------------------===//
17+
// Target codegen info implementation for DirectX.
18+
//===----------------------------------------------------------------------===//
19+
20+
namespace {
21+
22+
class DirectXTargetCodeGenInfo : public TargetCodeGenInfo {
23+
public:
24+
DirectXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
25+
: TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
26+
27+
llvm::Type *getHLSLType(CodeGenModule &CGM, const Type *T) const override;
28+
};
29+
30+
llvm::Type *DirectXTargetCodeGenInfo::getHLSLType(CodeGenModule &CGM,
31+
const Type *Ty) const {
32+
auto *BuiltinTy = dyn_cast<BuiltinType>(Ty);
33+
if (!BuiltinTy || BuiltinTy->getKind() != BuiltinType::HLSLResource)
34+
return nullptr;
35+
36+
llvm::LLVMContext &Ctx = CGM.getLLVMContext();
37+
// FIXME: translate __hlsl_resource_t to target("dx.TypedBuffer", <4 x float>,
38+
// 1, 0, 0) only for now (RWBuffer<float4>); more work us needed to determine
39+
// the target ext type and its parameters based on the handle type
40+
// attributes (not yet implemented)
41+
llvm::FixedVectorType *ElemType =
42+
llvm::FixedVectorType::get(llvm::Type::getFloatTy(Ctx), 4);
43+
unsigned Flags[] = {/*IsWriteable*/ 1, /*IsROV*/ 0, /*IsSigned*/ 0};
44+
return llvm::TargetExtType::get(Ctx, "dx.TypedBuffer", {ElemType}, Flags);
45+
}
46+
47+
} // namespace
48+
49+
std::unique_ptr<TargetCodeGenInfo>
50+
CodeGen::createDirectXTargetCodeGenInfo(CodeGenModule &CGM) {
51+
return std::make_unique<DirectXTargetCodeGenInfo>(CGM.getTypes());
52+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -O1 -o - %s | FileCheck %s
2+
3+
void foo(__hlsl_resource_t res);
4+
5+
// CHECK: define void @"?bar@@YAXU__hlsl_resource_t@@@Z"(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %[[PARAM:[a-zA-Z0-9]+]])
6+
// CHECK: call void @"?foo@@YAXU__hlsl_resource_t@@@Z"(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %[[PARAM]])
7+
void bar(__hlsl_resource_t a) {
8+
foo(a);
9+
}

llvm/lib/IR/Type.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,10 @@ static TargetTypeInfo getTargetTypeInfo(const TargetExtType *Ty) {
879879
ScalableVectorType::get(Type::getInt8Ty(C), TotalNumElts));
880880
}
881881

882+
// DirectX resources
883+
if (Name.starts_with("dx."))
884+
return TargetTypeInfo(PointerType::get(C, 0));
885+
882886
return TargetTypeInfo(Type::getVoidTy(C));
883887
}
884888

0 commit comments

Comments
 (0)