Skip to content

Commit ec4e3a9

Browse files
committed
furthest checkpoint yet
1 parent 06ad11a commit ec4e3a9

File tree

7 files changed

+55
-20
lines changed

7 files changed

+55
-20
lines changed

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,11 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
370370
? llvm::Intrinsic::dx_resource_load_rawbuffer
371371
: llvm::Intrinsic::dx_resource_load_typedbuffer;
372372

373-
llvm::Type *DataTy = ConvertType(E->getType());
374-
llvm::Type *RetTy = llvm::StructType::get(Builder.getContext(),
375-
{DataTy, Builder.getInt1Ty()});
373+
QualType BuiltinRetTy = E->getType();
374+
llvm::Type *DataTy = ConvertType(BuiltinRetTy->getPointeeType());
375+
376+
llvm::Type *IntrinsicRetTy = llvm::StructType::get(
377+
Builder.getContext(), {DataTy, Builder.getInt1Ty()});
376378

377379
SmallVector<Value *, 3> Args;
378380
Args.push_back(HandleOp);
@@ -384,7 +386,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
384386

385387
// Call the intrinsic (returns a struct)
386388
Value *ResRet =
387-
Builder.CreateIntrinsic(RetTy, IntrID, Args, {}, "ld.struct");
389+
Builder.CreateIntrinsic(IntrinsicRetTy, IntrID, Args, {}, "ld.struct");
388390

389391
// Extract the loaded data (first element of the struct)
390392
Value *LoadedValue = Builder.CreateExtractValue(ResRet, {0}, "ld.value");

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,6 @@ class CGHLSLRuntime {
126126

127127
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateResourceGetPointer,
128128
resource_getpointer)
129-
130-
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateResourceLoadTypedBuffer,
131-
resource_load_typedbuffer)
132129
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding,
133130
resource_handlefrombinding)
134131
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromImplicitBinding,

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,5 +605,7 @@ smoothstep(__detail::HLSL_FIXED_VECTOR<float, N> Min,
605605
return __detail::smoothstep_vec_impl(Min, Max, X);
606606
}
607607

608+
bool CheckAccessFullyMapped(uint Status) { return static_cast<bool>(Status); }
609+
608610
} // namespace hlsl
609611
#endif //_HLSL_HLSL_INTRINSICS_H_

clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,7 +1140,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addLoadMethods() {
11401140
DeclarationName Load(&II);
11411141
// TODO: We also need versions with status for CheckAccessFullyMapped.
11421142
addHandleAccessFunction(Load, /*IsConst=*/false, /*IsRef=*/false);
1143-
addLoadWithStatusFunction(Load, /*IsConst=*/false, /*IsRef=*/false);
1143+
addLoadWithStatusFunction(Load, /*IsConst=*/false);
11441144

11451145
return *this;
11461146
}
@@ -1235,7 +1235,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDecrementCounterMethod() {
12351235

12361236
BuiltinTypeDeclBuilder &
12371237
BuiltinTypeDeclBuilder::addLoadWithStatusFunction(DeclarationName &Name,
1238-
bool IsConst, bool IsRef) {
1238+
bool IsConst) {
12391239
assert(!Record->isCompleteDefinition() && "record is already complete");
12401240
ASTContext &AST = SemaRef.getASTContext();
12411241
using PH = BuiltinTypeMethodBuilder::PlaceHolder;
@@ -1246,16 +1246,9 @@ BuiltinTypeDeclBuilder::addLoadWithStatusFunction(DeclarationName &Name,
12461246
QualType ElemPtrTy = AST.getPointerType(AddrSpaceElemTy);
12471247
QualType ReturnTy;
12481248

1249-
if (IsRef) {
1250-
ReturnTy = AddrSpaceElemTy;
1251-
if (IsConst)
1252-
ReturnTy.addConst();
1253-
ReturnTy = AST.getLValueReferenceType(ReturnTy);
1254-
} else {
1255-
ReturnTy = ElemTy;
1256-
if (IsConst)
1257-
ReturnTy.addConst();
1258-
}
1249+
ReturnTy = ElemTy;
1250+
if (IsConst)
1251+
ReturnTy.addConst();
12591252

12601253
QualType StatusRefTy = AST.getLValueReferenceType(AST.UnsignedIntTy);
12611254
return BuiltinTypeMethodBuilder(*this, Name, ReturnTy, IsConst)

clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class BuiltinTypeDeclBuilder {
9292
BuiltinTypeDeclBuilder &addHandleAccessFunction(DeclarationName &Name,
9393
bool IsConst, bool IsRef);
9494
BuiltinTypeDeclBuilder &addLoadWithStatusFunction(DeclarationName &Name,
95-
bool IsConst, bool IsRef);
95+
bool IsConst);
9696
BuiltinTypeDeclBuilder &addAppendMethod();
9797
BuiltinTypeDeclBuilder &addConsumeMethod();
9898

clang/test/AST/HLSL/StructuredBuffers-AST.hlsl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,27 @@ RESOURCE<float> Buffer;
326326
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
327327
// CHECK-LOAD-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
328328

329+
// Load with status method
330+
331+
// CHECK-LOAD: CXXMethodDecl {{.*}} Load 'element_type (unsigned int, unsigned int &)'
332+
// CHECK-LOAD-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
333+
// CHECK-LOAD-NEXT: ParmVarDecl {{.*}} Status 'unsigned int &'
334+
// CHECK-LOAD-NEXT: CompoundStmt
335+
// CHECK-LOAD-NEXT: ReturnStmt
336+
// CHECK-LOAD-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
337+
// CHECK-LOAD-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
338+
// CHECK-LOAD-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
339+
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_load_with_status' 'void (...) noexcept'
340+
// CHECK-LOAD-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
341+
// CHECK-LOAD-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
342+
// CHECK-LOAD-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
343+
// CHECK-LOAD-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
344+
// CHECK-LOAD-SAME: lvalue .__handle {{.*}}
345+
// CHECK-LOAD-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this
346+
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
347+
// CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Status' 'unsigned int &'
348+
// CHECK-LOAD-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
349+
329350
// IncrementCounter method
330351

331352
// CHECK-COUNTER: CXXMethodDecl {{.*}} IncrementCounter 'unsigned int ()'

clang/test/AST/HLSL/TypedBuffers-AST.hlsl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,26 @@ RESOURCE<float> Buffer;
214214
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
215215
// CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
216216

217+
// Load with status method
218+
// CHECK-NEXT: CXXMethodDecl {{.*}} Load 'element_type (unsigned int, unsigned int &)'
219+
// CHECK-NEXT: ParmVarDecl {{.*}} Index 'unsigned int'
220+
// CHECK-NEXT: ParmVarDecl {{.*}} Status 'unsigned int &'
221+
// CHECK-NEXT: CompoundStmt
222+
// CHECK-NEXT: ReturnStmt
223+
// CHECK-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow
224+
// CHECK-NEXT: CallExpr {{.*}} 'hlsl_device element_type *'
225+
// CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
226+
// CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_load_with_status' 'void (...) noexcept'
227+
// CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
228+
// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
229+
// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
230+
// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
231+
// CHECK-SAME: lvalue .__handle {{.*}}
232+
// CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this
233+
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int'
234+
// CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Status' 'unsigned int &'
235+
// CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
236+
217237
// GetDimensions method
218238

219239
// CHECK-NEXT: CXXMethodDecl {{.*}} GetDimensions 'void (out unsigned int)'

0 commit comments

Comments
 (0)