Skip to content

Commit d92bac8

Browse files
authored
[HLSL] Introduce address space hlsl_constant(2) for constant buffer declarations (#123411)
Introduces a new address space `hlsl_constant(2)` for constant buffer declarations. This address space is applied to declarations inside `cbuffer` block. Later on, it will also be applied to `ConstantBuffer<T>` syntax and the default `$Globals` constant buffer. Clang codegen translates constant buffer declarations to global variables and loads from `hlsl_constant(2)` address space. More work coming soon will include addition of metadata that will map these globals to individual constant buffers and enable their transformation to appropriate constant buffer load intrinsics later on in an LLVM pass. Fixes #123406
1 parent 1b4bd4e commit d92bac8

24 files changed

+148
-155
lines changed

clang/include/clang/Basic/AddressSpaces.h

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ enum class LangAS : unsigned {
5858

5959
// HLSL specific address spaces.
6060
hlsl_groupshared,
61+
hlsl_constant,
6162

6263
// Wasm specific address spaces.
6364
wasm_funcref,

clang/lib/AST/TypePrinter.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -2552,10 +2552,12 @@ std::string Qualifiers::getAddrSpaceAsString(LangAS AS) {
25522552
return "__uptr __ptr32";
25532553
case LangAS::ptr64:
25542554
return "__ptr64";
2555-
case LangAS::wasm_funcref:
2556-
return "__funcref";
25572555
case LangAS::hlsl_groupshared:
25582556
return "groupshared";
2557+
case LangAS::hlsl_constant:
2558+
return "hlsl_constant";
2559+
case LangAS::wasm_funcref:
2560+
return "__funcref";
25592561
default:
25602562
return std::to_string(toTargetAddressSpace(AS));
25612563
}

clang/lib/Basic/Targets/AArch64.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static const unsigned ARM64AddrSpaceMap[] = {
4444
static_cast<unsigned>(AArch64AddrSpace::ptr32_uptr),
4545
static_cast<unsigned>(AArch64AddrSpace::ptr64),
4646
0, // hlsl_groupshared
47+
0, // hlsl_constant
4748
// Wasm address space values for this target are dummy values,
4849
// as it is only enabled for Wasm targets.
4950
20, // wasm_funcref

clang/lib/Basic/Targets/AMDGPU.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
5959
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr32_uptr
6060
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64
6161
llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared
62+
llvm::AMDGPUAS::CONSTANT_ADDRESS, // hlsl_constant
6263
};
6364

6465
const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
@@ -74,16 +75,16 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
7475
llvm::AMDGPUAS::CONSTANT_ADDRESS, // cuda_constant
7576
llvm::AMDGPUAS::LOCAL_ADDRESS, // cuda_shared
7677
// SYCL address space values for this map are dummy
77-
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_global
78-
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_global_device
79-
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_global_host
80-
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_local
81-
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_private
82-
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr32_sptr
83-
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr32_uptr
84-
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64
85-
llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared
86-
78+
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_global
79+
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_global_device
80+
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_global_host
81+
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_local
82+
llvm::AMDGPUAS::FLAT_ADDRESS, // sycl_private
83+
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr32_sptr
84+
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr32_uptr
85+
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64
86+
llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared
87+
llvm::AMDGPUAS::CONSTANT_ADDRESS, // hlsl_constant
8788
};
8889
} // namespace targets
8990
} // namespace clang

clang/lib/Basic/Targets/DirectX.h

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static const unsigned DirectXAddrSpaceMap[] = {
4242
0, // ptr32_uptr
4343
0, // ptr64
4444
3, // hlsl_groupshared
45+
2, // hlsl_constant
4546
// Wasm address space values for this target are dummy values,
4647
// as it is only enabled for Wasm targets.
4748
20, // wasm_funcref

clang/lib/Basic/Targets/NVPTX.h

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ static const unsigned NVPTXAddrSpaceMap[] = {
4646
0, // ptr32_uptr
4747
0, // ptr64
4848
0, // hlsl_groupshared
49+
0, // hlsl_constant
4950
// Wasm address space values for this target are dummy values,
5051
// as it is only enabled for Wasm targets.
5152
20, // wasm_funcref

clang/lib/Basic/Targets/SPIR.h

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ static const unsigned SPIRDefIsPrivMap[] = {
4747
0, // ptr32_uptr
4848
0, // ptr64
4949
0, // hlsl_groupshared
50+
2, // hlsl_constant
5051
// Wasm address space values for this target are dummy values,
5152
// as it is only enabled for Wasm targets.
5253
20, // wasm_funcref
@@ -80,6 +81,7 @@ static const unsigned SPIRDefIsGenMap[] = {
8081
0, // ptr32_uptr
8182
0, // ptr64
8283
0, // hlsl_groupshared
84+
0, // hlsl_constant
8385
// Wasm address space values for this target are dummy values,
8486
// as it is only enabled for Wasm targets.
8587
20, // wasm_funcref

clang/lib/Basic/Targets/SystemZ.h

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static const unsigned ZOSAddressMap[] = {
4242
1, // ptr32_uptr
4343
0, // ptr64
4444
0, // hlsl_groupshared
45+
0, // hlsl_constant
4546
0 // wasm_funcref
4647
};
4748

clang/lib/Basic/Targets/TCE.h

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ static const unsigned TCEOpenCLAddrSpaceMap[] = {
5151
0, // ptr32_uptr
5252
0, // ptr64
5353
0, // hlsl_groupshared
54+
0, // hlsl_constant
5455
// Wasm address space values for this target are dummy values,
5556
// as it is only enabled for Wasm targets.
5657
20, // wasm_funcref

clang/lib/Basic/Targets/WebAssembly.h

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static const unsigned WebAssemblyAddrSpaceMap[] = {
4242
0, // ptr32_uptr
4343
0, // ptr64
4444
0, // hlsl_groupshared
45+
0, // hlsl_constant
4546
20, // wasm_funcref
4647
};
4748

clang/lib/Basic/Targets/X86.h

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ static const unsigned X86AddrSpaceMap[] = {
4646
271, // ptr32_uptr
4747
272, // ptr64
4848
0, // hlsl_groupshared
49+
0, // hlsl_constant
4950
// Wasm address space values for this target are dummy values,
5051
// as it is only enabled for Wasm targets.
5152
20, // wasm_funcref

clang/lib/CodeGen/CGHLSLRuntime.cpp

+1-16
Original file line numberDiff line numberDiff line change
@@ -100,22 +100,6 @@ GlobalVariable *replaceBuffer(CGHLSLRuntime::Buffer &Buf) {
100100
llvm::formatv("{0}{1}", Buf.Name, Buf.IsCBuffer ? ".cb." : ".tb."),
101101
GlobalValue::NotThreadLocal);
102102

103-
IRBuilder<> B(CBGV->getContext());
104-
Value *ZeroIdx = B.getInt32(0);
105-
// Replace Const use with CB use.
106-
for (auto &[GV, Offset] : Buf.Constants) {
107-
Value *GEP =
108-
B.CreateGEP(Buf.LayoutStruct, CBGV, {ZeroIdx, B.getInt32(Offset)});
109-
110-
assert(Buf.LayoutStruct->getElementType(Offset) == GV->getValueType() &&
111-
"constant type mismatch");
112-
113-
// Replace.
114-
GV->replaceAllUsesWith(GEP);
115-
// Erase GV.
116-
GV->removeDeadConstantUsers();
117-
GV->eraseFromParent();
118-
}
119103
return CBGV;
120104
}
121105

@@ -144,6 +128,7 @@ void CGHLSLRuntime::addConstant(VarDecl *D, Buffer &CB) {
144128
}
145129

146130
auto *GV = cast<GlobalVariable>(CGM.GetAddrOfGlobalVar(D));
131+
GV->setExternallyInitialized(true);
147132
// Add debug info for constVal.
148133
if (CGDebugInfo *DI = CGM.getModuleDebugInfo())
149134
if (CGM.getCodeGenOpts().getDebugInfo() >=

clang/lib/Sema/SemaHLSL.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "clang/Basic/IdentifierTable.h"
2626
#include "clang/Basic/LLVM.h"
2727
#include "clang/Basic/SourceLocation.h"
28+
#include "clang/Basic/Specifiers.h"
2829
#include "clang/Basic/TargetInfo.h"
2930
#include "clang/Sema/Initialization.h"
3031
#include "clang/Sema/ParsedAttr.h"
@@ -475,14 +476,20 @@ void createHostLayoutStructForBuffer(Sema &S, HLSLBufferDecl *BufDecl) {
475476
LS->setImplicit(true);
476477
LS->startDefinition();
477478

478-
for (const Decl *D : BufDecl->decls()) {
479-
const VarDecl *VD = dyn_cast<VarDecl>(D);
479+
for (Decl *D : BufDecl->decls()) {
480+
VarDecl *VD = dyn_cast<VarDecl>(D);
480481
if (!VD || VD->getStorageClass() == SC_Static)
481482
continue;
482483
const Type *Ty = VD->getType()->getUnqualifiedDesugaredType();
483484
if (FieldDecl *FD =
484-
createFieldForHostLayoutStruct(S, Ty, VD->getIdentifier(), LS))
485+
createFieldForHostLayoutStruct(S, Ty, VD->getIdentifier(), LS)) {
486+
// add the field decl to the layout struct
485487
LS->addDecl(FD);
488+
// update address space of the original decl to hlsl_constant
489+
QualType NewTy =
490+
AST.getAddrSpaceQualType(VD->getType(), LangAS::hlsl_constant);
491+
VD->setType(NewTy);
492+
}
486493
}
487494
LS->completeDefinition();
488495
BufDecl->addDecl(LS);

clang/test/AST/HLSL/ast-dump-comment-cbuffer-tbuffer.hlsl

-62
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// RUN: %clang_cc1 -Wdocumentation -ast-dump=json -x hlsl -triple dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefix=JSON
2+
// RUN: %clang_cc1 -Wdocumentation -ast-dump -x hlsl -triple dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefix=AST
3+
4+
// JSON:"kind": "HLSLBufferDecl",
5+
// JSON:"name": "A",
6+
// JSON-NEXT:"bufferKind": "cbuffer",
7+
// JSON:"kind": "TextComment",
8+
// JSON:"text": " CBuffer decl."
9+
10+
/// CBuffer decl.
11+
cbuffer A {
12+
// JSON: "kind": "VarDecl",
13+
// JSON: "name": "a",
14+
// JSON: "qualType": "hlsl_constant float"
15+
float a;
16+
// JSON: "kind": "VarDecl",
17+
// JSON: "name": "b",
18+
// JSON: "qualType": "hlsl_constant int"
19+
int b;
20+
}
21+
22+
// AST: HLSLBufferDecl {{.*}} line:11:9 cbuffer A
23+
// AST-NEXT: HLSLResourceClassAttr {{.*}} Implicit CBuffer
24+
// AST-NEXT: HLSLResourceAttr {{.*}} Implicit CBuffer
25+
// AST-NEXT: FullComment
26+
// AST-NEXT: ParagraphComment
27+
// AST-NEXT: TextComment {{.*}} Text=" CBuffer decl."
28+
// AST-NEXT: VarDecl {{.*}} a 'hlsl_constant float'
29+
// AST-NEXT: VarDecl {{.*}} b 'hlsl_constant int'
30+
// AST-NEXT: CXXRecordDecl {{.*}} implicit class __layout_A definition
31+
// AST: FieldDecl {{.*}} a 'float'
32+
// AST-NEXT: FieldDecl {{.*}} b 'int'

clang/test/AST/HLSL/cbuffer.hlsl

+12-12
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ struct TwoFloats {
4848
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
4949
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
5050
cbuffer CB {
51-
// CHECK: VarDecl {{.*}} col:9 used a1 'float'
51+
// CHECK: VarDecl {{.*}} col:9 used a1 'hlsl_constant float'
5252
float a1;
5353
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB definition
5454
// CHECK: FieldDecl {{.*}} a1 'float'
@@ -60,15 +60,15 @@ _Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(OneFloat, __layout
6060
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
6161
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
6262
cbuffer CB {
63-
// CHECK: VarDecl {{.*}} col:9 used a2 'float'
63+
// CHECK: VarDecl {{.*}} col:9 used a2 'hlsl_constant float'
6464
float a2;
6565
// CHECK: VarDecl {{.*}} col:19 b2 'RWBuffer<float>':'hlsl::RWBuffer<float>'
6666
RWBuffer<float> b2;
6767
// CHECK: VarDecl {{.*}} col:15 c2 'EmptyStruct'
6868
EmptyStruct c2;
6969
// CHECK: VarDecl {{.*}} col:9 d2 'float[0]'
7070
float d2[0];
71-
// CHECK: VarDecl {{.*}} col:9 e2 'float'
71+
// CHECK: VarDecl {{.*}} col:9 e2 'hlsl_constant float'
7272
float e2;
7373
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_1 definition
7474
// CHECK: FieldDecl {{.*}} a2 'float'
@@ -81,11 +81,11 @@ _Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(TwoFloats, __layou
8181
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
8282
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
8383
cbuffer CB {
84-
// CHECK: VarDecl {{.*}} col:5 used s1 'A'
84+
// CHECK: VarDecl {{.*}} col:5 used s1 'hlsl_constant A'
8585
A s1;
86-
// CHECK: VarDecl {{.*}} col:5 s2 'B'
86+
// CHECK: VarDecl {{.*}} col:5 s2 'hlsl_constant B'
8787
B s2;
88-
// CHECK: VarDecl {{.*}} col:12 s3 'CTypedef':'C
88+
// CHECK: VarDecl {{.*}} col:12 s3 'CTypedef':'C'
8989
CTypedef s3;
9090
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_2 definition
9191
// CHECK: FieldDecl {{.*}} s1 'A'
@@ -102,7 +102,7 @@ _Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(TwoFloats, __layou
102102
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
103103
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
104104
cbuffer CB {
105-
// CHECK: VarDecl {{.*}} s4 'D'
105+
// CHECK: VarDecl {{.*}} s4 'hlsl_constant D'
106106
D s4;
107107
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_3 definition
108108
// CHECK: FieldDecl {{.*}} s4 '__layout_D'
@@ -120,9 +120,9 @@ _Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(TwoFloats, __layou
120120
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
121121
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
122122
cbuffer CB {
123-
// CHECK: VarDecl {{.*}} s5 'E'
123+
// CHECK: VarDecl {{.*}} s5 'hlsl_constant E'
124124
E s5;
125-
// CHECK: VarDecl {{.*}} s6 'BTypedef':'B'
125+
// CHECK: VarDecl {{.*}} s6 'hlsl_constant BTypedef':'hlsl_constant B'
126126
BTypedef s6;
127127
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_4 definition
128128
// CHECK: FieldDecl {{.*}} s5 '__layout_E'
@@ -158,7 +158,7 @@ cbuffer CB {
158158
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
159159
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
160160
cbuffer CB {
161-
// CHECK: VarDecl {{.*}} s8 'F'
161+
// CHECK: VarDecl {{.*}} s8 'hlsl_constant F'
162162
F s8;
163163
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_6 definition
164164
// CHECK: FieldDecl {{.*}} s8 '__layout_F'
@@ -182,15 +182,15 @@ cbuffer CB {
182182
// CHECK: FieldDecl {{.*}} f 'RWBuffer<float>':'hlsl::RWBuffer<float>'
183183
RWBuffer<float> f;
184184
} s9;
185-
// CHECK: VarDecl {{.*}} s9 'struct (unnamed struct at {{.*}}cbuffer.hlsl:177:3
185+
// CHECK: VarDecl {{.*}} s9 'hlsl_constant struct (unnamed struct at {{.*}}cbuffer.hlsl:177:3
186186
// CHECK: CXXRecordDecl {{.*}} struct definition
187187
struct {
188188
// CHECK: FieldDecl {{.*}} g 'float'
189189
float g;
190190
// CHECK: FieldDecl {{.*}} f 'RWBuffer<float>':'hlsl::RWBuffer<float>'
191191
RWBuffer<float> f;
192192
} s10;
193-
// CHECK: VarDecl {{.*}} s10 'struct (unnamed struct at {{.*}}cbuffer.hlsl:187:3
193+
// CHECK: VarDecl {{.*}} s10 'hlsl_constant struct (unnamed struct at {{.*}}cbuffer.hlsl:187:3
194194
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_anon definition
195195
// CHECK: FieldDecl {{.*}} e 'float'
196196
// CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_anon_1 definition

0 commit comments

Comments
 (0)