@@ -168,10 +168,13 @@ struct BuiltinTypeMethodBuilder {
168168 template <typename ... Ts>
169169 BuiltinTypeMethodBuilder &callBuiltin (StringRef BuiltinName,
170170 QualType ReturnType, Ts... ArgSpecs);
171- template <typename T> BuiltinTypeMethodBuilder &callHandleCtor (T HandleExpr);
172171 template <typename TLHS, typename TRHS>
173172 BuiltinTypeMethodBuilder &assign (TLHS LHS, TRHS RHS);
174173 template <typename T> BuiltinTypeMethodBuilder &dereference (T Ptr);
174+ template <typename T> BuiltinTypeMethodBuilder &getResourceHandle (T ResourceRecord);
175+ template <typename TResource, typename TValue>
176+ BuiltinTypeMethodBuilder &setHandleFieldOnResource (TResource ResourceRecord, TValue HandleValue);
177+ template <typename T> BuiltinTypeMethodBuilder &returnValue (T ReturnValue);
175178 BuiltinTypeDeclBuilder &finalize (CXXMethodDecl **OutMethod = nullptr );
176179 Expr *getResourceHandleExpr ();
177180
@@ -503,25 +506,6 @@ BuiltinTypeMethodBuilder::callBuiltin(StringRef BuiltinName,
503506 return *this ;
504507}
505508
506- template <typename T>
507- BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::callHandleCtor (T Handle) {
508- ensureCompleteDecl ();
509-
510- Expr *HandleExpr = convertPlaceholder (Handle);
511-
512- ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
513- QualType RecordType = AST.getTypeDeclType (cast<TypeDecl>(DeclBuilder.Record ));
514- CXXConstructorDecl *Ctor = DeclBuilder.HandleCtor ;
515- assert (Ctor && " Handle constructor not created" );
516-
517- CXXConstructExpr *CtorExpr = CXXConstructExpr::Create (
518- AST, RecordType, SourceLocation (), Ctor, false , {HandleExpr}, false ,
519- false , false , false , CXXConstructionKind::Complete, SourceRange ());
520-
521- StmtsList.push_back (CtorExpr);
522- return *this ;
523- }
524-
525509template <typename TLHS, typename TRHS>
526510BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::assign (TLHS LHS, TRHS RHS) {
527511 Expr *LHSExpr = convertPlaceholder (LHS);
@@ -546,6 +530,51 @@ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::dereference(T Ptr) {
546530 return *this ;
547531}
548532
533+ template <typename T>
534+ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::getResourceHandle (T ResourceRecord) {
535+ ensureCompleteDecl ();
536+
537+ Expr *ResourceExpr = convertPlaceholder (ResourceRecord);
538+
539+ ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
540+ FieldDecl *HandleField = DeclBuilder.getResourceHandleField ();
541+ MemberExpr *HandleExpr = MemberExpr::CreateImplicit (
542+ AST, ResourceExpr, false , HandleField, HandleField->getType (), VK_LValue,
543+ OK_Ordinary);
544+ StmtsList.push_back (HandleExpr);
545+ return *this ;
546+ }
547+
548+ template <typename TResource, typename TValue>
549+ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::setHandleFieldOnResource (TResource ResourceRecord, TValue HandleValue) {
550+ ensureCompleteDecl ();
551+
552+ Expr *ResourceExpr = convertPlaceholder (ResourceRecord);
553+ Expr *HandleValueExpr = convertPlaceholder (HandleValue);
554+
555+ ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
556+ FieldDecl *HandleField = DeclBuilder.getResourceHandleField ();
557+ MemberExpr *HandleMemberExpr = MemberExpr::CreateImplicit (
558+ AST, ResourceExpr, false , HandleField, HandleField->getType (), VK_LValue,
559+ OK_Ordinary);
560+ Stmt *AssignStmt = BinaryOperator::Create (
561+ DeclBuilder.SemaRef .getASTContext (), HandleMemberExpr, HandleValueExpr, BO_Assign,
562+ HandleMemberExpr->getType (), ExprValueKind::VK_PRValue,
563+ ExprObjectKind::OK_Ordinary, SourceLocation (), FPOptionsOverride ());
564+ StmtsList.push_back (AssignStmt);
565+ return *this ;
566+ }
567+
568+ template <typename T>
569+ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::returnValue (T ReturnValue) {
570+ ensureCompleteDecl ();
571+
572+ Expr *ReturnValueExpr = convertPlaceholder (ReturnValue);
573+ ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
574+ StmtsList.push_back (ReturnStmt::Create (AST, SourceLocation (), ReturnValueExpr, nullptr ));
575+ return *this ;
576+ }
577+
549578BuiltinTypeDeclBuilder &
550579BuiltinTypeMethodBuilder::finalize (CXXMethodDecl **OutMethod) {
551580 assert (!DeclBuilder.Record ->isCompleteDefinition () &&
@@ -699,23 +728,6 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDefaultConstructor() {
699728 .finalize ();
700729}
701730
702- BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addHandleConstructor () {
703- if (Record->isCompleteDefinition ())
704- return *this ;
705-
706- using PH = BuiltinTypeMethodBuilder::PlaceHolder;
707- ASTContext &AST = SemaRef.getASTContext ();
708- QualType HandleType = getResourceHandleField ()->getType ();
709- CXXMethodDecl *OutMethod = nullptr ;
710-
711- BuiltinTypeMethodBuilder (*this , " " , AST.VoidTy , false , true , AS_public)
712- .addParam (" handle" , HandleType)
713- .assign (PH::Handle, PH::_0)
714- .finalize (&OutMethod);
715- HandleCtor = cast<CXXConstructorDecl>(OutMethod);
716- return *this ;
717- }
718-
719731BuiltinTypeDeclBuilder &
720732BuiltinTypeDeclBuilder::addHandleConstructorFromBinding () {
721733 if (Record->isCompleteDefinition ())
@@ -775,10 +787,12 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCreateFromBinding() {
775787 .addParam (" range" , AST.IntTy )
776788 .addParam (" index" , AST.UnsignedIntTy )
777789 .addParam (" name" , AST.getPointerType (AST.CharTy .withConst ()))
778- .createLocalVar (" tmp" , HandleType)
790+ .createLocalVar (" tmp" , RecordType)
791+ .getResourceHandle (PH::LocalVar_0)
779792 .callBuiltin (" __builtin_hlsl_resource_handlefrombinding" , HandleType,
780- PH::LocalVar_0, PH::_0, PH::_1, PH::_2, PH::_3, PH::_4)
781- .callHandleCtor (PH::LastStmt)
793+ PH::LastStmt, PH::_0, PH::_1, PH::_2, PH::_3, PH::_4)
794+ .setHandleFieldOnResource (PH::LocalVar_0, PH::LastStmt)
795+ .returnValue (PH::LocalVar_0)
782796 .finalize ();
783797}
784798
@@ -799,11 +813,13 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCreateFromImplicitBinding() {
799813 .addParam (" range" , AST.IntTy )
800814 .addParam (" index" , AST.UnsignedIntTy )
801815 .addParam (" name" , AST.getPointerType (AST.CharTy .withConst ()))
802- .createLocalVar (" tmp" , HandleType)
816+ .createLocalVar (" tmp" , RecordType)
817+ .getResourceHandle (PH::LocalVar_0)
803818 .callBuiltin (" __builtin_hlsl_resource_handlefromimplicitbinding" ,
804- HandleType, PH::LocalVar_0 , PH::_0, PH::_1, PH::_2, PH::_3,
819+ HandleType, PH::LastStmt , PH::_0, PH::_1, PH::_2, PH::_3,
805820 PH::_4)
806- .callHandleCtor (PH::LastStmt)
821+ .setHandleFieldOnResource (PH::LocalVar_0, PH::LastStmt)
822+ .returnValue (PH::LocalVar_0)
807823 .finalize ();
808824}
809825
0 commit comments