@@ -168,10 +168,13 @@ struct BuiltinTypeMethodBuilder {
168
168
template <typename ... Ts>
169
169
BuiltinTypeMethodBuilder &callBuiltin (StringRef BuiltinName,
170
170
QualType ReturnType, Ts... ArgSpecs);
171
- template <typename T> BuiltinTypeMethodBuilder &callHandleCtor (T HandleExpr);
172
171
template <typename TLHS, typename TRHS>
173
172
BuiltinTypeMethodBuilder &assign (TLHS LHS, TRHS RHS);
174
173
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);
175
178
BuiltinTypeDeclBuilder &finalize (CXXMethodDecl **OutMethod = nullptr );
176
179
Expr *getResourceHandleExpr ();
177
180
@@ -503,25 +506,6 @@ BuiltinTypeMethodBuilder::callBuiltin(StringRef BuiltinName,
503
506
return *this ;
504
507
}
505
508
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
-
525
509
template <typename TLHS, typename TRHS>
526
510
BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::assign (TLHS LHS, TRHS RHS) {
527
511
Expr *LHSExpr = convertPlaceholder (LHS);
@@ -546,6 +530,51 @@ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::dereference(T Ptr) {
546
530
return *this ;
547
531
}
548
532
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
+
549
578
BuiltinTypeDeclBuilder &
550
579
BuiltinTypeMethodBuilder::finalize (CXXMethodDecl **OutMethod) {
551
580
assert (!DeclBuilder.Record ->isCompleteDefinition () &&
@@ -699,23 +728,6 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDefaultConstructor() {
699
728
.finalize ();
700
729
}
701
730
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
-
719
731
BuiltinTypeDeclBuilder &
720
732
BuiltinTypeDeclBuilder::addHandleConstructorFromBinding () {
721
733
if (Record->isCompleteDefinition ())
@@ -775,10 +787,12 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCreateFromBinding() {
775
787
.addParam (" range" , AST.IntTy )
776
788
.addParam (" index" , AST.UnsignedIntTy )
777
789
.addParam (" name" , AST.getPointerType (AST.CharTy .withConst ()))
778
- .createLocalVar (" tmp" , HandleType)
790
+ .createLocalVar (" tmp" , RecordType)
791
+ .getResourceHandle (PH::LocalVar_0)
779
792
.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)
782
796
.finalize ();
783
797
}
784
798
@@ -799,11 +813,13 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCreateFromImplicitBinding() {
799
813
.addParam (" range" , AST.IntTy )
800
814
.addParam (" index" , AST.UnsignedIntTy )
801
815
.addParam (" name" , AST.getPointerType (AST.CharTy .withConst ()))
802
- .createLocalVar (" tmp" , HandleType)
816
+ .createLocalVar (" tmp" , RecordType)
817
+ .getResourceHandle (PH::LocalVar_0)
803
818
.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,
805
820
PH::_4)
806
- .callHandleCtor (PH::LastStmt)
821
+ .setHandleFieldOnResource (PH::LocalVar_0, PH::LastStmt)
822
+ .returnValue (PH::LocalVar_0)
807
823
.finalize ();
808
824
}
809
825
0 commit comments