Skip to content

Commit 7693442

Browse files
committed
[HLSL] Use hlsl_device address space for getpointer.
We add the hlsl_device address space to represent the device memory space as defined in section 1.7.1.3 of the [HLSL spec](https://microsoft.github.io/hlsl-specs/specs/hlsl.pdf). Fixes #127075
1 parent 4244a91 commit 7693442

20 files changed

+94
-56
lines changed

Diff for: clang/include/clang/Basic/AddressSpaces.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ enum class LangAS : unsigned {
6060
hlsl_groupshared,
6161
hlsl_constant,
6262
hlsl_private,
63+
hlsl_device,
6364

6465
// Wasm specific address spaces.
6566
wasm_funcref,

Diff for: clang/lib/AST/Type.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,12 @@ bool Qualifiers::isTargetAddressSpaceSupersetOf(LangAS A, LangAS B,
9494
(A == LangAS::Default &&
9595
(B == LangAS::cuda_constant || B == LangAS::cuda_device ||
9696
B == LangAS::cuda_shared)) ||
97-
// `this` overloading depending on address space is not ready,
98-
// so this is a hack to allow generating addrspacecasts.
99-
// IR legalization will be required when this address space is used.
97+
// In HLSL, the this pointer for member functions points to the default
98+
// address space. This causes a problem if the structure is in
99+
// a different address space. We want to allow casting from these
100+
// address spaces to default to work around this problem.
100101
(A == LangAS::Default && B == LangAS::hlsl_private) ||
102+
(A == LangAS::Default && B == LangAS::hlsl_device) ||
101103
// Conversions from target specific address spaces may be legal
102104
// depending on the target information.
103105
Ctx.getTargetInfo().isAddressSpaceSupersetOf(A, B);

Diff for: clang/lib/AST/TypePrinter.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -2583,6 +2583,8 @@ std::string Qualifiers::getAddrSpaceAsString(LangAS AS) {
25832583
return "hlsl_constant";
25842584
case LangAS::hlsl_private:
25852585
return "hlsl_private";
2586+
case LangAS::hlsl_device:
2587+
return "hlsl_device";
25862588
case LangAS::wasm_funcref:
25872589
return "__funcref";
25882590
default:

Diff for: clang/lib/Basic/Targets/AArch64.h

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

Diff for: clang/lib/Basic/Targets/AMDGPU.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
6363
// FIXME(pr/122103): hlsl_private -> PRIVATE is wrong, but at least this
6464
// will break loudly.
6565
llvm::AMDGPUAS::PRIVATE_ADDRESS, // hlsl_private
66+
llvm::AMDGPUAS::GLOBAL_ADDRESS, // hlsl_device
6667
};
6768

6869
const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
@@ -89,6 +90,7 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
8990
llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared
9091
llvm::AMDGPUAS::CONSTANT_ADDRESS, // hlsl_constant
9192
llvm::AMDGPUAS::PRIVATE_ADDRESS, // hlsl_private
93+
llvm::AMDGPUAS::GLOBAL_ADDRESS, // hlsl_device
9294
};
9395
} // namespace targets
9496
} // namespace clang

Diff for: clang/lib/Basic/Targets/DirectX.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static const unsigned DirectXAddrSpaceMap[] = {
4444
3, // hlsl_groupshared
4545
2, // hlsl_constant
4646
0, // hlsl_private
47+
0, // hlsl_device
4748
// Wasm address space values for this target are dummy values,
4849
// as it is only enabled for Wasm targets.
4950
20, // wasm_funcref

Diff for: clang/lib/Basic/Targets/NVPTX.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static const unsigned NVPTXAddrSpaceMap[] = {
4848
0, // hlsl_groupshared
4949
0, // hlsl_constant
5050
0, // hlsl_private
51+
0, // hlsl_device
5152
// Wasm address space values for this target are dummy values,
5253
// as it is only enabled for Wasm targets.
5354
20, // wasm_funcref

Diff for: clang/lib/Basic/Targets/SPIR.h

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ static const unsigned SPIRDefIsPrivMap[] = {
4949
0, // hlsl_groupshared
5050
2, // hlsl_constant
5151
10, // hlsl_private
52+
11, // hlsl_device
5253
// Wasm address space values for this target are dummy values,
5354
// as it is only enabled for Wasm targets.
5455
20, // wasm_funcref
@@ -84,6 +85,7 @@ static const unsigned SPIRDefIsGenMap[] = {
8485
0, // hlsl_groupshared
8586
0, // hlsl_constant
8687
10, // hlsl_private
88+
11, // hlsl_device
8789
// Wasm address space values for this target are dummy values,
8890
// as it is only enabled for Wasm targets.
8991
20, // wasm_funcref

Diff for: clang/lib/Basic/Targets/SystemZ.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static const unsigned ZOSAddressMap[] = {
4444
0, // hlsl_groupshared
4545
0, // hlsl_constant
4646
0, // hlsl_private
47+
0, // hlsl_device
4748
0 // wasm_funcref
4849
};
4950

Diff for: clang/lib/Basic/Targets/TCE.h

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ static const unsigned TCEOpenCLAddrSpaceMap[] = {
5353
0, // hlsl_groupshared
5454
0, // hlsl_constant
5555
0, // hlsl_private
56+
0, // hlsl_device
5657
// Wasm address space values for this target are dummy values,
5758
// as it is only enabled for Wasm targets.
5859
20, // wasm_funcref

Diff for: clang/lib/Basic/Targets/WebAssembly.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ static const unsigned WebAssemblyAddrSpaceMap[] = {
4444
0, // hlsl_groupshared
4545
0, // hlsl_constant
4646
0, // hlsl_private
47+
0, // hlsl_device
4748
20, // wasm_funcref
4849
};
4950

Diff for: clang/lib/Basic/Targets/X86.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static const unsigned X86AddrSpaceMap[] = {
4848
0, // hlsl_groupshared
4949
0, // hlsl_constant
5050
0, // hlsl_private
51+
0, // hlsl_device
5152
// Wasm address space values for this target are dummy values,
5253
// as it is only enabled for Wasm targets.
5354
20, // wasm_funcref

Diff for: clang/lib/CodeGen/CGHLSLBuiltins.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
280280
Value *HandleOp = EmitScalarExpr(E->getArg(0));
281281
Value *IndexOp = EmitScalarExpr(E->getArg(1));
282282

283-
// TODO: Map to an hlsl_device address space.
284-
llvm::Type *RetTy = llvm::PointerType::getUnqual(getLLVMContext());
285-
283+
llvm::Type *RetTy = ConvertType(E->getType());
286284
return Builder.CreateIntrinsic(
287285
RetTy, CGM.getHLSLRuntime().getCreateResourceGetPointerIntrinsic(),
288286
ArrayRef<Value *>{HandleOp, IndexOp});

Diff for: clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp

+14-7
Original file line numberDiff line numberDiff line change
@@ -751,13 +751,14 @@ BuiltinTypeDeclBuilder::addHandleAccessFunction(DeclarationName &Name,
751751
using PH = BuiltinTypeMethodBuilder::PlaceHolder;
752752

753753
QualType ElemTy = getHandleElementType();
754-
// TODO: Map to an hlsl_device address space.
755-
QualType ElemPtrTy = AST.getPointerType(ElemTy);
756-
QualType ReturnTy = ElemTy;
754+
QualType AddrSpaceElemTy =
755+
AST.getAddrSpaceQualType(ElemTy, LangAS::hlsl_device);
756+
QualType ElemPtrTy = AST.getPointerType(AddrSpaceElemTy);
757+
// QualType ReturnTy = (IsRef ? AST.getLValueReferenceType(ElemTy) : ElemTy);
758+
QualType ReturnTy =
759+
(IsRef ? AST.getLValueReferenceType(AddrSpaceElemTy) : ElemTy);
757760
if (IsConst)
758761
ReturnTy.addConst();
759-
if (IsRef)
760-
ReturnTy = AST.getLValueReferenceType(ReturnTy);
761762

762763
return BuiltinTypeMethodBuilder(*this, Name, ReturnTy, IsConst)
763764
.addParam("Index", AST.UnsignedIntTy)
@@ -771,12 +772,15 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addAppendMethod() {
771772
using PH = BuiltinTypeMethodBuilder::PlaceHolder;
772773
ASTContext &AST = SemaRef.getASTContext();
773774
QualType ElemTy = getHandleElementType();
775+
QualType AddrSpaceElemTy =
776+
AST.getAddrSpaceQualType(ElemTy, LangAS::hlsl_device);
774777
return BuiltinTypeMethodBuilder(*this, "Append", AST.VoidTy)
775778
.addParam("value", ElemTy)
776779
.callBuiltin("__builtin_hlsl_buffer_update_counter", AST.UnsignedIntTy,
777780
PH::Handle, getConstantIntExpr(1))
778781
.callBuiltin("__builtin_hlsl_resource_getpointer",
779-
AST.getPointerType(ElemTy), PH::Handle, PH::LastStmt)
782+
AST.getPointerType(AddrSpaceElemTy), PH::Handle,
783+
PH::LastStmt)
780784
.dereference(PH::LastStmt)
781785
.assign(PH::LastStmt, PH::_0)
782786
.finalize();
@@ -786,11 +790,14 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addConsumeMethod() {
786790
using PH = BuiltinTypeMethodBuilder::PlaceHolder;
787791
ASTContext &AST = SemaRef.getASTContext();
788792
QualType ElemTy = getHandleElementType();
793+
QualType AddrSpaceElemTy =
794+
AST.getAddrSpaceQualType(ElemTy, LangAS::hlsl_device);
789795
return BuiltinTypeMethodBuilder(*this, "Consume", ElemTy)
790796
.callBuiltin("__builtin_hlsl_buffer_update_counter", AST.UnsignedIntTy,
791797
PH::Handle, getConstantIntExpr(-1))
792798
.callBuiltin("__builtin_hlsl_resource_getpointer",
793-
AST.getPointerType(ElemTy), PH::Handle, PH::LastStmt)
799+
AST.getPointerType(AddrSpaceElemTy), PH::Handle,
800+
PH::LastStmt)
794801
.dereference(PH::LastStmt)
795802
.finalize();
796803
}

Diff for: clang/lib/Sema/SemaHLSL.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -2379,8 +2379,10 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
23792379
auto *ResourceTy =
23802380
TheCall->getArg(0)->getType()->castAs<HLSLAttributedResourceType>();
23812381
QualType ContainedTy = ResourceTy->getContainedType();
2382-
// TODO: Map to an hlsl_device address space.
2383-
TheCall->setType(getASTContext().getPointerType(ContainedTy));
2382+
auto returnType =
2383+
SemaRef.Context.getAddrSpaceQualType(ContainedTy, LangAS::hlsl_device);
2384+
returnType = SemaRef.Context.getPointerType(returnType);
2385+
TheCall->setType(returnType);
23842386
TheCall->setValueKind(VK_LValue);
23852387

23862388
break;

Diff for: clang/test/AST/HLSL/OutArgExpr.hlsl

+7-7
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,21 @@ void zero(out int Z) { Z = 0; }
3030
// AST-NEXT: ImplicitCastExpr {{.*}} 'void (*)(inout int)' <FunctionToPointerDecay>
3131
// AST-NEXT: DeclRefExpr {{.*}} 'void (inout int)' lvalue Function
3232
// AST-NEXT: HLSLOutArgExpr {{.*}} 'int' lvalue inout
33-
// AST-NEXT: OpaqueValueExpr [[LVOpV:0x[0-9a-fA-F]+]] {{.*}} 'float' lvalue
34-
// AST-NEXT: CXXOperatorCallExpr {{.*}} 'float' lvalue '[]'
35-
// AST-NEXT: ImplicitCastExpr {{.*}} 'float &(*)(unsigned int)' <FunctionToPointerDecay>
36-
// AST-NEXT: DeclRefExpr {{.*}} 'float &(unsigned int)' lvalue CXXMethod {{.*}} 'operator[]' 'float &(unsigned int)'
33+
// AST-NEXT: OpaqueValueExpr [[LVOpV:0x[0-9a-fA-F]+]] {{.*}} 'hlsl_device float' lvalue
34+
// AST-NEXT: CXXOperatorCallExpr {{.*}} 'hlsl_device float' lvalue '[]'
35+
// AST-NEXT: ImplicitCastExpr {{.*}} 'hlsl_device float &(*)(unsigned int)' <FunctionToPointerDecay>
36+
// AST-NEXT: DeclRefExpr {{.*}} 'hlsl_device float &(unsigned int)' lvalue CXXMethod {{.*}} 'operator[]' 'hlsl_device float &(unsigned int)'
3737
// AST-NEXT: DeclRefExpr {{.*}} 'RWBuffer<float>':'hlsl::RWBuffer<float>' lvalue Var {{.*}} 'Buf' 'RWBuffer<float>':'hlsl::RWBuffer<float>'
3838
// AST-NEXT: ImplicitCastExpr {{.*}} 'uint':'unsigned int' <LValueToRValue>
3939
// AST-NEXT: DeclRefExpr {{.*}} 'uint':'unsigned int' lvalue ParmVar {{.*}} 'GI' 'uint':'unsigned int'
4040

4141
// AST-NEXT: OpaqueValueExpr [[TmpOpV:0x[0-9a-fA-F]+]] {{.*}} 'int' lvalue
4242
// AST-NEXT: ImplicitCastExpr {{.*}} 'int' <FloatingToIntegral>
4343
// AST-NEXT: ImplicitCastExpr {{.*}} 'float' <LValueToRValue>
44-
// AST-NEXT: OpaqueValueExpr [[LVOpV]] <col:15, col:21> 'float' lvalue
44+
// AST-NEXT: OpaqueValueExpr [[LVOpV]] <col:15, col:21> 'hlsl_device float' lvalue
4545

46-
// AST: BinaryOperator {{.*}} 'float' lvalue '='
47-
// AST-NEXT: OpaqueValueExpr [[LVOpV]] {{.*}} 'float' lvalue
46+
// AST: BinaryOperator {{.*}} 'hlsl_device float' lvalue '='
47+
// AST-NEXT: OpaqueValueExpr [[LVOpV]] {{.*}} 'hlsl_device float' lvalue
4848
// AST: ImplicitCastExpr {{.*}} 'float' <IntegralToFloating>
4949
// AST-NEXT: ImplicitCastExpr {{.*}} 'int' <LValueToRValue>
5050
// AST-NEXT: OpaqueValueExpr [[TmpOpV]] {{.*}} 'int' lvalue

Diff for: clang/test/AST/HLSL/StructuredBuffers-AST.hlsl

+15-15
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,12 @@ RESOURCE<float> Buffer;
8989
// CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]]
9090
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
9191

92-
// CHECK-SUBSCRIPT: CXXMethodDecl {{.*}} operator[] 'const element_type &(unsigned int) const'
92+
// CHECK-SUBSCRIPT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &const (unsigned int) const'
9393
// CHECK-SUBSCRIPT-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
9494
// CHECK-SUBSCRIPT-NEXT: CompoundStmt
9595
// CHECK-SUBSCRIPT-NEXT: ReturnStmt
96-
// CHECK-SUBSCRIPT-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
97-
// CHECK-SUBSCRIPT-NEXT: CallExpr {{.*}} 'element_type *'
96+
// CHECK-SUBSCRIPT-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
97+
// CHECK-SUBSCRIPT-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
9898
// CHECK-SUBSCRIPT-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
9999
// CHECK-SUBSCRIPT-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
100100
// CHECK-SUBSCRIPT-SAME{LITERAL}: [[hlsl::resource_class(
@@ -105,12 +105,12 @@ RESOURCE<float> Buffer;
105105
// CHECK-SUBSCRIPT-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
106106
// CHECK-SUBSCRIPT-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
107107

108-
// CHECK-SUBSCRIPT-NEXT: CXXMethodDecl {{.*}} operator[] 'element_type &(unsigned int)'
108+
// CHECK-SUBSCRIPT-NEXT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &(unsigned int)'
109109
// CHECK-SUBSCRIPT-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
110110
// CHECK-SUBSCRIPT-NEXT: CompoundStmt
111111
// CHECK-SUBSCRIPT-NEXT: ReturnStmt
112-
// CHECK-SUBSCRIPT-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
113-
// CHECK-SUBSCRIPT-NEXT: CallExpr {{.*}} 'element_type *'
112+
// CHECK-SUBSCRIPT-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
113+
// CHECK-SUBSCRIPT-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
114114
// CHECK-SUBSCRIPT-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
115115
// CHECK-SUBSCRIPT-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
116116
// CHECK-SUBSCRIPT-SAME{LITERAL}: [[hlsl::resource_class(
@@ -121,15 +121,15 @@ RESOURCE<float> Buffer;
121121
// CHECK-SUBSCRIPT-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
122122
// CHECK-SUBSCRIPT-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
123123

124-
// CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'const element_type &(unsigned int) const'
125-
// CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'element_type &(unsigned int)'
124+
// CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &const (unsigned int) const'
125+
// CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &(unsigned int)'
126126

127127
// CHECK-LOAD: CXXMethodDecl {{.*}} Load 'element_type (unsigned int)'
128128
// CHECK-LOAD-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
129129
// CHECK-LOAD-NEXT: CompoundStmt
130130
// CHECK-LOAD-NEXT: ReturnStmt
131-
// CHECK-LOAD-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
132-
// CHECK-LOAD-NEXT: CallExpr {{.*}} 'element_type *'
131+
// CHECK-LOAD-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
132+
// CHECK-LOAD-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
133133
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
134134
// CHECK-LOAD-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
135135
// CHECK-LOAD-SAME{LITERAL}: [[hlsl::resource_class(
@@ -168,9 +168,9 @@ RESOURCE<float> Buffer;
168168
// CHECK-APPEND: CXXMethodDecl {{.*}} Append 'void (element_type)'
169169
// CHECK-APPEND-NEXT: ParmVarDecl {{.*}} value 'element_type'
170170
// CHECK-APPEND-NEXT: CompoundStmt
171-
// CHECK-APPEND-NEXT: BinaryOperator {{.*}} 'element_type' '='
172-
// CHECK-APPEND-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
173-
// CHECK-APPEND-NEXT: CallExpr {{.*}} 'element_type *'
171+
// CHECK-APPEND-NEXT: BinaryOperator {{.*}} 'hlsl_device element_type' '='
172+
// CHECK-APPEND-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
173+
// CHECK-APPEND-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
174174
// CHECK-APPEND-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
175175
// CHECK-APPEND-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
176176
// CHECK-APPEND-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
@@ -190,8 +190,8 @@ RESOURCE<float> Buffer;
190190
// CHECK-CONSUME: CXXMethodDecl {{.*}} Consume 'element_type ()'
191191
// CHECK-CONSUME-NEXT: CompoundStmt
192192
// CHECK-CONSUME-NEXT: ReturnStmt
193-
// CHECK-CONSUME-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
194-
// CHECK-CONSUME-NEXT: CallExpr {{.*}} 'element_type *'
193+
// CHECK-CONSUME-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
194+
// CHECK-CONSUME-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
195195
// CHECK-CONSUME-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
196196
// CHECK-CONSUME-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
197197
// CHECK-CONSUME-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]

Diff for: clang/test/AST/HLSL/TypedBuffers-AST.hlsl

+11-11
Original file line numberDiff line numberDiff line change
@@ -56,32 +56,32 @@ RESOURCE<float> Buffer;
5656
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
5757
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
5858

59-
// CHECK: CXXMethodDecl {{.*}} operator[] 'const element_type &(unsigned int) const'
59+
// CHECK: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &const (unsigned int) const'
6060
// CHECK-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
6161
// CHECK-NEXT: CompoundStmt
6262
// CHECK-NEXT: ReturnStmt
63-
// CHECK-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
64-
// CHECK-NEXT: CallExpr {{.*}} 'element_type *'
63+
// CHECK-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
64+
// CHECK-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
6565
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
6666
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
6767
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
6868
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
69-
// CHECK-SAME: ' lvalue .__handle {{.*}}
69+
// CHECK-SAME: ' lvalue .__handle {{.*}}
7070
// CHECK-NEXT: CXXThisExpr {{.*}} 'const [[RESOURCE]]<element_type>' lvalue implicit this
7171
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
7272
// CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
7373

74-
// CHECK-NEXT: CXXMethodDecl {{.*}} operator[] 'element_type &(unsigned int)'
74+
// CHECK-NEXT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &(unsigned int)'
7575
// CHECK-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
7676
// CHECK-NEXT: CompoundStmt
7777
// CHECK-NEXT: ReturnStmt
78-
// CHECK-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
79-
// CHECK-NEXT: CallExpr {{.*}} 'element_type *'
78+
// CHECK-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
79+
// CHECK-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
8080
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
8181
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
8282
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
8383
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
84-
// CHECK-SAME: ' lvalue .__handle {{.*}}
84+
// CHECK-SAME: ' lvalue .__handle {{.*}}
8585
// CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit this
8686
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
8787
// CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
@@ -90,13 +90,13 @@ RESOURCE<float> Buffer;
9090
// CHECK-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
9191
// CHECK-NEXT: CompoundStmt
9292
// CHECK-NEXT: ReturnStmt
93-
// CHECK-NEXT: UnaryOperator {{.*}} 'element_type' prefix '*' cannot overflow
94-
// CHECK-NEXT: CallExpr {{.*}} 'element_type *'
93+
// CHECK-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
94+
// CHECK-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
9595
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
9696
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
9797
// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
9898
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
99-
// CHECK-SAME: ' lvalue .__handle {{.*}}
99+
// CHECK-SAME: ' lvalue .__handle {{.*}}
100100
// CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit this
101101
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
102102
// CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline

0 commit comments

Comments
 (0)