@@ -157,9 +157,9 @@ struct BuiltinTypeDeclBuilder {
157157 assert (R.isSingleResult () &&
158158 " Since this is a builtin it should always resolve!" );
159159 auto *VD = cast<ValueDecl>(R.getFoundDecl ());
160- QualType Ty = VD->getType ();
161160 return DeclRefExpr::Create (AST, NestedNameSpecifierLoc (), SourceLocation (),
162- VD, false , NameInfo, Ty, VK_PRValue);
161+ VD, false , NameInfo, AST.BuiltinFnTy ,
162+ VK_PRValue);
163163 }
164164
165165 BuiltinTypeDeclBuilder &addDefaultHandleConstructor (Sema &S) {
@@ -186,15 +186,15 @@ struct BuiltinTypeDeclBuilder {
186186 return *this ;
187187 }
188188
189- BuiltinTypeDeclBuilder &addArraySubscriptOperators () {
189+ BuiltinTypeDeclBuilder &addArraySubscriptOperators (Sema &S ) {
190190 if (Record->isCompleteDefinition ())
191191 return *this ;
192- addArraySubscriptOperator (true );
193- addArraySubscriptOperator (false );
192+ addArraySubscriptOperator (S, true );
193+ addArraySubscriptOperator (S, false );
194194 return *this ;
195195 }
196196
197- BuiltinTypeDeclBuilder &addArraySubscriptOperator (bool IsConst) {
197+ BuiltinTypeDeclBuilder &addArraySubscriptOperator (Sema &S, bool IsConst) {
198198 if (Record->isCompleteDefinition ())
199199 return *this ;
200200
@@ -241,23 +241,29 @@ struct BuiltinTypeDeclBuilder {
241241 auto FnProtoLoc = TSInfo->getTypeLoc ().getAs <FunctionProtoTypeLoc>();
242242 FnProtoLoc.setParam (0 , IdxParam);
243243
244- // FIXME: Placeholder to make sure we return the correct type - create
245- // field of element_type and return reference to it. This field will go
246- // away once indexing into resources is properly implemented in
247- // llvm/llvm-project#95956.
248- if (Fields.count (" e" ) == 0 ) {
249- addMemberVariable (" e" , ElemTy, {});
250- }
251- FieldDecl *ElemFieldDecl = Fields[" e" ];
252-
253244 auto *This =
254245 CXXThisExpr::Create (AST, SourceLocation (),
255246 MethodDecl->getFunctionObjectParameterType (), true );
256- Expr *ElemField = MemberExpr::CreateImplicit (
257- AST, This, false , ElemFieldDecl, ElemFieldDecl->getType (), VK_LValue,
258- OK_Ordinary);
259- auto *Return =
260- ReturnStmt::Create (AST, SourceLocation (), ElemField, nullptr );
247+ FieldDecl *Handle = Fields[" __handle" ];
248+ auto *HandleExpr = MemberExpr::CreateImplicit (
249+ AST, This, false , Handle, Handle->getType (), VK_LValue, OK_Ordinary);
250+
251+ auto *IndexExpr = DeclRefExpr::Create (
252+ AST, NestedNameSpecifierLoc (), SourceLocation (), IdxParam, false ,
253+ DeclarationNameInfo (IdxParam->getDeclName (), SourceLocation ()),
254+ AST.UnsignedIntTy , VK_PRValue);
255+
256+ DeclRefExpr *Builtin =
257+ lookupBuiltinFunction (AST, S, " __builtin_hlsl_resource_getpointer" );
258+ // TODO: Map to an hlsl_device address space.
259+ QualType ElemPtrTy = AST.getPointerType (ElemTy);
260+ Expr *Call = CallExpr::Create (AST, Builtin, {HandleExpr, IndexExpr},
261+ ElemPtrTy, VK_PRValue,
262+ SourceLocation (), FPOptionsOverride ());
263+ Expr *Deref = UnaryOperator::Create (
264+ AST, Call, UO_Deref, ElemTy, VK_PRValue, OK_Ordinary, SourceLocation (),
265+ /* CanOverflow=*/ false , FPOptionsOverride ());
266+ auto *Return = ReturnStmt::Create (AST, SourceLocation (), Deref, nullptr );
261267
262268 MethodDecl->setBody (CompoundStmt::Create (AST, {Return}, FPOptionsOverride (),
263269 SourceLocation (),
@@ -482,7 +488,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
482488 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV,
483489 ResourceKind::TypedBuffer, /* IsROV=*/ false ,
484490 /* RawBuffer=*/ false )
485- .addArraySubscriptOperators ()
491+ .addArraySubscriptOperators (*SemaPtr )
486492 .completeDefinition ();
487493 });
488494
@@ -494,7 +500,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
494500 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV,
495501 ResourceKind::TypedBuffer, /* IsROV=*/ true ,
496502 /* RawBuffer=*/ false )
497- .addArraySubscriptOperators ()
503+ .addArraySubscriptOperators (*SemaPtr )
498504 .completeDefinition ();
499505 });
500506
@@ -504,7 +510,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
504510 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
505511 setupBufferType (Decl, *SemaPtr, ResourceClass::SRV, ResourceKind::RawBuffer,
506512 /* IsROV=*/ false , /* RawBuffer=*/ true )
507- .addArraySubscriptOperators ()
513+ .addArraySubscriptOperators (*SemaPtr )
508514 .completeDefinition ();
509515 });
510516
@@ -514,7 +520,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
514520 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
515521 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
516522 /* IsROV=*/ false , /* RawBuffer=*/ true )
517- .addArraySubscriptOperators ()
523+ .addArraySubscriptOperators (*SemaPtr )
518524 .completeDefinition ();
519525 });
520526
@@ -545,7 +551,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
545551 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
546552 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
547553 /* IsROV=*/ true , /* RawBuffer=*/ true )
548- .addArraySubscriptOperators ()
554+ .addArraySubscriptOperators (*SemaPtr )
549555 .completeDefinition ();
550556 });
551557}
0 commit comments