Lines Matching full:this

40     return this->addLocal(Local);  in addExtended()
44 this->Ctx->GlobalDecl = OldGlobalDecl; in ~DeclScope()
45 this->Ctx->InitializingDecl = OldInitializingDecl; in ~DeclScope()
46 this->Ctx->InitStack.pop_back(); in ~DeclScope()
118 this->Ctx->BreakLabel = BreakLabel; in LoopScope()
119 this->Ctx->ContinueLabel = ContinueLabel; in LoopScope()
123 this->Ctx->BreakLabel = OldBreakLabel; in ~LoopScope()
124 this->Ctx->ContinueLabel = OldContinueLabel; in ~LoopScope()
142 OldDefaultLabel(this->Ctx->DefaultLabel), in SwitchScope()
143 OldCaseLabels(std::move(this->Ctx->CaseLabels)) { in SwitchScope()
144 this->Ctx->BreakLabel = BreakLabel; in SwitchScope()
145 this->Ctx->DefaultLabel = DefaultLabel; in SwitchScope()
146 this->Ctx->CaseLabels = std::move(CaseLabels); in SwitchScope()
150 this->Ctx->BreakLabel = OldBreakLabel; in ~SwitchScope()
151 this->Ctx->DefaultLabel = OldDefaultLabel; in ~SwitchScope()
152 this->Ctx->CaseLabels = std::move(OldCaseLabels); in ~SwitchScope()
184 return this->discard(SubExpr); in VisitCastExpr()
192 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
196 if (!this->visit(SubExpr)) in VisitCastExpr()
200 return this->emitLoadPop(*SubExprT, CE); in VisitCastExpr()
203 // This happens for example in C when dereferencing a pointer of struct in VisitCastExpr()
205 return this->emitMemcpy(CE); in VisitCastExpr()
217 if (!this->visit(SubExpr)) in VisitCastExpr()
220 return this->emitGetMemberPtrBasePop(DerivedOffset, CE); in VisitCastExpr()
232 if (!this->visit(SubExpr)) in VisitCastExpr()
234 return this->emitGetMemberPtrBasePop(-DerivedOffset, CE); in VisitCastExpr()
239 if (!this->visit(SubExpr)) in VisitCastExpr()
253 if (!this->emitGetPtrVirtBasePop(extractRecordDecl(B->getType()), CE)) in VisitCastExpr()
258 if (!this->emitGetPtrBasePop(DerivedOffset, CE)) in VisitCastExpr()
268 if (!this->visit(SubExpr)) in VisitCastExpr()
274 return this->emitGetPtrDerivedPop(DerivedOffset, CE); in VisitCastExpr()
283 return this->discard(SubExpr); in VisitCastExpr()
284 if (!this->visit(SubExpr)) in VisitCastExpr()
287 return this->emitCastFP(TargetSemantics, getRoundingMode(CE), CE); in VisitCastExpr()
292 return this->discard(SubExpr); in VisitCastExpr()
297 if (!this->visit(SubExpr)) in VisitCastExpr()
302 return this->emitCastIntegralFloating(*FromT, TargetSemantics, RM, CE); in VisitCastExpr()
308 return this->discard(SubExpr); in VisitCastExpr()
315 if (!this->visit(SubExpr)) in VisitCastExpr()
319 return this->emitCastFloatingIntegralAP(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
322 return this->emitCastFloatingIntegralAPS(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
325 return this->emitCastFloatingIntegral(*ToT, CE); in VisitCastExpr()
339 return this->emitNull(classifyPrim(CE->getType()), Desc, CE); in VisitCastExpr()
344 return this->discard(SubExpr); in VisitCastExpr()
346 if (!this->visit(SubExpr)) in VisitCastExpr()
352 if (!this->emitDecayPtr(FromT, PT_Ptr, CE)) in VisitCastExpr()
358 return this->emitCastPointerIntegralAP(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
361 return this->emitCastPointerIntegralAPS(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
363 return this->emitCastPointerIntegral(T, CE); in VisitCastExpr()
367 if (!this->visit(SubExpr)) in VisitCastExpr()
369 if (!this->emitArrayDecay(CE)) in VisitCastExpr()
372 return this->emitPopPtr(CE); in VisitCastExpr()
379 if (!this->visit(SubExpr)) in VisitCastExpr()
385 return this->emitPop(T, CE); in VisitCastExpr()
400 if (!this->emitGetIntPtr(T, Desc, CE)) in VisitCastExpr()
408 return this->emitDecayPtr(PT_Ptr, DestPtrT, CE); in VisitCastExpr()
418 return this->delegate(SubExpr); in VisitCastExpr()
423 if (!this->discard(SubExpr)) in VisitCastExpr()
425 return this->emitInvalidCast(CastKind::Reinterpret, CE); in VisitCastExpr()
429 return this->discard(SubExpr); in VisitCastExpr()
441 return this->delegate(SubExpr); in VisitCastExpr()
443 if (!this->visit(SubExpr)) in VisitCastExpr()
446 return this->emitPtrPtrCast(SubExprTy->isVoidPointerType(), CE); in VisitCastExpr()
450 if (!this->visit(SubExpr)) in VisitCastExpr()
452 return this->emitDecayPtr(*FromT, *ToT, CE); in VisitCastExpr()
459 return this->discard(SubExpr); in VisitCastExpr()
466 if (!this->visit(SubExpr)) in VisitCastExpr()
474 if (!this->emitCheckEnumValue(*FromT, ET->getDecl(), CE)) in VisitCastExpr()
480 return this->emitCastAP(*FromT, Ctx.getBitWidth(CE->getType()), CE); in VisitCastExpr()
482 return this->emitCastAPS(*FromT, Ctx.getBitWidth(CE->getType()), CE); in VisitCastExpr()
486 if (!this->emitCast(*FromT, *ToT, CE)) in VisitCastExpr()
490 return this->emitNeg(*ToT, CE); in VisitCastExpr()
498 // Just emit p != nullptr for this. in VisitCastExpr()
499 if (!this->visit(SubExpr)) in VisitCastExpr()
502 if (!this->emitNull(PtrT, nullptr, CE)) in VisitCastExpr()
505 return this->emitNE(PtrT, CE); in VisitCastExpr()
511 return this->discard(SubExpr); in VisitCastExpr()
512 if (!this->visit(SubExpr)) in VisitCastExpr()
514 return this->emitComplexBoolCast(SubExpr); in VisitCastExpr()
519 return this->emitComplexReal(SubExpr); in VisitCastExpr()
529 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
534 if (!this->visitArrayElemInit(0, SubExpr)) in VisitCastExpr()
538 if (!this->visitZeroInitializer(T, SubExpr->getType(), SubExpr)) in VisitCastExpr()
540 return this->emitInitElem(T, 1, SubExpr); in VisitCastExpr()
550 return this->discard(SubExpr); in VisitCastExpr()
556 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
565 if (!this->visit(SubExpr)) in VisitCastExpr()
567 if (!this->emitSetLocal(PT_Ptr, SubExprOffset, CE)) in VisitCastExpr()
576 if (!this->emitGetLocal(PT_Ptr, SubExprOffset, CE)) in VisitCastExpr()
578 if (!this->emitArrayElemPop(SourceElemT, I, CE)) in VisitCastExpr()
582 if (!this->emitPrimCast(SourceElemT, DestElemT, DestElemType, CE)) in VisitCastExpr()
586 if (!this->emitInitElem(DestElemT, I, CE)) in VisitCastExpr()
598 return this->discard(SubExpr); in VisitCastExpr()
604 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
614 if (!this->visit(SubExpr)) in VisitCastExpr()
616 if (classifyPrim(SubExpr) == PT_Ptr && !this->emitLoadPop(ElemT, CE)) in VisitCastExpr()
619 if (!this->emitSetLocal(ElemT, ElemOffset, CE)) in VisitCastExpr()
623 if (!this->emitGetLocal(ElemT, ElemOffset, CE)) in VisitCastExpr()
625 if (!this->emitInitElem(ElemT, I, CE)) in VisitCastExpr()
636 return this->emitInvalid(CE); in VisitCastExpr()
646 return this->emitConst(LE->getValue(), LE); in VisitIntegerLiteral()
654 return this->emitConstFloat(E->getValue(), E); in VisitFloatingLiteral()
667 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitImaginaryLiteral()
674 if (!this->visitZeroInitializer(SubExprT, SubExpr->getType(), SubExpr)) in VisitImaginaryLiteral()
676 if (!this->emitInitElem(SubExprT, 0, SubExpr)) in VisitImaginaryLiteral()
678 return this->visitArrayElemInit(1, SubExpr); in VisitImaginaryLiteral()
683 return this->delegate(E->getSubExpr()); in VisitParenExpr()
690 return this->VisitLogicalBinOp(BO); in VisitBinaryOperator()
698 if (!this->discard(LHS)) in VisitBinaryOperator()
701 return this->discard(RHS); in VisitBinaryOperator()
703 return this->delegate(RHS); in VisitBinaryOperator()
707 return this->VisitComplexBinOp(BO); in VisitBinaryOperator()
711 return this->emitComplexComparison(LHS, RHS, BO); in VisitBinaryOperator()
714 if (!this->visit(LHS)) in VisitBinaryOperator()
717 if (!this->visit(RHS)) in VisitBinaryOperator()
720 if (!this->emitToMemberPtr(BO)) in VisitBinaryOperator()
726 if (!this->emitCastMemberPtrPtr(BO)) in VisitBinaryOperator()
728 return DiscardResult ? this->emitPopPtr(BO) : true; in VisitBinaryOperator()
748 std::optional<unsigned> ResultIndex = this->allocateLocal(BO); in VisitBinaryOperator()
749 if (!this->emitGetPtrLocal(*ResultIndex, BO)) in VisitBinaryOperator()
756 return this->emitCMP3(*LT, CmpInfo, BO); in VisitBinaryOperator()
765 return this->VisitPointerArithBinOp(BO); in VisitBinaryOperator()
773 auto MaybeCastToBool = [this, T, BO](bool Result) { in VisitBinaryOperator()
777 return this->emitPop(*T, BO); in VisitBinaryOperator()
779 return this->emitCast(PT_Bool, *T, BO); in VisitBinaryOperator()
783 auto Discard = [this, T, BO](bool Result) { in VisitBinaryOperator()
786 return DiscardResult ? this->emitPop(*T, BO) : true; in VisitBinaryOperator()
791 return MaybeCastToBool(this->emitEQ(*LT, BO)); in VisitBinaryOperator()
793 return MaybeCastToBool(this->emitNE(*LT, BO)); in VisitBinaryOperator()
795 return MaybeCastToBool(this->emitLT(*LT, BO)); in VisitBinaryOperator()
797 return MaybeCastToBool(this->emitLE(*LT, BO)); in VisitBinaryOperator()
799 return MaybeCastToBool(this->emitGT(*LT, BO)); in VisitBinaryOperator()
801 return MaybeCastToBool(this->emitGE(*LT, BO)); in VisitBinaryOperator()
804 return Discard(this->emitSubf(getRoundingMode(BO), BO)); in VisitBinaryOperator()
805 return Discard(this->emitSub(*T, BO)); in VisitBinaryOperator()
808 return Discard(this->emitAddf(getRoundingMode(BO), BO)); in VisitBinaryOperator()
809 return Discard(this->emitAdd(*T, BO)); in VisitBinaryOperator()
812 return Discard(this->emitMulf(getRoundingMode(BO), BO)); in VisitBinaryOperator()
813 return Discard(this->emitMul(*T, BO)); in VisitBinaryOperator()
815 return Discard(this->emitRem(*T, BO)); in VisitBinaryOperator()
818 return Discard(this->emitDivf(getRoundingMode(BO), BO)); in VisitBinaryOperator()
819 return Discard(this->emitDiv(*T, BO)); in VisitBinaryOperator()
822 return LHS->refersToBitField() ? this->emitStoreBitFieldPop(*T, BO) in VisitBinaryOperator()
823 : this->emitStorePop(*T, BO); in VisitBinaryOperator()
825 if (!this->emitStoreBitField(*T, BO)) in VisitBinaryOperator()
828 if (!this->emitStore(*T, BO)) in VisitBinaryOperator()
834 return this->emitLoadPop(*T, BO); in VisitBinaryOperator()
837 return Discard(this->emitBitAnd(*T, BO)); in VisitBinaryOperator()
839 return Discard(this->emitBitOr(*T, BO)); in VisitBinaryOperator()
841 return Discard(this->emitShl(*LT, *RT, BO)); in VisitBinaryOperator()
843 return Discard(this->emitShr(*LT, *RT, BO)); in VisitBinaryOperator()
845 return Discard(this->emitBitXor(*T, BO)); in VisitBinaryOperator()
882 return this->emitSubPtr(classifyPrim(E->getType()), E); in VisitPointerArithBinOp()
899 return this->emitAddOffset(OffsetType, E); in VisitPointerArithBinOp()
901 return this->emitSubOffset(OffsetType, E); in VisitPointerArithBinOp()
916 LabelTy LabelTrue = this->getLabel(); in VisitLogicalBinOp()
917 LabelTy LabelEnd = this->getLabel(); in VisitLogicalBinOp()
919 if (!this->visitBool(LHS)) in VisitLogicalBinOp()
921 if (!this->jumpTrue(LabelTrue)) in VisitLogicalBinOp()
924 if (!this->visitBool(RHS)) in VisitLogicalBinOp()
926 if (!this->jump(LabelEnd)) in VisitLogicalBinOp()
929 this->emitLabel(LabelTrue); in VisitLogicalBinOp()
930 this->emitConstBool(true, E); in VisitLogicalBinOp()
931 this->fallthrough(LabelEnd); in VisitLogicalBinOp()
932 this->emitLabel(LabelEnd); in VisitLogicalBinOp()
938 LabelTy LabelFalse = this->getLabel(); in VisitLogicalBinOp()
939 LabelTy LabelEnd = this->getLabel(); in VisitLogicalBinOp()
941 if (!this->visitBool(LHS)) in VisitLogicalBinOp()
943 if (!this->jumpFalse(LabelFalse)) in VisitLogicalBinOp()
946 if (!this->visitBool(RHS)) in VisitLogicalBinOp()
948 if (!this->jump(LabelEnd)) in VisitLogicalBinOp()
951 this->emitLabel(LabelFalse); in VisitLogicalBinOp()
952 this->emitConstBool(false, E); in VisitLogicalBinOp()
953 this->fallthrough(LabelEnd); in VisitLogicalBinOp()
954 this->emitLabel(LabelEnd); in VisitLogicalBinOp()
958 return this->emitPopBool(E); in VisitLogicalBinOp()
963 return this->emitCast(PT_Bool, *T, E); in VisitLogicalBinOp()
974 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitComplexBinOp()
983 PrimType ResultElemT = this->classifyComplexElementType(E->getType()); in VisitComplexBinOp()
986 ResultOffset = this->allocateLocalPrimitive(E, PT_Ptr, true, false); in VisitComplexBinOp()
989 if (!this->DiscardResult) { in VisitComplexBinOp()
990 if (!this->emitDupPtr(E)) in VisitComplexBinOp()
992 if (!this->emitSetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
1014 if (!this->visit(LHS)) in VisitComplexBinOp()
1016 if (!this->visit(RHS)) in VisitComplexBinOp()
1018 return this->emitMulc(ElemT, E); in VisitComplexBinOp()
1029 // This is using the RHS type for the fake-complex LHS. in VisitComplexBinOp()
1035 if (!this->emitGetPtrLocal(LHSOffset, E)) in VisitComplexBinOp()
1038 if (!this->visit(LHS)) in VisitComplexBinOp()
1041 if (!this->emitInitElem(ElemT, 0, E)) in VisitComplexBinOp()
1044 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitComplexBinOp()
1046 if (!this->emitInitElem(ElemT, 1, E)) in VisitComplexBinOp()
1049 if (!this->visit(LHS)) in VisitComplexBinOp()
1053 if (!this->visit(RHS)) in VisitComplexBinOp()
1055 return this->emitDivc(ElemT, E); in VisitComplexBinOp()
1060 LHSOffset = this->allocateLocalPrimitive(LHS, PT_Ptr, true, false); in VisitComplexBinOp()
1061 if (!this->visit(LHS)) in VisitComplexBinOp()
1063 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in VisitComplexBinOp()
1067 LHSOffset = this->allocateLocalPrimitive(LHS, LHST, true, false); in VisitComplexBinOp()
1068 if (!this->visit(LHS)) in VisitComplexBinOp()
1070 if (!this->emitSetLocal(LHST, LHSOffset, E)) in VisitComplexBinOp()
1077 RHSOffset = this->allocateLocalPrimitive(RHS, PT_Ptr, true, false); in VisitComplexBinOp()
1078 if (!this->visit(RHS)) in VisitComplexBinOp()
1080 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in VisitComplexBinOp()
1084 RHSOffset = this->allocateLocalPrimitive(RHS, RHST, true, false); in VisitComplexBinOp()
1085 if (!this->visit(RHS)) in VisitComplexBinOp()
1087 if (!this->emitSetLocal(RHST, RHSOffset, E)) in VisitComplexBinOp()
1094 auto loadComplexValue = [this](bool IsComplex, bool LoadZero, in VisitComplexBinOp()
1098 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitComplexBinOp()
1100 return this->emitArrayElemPop(classifyComplexElementType(E->getType()), in VisitComplexBinOp()
1104 return this->emitGetLocal(classifyPrim(E->getType()), Offset, E); in VisitComplexBinOp()
1105 return this->visitZeroInitializer(classifyPrim(E->getType()), E->getType(), in VisitComplexBinOp()
1112 if (!this->DiscardResult) { in VisitComplexBinOp()
1113 if (!this->emitGetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
1126 if (!this->emitAddf(getRoundingMode(E), E)) in VisitComplexBinOp()
1129 if (!this->emitAdd(ResultElemT, E)) in VisitComplexBinOp()
1140 if (!this->emitSubf(getRoundingMode(E), E)) in VisitComplexBinOp()
1143 if (!this->emitSub(ResultElemT, E)) in VisitComplexBinOp()
1155 if (!this->emitMulf(getRoundingMode(E), E)) in VisitComplexBinOp()
1158 if (!this->emitMul(ResultElemT, E)) in VisitComplexBinOp()
1171 if (!this->emitDivf(getRoundingMode(E), E)) in VisitComplexBinOp()
1174 if (!this->emitDiv(ResultElemT, E)) in VisitComplexBinOp()
1183 if (!this->DiscardResult) { in VisitComplexBinOp()
1185 if (!this->emitInitElemPop(ResultElemT, ElemIndex, E)) in VisitComplexBinOp()
1188 if (!this->emitPop(ResultElemT, E)) in VisitComplexBinOp()
1201 return this->visitZeroInitializer(*T, QT, E); in VisitImplicitValueInitExpr()
1226 return this->visitZeroRecordInitializer(R, E); in VisitImplicitValueInitExpr()
1240 if (!this->visitZeroInitializer(ElemT, CAT->getElementType(), E)) in VisitImplicitValueInitExpr()
1242 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1254 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitImplicitValueInitExpr()
1256 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1268 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitImplicitValueInitExpr()
1270 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1285 return this->discard(Base) && this->discard(Index); in VisitArraySubscriptExpr()
1288 // What's left on the stack after this is a pointer. in VisitArraySubscriptExpr()
1289 if (!this->visit(Base)) in VisitArraySubscriptExpr()
1292 if (!this->visit(Index)) in VisitArraySubscriptExpr()
1296 return this->emitArrayElemPtrPop(IndexT, E); in VisitArraySubscriptExpr()
1309 return this->emitInvalid(E); in visitInitList()
1314 if (!this->discard(Init)) in visitInitList()
1324 return this->visitZeroInitializer(*T, QT, E); in visitInitList()
1326 return this->delegate(Inits[0]); in visitInitList()
1333 return this->delegate(Inits[0]); in visitInitList()
1337 InitStackScope<Emitter> ISS(this, isa<CXXDefaultInitExpr>(Init)); in visitInitList()
1338 if (!this->visit(Init)) in visitInitList()
1342 return this->emitInitBitField(T, FieldToInit, E); in visitInitList()
1343 return this->emitInitField(T, FieldToInit->Offset, E); in visitInitList()
1348 InitStackScope<Emitter> ISS(this, isa<CXXDefaultInitExpr>(Init)); in visitInitList()
1349 InitLinkScope<Emitter> ILS(this, InitLink::Field(FieldToInit->Offset)); in visitInitList()
1352 if (!this->emitGetPtrField(FieldToInit->Offset, Init)) in visitInitList()
1354 if (!this->visitInitializer(Init)) in visitInitList()
1356 return this->emitPopPtr(E); in visitInitList()
1363 return this->emitFinishInit(E); in visitInitList()
1367 if (!this->visitZeroInitializer(*T, FieldType, E)) in visitInitList()
1369 if (!this->emitInitField(*T, FieldToInit->Offset, E)) in visitInitList()
1390 return this->emitFinishInit(E); in visitInitList()
1409 if (!this->emitGetPtrBase(B->Offset, Init)) in visitInitList()
1412 if (!this->visitInitializer(Init)) in visitInitList()
1415 if (!this->emitFinishInitPop(E)) in visitInitList()
1427 return this->emitFinishInit(E); in visitInitList()
1432 return this->delegate(Inits[0]); in visitInitList()
1442 if (!this->visit(Init)) in visitInitList()
1445 if (!this->emitCast(InitT, TargetT, E)) in visitInitList()
1448 return this->emitInitElem(TargetT, ElemIndex, Init); in visitInitList()
1453 if (!this->visitArrayElemInit(ElementIndex, Init)) in visitInitList()
1460 // FIXME: This should go away. in visitInitList()
1467 if (!this->visitArrayElemInit(ElementIndex, ArrayFiller)) in visitInitList()
1472 return this->emitFinishInit(E); in visitInitList()
1479 return this->delegate(Inits[0]); in visitInitList()
1486 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in visitInitList()
1488 if (!this->emitInitElem(ElemT, I, E)) in visitInitList()
1494 if (!this->visit(Init)) in visitInitList()
1497 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1515 if (!this->visit(Init)) in visitInitList()
1521 if (!this->emitCopyArray(ElemT, 0, InitIndex, in visitInitList()
1526 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1536 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in visitInitList()
1538 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1548 /// this.
1554 if (!this->visit(Init)) in visitArrayElemInit()
1556 return this->emitInitElem(*T, ElemIndex, Init); in visitArrayElemInit()
1561 if (!this->emitConstUint32(ElemIndex, Init)) in visitArrayElemInit()
1563 if (!this->emitArrayElemPtrUint32(Init)) in visitArrayElemInit()
1565 if (!this->visitInitializer(Init)) in visitArrayElemInit()
1567 return this->emitFinishInitPop(Init); in visitArrayElemInit()
1572 return this->visitInitList(E->inits(), E->getArrayFiller(), E); in VisitInitListExpr()
1578 return this->visitInitList(E->getInitExprs(), E->getArrayFiller(), E); in VisitCXXParenListInitExpr()
1584 return this->delegate(E->getReplacement()); in VisitSubstNonTypeTemplateParmExpr()
1592 // This will only fail if we can't emit the APValue, so won't emit any in VisitConstantExpr()
1597 if (this->visitAPValue(E->getAPValueResult(), *T, E)) in VisitConstantExpr()
1600 return this->delegate(E->getSubExpr()); in VisitConstantExpr()
1606 return this->visit(*It); in VisitEmbedExpr()
1662 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
1695 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
1700 return this->emitConst(VT->getNumElements(), E); in VisitUnaryExprOrTypeTraitExpr()
1702 return this->emitSizelessVectorElementSize(E); in VisitUnaryExprOrTypeTraitExpr()
1714 return this->emitConst(N, E); in VisitUnaryExprOrTypeTraitExpr()
1716 return this->emitConst(1, E); in VisitUnaryExprOrTypeTraitExpr()
1729 return this->discard(Base); in VisitMemberExpr()
1737 return this->emitLoadPop(*T, E); in VisitMemberExpr()
1743 // and therefore registered as a global variable. But this will probably in VisitMemberExpr()
1746 return this->emitGetPtrGlobal(*GlobalIndex, E) && maybeLoadValue(); in VisitMemberExpr()
1751 return this->discard(Base) && this->visitDeclRef(Member, E); in VisitMemberExpr()
1754 if (!this->delegate(Base)) in VisitMemberExpr()
1757 if (!this->visit(Base)) in VisitMemberExpr()
1770 return this->emitGetFieldPop(PT_Ptr, F->Offset, E) && maybeLoadValue(); in VisitMemberExpr()
1771 return this->emitGetPtrFieldPop(F->Offset, E) && maybeLoadValue(); in VisitMemberExpr()
1780 return this->emitConst(*ArrayIndex, E); in VisitArrayInitIndexExpr()
1790 if (!this->discard(E->getCommonExpr())) in VisitArrayInitLoopExpr()
1793 // TODO: This compiles to quite a lot of bytecode if the array is larger. in VisitArrayInitLoopExpr()
1794 // Investigate compiling this to a loop. in VisitArrayInitLoopExpr()
1802 ArrayIndexScope<Emitter> IndexScope(this, I); in VisitArrayInitLoopExpr()
1803 BlockScope<Emitter> BS(this); in VisitArrayInitLoopExpr()
1805 if (!this->visitArrayElemInit(I, SubExpr)) in VisitArrayInitLoopExpr()
1820 return this->visitInitializer(SourceExpr); in VisitOpaqueValueExpr()
1824 return this->emitGetLocal(SubExprT, It->second, E); in VisitOpaqueValueExpr()
1826 if (!this->visit(SourceExpr)) in VisitOpaqueValueExpr()
1829 // At this point we either have the evaluated source expression or a pointer in VisitOpaqueValueExpr()
1831 // this value. in VisitOpaqueValueExpr()
1833 if (!this->emitSetLocal(SubExprT, LocalIndex, E)) in VisitOpaqueValueExpr()
1839 if (!this->emitGetLocal(SubExprT, LocalIndex, E)) in VisitOpaqueValueExpr()
1843 // This is cleaned up when the local variable is destroyed. in VisitOpaqueValueExpr()
1856 LabelTy LabelEnd = this->getLabel(); // Label after the operator. in VisitAbstractConditionalOperator()
1857 LabelTy LabelFalse = this->getLabel(); // Label for the false expr. in VisitAbstractConditionalOperator()
1859 if (!this->visitBool(Condition)) in VisitAbstractConditionalOperator()
1862 if (!this->jumpFalse(LabelFalse)) in VisitAbstractConditionalOperator()
1865 if (!this->delegate(TrueExpr)) in VisitAbstractConditionalOperator()
1867 if (!this->jump(LabelEnd)) in VisitAbstractConditionalOperator()
1870 this->emitLabel(LabelFalse); in VisitAbstractConditionalOperator()
1872 if (!this->delegate(FalseExpr)) in VisitAbstractConditionalOperator()
1875 this->fallthrough(LabelEnd); in VisitAbstractConditionalOperator()
1876 this->emitLabel(LabelEnd); in VisitAbstractConditionalOperator()
1888 return this->emitGetPtrGlobal(StringIndex, E); in VisitStringLiteral()
1906 this->emitConstSint8(CodeUnit, E); in VisitStringLiteral()
1907 this->emitInitElemSint8(I, E); in VisitStringLiteral()
1909 this->emitConstUint16(CodeUnit, E); in VisitStringLiteral()
1910 this->emitInitElemUint16(I, E); in VisitStringLiteral()
1912 this->emitConstUint32(CodeUnit, E); in VisitStringLiteral()
1913 this->emitInitElemUint32(I, E); in VisitStringLiteral()
1922 this->emitConstSint8(0, E); in VisitStringLiteral()
1923 this->emitInitElemSint8(I, E); in VisitStringLiteral()
1925 this->emitConstUint16(0, E); in VisitStringLiteral()
1926 this->emitInitElemUint16(I, E); in VisitStringLiteral()
1928 this->emitConstUint32(0, E); in VisitStringLiteral()
1929 this->emitInitElemUint32(I, E); in VisitStringLiteral()
1940 return this->delegate(E->getString()); in VisitObjCStringLiteral()
1951 return this->delegate(SL); in VisitObjCEncodeExpr()
1975 return this->emitGetPtrGlobal(StringIndex, E); in VisitSYCLUniqueStableNameExpr()
1982 return this->emitConst(E->getValue(), E); in VisitCharacterLiteral()
2010 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitFloatCompoundAssignOperator()
2011 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
2017 if (!this->emitLoad(LHST, E)) in VisitFloatCompoundAssignOperator()
2021 if (!this->emitPrimCast(LHST, classifyPrim(LHSComputationType), in VisitFloatCompoundAssignOperator()
2026 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
2032 if (!this->emitAddf(RM, E)) in VisitFloatCompoundAssignOperator()
2036 if (!this->emitSubf(RM, E)) in VisitFloatCompoundAssignOperator()
2040 if (!this->emitMulf(RM, E)) in VisitFloatCompoundAssignOperator()
2044 if (!this->emitDivf(RM, E)) in VisitFloatCompoundAssignOperator()
2051 if (!this->emitPrimCast(classifyPrim(ResultType), LHST, LHS->getType(), E)) in VisitFloatCompoundAssignOperator()
2055 return this->emitStorePop(LHST, E); in VisitFloatCompoundAssignOperator()
2056 return this->emitStore(LHST, E); in VisitFloatCompoundAssignOperator()
2077 if (!this->emitLoad(*LT, LHS)) in VisitPointerCompoundAssignOperator()
2084 if (!this->emitAddOffset(*RT, E)) in VisitPointerCompoundAssignOperator()
2087 if (!this->emitSubOffset(*RT, E)) in VisitPointerCompoundAssignOperator()
2092 return this->emitStorePopPtr(E); in VisitPointerCompoundAssignOperator()
2093 return this->emitStorePtr(E); in VisitPointerCompoundAssignOperator()
2109 return this->visit(RHS) && this->visit(LHS) && this->emitError(E); in VisitCompoundAssignOperator()
2134 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitCompoundAssignOperator()
2136 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
2143 if (!this->emitLoad(*LT, E)) in VisitCompoundAssignOperator()
2146 if (!this->emitCast(*LT, *LHSComputationT, E)) in VisitCompoundAssignOperator()
2151 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
2157 if (!this->emitAdd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2161 if (!this->emitSub(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2165 if (!this->emitMul(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2169 if (!this->emitDiv(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2173 if (!this->emitRem(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2177 if (!this->emitShl(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
2181 if (!this->emitShr(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
2185 if (!this->emitBitAnd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2189 if (!this->emitBitXor(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2193 if (!this->emitBitOr(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2202 if (!this->emitCast(*LHSComputationT, *ResultT, E)) in VisitCompoundAssignOperator()
2209 return this->emitStoreBitFieldPop(*ResultT, E); in VisitCompoundAssignOperator()
2210 return this->emitStorePop(*ResultT, E); in VisitCompoundAssignOperator()
2213 return this->emitStoreBitField(*ResultT, E); in VisitCompoundAssignOperator()
2214 return this->emitStore(*ResultT, E); in VisitCompoundAssignOperator()
2219 LocalScope<Emitter> ES(this); in VisitExprWithCleanups()
2224 return this->delegate(SubExpr) && ES.destroyLocals(); in VisitExprWithCleanups()
2234 return this->delegate(SubExpr); in VisitMaterializeTemporaryExpr()
2239 return this->discard(SubExpr); in VisitMaterializeTemporaryExpr()
2256 if (!this->visit(SubExpr)) in VisitMaterializeTemporaryExpr()
2259 if (!this->emitInitGlobalTemp(*SubExprT, *GlobalIndex, TempDecl, E)) in VisitMaterializeTemporaryExpr()
2262 if (!this->emitInitGlobal(*SubExprT, *GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
2265 return this->emitGetPtrGlobal(*GlobalIndex, E); in VisitMaterializeTemporaryExpr()
2269 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
2271 if (!this->visitInitializer(SubExpr)) in VisitMaterializeTemporaryExpr()
2274 return this->emitInitGlobalTempComp(TempDecl, E); in VisitMaterializeTemporaryExpr()
2282 if (!this->visit(SubExpr)) in VisitMaterializeTemporaryExpr()
2284 if (!this->emitSetLocal(*SubExprT, LocalIndex, E)) in VisitMaterializeTemporaryExpr()
2286 return this->emitGetPtrLocal(LocalIndex, E); in VisitMaterializeTemporaryExpr()
2291 InitLinkScope<Emitter> ILS(this, InitLink::Temp(*LocalIndex)); in VisitMaterializeTemporaryExpr()
2292 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitMaterializeTemporaryExpr()
2294 return this->visitInitializer(SubExpr); in VisitMaterializeTemporaryExpr()
2303 return this->delegate(E->getSubExpr()); in VisitCXXBindTemporaryExpr()
2311 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2316 // Avoid creating a variable if this is a primitive RValue anyway. in VisitCompoundLiteralExpr()
2318 return this->delegate(Init); in VisitCompoundLiteralExpr()
2321 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCompoundLiteralExpr()
2325 if (!this->visit(Init)) in VisitCompoundLiteralExpr()
2327 return this->emitInitGlobal(*T, *GlobalIndex, E); in VisitCompoundLiteralExpr()
2330 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2339 return this->delegate(Init); in VisitCompoundLiteralExpr()
2344 LocalIndex = this->allocateLocalPrimitive(Init, *T, false, false); in VisitCompoundLiteralExpr()
2345 else if (std::optional<unsigned> MaybeIndex = this->allocateLocal(Init)) in VisitCompoundLiteralExpr()
2350 if (!this->emitGetPtrLocal(LocalIndex, E)) in VisitCompoundLiteralExpr()
2354 if (!this->visit(Init)) { in VisitCompoundLiteralExpr()
2357 return this->emitInit(*T, E); in VisitCompoundLiteralExpr()
2359 if (!this->visitInitializer(Init) || !this->emitFinishInit(E)) in VisitCompoundLiteralExpr()
2364 return this->emitPopPtr(E); in VisitCompoundLiteralExpr()
2376 return this->emitConstBool(E->getValue(), E); in VisitTypeTraitExpr()
2377 return this->emitConst(E->getValue(), E); in VisitTypeTraitExpr()
2384 return this->emitConst(E->getValue(), E); in VisitArrayTypeTraitExpr()
2406 if (!this->visit(Init)) in VisitLambdaExpr()
2409 if (!this->emitInitField(*T, F.Offset, E)) in VisitLambdaExpr()
2412 if (!this->emitGetPtrField(F.Offset, E)) in VisitLambdaExpr()
2415 if (!this->visitInitializer(Init)) in VisitLambdaExpr()
2418 if (!this->emitPopPtr(E)) in VisitLambdaExpr()
2431 return this->delegate(E->getFunctionName()); in VisitPredefinedExpr()
2436 if (E->getSubExpr() && !this->discard(E->getSubExpr())) in VisitCXXThrowExpr()
2439 return this->emitInvalid(E); in VisitCXXThrowExpr()
2445 if (!this->discard(E->getSubExpr())) in VisitCXXReinterpretCastExpr()
2448 return this->emitInvalidCast(CastKind::Reinterpret, E); in VisitCXXReinterpretCastExpr()
2457 return this->emitConstBool(E->getValue(), E); in VisitCXXNoexceptExpr()
2473 return this->visitInitializer(E->getArg(0)); in VisitCXXConstructExpr()
2486 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXConstructExpr()
2494 if (!this->visitZeroRecordInitializer(R, E)) in VisitCXXConstructExpr()
2510 // The This pointer is already on the stack because this is an initializer, in VisitCXXConstructExpr()
2512 if (!this->emitDupPtr(E)) in VisitCXXConstructExpr()
2517 if (!this->visit(Arg)) in VisitCXXConstructExpr()
2528 if (!this->emitCallVar(Func, VarArgSize, E)) in VisitCXXConstructExpr()
2531 if (!this->emitCall(Func, 0, E)) in VisitCXXConstructExpr()
2537 if (!this->emitRecordDestruction(getRecord(E->getType()))) in VisitCXXConstructExpr()
2539 if (!this->emitPopPtr(E)) in VisitCXXConstructExpr()
2559 if (!this->emitConstUint64(I, E)) in VisitCXXConstructExpr()
2561 if (!this->emitArrayElemPtrUint64(E)) in VisitCXXConstructExpr()
2566 if (!this->visit(Arg)) in VisitCXXConstructExpr()
2570 if (!this->emitCall(Func, 0, E)) in VisitCXXConstructExpr()
2591 return this->emitConst(I, E); in VisitSourceLocExpr()
2599 return this->visit(LValueExpr); in VisitSourceLocExpr()
2614 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitSourceLocExpr()
2625 if (!this->visitAPValue(FieldValue, FieldT, E)) in VisitSourceLocExpr()
2627 if (!this->emitInitField(FieldT, F->Offset, E)) in VisitSourceLocExpr()
2648 if (!this->discard(ArrayIndexExpr)) in VisitOffsetOfExpr()
2653 if (!this->visit(ArrayIndexExpr)) in VisitOffsetOfExpr()
2657 if (!this->emitCast(IndexT, PT_Sint64, E)) in VisitOffsetOfExpr()
2667 return this->emitOffsetOf(T, E, E); in VisitOffsetOfExpr()
2679 return this->visitZeroInitializer(*T, Ty, E); in VisitCXXScalarValueInitExpr()
2686 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXScalarValueInitExpr()
2695 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitCXXScalarValueInitExpr()
2697 if (!this->emitInitElem(ElemT, I, E)) in VisitCXXScalarValueInitExpr()
2709 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXScalarValueInitExpr()
2718 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitCXXScalarValueInitExpr()
2720 if (!this->emitInitElem(ElemT, I, E)) in VisitCXXScalarValueInitExpr()
2731 return this->emitConst(E->getPackLength(), E); in VisitSizeOfPackExpr()
2737 return this->delegate(E->getResultExpr()); in VisitGenericSelectionExpr()
2742 return this->delegate(E->getChosenSubExpr()); in VisitChooseExpr()
2750 return this->emitConst(E->getValue(), E); in VisitObjCBoolLiteralExpr()
2759 const Function *F = this->getFunction(Ctor); in VisitCXXInheritedCtorInitExpr()
2764 if (!this->emitDupPtr(SourceInfo{})) in VisitCXXInheritedCtorInitExpr()
2769 // This is necessary because the calling code has pushed the pointer in VisitCXXInheritedCtorInitExpr()
2774 PrimType PT = this->classify(PD->getType()).value_or(PT_Ptr); in VisitCXXInheritedCtorInitExpr()
2776 if (!this->emitGetParam(PT, Offset, E)) in VisitCXXInheritedCtorInitExpr()
2781 return this->emitCall(F, 0, E); in VisitCXXInheritedCtorInitExpr()
2797 // FIXME: There is no restriction on this, but it's not clear that any in VisitCXXNewExpr()
2806 return this->emitInvalid(E); in VisitCXXNewExpr()
2808 if (!this->discard(E->getPlacementArg(0))) in VisitCXXNewExpr()
2816 Desc = nullptr; // We're not going to use it in this case. in VisitCXXNewExpr()
2842 if (!this->visit(Stripped)) in VisitCXXNewExpr()
2847 if (!this->emitAllocN(SizeT, *ElemT, E, IsNoThrow, E)) in VisitCXXNewExpr()
2851 if (!this->emitAllocCN(SizeT, Desc, IsNoThrow, E)) in VisitCXXNewExpr()
2855 if (Init && !this->visitInitializer(Init)) in VisitCXXNewExpr()
2860 if (!this->emitAlloc(Desc, E)) in VisitCXXNewExpr()
2865 if (!this->visit(Init)) in VisitCXXNewExpr()
2868 if (!this->emitInit(*ElemT, E)) in VisitCXXNewExpr()
2872 if (!this->visitInitializer(Init)) in VisitCXXNewExpr()
2879 return this->emitPopPtr(E); in VisitCXXNewExpr()
2889 if (!this->visit(Arg)) in VisitCXXDeleteExpr()
2892 return this->emitFree(E->isArrayForm(), E); in VisitCXXDeleteExpr()
2898 return this->emitConstBool(E->getValue(), E); in VisitExpressionTraitExpr()
2914 return this->emitGetPtrGlobal(*I, E); in VisitCXXUuidofExpr()
2921 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCXXUuidofExpr()
2924 assert(this->getRecord(E->getType())); in VisitCXXUuidofExpr()
2932 if (!this->visitAPValueInitializer(V, E)) in VisitCXXUuidofExpr()
2935 return this->emitFinishInit(E); in VisitCXXUuidofExpr()
2943 return this->emitConstBool(E->isSatisfied(), E); in VisitRequiresExpr()
2952 return this->emitConstBool(E->isSatisfied(), E); in VisitConceptSpecializationExpr()
2958 return this->delegate(E->getSemanticForm()); in VisitCXXRewrittenBinaryOperator()
2972 if (!this->discard(OVE)) in VisitPseudoObjectExpr()
2975 if (!this->delegate(SemE)) in VisitPseudoObjectExpr()
2978 if (!this->discard(SemE)) in VisitPseudoObjectExpr()
2987 return this->delegate(E->getSelectedExpr()); in VisitPackIndexingExpr()
2992 return this->emitError(E); in VisitRecoveryExpr()
3002 return this->emitGetLocal(PT_Ptr, Offset, E); in VisitAddrLabelExpr()
3015 unsigned SrcOffset = this->allocateLocalPrimitive(Src, PT_Ptr, true, false); in VisitConvertVectorExpr()
3016 if (!this->visit(Src)) in VisitConvertVectorExpr()
3018 if (!this->emitSetLocal(PT_Ptr, SrcOffset, E)) in VisitConvertVectorExpr()
3022 if (!this->emitGetLocal(PT_Ptr, SrcOffset, E)) in VisitConvertVectorExpr()
3024 if (!this->emitArrayElemPop(SrcElemT, I, E)) in VisitConvertVectorExpr()
3027 if (!this->emitPrimCast(SrcElemT, ElemT, ElemType, E)) in VisitConvertVectorExpr()
3030 if (!this->emitInitElem(ElemT, I, E)) in VisitConvertVectorExpr()
3052 VectorOffsets[I] = this->allocateLocalPrimitive( in VisitShuffleVectorExpr()
3054 if (!this->visit(Vecs[I])) in VisitShuffleVectorExpr()
3056 if (!this->emitSetLocal(PT_Ptr, VectorOffsets[I], E)) in VisitShuffleVectorExpr()
3062 return this->emitInvalid(E); // FIXME: Better diagnostic. in VisitShuffleVectorExpr()
3065 if (!this->emitGetLocal(PT_Ptr, in VisitShuffleVectorExpr()
3069 if (!this->emitArrayElemPop(ElemT, InputVectorIndex, E)) in VisitShuffleVectorExpr()
3072 if (!this->emitInitElem(ElemT, I, E)) in VisitShuffleVectorExpr()
3091 if (!this->visit(Base)) in VisitExtVectorElementExpr()
3095 if (!this->emitConstUint32(Indices[0], E)) in VisitExtVectorElementExpr()
3097 return this->emitArrayElemPtrPop(PT_Uint32, E); in VisitExtVectorElementExpr()
3100 return this->emitArrayElemPop(classifyPrim(E->getType()), Indices[0], E); in VisitExtVectorElementExpr()
3106 if (!this->visit(Base)) in VisitExtVectorElementExpr()
3108 if (!this->emitSetLocal(PT_Ptr, BaseOffset, E)) in VisitExtVectorElementExpr()
3117 if (!this->emitGetPtrLocal(*ResultIndex, E)) in VisitExtVectorElementExpr()
3127 if (!this->emitGetLocal(PT_Ptr, BaseOffset, E)) in VisitExtVectorElementExpr()
3129 if (!this->emitArrayElemPop(ElemT, I, E)) in VisitExtVectorElementExpr()
3131 if (!this->emitInitElem(ElemT, DstIndex, E)) in VisitExtVectorElementExpr()
3144 return this->emitInvalid(E); in VisitObjCBoxedExpr()
3146 return this->delegate(E->getSubExpr()); in VisitObjCBoxedExpr()
3159 if (!this->visit(SubExpr)) in VisitCXXStdInitializerListExpr()
3161 if (!this->emitInitFieldPtr(R->getField(0u)->Offset, E)) in VisitCXXStdInitializerListExpr()
3166 if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()), in VisitCXXStdInitializerListExpr()
3169 return this->emitInitField(SecondFieldT, R->getField(1u)->Offset, E); in VisitCXXStdInitializerListExpr()
3173 if (!this->emitGetFieldPtr(R->getField(0u)->Offset, E)) in VisitCXXStdInitializerListExpr()
3175 if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()), PT_Uint64, E)) in VisitCXXStdInitializerListExpr()
3177 if (!this->emitArrayElemPtrPop(PT_Uint64, E)) in VisitCXXStdInitializerListExpr()
3179 return this->emitInitFieldPtr(R->getField(1u)->Offset, E); in VisitCXXStdInitializerListExpr()
3184 BlockScope<Emitter> BS(this); in VisitStmtExpr()
3185 StmtExprScope<Emitter> SS(this); in VisitStmtExpr()
3191 if (!this->visitStmt(S)) in VisitStmtExpr()
3199 return this->discard(ResultExpr); in VisitStmtExpr()
3200 return this->delegate(ResultExpr); in VisitStmtExpr()
3203 return this->visitStmt(S); in VisitStmtExpr()
3210 OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true, in discard()
3212 return this->Visit(E); in discard()
3217 return this->emitError(E); in delegate()
3220 // OptionScope<Emitter> Scope(this, DicardResult, Initializing); in delegate()
3222 return this->Visit(E); in delegate()
3230 return this->discard(E); in visit()
3239 if (!this->emitGetPtrLocal(*LocalIndex, E)) in visit()
3241 return this->visitInitializer(E); in visit()
3246 OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false, in visit()
3248 return this->Visit(E); in visit()
3256 return this->emitError(E); in visitInitializer()
3258 OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false, in visitInitializer()
3260 return this->Visit(E); in visitInitializer()
3268 if (!this->visit(E)) in visitBool()
3270 return this->emitComplexBoolCast(E); in visitBool()
3275 if (!this->visit(E)) in visitBool()
3283 if (!this->emitNull(*T, nullptr, E)) in visitBool()
3285 return this->emitNE(*T, E); in visitBool()
3290 return this->emitCastFloatingIntegralBool(E); in visitBool()
3293 return this->emitCast(*T, PT_Bool, E); in visitBool()
3301 return this->emitZeroBool(E); in visitZeroInitializer()
3303 return this->emitZeroSint8(E); in visitZeroInitializer()
3305 return this->emitZeroUint8(E); in visitZeroInitializer()
3307 return this->emitZeroSint16(E); in visitZeroInitializer()
3309 return this->emitZeroUint16(E); in visitZeroInitializer()
3311 return this->emitZeroSint32(E); in visitZeroInitializer()
3313 return this->emitZeroUint32(E); in visitZeroInitializer()
3315 return this->emitZeroSint64(E); in visitZeroInitializer()
3317 return this->emitZeroUint64(E); in visitZeroInitializer()
3319 return this->emitZeroIntAP(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
3321 return this->emitZeroIntAPS(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
3323 return this->emitNullPtr(nullptr, E); in visitZeroInitializer()
3325 return this->emitNullFnPtr(nullptr, E); in visitZeroInitializer()
3327 return this->emitNullMemberPtr(nullptr, E); in visitZeroInitializer()
3329 return this->emitConstFloat(APFloat::getZero(Ctx.getFloatSemantics(QT)), E); in visitZeroInitializer()
3346 if (!this->visitZeroInitializer(T, QT, E)) in visitZeroRecordInitializer()
3348 if (!this->emitInitField(T, Field.Offset, E)) in visitZeroRecordInitializer()
3353 if (!this->emitGetPtrField(Field.Offset, E)) in visitZeroRecordInitializer()
3360 if (!this->visitZeroInitializer(T, ET, E)) in visitZeroRecordInitializer()
3362 if (!this->emitInitElem(T, I, E)) in visitZeroRecordInitializer()
3369 if (!this->emitConstUint32(I, E)) in visitZeroRecordInitializer()
3371 if (!this->emitArrayElemPtr(PT_Uint32, E)) in visitZeroRecordInitializer()
3373 if (!this->visitZeroRecordInitializer(ElemRecord, E)) in visitZeroRecordInitializer()
3375 if (!this->emitPopPtr(E)) in visitZeroRecordInitializer()
3379 if (!this->visitZeroRecordInitializer(D->ElemRecord, E)) in visitZeroRecordInitializer()
3385 if (!this->emitPopPtr(E)) in visitZeroRecordInitializer()
3390 if (!this->emitGetPtrBase(B.Offset, E)) in visitZeroRecordInitializer()
3392 if (!this->visitZeroRecordInitializer(B.R, E)) in visitZeroRecordInitializer()
3394 if (!this->emitFinishInitPop(E)) in visitZeroRecordInitializer()
3408 return this->emitConstSint8(Value, E); in emitConst()
3410 return this->emitConstUint8(Value, E); in emitConst()
3412 return this->emitConstSint16(Value, E); in emitConst()
3414 return this->emitConstUint16(Value, E); in emitConst()
3416 return this->emitConstSint32(Value, E); in emitConst()
3418 return this->emitConstUint32(Value, E); in emitConst()
3420 return this->emitConstSint64(Value, E); in emitConst()
3422 return this->emitConstUint64(Value, E); in emitConst()
3424 return this->emitConstBool(Value, E); in emitConst()
3440 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
3447 return this->emitConstIntAPS(Value, E); in emitConst()
3449 return this->emitConstIntAP(Value, E); in emitConst()
3452 return this->emitConst(Value.getSExtValue(), Ty, E); in emitConst()
3453 return this->emitConst(Value.getZExtValue(), Ty, E); in emitConst()
3458 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
3478 Scope::Local Local = this->createLocal(D); in allocateLocalPrimitive()
3517 Scope::Local Local = this->createLocal(D); in allocateLocal()
3551 LocalScope<Emitter> RootScope(this); in visitExpr()
3556 return this->emitRetVoid(E) && RootScope.destroyLocals(); in visitExpr()
3563 return this->emitRet(*T, E) && RootScope.destroyLocals(); in visitExpr()
3569 if (std::optional<unsigned> LocalOffset = this->allocateLocal(E)) { in visitExpr()
3570 if (!this->emitGetPtrLocal(*LocalOffset, E)) in visitExpr()
3576 if (!this->emitFinishInit(E)) in visitExpr()
3581 return this->emitRetValue(E) && RootScope.destroyLocals(); in visitExpr()
3591 auto R = this->visitVarDecl(VD, /*Toplevel=*/true); in visitDecl()
3624 DeclScope<Emitter> LS(this, VD); in visitDeclAndReturn()
3625 if (!this->visit(VD->getAnyInitializer())) in visitDeclAndReturn()
3627 return this->emitRet(VarT.value_or(PT_Ptr), VD) && LS.destroyLocals(); in visitDeclAndReturn()
3630 LocalScope<Emitter> VDScope(this, VD); in visitDeclAndReturn()
3631 if (!this->visitVarDecl(VD, /*Toplevel=*/true)) in visitDeclAndReturn()
3638 if (!this->emitGetGlobalUnchecked(*VarT, *GlobalIndex, VD)) in visitDeclAndReturn()
3641 if (!this->emitGetPtrGlobal(*GlobalIndex, VD)) in visitDeclAndReturn()
3648 if (!this->emitGetLocal(*VarT, Local->second.Offset, VD)) in visitDeclAndReturn()
3651 if (!this->emitGetPtrLocal(Local->second.Offset, VD)) in visitDeclAndReturn()
3657 if (!this->emitRet(VarT.value_or(PT_Ptr), VD)) { in visitDeclAndReturn()
3658 // If the Ret above failed and this is a global variable, mark it as in visitDeclAndReturn()
3682 // This case is EvalEmitter-only. If we won't create any instructions for the in visitVarDecl()
3684 if (!this->isActive()) in visitVarDecl()
3693 return !NeedsOp || this->emitCheckDecl(VD, VD); in visitVarDecl()
3698 DeclScope<Emitter> LocalScope(this, VD); in visitVarDecl()
3701 if (!this->visit(Init)) in visitVarDecl()
3704 return checkDecl() && this->emitInitGlobal(*VarT, GlobalIndex, VD); in visitVarDecl()
3710 if (!this->emitGetPtrGlobal(GlobalIndex, Init)) in visitVarDecl()
3716 if (!this->emitFinishInit(Init)) in visitVarDecl()
3719 return this->emitPopPtr(Init); in visitVarDecl()
3722 // We've already seen and initialized this global. in visitVarDecl()
3728 // so let's try this one. in visitVarDecl()
3739 InitLinkScope<Emitter> ILS(this, InitLink::Decl(VD)); in visitVarDecl()
3742 unsigned Offset = this->allocateLocalPrimitive( in visitVarDecl()
3745 // If this is a toplevel declaration, create a scope for the in visitVarDecl()
3748 LocalScope<Emitter> Scope(this); in visitVarDecl()
3749 if (!this->visit(Init)) in visitVarDecl()
3751 return this->emitSetLocal(*VarT, Offset, VD) && Scope.destroyLocals(); in visitVarDecl()
3753 if (!this->visit(Init)) in visitVarDecl()
3755 return this->emitSetLocal(*VarT, Offset, VD); in visitVarDecl()
3759 if (std::optional<unsigned> Offset = this->allocateLocal(VD)) { in visitVarDecl()
3763 if (!this->emitGetPtrLocal(*Offset, Init)) in visitVarDecl()
3769 if (!this->emitFinishInit(Init)) in visitVarDecl()
3772 return this->emitPopPtr(Init); in visitVarDecl()
3787 return this->emitConst(Val.getInt(), ValType, E); in visitAPValue()
3789 return this->emitConstFloat(Val.getFloat(), E); in visitAPValue()
3793 return this->emitNull(ValType, nullptr, E); in visitAPValue()
3796 return this->visit(BaseExpr); in visitAPValue()
3798 return this->visitDeclRef(VD, E); in visitAPValue()
3802 return this->emitGetMemberPtr(MemberDecl, E); in visitAPValue()
3803 return this->emitNullMemberPtr(nullptr, E); in visitAPValue()
3814 const Record *R = this->getRecord(E->getType()); in visitAPValueInitializer()
3822 if (!this->visitAPValue(F, T, E)) in visitAPValueInitializer()
3824 if (!this->emitInitField(T, RF->Offset, E)) in visitAPValueInitializer()
3832 if (!this->emitGetPtrField(RF->Offset, E)) in visitAPValueInitializer()
3836 if (!this->visitAPValue(F.getArrayInitializedElt(A), ElemT, E)) in visitAPValueInitializer()
3838 if (!this->emitInitElem(ElemT, A, E)) in visitAPValueInitializer()
3842 if (!this->emitPopPtr(E)) in visitAPValueInitializer()
3845 if (!this->emitGetPtrField(RF->Offset, E)) in visitAPValueInitializer()
3847 if (!this->visitAPValueInitializer(F, E)) in visitAPValueInitializer()
3849 if (!this->emitPopPtr(E)) in visitAPValueInitializer()
3852 assert(false && "I don't think this should be possible"); in visitAPValueInitializer()
3858 const Record *R = this->getRecord(UnionField->getParent()); in visitAPValueInitializer()
3863 if (!this->visitAPValue(F, T, E)) in visitAPValueInitializer()
3865 return this->emitInitField(T, RF->Offset, E); in visitAPValueInitializer()
3879 // to the CallExpr. This is needed to get the correct codegen. in VisitBuiltinCallExpr()
3886 if (!this->emitGetPtrGlobal(*GlobalOffset, E)) in VisitBuiltinCallExpr()
3890 return this->emitDecayPtr(PT_Ptr, PT, E); in VisitBuiltinCallExpr()
3904 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitBuiltinCallExpr()
3911 if (!this->visit(Arg)) in VisitBuiltinCallExpr()
3916 if (!this->emitCallBI(Func, E, E)) in VisitBuiltinCallExpr()
3921 return this->emitPop(*ReturnT, E); in VisitBuiltinCallExpr()
3941 // for this call. in VisitCallExpr()
3943 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
3951 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
3955 if (!this->emitDupPtr(E)) in VisitCallExpr()
3967 if (!this->discard(E->getArg(0))) in VisitCallExpr()
3974 // Add the (optional, implicit) This pointer. in VisitCallExpr()
3977 // If we end up creating a CallPtr op for this, we need the base of the in VisitCallExpr()
3982 this->allocateLocalPrimitive(Callee, PT_MemberPtr, true, false); in VisitCallExpr()
3983 if (!this->visit(Callee)) in VisitCallExpr()
3985 if (!this->emitSetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
3987 if (!this->emitGetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
3989 if (!this->emitGetMemberPtrBase(E)) in VisitCallExpr()
3991 } else if (!this->visit(MC->getImplicitObjectArgument())) { in VisitCallExpr()
4000 if (!this->visit(Arg)) in VisitCallExpr()
4007 if (!this->emitCheckNonNullArg(ArgT, Arg)) in VisitCallExpr()
4038 if (!this->emitCallVirt(Func, VarArgSize, E)) in VisitCallExpr()
4046 if (!this->emitCallVar(Func, VarArgSize, E)) in VisitCallExpr()
4049 if (!this->emitCall(Func, 0, E)) in VisitCallExpr()
4065 if (!this->emitGetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
4067 if (!this->emitGetMemberPtrDecl(E)) in VisitCallExpr()
4069 if (!this->emitCallPtr(ArgSize, E, E)) in VisitCallExpr()
4072 if (!this->visit(E->getCallee())) in VisitCallExpr()
4075 if (!this->emitCallPtr(ArgSize, E, E)) in VisitCallExpr()
4082 return this->emitPop(*T, E); in VisitCallExpr()
4089 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultInitExpr()
4091 return this->delegate(E->getExpr()); in VisitCXXDefaultInitExpr()
4096 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultArgExpr()
4100 return this->visit(SubExpr); in VisitCXXDefaultArgExpr()
4103 return this->visitInitializer(SubExpr); in VisitCXXDefaultArgExpr()
4111 return this->emitConstBool(E->getValue(), E); in VisitCXXBoolLiteralExpr()
4120 return this->emitNullPtr(nullptr, E); in VisitCXXNullPtrLiteralExpr()
4131 return this->emitZero(T, E); in VisitGNUNullExpr()
4139 if (this->LambdaThisCapture.Offset > 0) { in VisitCXXThisExpr()
4140 if (this->LambdaThisCapture.IsPtr) in VisitCXXThisExpr()
4141 return this->emitGetThisFieldPtr(this->LambdaThisCapture.Offset, E); in VisitCXXThisExpr()
4142 return this->emitGetPtrThisField(this->LambdaThisCapture.Offset, E); in VisitCXXThisExpr()
4145 // In some circumstances, the 'this' pointer does not actually refer to the in VisitCXXThisExpr()
4148 // this scenario. in VisitCXXThisExpr()
4150 return this->emitThis(E); in VisitCXXThisExpr()
4160 if (!InitStack[I].template emit<Emitter>(this, E)) in VisitCXXThisExpr()
4165 return this->emitThis(E); in VisitCXXThisExpr()
4206 return this->emitInvalid(S); in visitStmt()
4208 return this->visitStmt(cast<LabelStmt>(S)->getSubStmt()); in visitStmt()
4211 return this->discard(E); in visitStmt()
4230 return this->visitStmt(S); in visitLoopBody()
4235 BlockScope<Emitter> Scope(this); in visitCompoundStmt()
4252 if (!this->visitVarDecl(VD)) in visitDeclStmt()
4261 if (this->InStmtExpr) in visitReturnStmt()
4262 return this->emitUnsupported(RS); in visitReturnStmt()
4265 LocalScope<Emitter> RetScope(this); in visitReturnStmt()
4268 if (!this->visit(RE)) in visitReturnStmt()
4270 this->emitCleanup(); in visitReturnStmt()
4271 return this->emitRet(*ReturnType, RS); in visitReturnStmt()
4273 if (!this->visit(RE)) in visitReturnStmt()
4277 if (!this->emitRVOPtr(RE)) in visitReturnStmt()
4279 if (!this->visitInitializer(RE)) in visitReturnStmt()
4281 if (!this->emitPopPtr(RE)) in visitReturnStmt()
4284 this->emitCleanup(); in visitReturnStmt()
4285 return this->emitRetVoid(RS); in visitReturnStmt()
4290 this->emitCleanup(); in visitReturnStmt()
4291 return this->emitRetVoid(RS); in visitReturnStmt()
4295 BlockScope<Emitter> IfScope(this); in visitIfStmt()
4310 if (!this->visitBool(IS->getCond())) in visitIfStmt()
4314 LabelTy LabelElse = this->getLabel(); in visitIfStmt()
4315 LabelTy LabelEnd = this->getLabel(); in visitIfStmt()
4316 if (!this->jumpFalse(LabelElse)) in visitIfStmt()
4320 if (!this->jump(LabelEnd)) in visitIfStmt()
4322 this->emitLabel(LabelElse); in visitIfStmt()
4325 this->emitLabel(LabelEnd); in visitIfStmt()
4327 LabelTy LabelEnd = this->getLabel(); in visitIfStmt()
4328 if (!this->jumpFalse(LabelEnd)) in visitIfStmt()
4332 this->emitLabel(LabelEnd); in visitIfStmt()
4343 LabelTy CondLabel = this->getLabel(); // Label before the condition. in visitWhileStmt()
4344 LabelTy EndLabel = this->getLabel(); // Label after the loop. in visitWhileStmt()
4345 LoopScope<Emitter> LS(this, EndLabel, CondLabel); in visitWhileStmt()
4347 this->fallthrough(CondLabel); in visitWhileStmt()
4348 this->emitLabel(CondLabel); in visitWhileStmt()
4354 if (!this->visitBool(Cond)) in visitWhileStmt()
4356 if (!this->jumpFalse(EndLabel)) in visitWhileStmt()
4359 LocalScope<Emitter> Scope(this); in visitWhileStmt()
4362 if (!this->visitLoopBody(Body)) in visitWhileStmt()
4366 if (!this->jump(CondLabel)) in visitWhileStmt()
4368 this->emitLabel(EndLabel); in visitWhileStmt()
4377 LabelTy StartLabel = this->getLabel(); in visitDoStmt()
4378 LabelTy EndLabel = this->getLabel(); in visitDoStmt()
4379 LabelTy CondLabel = this->getLabel(); in visitDoStmt()
4380 LoopScope<Emitter> LS(this, EndLabel, CondLabel); in visitDoStmt()
4381 LocalScope<Emitter> Scope(this); in visitDoStmt()
4383 this->fallthrough(StartLabel); in visitDoStmt()
4384 this->emitLabel(StartLabel); in visitDoStmt()
4388 if (!this->visitLoopBody(Body)) in visitDoStmt()
4390 this->fallthrough(CondLabel); in visitDoStmt()
4391 this->emitLabel(CondLabel); in visitDoStmt()
4392 if (!this->visitBool(Cond)) in visitDoStmt()
4395 if (!this->jumpTrue(StartLabel)) in visitDoStmt()
4398 this->fallthrough(EndLabel); in visitDoStmt()
4399 this->emitLabel(EndLabel); in visitDoStmt()
4411 LabelTy EndLabel = this->getLabel(); in visitForStmt()
4412 LabelTy CondLabel = this->getLabel(); in visitForStmt()
4413 LabelTy IncLabel = this->getLabel(); in visitForStmt()
4414 LoopScope<Emitter> LS(this, EndLabel, IncLabel); in visitForStmt()
4415 LocalScope<Emitter> Scope(this); in visitForStmt()
4417 if (Init && !this->visitStmt(Init)) in visitForStmt()
4419 this->fallthrough(CondLabel); in visitForStmt()
4420 this->emitLabel(CondLabel); in visitForStmt()
4427 if (!this->visitBool(Cond)) in visitForStmt()
4429 if (!this->jumpFalse(EndLabel)) in visitForStmt()
4436 if (Body && !this->visitLoopBody(Body)) in visitForStmt()
4438 this->fallthrough(IncLabel); in visitForStmt()
4439 this->emitLabel(IncLabel); in visitForStmt()
4440 if (Inc && !this->discard(Inc)) in visitForStmt()
4444 if (!this->jump(CondLabel)) in visitForStmt()
4446 this->fallthrough(EndLabel); in visitForStmt()
4447 this->emitLabel(EndLabel); in visitForStmt()
4462 LabelTy EndLabel = this->getLabel(); in visitCXXForRangeStmt()
4463 LabelTy CondLabel = this->getLabel(); in visitCXXForRangeStmt()
4464 LabelTy IncLabel = this->getLabel(); in visitCXXForRangeStmt()
4465 LoopScope<Emitter> LS(this, EndLabel, IncLabel); in visitCXXForRangeStmt()
4468 if (Init && !this->visitStmt(Init)) in visitCXXForRangeStmt()
4470 if (!this->visitStmt(RangeStmt)) in visitCXXForRangeStmt()
4472 if (!this->visitStmt(BeginStmt)) in visitCXXForRangeStmt()
4474 if (!this->visitStmt(EndStmt)) in visitCXXForRangeStmt()
4478 this->fallthrough(CondLabel); in visitCXXForRangeStmt()
4479 this->emitLabel(CondLabel); in visitCXXForRangeStmt()
4480 if (!this->visitBool(Cond)) in visitCXXForRangeStmt()
4482 if (!this->jumpFalse(EndLabel)) in visitCXXForRangeStmt()
4485 if (!this->visitVarDecl(LoopVar)) in visitCXXForRangeStmt()
4489 LocalScope<Emitter> Scope(this); in visitCXXForRangeStmt()
4493 if (!this->visitLoopBody(Body)) in visitCXXForRangeStmt()
4495 this->fallthrough(IncLabel); in visitCXXForRangeStmt()
4496 this->emitLabel(IncLabel); in visitCXXForRangeStmt()
4497 if (!this->discard(Inc)) in visitCXXForRangeStmt()
4501 if (!this->jump(CondLabel)) in visitCXXForRangeStmt()
4504 this->fallthrough(EndLabel); in visitCXXForRangeStmt()
4505 this->emitLabel(EndLabel); in visitCXXForRangeStmt()
4514 this->VarScope->emitDestructors(); in visitBreakStmt()
4515 return this->jump(*BreakLabel); in visitBreakStmt()
4523 this->VarScope->emitDestructors(); in visitContinueStmt()
4524 return this->jump(*ContinueLabel); in visitContinueStmt()
4530 PrimType CondT = this->classifyPrim(Cond->getType()); in visitSwitchStmt()
4532 LabelTy EndLabel = this->getLabel(); in visitSwitchStmt()
4534 unsigned CondVar = this->allocateLocalPrimitive(Cond, CondT, true, false); in visitSwitchStmt()
4545 if (!this->visit(Cond)) in visitSwitchStmt()
4547 if (!this->emitSetLocal(CondT, CondVar, S)) in visitSwitchStmt()
4558 CaseLabels[SC] = this->getLabel(); in visitSwitchStmt()
4561 PrimType ValueT = this->classifyPrim(Value->getType()); in visitSwitchStmt()
4564 if (!this->emitGetLocal(CondT, CondVar, CS)) in visitSwitchStmt()
4566 if (!this->visit(Value)) in visitSwitchStmt()
4570 if (!this->emitEQ(ValueT, S)) in visitSwitchStmt()
4572 if (!this->jumpTrue(CaseLabels[CS])) in visitSwitchStmt()
4576 DefaultLabel = this->getLabel(); in visitSwitchStmt()
4583 if (!this->jump(*DefaultLabel)) in visitSwitchStmt()
4586 if (!this->jump(EndLabel)) in visitSwitchStmt()
4590 SwitchScope<Emitter> SS(this, std::move(CaseLabels), EndLabel, DefaultLabel); in visitSwitchStmt()
4591 if (!this->visitStmt(S->getBody())) in visitSwitchStmt()
4593 this->emitLabel(EndLabel); in visitSwitchStmt()
4599 this->emitLabel(CaseLabels[S]); in visitCaseStmt()
4600 return this->visitStmt(S->getSubStmt()); in visitCaseStmt()
4605 this->emitLabel(*DefaultLabel); in visitDefaultStmt()
4606 return this->visitStmt(S->getSubStmt()); in visitDefaultStmt()
4611 if (this->Ctx.getLangOpts().CXXAssumptions && in visitAttributedStmt()
4612 !this->Ctx.getLangOpts().MSVCCompat) { in visitAttributedStmt()
4624 if (Assumption->HasSideEffects(this->Ctx.getASTContext())) in visitAttributedStmt()
4628 if (!this->visitBool(Assumption)) in visitAttributedStmt()
4631 if (!this->emitAssume(Assumption)) in visitAttributedStmt()
4637 return this->visitStmt(S->getSubStmt()); in visitAttributedStmt()
4643 return this->visitStmt(S->getTryBlock()); in visitCXXTryStmt()
4655 const Function *Func = this->getFunction(LambdaCallOp); in emitLambdaStaticInvokerBody()
4662 if (!this->emitRVOPtr(MD)) in emitLambdaStaticInvokerBody()
4668 // any captures, as verified above. Emit a null pointer. This is then in emitLambdaStaticInvokerBody()
4670 if (!this->emitNullPtr(nullptr, MD)) in emitLambdaStaticInvokerBody()
4675 auto It = this->Params.find(PVD); in emitLambdaStaticInvokerBody()
4676 assert(It != this->Params.end()); in emitLambdaStaticInvokerBody()
4680 PrimType ParamType = this->classify(PVD->getType()).value_or(PT_Ptr); in emitLambdaStaticInvokerBody()
4681 if (!this->emitGetParam(ParamType, It->second.Offset, MD)) in emitLambdaStaticInvokerBody()
4685 if (!this->emitCall(Func, 0, LambdaCallOp)) in emitLambdaStaticInvokerBody()
4688 this->emitCleanup(); in emitLambdaStaticInvokerBody()
4690 return this->emitRet(*ReturnType, MD); in emitLambdaStaticInvokerBody()
4693 return this->emitRetVoid(MD); in emitLambdaStaticInvokerBody()
4699 ReturnType = this->classify(F->getReturnType()); in visitFunc()
4707 if (std::optional<PrimType> T = this->classify(InitExpr)) { in visitFunc()
4708 if (!this->visit(InitExpr)) in visitFunc()
4712 return this->emitInitThisBitField(*T, F, FieldOffset, InitExpr); in visitFunc()
4713 return this->emitInitThisField(*T, FieldOffset, InitExpr); in visitFunc()
4717 InitLinkScope<Emitter> FieldScope(this, InitLink::Field(F->Offset)); in visitFunc()
4718 if (!this->emitGetPtrThisField(FieldOffset, InitExpr)) in visitFunc()
4721 if (!this->visitInitializer(InitExpr)) in visitFunc()
4724 return this->emitPopPtr(InitExpr); in visitFunc()
4727 // Emit custom code if this is a lambda static invoker. in visitFunc()
4730 return this->emitLambdaStaticInvokerBody(MD); in visitFunc()
4735 const Record *R = this->getRecord(RD); in visitFunc()
4739 InitLinkScope<Emitter> InitScope(this, InitLink::This()); in visitFunc()
4742 BlockScope<Emitter> Scope(this); in visitFunc()
4756 if (!this->emitGetPtrThisVirtBase(BaseDecl, InitExpr)) in visitFunc()
4761 // Get This Base and call initializer on it. in visitFunc()
4764 if (!this->emitGetPtrThisBase(B->Offset, InitExpr)) in visitFunc()
4768 if (!this->visitInitializer(InitExpr)) in visitFunc()
4770 if (!this->emitFinishInitPop(InitExpr)) in visitFunc()
4780 this->P.getOrCreateRecord(FD->getParent()); in visitFunc()
4794 if (!this->emitThis(InitExpr)) in visitFunc()
4796 if (!this->visitInitializer(Init->getInit())) in visitFunc()
4798 if (!this->emitPopPtr(InitExpr)) in visitFunc()
4813 return this->emitRetVoid(SourceInfo{}); in visitFunc()
4814 return this->emitNoRet(SourceInfo{}); in visitFunc()
4821 return this->VisitComplexUnaryOperator(E); in VisitUnaryOperator()
4827 return this->emitInvalid(E); in VisitUnaryOperator()
4829 return this->emitError(E); in VisitUnaryOperator()
4831 if (!this->visit(SubExpr)) in VisitUnaryOperator()
4835 if (!this->emitIncPtr(E)) in VisitUnaryOperator()
4838 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
4842 return DiscardResult ? this->emitIncfPop(getRoundingMode(E), E) in VisitUnaryOperator()
4843 : this->emitIncf(getRoundingMode(E), E); in VisitUnaryOperator()
4846 return DiscardResult ? this->emitIncPop(*T, E) : this->emitInc(*T, E); in VisitUnaryOperator()
4850 return this->emitInvalid(E); in VisitUnaryOperator()
4852 return this->emitError(E); in VisitUnaryOperator()
4854 if (!this->visit(SubExpr)) in VisitUnaryOperator()
4858 if (!this->emitDecPtr(E)) in VisitUnaryOperator()
4861 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
4865 return DiscardResult ? this->emitDecfPop(getRoundingMode(E), E) in VisitUnaryOperator()
4866 : this->emitDecf(getRoundingMode(E), E); in VisitUnaryOperator()
4869 return DiscardResult ? this->emitDecPop(*T, E) : this->emitDec(*T, E); in VisitUnaryOperator()
4873 return this->emitInvalid(E); in VisitUnaryOperator()
4875 return this->emitError(E); in VisitUnaryOperator()
4877 if (!this->visit(SubExpr)) in VisitUnaryOperator()
4881 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
4883 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
4885 if (!this->emitAddOffsetUint8(E)) in VisitUnaryOperator()
4887 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
4893 return this->emitIncfPop(getRoundingMode(E), E); in VisitUnaryOperator()
4894 return this->emitIncPop(*T, E); in VisitUnaryOperator()
4899 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
4901 if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E)) in VisitUnaryOperator()
4903 if (!this->emitAddf(getRoundingMode(E), E)) in VisitUnaryOperator()
4905 if (!this->emitStoreFloat(E)) in VisitUnaryOperator()
4909 if (!this->emitLoad(*T, E)) in VisitUnaryOperator()
4911 if (!this->emitConst(1, E)) in VisitUnaryOperator()
4913 if (!this->emitAdd(*T, E)) in VisitUnaryOperator()
4915 if (!this->emitStore(*T, E)) in VisitUnaryOperator()
4918 return E->isGLValue() || this->emitLoadPop(*T, E); in VisitUnaryOperator()
4922 return this->emitInvalid(E); in VisitUnaryOperator()
4924 return this->emitError(E); in VisitUnaryOperator()
4926 if (!this->visit(SubExpr)) in VisitUnaryOperator()
4930 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
4932 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
4934 if (!this->emitSubOffsetUint8(E)) in VisitUnaryOperator()
4936 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
4942 return this->emitDecfPop(getRoundingMode(E), E); in VisitUnaryOperator()
4943 return this->emitDecPop(*T, E); in VisitUnaryOperator()
4948 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
4950 if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E)) in VisitUnaryOperator()
4952 if (!this->emitSubf(getRoundingMode(E), E)) in VisitUnaryOperator()
4954 if (!this->emitStoreFloat(E)) in VisitUnaryOperator()
4958 if (!this->emitLoad(*T, E)) in VisitUnaryOperator()
4960 if (!this->emitConst(1, E)) in VisitUnaryOperator()
4962 if (!this->emitSub(*T, E)) in VisitUnaryOperator()
4964 if (!this->emitStore(*T, E)) in VisitUnaryOperator()
4967 return E->isGLValue() || this->emitLoadPop(*T, E); in VisitUnaryOperator()
4971 return this->emitError(E); in VisitUnaryOperator()
4974 return this->discard(SubExpr); in VisitUnaryOperator()
4976 if (!this->visitBool(SubExpr)) in VisitUnaryOperator()
4979 if (!this->emitInvBool(E)) in VisitUnaryOperator()
4983 return this->emitCast(PT_Bool, ET, E); in VisitUnaryOperator()
4987 return this->emitError(E); in VisitUnaryOperator()
4989 if (!this->visit(SubExpr)) in VisitUnaryOperator()
4991 return DiscardResult ? this->emitPop(*T, E) : this->emitNeg(*T, E); in VisitUnaryOperator()
4994 return this->emitError(E); in VisitUnaryOperator()
4996 if (!this->visit(SubExpr)) // noop in VisitUnaryOperator()
4998 return DiscardResult ? this->emitPop(*T, E) : true; in VisitUnaryOperator()
5003 return this->emitGetMemberPtr(cast<DeclRefExpr>(SubExpr)->getDecl(), E); in VisitUnaryOperator()
5006 return this->delegate(SubExpr); in VisitUnaryOperator()
5009 return this->discard(SubExpr); in VisitUnaryOperator()
5010 return this->visit(SubExpr); in VisitUnaryOperator()
5013 return this->emitError(E); in VisitUnaryOperator()
5015 if (!this->visit(SubExpr)) in VisitUnaryOperator()
5017 return DiscardResult ? this->emitPop(*T, E) : this->emitComp(*T, E); in VisitUnaryOperator()
5020 return this->delegate(SubExpr); in VisitUnaryOperator()
5023 if (!this->discard(SubExpr)) in VisitUnaryOperator()
5025 return this->visitZeroInitializer(*T, SubExpr->getType(), SubExpr); in VisitUnaryOperator()
5028 return this->delegate(SubExpr); in VisitUnaryOperator()
5042 return this->discard(SubExpr); in VisitComplexUnaryOperator()
5050 return this->emitGetPtrLocal(*LocalIndex, E); in VisitComplexUnaryOperator()
5059 SubExprOffset = this->allocateLocalPrimitive(SubExpr, PT_Ptr, true, false); in VisitComplexUnaryOperator()
5060 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
5062 return this->emitSetLocal(PT_Ptr, SubExprOffset, E); in VisitComplexUnaryOperator()
5067 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitComplexUnaryOperator()
5069 return this->emitArrayElemPop(ElemT, Index, E); in VisitComplexUnaryOperator()
5081 if (!this->emitNeg(ElemT, E)) in VisitComplexUnaryOperator()
5083 if (!this->emitInitElem(ElemT, I, E)) in VisitComplexUnaryOperator()
5091 return this->delegate(SubExpr); in VisitComplexUnaryOperator()
5094 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
5096 if (!this->emitComplexBoolCast(SubExpr)) in VisitComplexUnaryOperator()
5098 if (!this->emitInvBool(E)) in VisitComplexUnaryOperator()
5101 return this->emitCast(PT_Bool, ET, E); in VisitComplexUnaryOperator()
5105 return this->emitComplexReal(SubExpr); in VisitComplexUnaryOperator()
5108 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
5112 if (!this->emitConstUint8(1, E)) in VisitComplexUnaryOperator()
5114 return this->emitArrayElemPtrPopUint8(E); in VisitComplexUnaryOperator()
5119 return this->emitArrayElemPop(classifyPrim(E->getType()), 1, E); in VisitComplexUnaryOperator()
5122 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
5125 if (!this->emitArrayElem(ElemT, 1, E)) in VisitComplexUnaryOperator()
5127 if (!this->emitNeg(ElemT, E)) in VisitComplexUnaryOperator()
5129 if (!this->emitInitElem(ElemT, 1, E)) in VisitComplexUnaryOperator()
5131 return DiscardResult ? this->emitPopPtr(E) : true; in VisitComplexUnaryOperator()
5134 return this->delegate(SubExpr); in VisitComplexUnaryOperator()
5137 return this->emitInvalid(E); in VisitComplexUnaryOperator()
5149 return this->emitConst(ECD->getInitVal(), E); in visitDeclRef()
5151 return this->visit(BD->getBinding()); in visitDeclRef()
5154 return F && this->emitGetFnPtr(F, E); in visitDeclRef()
5157 if (!this->emitGetPtrGlobal(*Index, E)) in visitDeclRef()
5160 if (!this->visitAPValue(TPOD->getValue(), *T, E)) in visitDeclRef()
5162 return this->emitInitGlobal(*T, *Index, E); in visitDeclRef()
5164 return this->visitAPValueInitializer(TPOD->getValue(), E); in visitDeclRef()
5179 return this->emitGetLocal(PT_Ptr, Offset, E); in visitDeclRef()
5180 return this->emitGetPtrLocal(Offset, E); in visitDeclRef()
5184 return this->emitGetGlobal(classifyPrim(E), *GlobalIndex, E); in visitDeclRef()
5185 return this->emitGetGlobalUnchecked(classifyPrim(E), *GlobalIndex, E); in visitDeclRef()
5188 return this->emitGetPtrGlobal(*GlobalIndex, E); in visitDeclRef()
5190 if (auto It = this->Params.find(PVD); It != this->Params.end()) { in visitDeclRef()
5192 return this->emitGetParam(classifyPrim(E), It->second.Offset, E); in visitDeclRef()
5194 return this->emitGetPtrParam(It->second.Offset, E); in visitDeclRef()
5200 auto VarState = this->visitDecl(VD); in visitDeclRef()
5207 return this->visitDeclRef(D, E); in visitDeclRef()
5211 if (auto It = this->LambdaCaptures.find(D); in visitDeclRef()
5212 It != this->LambdaCaptures.end()) { in visitDeclRef()
5216 return this->emitGetThisFieldPtr(Offset, E); in visitDeclRef()
5217 return this->emitGetPtrThisField(Offset, E); in visitDeclRef()
5252 if (!this->emitGetPtrGlobal(*I, E)) in visitDeclRef()
5259 return this->emitDecayPtr(PT_Ptr, PT, E); in visitDeclRef()
5266 return this->emitInvalidDeclRef(DRE, E); in visitDeclRef()
5273 return this->visitDeclRef(D, E); in VisitDeclRefExpr()
5304 return this->emitCastFP(ToSem, getRoundingMode(E), E); in emitPrimCast()
5308 return this->emitCastFloatingIntegralAP(Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5310 return this->emitCastFloatingIntegralAPS(Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5314 return this->emitCastFloatingIntegral(ToT, E); in emitPrimCast()
5319 return this->emitCastAP(FromT, Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5321 return this->emitCastAPS(FromT, Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5325 return FromT != ToT ? this->emitCast(FromT, ToT, E) : true; in emitPrimCast()
5330 return this->emitCastIntegralFloating(FromT, ToSem, getRoundingMode(E), in emitPrimCast()
5344 return this->discard(SubExpr); in emitComplexReal()
5346 if (!this->visit(SubExpr)) in emitComplexReal()
5349 if (!this->emitConstUint8(0, SubExpr)) in emitComplexReal()
5351 return this->emitArrayElemPtrPopUint8(SubExpr); in emitComplexReal()
5355 return this->emitArrayElemPop(classifyComplexElementType(SubExpr->getType()), in emitComplexReal()
5365 if (!this->emitArrayElem(ElemT, 0, E)) in emitComplexBoolCast()
5368 if (!this->emitCastFloatingIntegral(PT_Bool, E)) in emitComplexBoolCast()
5371 if (!this->emitCast(ElemT, PT_Bool, E)) in emitComplexBoolCast()
5376 LabelTy LabelTrue = this->getLabel(); in emitComplexBoolCast()
5377 if (!this->jumpTrue(LabelTrue)) in emitComplexBoolCast()
5380 if (!this->emitArrayElemPop(ElemT, 1, E)) in emitComplexBoolCast()
5383 if (!this->emitCastFloatingIntegral(PT_Bool, E)) in emitComplexBoolCast()
5386 if (!this->emitCast(ElemT, PT_Bool, E)) in emitComplexBoolCast()
5390 LabelTy EndLabel = this->getLabel(); in emitComplexBoolCast()
5391 this->jump(EndLabel); in emitComplexBoolCast()
5393 this->emitLabel(LabelTrue); in emitComplexBoolCast()
5394 if (!this->emitPopPtr(E)) in emitComplexBoolCast()
5396 if (!this->emitConstBool(true, E)) in emitComplexBoolCast()
5399 this->fallthrough(EndLabel); in emitComplexBoolCast()
5400 this->emitLabel(EndLabel); in emitComplexBoolCast()
5420 if (!this->visit(LHS)) in emitComplexComparison()
5422 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in emitComplexComparison()
5427 LHSOffset = this->allocateLocalPrimitive(LHS, LHST, true, false); in emitComplexComparison()
5428 if (!this->visit(LHS)) in emitComplexComparison()
5430 if (!this->emitSetLocal(LHST, LHSOffset, E)) in emitComplexComparison()
5441 if (!this->visit(RHS)) in emitComplexComparison()
5443 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in emitComplexComparison()
5448 RHSOffset = this->allocateLocalPrimitive(RHS, RHST, true, false); in emitComplexComparison()
5449 if (!this->visit(RHS)) in emitComplexComparison()
5451 if (!this->emitSetLocal(RHST, RHSOffset, E)) in emitComplexComparison()
5458 if (!this->emitGetLocal(PT_Ptr, LocalOffset, E)) in emitComplexComparison()
5460 return this->emitArrayElemPop(ElemT, Index, E); in emitComplexComparison()
5462 return this->emitGetLocal(ElemT, LocalOffset, E); in emitComplexComparison()
5472 if (!this->emitEQ(ElemT, E)) in emitComplexComparison()
5475 if (!this->emitCastBoolUint8(E)) in emitComplexComparison()
5480 if (!this->emitAddUint8(E)) in emitComplexComparison()
5482 if (!this->emitConstUint8(2, E)) in emitComplexComparison()
5486 if (!this->emitEQUint8(E)) in emitComplexComparison()
5489 if (!this->emitNEUint8(E)) in emitComplexComparison()
5494 // In C, this returns an int. in emitComplexComparison()
5496 return this->emitCast(PT_Bool, ResT, E); in emitComplexComparison()
5500 /// When calling this, we have a pointer of the local-to-destroy
5510 if (!this->emitGetPtrField(Field.Offset, SourceInfo{})) in emitRecordDestruction()
5512 if (!this->emitDestruction(D)) in emitRecordDestruction()
5514 if (!this->emitPopPtr(SourceInfo{})) in emitRecordDestruction()
5530 if (!this->emitDupPtr(SourceInfo{})) in emitRecordDestruction()
5532 if (!this->emitCall(DtorFunc, 0, SourceInfo{})) in emitRecordDestruction()
5537 if (!this->emitGetPtrBase(Base.Offset, SourceInfo{})) in emitRecordDestruction()
5539 if (!this->emitRecordDestruction(Base.R)) in emitRecordDestruction()
5541 if (!this->emitPopPtr(SourceInfo{})) in emitRecordDestruction()
5548 /// When calling this, we have a pointer of the local-to-destroy
5566 // If this is an array of record types, check if we need in emitDestruction()
5576 if (!this->emitConstUint64(I, SourceInfo{})) in emitDestruction()
5578 if (!this->emitArrayElemPtrUint64(SourceInfo{})) in emitDestruction()
5580 if (!this->emitDestruction(ElemDesc)) in emitDestruction()
5582 if (!this->emitPopPtr(SourceInfo{})) in emitDestruction()
5589 return this->emitRecordDestruction(Desc->ElemRecord); in emitDestruction()