Skip to content

Commit 01bc672

Browse files
spallefriedma-quic
andauthored
[HLSL] Desugar ConstantArrayType when calculating cbuffer field layout (#134683)
When calculating the layout for a cbuffer field, if that field is a ConstantArrayType, desguar it before casting it to a ConstantArrayType. Closes #134668 --------- Co-authored-by: Eli Friedman <[email protected]>
1 parent ad9f15a commit 01bc672

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

clang/lib/CodeGen/HLSLBufferLayoutBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ bool HLSLBufferLayoutBuilder::layoutField(const FieldDecl *FD,
195195
// Unwrap array to find the element type and get combined array size.
196196
QualType Ty = FieldTy;
197197
while (Ty->isConstantArrayType()) {
198-
const ConstantArrayType *ArrayTy = cast<ConstantArrayType>(Ty);
198+
auto *ArrayTy = CGM.getContext().getAsConstantArrayType(Ty);
199199
ArrayCount *= ArrayTy->getSExtSize();
200200
Ty = ArrayTy->getElementType();
201201
}

clang/test/CodeGenHLSL/cbuffer.hlsl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,19 @@ cbuffer CBArrays : register(b2) {
9999
// CHECK: @c7 = external addrspace(2) global [2 x i64], align 8
100100
// CHECK: @c8 = external addrspace(2) global [4 x i32], align 4
101101

102+
typedef uint32_t4 uint32_t8[2];
103+
typedef uint4 T1;
104+
typedef T1 T2[2]; // check a double typedef
105+
106+
cbuffer CBTypedefArray {
107+
uint32_t8 t1[2];
108+
T2 t2[2];
109+
}
110+
111+
// CHECK: @CBTypedefArray.cb = global target("dx.CBuffer", target("dx.Layout", %__cblayout_CBTypedefArray,
112+
// CHECK-SAME: 128, 0, 64))
113+
// CHECK: @t1 = external addrspace(2) global [2 x [2 x <4 x i32>]], align 16
114+
// CHECK: @t2 = external addrspace(2) global [2 x [2 x <4 x i32>]], align 16
102115
struct Empty {};
103116

104117
struct A {
@@ -278,7 +291,7 @@ void main() {
278291
// CHECK-NEXT: call void @_init_resource_CBScalars.cb()
279292
// CHECK-NEXT: call void @_init_resource_CBArrays.cb()
280293

281-
// CHECK: !hlsl.cbs = !{![[CBSCALARS:[0-9]+]], ![[CBVECTORS:[0-9]+]], ![[CBARRAYS:[0-9]+]], ![[CBSTRUCTS:[0-9]+]], ![[CBCLASSES:[0-9]+]],
294+
// CHECK: !hlsl.cbs = !{![[CBSCALARS:[0-9]+]], ![[CBVECTORS:[0-9]+]], ![[CBARRAYS:[0-9]+]], ![[CBTYPEDEFARRAY:[0-9]+]], ![[CBSTRUCTS:[0-9]+]], ![[CBCLASSES:[0-9]+]],
282295
// CHECK-SAME: ![[CBMIX:[0-9]+]], ![[CB_A:[0-9]+]], ![[CB_B:[0-9]+]], ![[CB_C:[0-9]+]]}
283296

284297
// CHECK: ![[CBSCALARS]] = !{ptr @CBScalars.cb, ptr addrspace(2) @a1, ptr addrspace(2) @a2, ptr addrspace(2) @a3, ptr addrspace(2) @a4,
@@ -290,6 +303,8 @@ void main() {
290303
// CHECK: ![[CBARRAYS]] = !{ptr @CBArrays.cb, ptr addrspace(2) @c1, ptr addrspace(2) @c2, ptr addrspace(2) @c3, ptr addrspace(2) @c4,
291304
// CHECK-SAME: ptr addrspace(2) @c5, ptr addrspace(2) @c6, ptr addrspace(2) @c7, ptr addrspace(2) @c8}
292305

306+
// CHECK: ![[CBTYPEDEFARRAY]] = !{ptr @CBTypedefArray.cb, ptr addrspace(2) @t1, ptr addrspace(2) @t2}
307+
293308
// CHECK: ![[CBSTRUCTS]] = !{ptr @CBStructs.cb, ptr addrspace(2) @a, ptr addrspace(2) @b, ptr addrspace(2) @c, ptr addrspace(2) @array_of_A,
294309
// CHECK-SAME: ptr addrspace(2) @d, ptr addrspace(2) @e, ptr addrspace(2) @f}
295310

0 commit comments

Comments
 (0)