Lines Matching full:this

49     this->Ctx->InitializingDecl = OldInitializingDecl;  in ~DeclScope()
50 this->Ctx->InitStack.pop_back(); in ~DeclScope()
131 this->Ctx->BreakLabel = BreakLabel; in LoopScope()
132 this->Ctx->ContinueLabel = ContinueLabel; in LoopScope()
133 this->Ctx->BreakVarScope = this->Ctx->VarScope; in LoopScope()
134 this->Ctx->ContinueVarScope = this->Ctx->VarScope; in LoopScope()
138 this->Ctx->BreakLabel = OldBreakLabel; in ~LoopScope()
139 this->Ctx->ContinueLabel = OldContinueLabel; in ~LoopScope()
140 this->Ctx->ContinueVarScope = OldContinueVarScope; in ~LoopScope()
141 this->Ctx->BreakVarScope = OldBreakVarScope; in ~LoopScope()
161 OldDefaultLabel(this->Ctx->DefaultLabel), in SwitchScope()
162 OldCaseLabels(std::move(this->Ctx->CaseLabels)), in SwitchScope()
164 this->Ctx->BreakLabel = BreakLabel; in SwitchScope()
165 this->Ctx->DefaultLabel = DefaultLabel; in SwitchScope()
166 this->Ctx->CaseLabels = std::move(CaseLabels); in SwitchScope()
167 this->Ctx->BreakVarScope = this->Ctx->VarScope; in SwitchScope()
171 this->Ctx->BreakLabel = OldBreakLabel; in ~SwitchScope()
172 this->Ctx->DefaultLabel = OldDefaultLabel; in ~SwitchScope()
173 this->Ctx->CaseLabels = std::move(OldCaseLabels); in ~SwitchScope()
174 this->Ctx->BreakVarScope = OldLabelVarScope; in ~SwitchScope()
205 return this->delegate(SubExpr); in VisitCastExpr()
210 return this->emitInvalidCast(CastKind::Volatile, /*Fatal=*/true, CE); in VisitCastExpr()
218 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
222 if (!this->visit(SubExpr)) in VisitCastExpr()
226 return this->emitLoadPop(*SubExprT, CE); in VisitCastExpr()
229 // This happens for example in C when dereferencing a pointer of struct in VisitCastExpr()
231 return this->emitMemcpy(CE); in VisitCastExpr()
244 if (!this->delegate(SubExpr)) in VisitCastExpr()
247 return this->emitGetMemberPtrBasePop(DerivedOffset, CE); in VisitCastExpr()
260 if (!this->delegate(SubExpr)) in VisitCastExpr()
262 return this->emitGetMemberPtrBasePop(-DerivedOffset, CE); in VisitCastExpr()
267 if (!this->delegate(SubExpr)) in VisitCastExpr()
281 if (!this->emitGetPtrVirtBasePop(extractRecordDecl(B->getType()), CE)) in VisitCastExpr()
286 if (!this->emitGetPtrBasePop( in VisitCastExpr()
297 if (!this->delegate(SubExpr)) in VisitCastExpr()
305 return this->emitGetPtrDerivedPop(DerivedOffset, in VisitCastExpr()
315 if (!this->visit(SubExpr)) in VisitCastExpr()
318 return this->emitCastFP(TargetSemantics, getRoundingMode(CE), CE); in VisitCastExpr()
324 if (!this->visit(SubExpr)) in VisitCastExpr()
327 return this->emitCastIntegralFloating( in VisitCastExpr()
336 return this->emitConstBool(FL->getValue().isNonZero(), CE); in VisitCastExpr()
337 if (!this->visit(SubExpr)) in VisitCastExpr()
339 return this->emitCastFloatingIntegralBool(getFPOptions(CE), CE); in VisitCastExpr()
343 if (!this->visit(SubExpr)) in VisitCastExpr()
347 return this->emitCastFloatingIntegralAP(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
350 return this->emitCastFloatingIntegralAPS(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
353 return this->emitCastFloatingIntegral(ToT, getFPOptions(CE), CE); in VisitCastExpr()
358 if (!this->discard(SubExpr)) in VisitCastExpr()
371 return this->emitNull(classifyPrim(CE->getType()), Val, Desc, CE); in VisitCastExpr()
375 if (!this->visit(SubExpr)) in VisitCastExpr()
381 if (!this->emitDecayPtr(FromT, PT_Ptr, CE)) in VisitCastExpr()
387 return this->emitCastPointerIntegralAP(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
390 return this->emitCastPointerIntegralAPS(Ctx.getBitWidth(CE->getType()), in VisitCastExpr()
392 return this->emitCastPointerIntegral(T, CE); in VisitCastExpr()
396 if (!this->visit(SubExpr)) in VisitCastExpr()
398 return this->emitArrayDecay(CE); in VisitCastExpr()
404 if (!this->visit(SubExpr)) in VisitCastExpr()
419 if (!this->emitGetIntPtr(T, Desc, CE)) in VisitCastExpr()
427 return this->emitDecayPtr(PT_Ptr, DestPtrT, CE); in VisitCastExpr()
438 return this->delegate(SubExpr); in VisitCastExpr()
443 if (!this->discard(SubExpr)) in VisitCastExpr()
445 return this->emitInvalidCast(CastKind::Reinterpret, /*Fatal=*/true, CE); in VisitCastExpr()
451 return this->emitBuiltinBitCast(CE); in VisitCastExpr()
461 return this->delegate(SubExpr); in VisitCastExpr()
463 if (!this->visit(SubExpr)) in VisitCastExpr()
468 return this->emitPtrPtrCast(SubExprTy->isVoidPointerType(), CE); in VisitCastExpr()
472 if (!this->visit(SubExpr)) in VisitCastExpr()
474 return this->emitDecayPtr(*FromT, *ToT, CE); in VisitCastExpr()
478 // HLSL uses this to cast to one-element vectors. in VisitCastExpr()
484 return this->emitConst(IL->getValue(), CE); in VisitCastExpr()
485 if (!this->visit(SubExpr)) in VisitCastExpr()
487 return this->emitCast(*FromT, classifyPrim(CE), CE); in VisitCastExpr()
501 return this->emitConst(IL->getValue(), CE); in VisitCastExpr()
502 if (!this->emitConst(IL->getValue(), SubExpr)) in VisitCastExpr()
505 if (!this->visit(SubExpr)) in VisitCastExpr()
514 if (!this->emitCheckEnumValue(*FromT, ET->getDecl(), CE)) in VisitCastExpr()
520 if (!this->emitCastAP(*FromT, Ctx.getBitWidth(CE->getType()), CE)) in VisitCastExpr()
523 if (!this->emitCastAPS(*FromT, Ctx.getBitWidth(CE->getType()), CE)) in VisitCastExpr()
528 if (!this->emitCast(*FromT, *ToT, CE)) in VisitCastExpr()
532 return this->emitNeg(*ToT, CE); in VisitCastExpr()
540 if (!this->visit(SubExpr)) in VisitCastExpr()
542 return this->emitIsNonNull(PtrT, CE); in VisitCastExpr()
547 if (!this->visit(SubExpr)) in VisitCastExpr()
549 return this->emitComplexBoolCast(SubExpr); in VisitCastExpr()
554 return this->emitComplexReal(SubExpr); in VisitCastExpr()
564 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
570 if (!this->visitArrayElemInit(0, SubExpr, T)) in VisitCastExpr()
573 if (!this->visitZeroInitializer(T, SubExpr->getType(), SubExpr)) in VisitCastExpr()
575 return this->emitInitElem(T, 1, SubExpr); in VisitCastExpr()
588 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
597 if (!this->visit(SubExpr)) in VisitCastExpr()
599 if (!this->emitSetLocal(PT_Ptr, SubExprOffset, CE)) in VisitCastExpr()
608 if (!this->emitGetLocal(PT_Ptr, SubExprOffset, CE)) in VisitCastExpr()
610 if (!this->emitArrayElemPop(SourceElemT, I, CE)) in VisitCastExpr()
614 if (!this->emitPrimCast(SourceElemT, DestElemT, DestElemType, CE)) in VisitCastExpr()
618 if (!this->emitInitElem(DestElemT, I, CE)) in VisitCastExpr()
633 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
643 if (!this->visit(SubExpr)) in VisitCastExpr()
645 if (classifyPrim(SubExpr) == PT_Ptr && !this->emitLoadPop(ElemT, CE)) in VisitCastExpr()
648 if (!this->emitSetLocal(ElemT, ElemOffset, CE)) in VisitCastExpr()
652 if (!this->emitGetLocal(ElemT, ElemOffset, CE)) in VisitCastExpr()
654 if (!this->emitInitElem(ElemT, I, CE)) in VisitCastExpr()
666 if (!this->visit(SubExpr)) in VisitCastExpr()
668 return this->emitArrayElemPop(*ResultT, 0, CE); in VisitCastExpr()
670 // Otherwise, this truncates from one vector type to another. in VisitCastExpr()
677 if (!this->emitGetPtrLocal(*LocalIndex, CE)) in VisitCastExpr()
682 if (!this->visit(SubExpr)) in VisitCastExpr()
684 return this->emitCopyArray(classifyVectorElementType(CE->getType()), 0, 0, in VisitCastExpr()
689 if (!this->visit(SubExpr)) in VisitCastExpr()
694 return this->emitCastIntegralFixedPoint(classifyPrim(SubExpr->getType()), in VisitCastExpr()
698 if (!this->visit(SubExpr)) in VisitCastExpr()
703 return this->emitCastFloatingFixedPoint(Sem, CE); in VisitCastExpr()
706 if (!this->visit(SubExpr)) in VisitCastExpr()
709 return this->emitCastFixedPointFloating(TargetSemantics, CE); in VisitCastExpr()
712 if (!this->visit(SubExpr)) in VisitCastExpr()
714 return this->emitCastFixedPointIntegral(classifyPrim(CE->getType()), CE); in VisitCastExpr()
717 if (!this->visit(SubExpr)) in VisitCastExpr()
721 return this->emitCastFixedPoint(Sem, CE); in VisitCastExpr()
728 return this->emitInvalid(CE); in VisitCastExpr()
735 return this->emitBuiltinBitCast(E); in VisitBuiltinBitCastExpr()
743 return this->emitConst(LE->getValue(), LE); in VisitIntegerLiteral()
752 return this->emitFloat(F, E); in VisitFloatingLiteral()
765 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitImaginaryLiteral()
772 if (!this->visitZeroInitializer(SubExprT, SubExpr->getType(), SubExpr)) in VisitImaginaryLiteral()
774 if (!this->emitInitElem(SubExprT, 0, SubExpr)) in VisitImaginaryLiteral()
776 return this->visitArrayElemInit(1, SubExpr, SubExprT); in VisitImaginaryLiteral()
789 return this->emitConstFixedPoint(FixedPoint(Value, Sem), E); in VisitFixedPointLiteral()
794 return this->delegate(E->getSubExpr()); in VisitParenExpr()
801 return this->VisitLogicalBinOp(BO); in VisitBinaryOperator()
809 if (!this->discard(LHS)) in VisitBinaryOperator()
812 return this->discard(RHS); in VisitBinaryOperator()
814 return this->delegate(RHS); in VisitBinaryOperator()
818 return this->VisitComplexBinOp(BO); in VisitBinaryOperator()
820 return this->VisitVectorBinOp(BO); in VisitBinaryOperator()
824 return this->emitComplexComparison(LHS, RHS, BO); in VisitBinaryOperator()
826 return this->VisitFixedPointBinOp(BO); in VisitBinaryOperator()
829 if (!this->visit(LHS)) in VisitBinaryOperator()
832 if (!this->visit(RHS)) in VisitBinaryOperator()
835 if (!this->emitToMemberPtr(BO)) in VisitBinaryOperator()
841 if (!this->emitCastMemberPtrPtr(BO)) in VisitBinaryOperator()
843 return DiscardResult ? this->emitPopPtr(BO) : true; in VisitBinaryOperator()
863 std::optional<unsigned> ResultIndex = this->allocateLocal(BO); in VisitBinaryOperator()
864 if (!this->emitGetPtrLocal(*ResultIndex, BO)) in VisitBinaryOperator()
871 return this->emitCMP3(*LT, CmpInfo, BO); in VisitBinaryOperator()
880 return this->VisitPointerArithBinOp(BO); in VisitBinaryOperator()
890 if (!Ctx.getLangOpts().CPlusPlus && !this->emitInvalid(BO)) in VisitBinaryOperator()
893 if (!this->emitFlip(*LT, *RT, BO)) in VisitBinaryOperator()
902 auto MaybeCastToBool = [this, T, BO](bool Result) { in VisitBinaryOperator()
906 return this->emitPop(*T, BO); in VisitBinaryOperator()
908 return this->emitCast(PT_Bool, *T, BO); in VisitBinaryOperator()
912 auto Discard = [this, T, BO](bool Result) { in VisitBinaryOperator()
915 return DiscardResult ? this->emitPop(*T, BO) : true; in VisitBinaryOperator()
920 return MaybeCastToBool(this->emitEQ(*LT, BO)); in VisitBinaryOperator()
922 return MaybeCastToBool(this->emitNE(*LT, BO)); in VisitBinaryOperator()
924 return MaybeCastToBool(this->emitLT(*LT, BO)); in VisitBinaryOperator()
926 return MaybeCastToBool(this->emitLE(*LT, BO)); in VisitBinaryOperator()
928 return MaybeCastToBool(this->emitGT(*LT, BO)); in VisitBinaryOperator()
930 return MaybeCastToBool(this->emitGE(*LT, BO)); in VisitBinaryOperator()
933 return Discard(this->emitSubf(getFPOptions(BO), BO)); in VisitBinaryOperator()
934 return Discard(this->emitSub(*T, BO)); in VisitBinaryOperator()
937 return Discard(this->emitAddf(getFPOptions(BO), BO)); in VisitBinaryOperator()
938 return Discard(this->emitAdd(*T, BO)); in VisitBinaryOperator()
941 return Discard(this->emitMulf(getFPOptions(BO), BO)); in VisitBinaryOperator()
942 return Discard(this->emitMul(*T, BO)); in VisitBinaryOperator()
944 return Discard(this->emitRem(*T, BO)); in VisitBinaryOperator()
947 return Discard(this->emitDivf(getFPOptions(BO), BO)); in VisitBinaryOperator()
948 return Discard(this->emitDiv(*T, BO)); in VisitBinaryOperator()
951 return LHS->refersToBitField() ? this->emitStoreBitFieldPop(*T, BO) in VisitBinaryOperator()
952 : this->emitStorePop(*T, BO); in VisitBinaryOperator()
954 if (!this->emitStoreBitField(*T, BO)) in VisitBinaryOperator()
957 if (!this->emitStore(*T, BO)) in VisitBinaryOperator()
963 return this->emitLoadPop(*T, BO); in VisitBinaryOperator()
966 return Discard(this->emitBitAnd(*T, BO)); in VisitBinaryOperator()
968 return Discard(this->emitBitOr(*T, BO)); in VisitBinaryOperator()
970 return Discard(this->emitShl(*LT, *RT, BO)); in VisitBinaryOperator()
972 return Discard(this->emitShr(*LT, *RT, BO)); in VisitBinaryOperator()
974 return Discard(this->emitBitXor(*T, BO)); in VisitBinaryOperator()
1005 if (!this->visit(E)) in VisitPointerArithBinOp()
1008 return this->emitDecayPtr(T, PT_Ptr, E); in VisitPointerArithBinOp()
1021 if (!this->emitSubPtr(IntT, E)) in VisitPointerArithBinOp()
1023 return DiscardResult ? this->emitPop(IntT, E) : true; in VisitPointerArithBinOp()
1030 if (!this->visit(LHS)) in VisitPointerArithBinOp()
1036 if (!this->visit(RHS)) in VisitPointerArithBinOp()
1046 if (!this->emitAddOffset(OffsetType, E)) in VisitPointerArithBinOp()
1050 return this->emitDecayPtr(PT_Ptr, classifyPrim(E), E); in VisitPointerArithBinOp()
1053 if (!this->emitSubOffset(OffsetType, E)) in VisitPointerArithBinOp()
1057 return this->emitDecayPtr(PT_Ptr, classifyPrim(E), E); in VisitPointerArithBinOp()
1074 LabelTy LabelTrue = this->getLabel(); in VisitLogicalBinOp()
1075 LabelTy LabelEnd = this->getLabel(); in VisitLogicalBinOp()
1077 if (!this->visitBool(LHS)) in VisitLogicalBinOp()
1079 if (!this->jumpTrue(LabelTrue)) in VisitLogicalBinOp()
1082 if (!this->visitBool(RHS)) in VisitLogicalBinOp()
1084 if (!this->jump(LabelEnd)) in VisitLogicalBinOp()
1087 this->emitLabel(LabelTrue); in VisitLogicalBinOp()
1088 this->emitConstBool(true, E); in VisitLogicalBinOp()
1089 this->fallthrough(LabelEnd); in VisitLogicalBinOp()
1090 this->emitLabel(LabelEnd); in VisitLogicalBinOp()
1096 LabelTy LabelFalse = this->getLabel(); in VisitLogicalBinOp()
1097 LabelTy LabelEnd = this->getLabel(); in VisitLogicalBinOp()
1099 if (!this->visitBool(LHS)) in VisitLogicalBinOp()
1101 if (!this->jumpFalse(LabelFalse)) in VisitLogicalBinOp()
1104 if (!this->visitBool(RHS)) in VisitLogicalBinOp()
1106 if (!this->jump(LabelEnd)) in VisitLogicalBinOp()
1109 this->emitLabel(LabelFalse); in VisitLogicalBinOp()
1110 this->emitConstBool(false, E); in VisitLogicalBinOp()
1111 this->fallthrough(LabelEnd); in VisitLogicalBinOp()
1112 this->emitLabel(LabelEnd); in VisitLogicalBinOp()
1116 return this->emitPopBool(E); in VisitLogicalBinOp()
1121 return this->emitCast(PT_Bool, *T, E); in VisitLogicalBinOp()
1132 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitComplexBinOp()
1141 PrimType ResultElemT = this->classifyComplexElementType(E->getType()); in VisitComplexBinOp()
1144 ResultOffset = this->allocateLocalPrimitive(E, PT_Ptr, /*IsConst=*/true); in VisitComplexBinOp()
1147 if (!this->DiscardResult) { in VisitComplexBinOp()
1148 if (!this->emitDupPtr(E)) in VisitComplexBinOp()
1150 if (!this->emitSetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
1172 if (!this->visit(LHS)) in VisitComplexBinOp()
1174 if (!this->visit(RHS)) in VisitComplexBinOp()
1176 return this->emitMulc(ElemT, E); in VisitComplexBinOp()
1187 // This is using the RHS type for the fake-complex LHS. in VisitComplexBinOp()
1193 if (!this->emitGetPtrLocal(LHSOffset, E)) in VisitComplexBinOp()
1196 if (!this->visit(LHS)) in VisitComplexBinOp()
1199 if (!this->emitInitElem(ElemT, 0, E)) in VisitComplexBinOp()
1202 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitComplexBinOp()
1204 if (!this->emitInitElem(ElemT, 1, E)) in VisitComplexBinOp()
1207 if (!this->visit(LHS)) in VisitComplexBinOp()
1211 if (!this->visit(RHS)) in VisitComplexBinOp()
1213 return this->emitDivc(ElemT, E); in VisitComplexBinOp()
1218 LHSOffset = this->allocateLocalPrimitive(LHS, PT_Ptr, /*IsConst=*/true); in VisitComplexBinOp()
1219 if (!this->visit(LHS)) in VisitComplexBinOp()
1221 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in VisitComplexBinOp()
1225 LHSOffset = this->allocateLocalPrimitive(LHS, LHST, /*IsConst=*/true); in VisitComplexBinOp()
1226 if (!this->visit(LHS)) in VisitComplexBinOp()
1228 if (!this->emitSetLocal(LHST, LHSOffset, E)) in VisitComplexBinOp()
1235 RHSOffset = this->allocateLocalPrimitive(RHS, PT_Ptr, /*IsConst=*/true); in VisitComplexBinOp()
1236 if (!this->visit(RHS)) in VisitComplexBinOp()
1238 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in VisitComplexBinOp()
1242 RHSOffset = this->allocateLocalPrimitive(RHS, RHST, /*IsConst=*/true); in VisitComplexBinOp()
1243 if (!this->visit(RHS)) in VisitComplexBinOp()
1245 if (!this->emitSetLocal(RHST, RHSOffset, E)) in VisitComplexBinOp()
1252 auto loadComplexValue = [this](bool IsComplex, bool LoadZero, in VisitComplexBinOp()
1256 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitComplexBinOp()
1258 return this->emitArrayElemPop(classifyComplexElementType(E->getType()), in VisitComplexBinOp()
1262 return this->emitGetLocal(classifyPrim(E->getType()), Offset, E); in VisitComplexBinOp()
1263 return this->visitZeroInitializer(classifyPrim(E->getType()), E->getType(), in VisitComplexBinOp()
1270 if (!this->DiscardResult) { in VisitComplexBinOp()
1271 if (!this->emitGetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
1284 if (!this->emitAddf(getFPOptions(E), E)) in VisitComplexBinOp()
1287 if (!this->emitAdd(ResultElemT, E)) in VisitComplexBinOp()
1298 if (!this->emitSubf(getFPOptions(E), E)) in VisitComplexBinOp()
1301 if (!this->emitSub(ResultElemT, E)) in VisitComplexBinOp()
1313 if (!this->emitMulf(getFPOptions(E), E)) in VisitComplexBinOp()
1316 if (!this->emitMul(ResultElemT, E)) in VisitComplexBinOp()
1329 if (!this->emitDivf(getFPOptions(E), E)) in VisitComplexBinOp()
1332 if (!this->emitDiv(ResultElemT, E)) in VisitComplexBinOp()
1341 if (!this->DiscardResult) { in VisitComplexBinOp()
1343 if (!this->emitInitElemPop(ResultElemT, ElemIndex, E)) in VisitComplexBinOp()
1346 if (!this->emitPop(ResultElemT, E)) in VisitComplexBinOp()
1366 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitVectorBinOp()
1377 PrimType ElemT = this->classifyVectorElementType(LHS->getType()); in VisitVectorBinOp()
1378 PrimType RHSElemT = this->classifyVectorElementType(RHS->getType()); in VisitVectorBinOp()
1379 PrimType ResultElemT = this->classifyVectorElementType(E->getType()); in VisitVectorBinOp()
1383 this->allocateLocalPrimitive(LHS, PT_Ptr, /*IsConst=*/true); in VisitVectorBinOp()
1384 if (!this->visit(LHS)) in VisitVectorBinOp()
1386 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in VisitVectorBinOp()
1391 this->allocateLocalPrimitive(RHS, PT_Ptr, /*IsConst=*/true); in VisitVectorBinOp()
1392 if (!this->visit(RHS)) in VisitVectorBinOp()
1394 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in VisitVectorBinOp()
1397 if (E->isCompoundAssignmentOp() && !this->emitGetLocal(PT_Ptr, LHSOffset, E)) in VisitVectorBinOp()
1409 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitVectorBinOp()
1411 if (!this->emitArrayElemPop(ElemT, Index, E)) in VisitVectorBinOp()
1414 if (!this->emitPrimCast(ElemT, PT_Bool, Ctx.getASTContext().BoolTy, E)) in VisitVectorBinOp()
1416 if (!this->emitPrimCast(PT_Bool, ResultElemT, VecTy->getElementType(), E)) in VisitVectorBinOp()
1419 if (!this->emitPrimCast(ElemT, PromotT, PromotTy, E)) in VisitVectorBinOp()
1428 if (!this->emit##OP##f(getFPOptions(E), E)) \ in VisitVectorBinOp()
1431 if (!this->emit##OP(ElemT, E)) \ in VisitVectorBinOp()
1452 if (!this->emitRem(ElemT, E)) in VisitVectorBinOp()
1456 if (!this->emitBitAnd(OpT, E)) in VisitVectorBinOp()
1460 if (!this->emitBitOr(OpT, E)) in VisitVectorBinOp()
1464 if (!this->emitBitXor(OpT, E)) in VisitVectorBinOp()
1468 if (!this->emitShl(OpT, RHSElemT, E)) in VisitVectorBinOp()
1472 if (!this->emitShr(OpT, RHSElemT, E)) in VisitVectorBinOp()
1476 if (!this->emitEQ(ElemT, E)) in VisitVectorBinOp()
1480 if (!this->emitNE(ElemT, E)) in VisitVectorBinOp()
1484 if (!this->emitLE(ElemT, E)) in VisitVectorBinOp()
1488 if (!this->emitLT(ElemT, E)) in VisitVectorBinOp()
1492 if (!this->emitGE(ElemT, E)) in VisitVectorBinOp()
1496 if (!this->emitGT(ElemT, E)) in VisitVectorBinOp()
1501 if (!this->emitBitAnd(ResultElemT, E)) in VisitVectorBinOp()
1506 if (!this->emitBitOr(ResultElemT, E)) in VisitVectorBinOp()
1510 return this->emitInvalid(E); in VisitVectorBinOp()
1519 if (!this->emitPrimCast(PT_Bool, ResultElemT, VecTy->getElementType(), E)) in VisitVectorBinOp()
1521 if (!this->emitNeg(ResultElemT, E)) in VisitVectorBinOp()
1528 !this->emitPrimCast(PromotT, ResultElemT, VecTy->getElementType(), E)) in VisitVectorBinOp()
1532 if (!this->emitInitElem(ResultElemT, I, E)) in VisitVectorBinOp()
1536 if (DiscardResult && E->isCompoundAssignmentOp() && !this->emitPopPtr(E)) in VisitVectorBinOp()
1555 if (!this->visit(LHS)) in VisitFixedPointBinOp()
1558 if (!this->emitCastIntegralFixedPoint(classifyPrim(LHS->getType()), in VisitFixedPointBinOp()
1563 if (!this->visit(RHS)) in VisitFixedPointBinOp()
1566 if (!this->emitCastIntegralFixedPoint(classifyPrim(RHS->getType()), in VisitFixedPointBinOp()
1578 return this->emitCastFixedPoint(ResultSema, E); in VisitFixedPointBinOp()
1587 return this->emitPop(T, E); in VisitFixedPointBinOp()
1589 return this->emitCast(PT_Bool, T, E); in VisitFixedPointBinOp()
1595 return MaybeCastToBool(this->emitEQFixedPoint(E)); in VisitFixedPointBinOp()
1597 return MaybeCastToBool(this->emitNEFixedPoint(E)); in VisitFixedPointBinOp()
1599 return MaybeCastToBool(this->emitLTFixedPoint(E)); in VisitFixedPointBinOp()
1601 return MaybeCastToBool(this->emitLEFixedPoint(E)); in VisitFixedPointBinOp()
1603 return MaybeCastToBool(this->emitGTFixedPoint(E)); in VisitFixedPointBinOp()
1605 return MaybeCastToBool(this->emitGEFixedPoint(E)); in VisitFixedPointBinOp()
1607 return ConvertResult(this->emitAddFixedPoint(E)); in VisitFixedPointBinOp()
1609 return ConvertResult(this->emitSubFixedPoint(E)); in VisitFixedPointBinOp()
1611 return ConvertResult(this->emitMulFixedPoint(E)); in VisitFixedPointBinOp()
1613 return ConvertResult(this->emitDivFixedPoint(E)); in VisitFixedPointBinOp()
1615 return ConvertResult(this->emitShiftFixedPoint(/*Left=*/true, E)); in VisitFixedPointBinOp()
1617 return ConvertResult(this->emitShiftFixedPoint(/*Left=*/false, E)); in VisitFixedPointBinOp()
1620 return this->emitInvalid(E); in VisitFixedPointBinOp()
1633 return this->delegate(SubExpr); in VisitFixedPointUnaryOperator()
1635 if (!this->visit(SubExpr)) in VisitFixedPointUnaryOperator()
1637 return this->emitNegFixedPoint(E); in VisitFixedPointUnaryOperator()
1651 return this->visitZeroInitializer(*T, QT, E); in VisitImplicitValueInitExpr()
1670 return this->visitZeroRecordInitializer(R, E); in VisitImplicitValueInitExpr()
1677 return this->visitZeroArrayInitializer(QT, E); in VisitImplicitValueInitExpr()
1684 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitImplicitValueInitExpr()
1686 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1698 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitImplicitValueInitExpr()
1700 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1720 if (!this->visit(SubExpr)) { in VisitArraySubscriptExpr()
1725 // Expand the base if this is a subscript on a in VisitArraySubscriptExpr()
1728 if (!this->emitExpandPtr(E)) in VisitArraySubscriptExpr()
1739 return this->emitError(E); in VisitArraySubscriptExpr()
1742 if (!this->emitFlip(PT_Ptr, *IndexT, E)) in VisitArraySubscriptExpr()
1746 if (!this->emitArrayElemPtrPop(*IndexT, E)) in VisitArraySubscriptExpr()
1749 return this->emitPopPtr(E); in VisitArraySubscriptExpr()
1756 InitLinkScope<Emitter> ILS(this, InitLink::InitList()); in visitInitList()
1765 return this->emitInvalid(E); in visitInitList()
1771 if (!this->discard(Init)) in visitInitList()
1781 return this->visitZeroInitializer(*T, QT, E); in visitInitList()
1783 return this->delegate(Inits[0]); in visitInitList()
1790 return this->delegate(Inits[0]); in visitInitList()
1794 InitStackScope<Emitter> ISS(this, isa<CXXDefaultInitExpr>(Init)); in visitInitList()
1795 InitLinkScope<Emitter> ILS(this, InitLink::Field(FieldToInit->Offset)); in visitInitList()
1796 if (!this->visit(Init)) in visitInitList()
1800 return this->emitInitBitField(T, FieldToInit, E); in visitInitList()
1801 return this->emitInitField(T, FieldToInit->Offset, E); in visitInitList()
1806 InitStackScope<Emitter> ISS(this, isa<CXXDefaultInitExpr>(Init)); in visitInitList()
1807 InitLinkScope<Emitter> ILS(this, InitLink::Field(FieldToInit->Offset)); in visitInitList()
1811 if (!this->emitGetPtrField(FieldToInit->Offset, Init)) in visitInitList()
1813 if (!this->visitInitializer(Init)) in visitInitList()
1815 return this->emitPopPtr(E); in visitInitList()
1820 if (!this->visitZeroRecordInitializer(R, E)) in visitInitList()
1839 return this->emitFinishInit(E); in visitInitList()
1858 if (!this->emitGetPtrBase(B->Offset, Init)) in visitInitList()
1861 if (!this->visitInitializer(Init)) in visitInitList()
1864 if (!this->emitFinishInitPop(E)) in visitInitList()
1876 return this->emitFinishInit(E); in visitInitList()
1881 return this->delegate(Inits[0]); in visitInitList()
1887 if (!this->emitCheckArraySize(NumElems, E)) in visitInitList()
1899 if (!this->visit(Init)) in visitInitList()
1902 if (!this->emitCast(InitT, TargetT, E)) in visitInitList()
1905 return this->emitInitElem(TargetT, ElemIndex, Init); in visitInitList()
1910 if (!this->visitArrayElemInit(ElementIndex, Init, InitT)) in visitInitList()
1917 // FIXME: This should go away. in visitInitList()
1920 if (!this->visitArrayElemInit(ElementIndex, ArrayFiller, InitT)) in visitInitList()
1925 return this->emitFinishInit(E); in visitInitList()
1932 return this->delegate(Inits[0]); in visitInitList()
1939 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in visitInitList()
1941 if (!this->emitInitElem(ElemT, I, E)) in visitInitList()
1947 if (!this->visit(Init)) in visitInitList()
1950 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1968 if (!this->visit(Init)) in visitInitList()
1974 if (!this->emitCopyArray(ElemT, 0, InitIndex, in visitInitList()
1979 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1989 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in visitInitList()
1991 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
2001 /// this.
2007 if (!this->visit(Init)) in visitArrayElemInit()
2009 return this->emitInitElem(*InitT, ElemIndex, Init); in visitArrayElemInit()
2012 InitLinkScope<Emitter> ILS(this, InitLink::Elem(ElemIndex)); in visitArrayElemInit()
2015 if (!this->emitConstUint32(ElemIndex, Init)) in visitArrayElemInit()
2017 if (!this->emitArrayElemPtrUint32(Init)) in visitArrayElemInit()
2019 if (!this->visitInitializer(Init)) in visitArrayElemInit()
2021 return this->emitFinishInitPop(Init); in visitArrayElemInit()
2033 if (!this->visit(Arg)) in visitCallArgs()
2042 if (!this->emitGetPtrLocal(*LocalIndex, Arg)) in visitCallArgs()
2044 InitLinkScope<Emitter> ILS(this, InitLink::Temp(*LocalIndex)); in visitCallArgs()
2045 if (!this->visitInitializer(Arg)) in visitCallArgs()
2052 if (!this->emitCheckNonNullArg(ArgT, Arg)) in visitCallArgs()
2065 return this->visitInitList(E->inits(), E->getArrayFiller(), E); in VisitInitListExpr()
2071 return this->visitInitList(E->getInitExprs(), E->getArrayFiller(), E); in VisitCXXParenListInitExpr()
2077 return this->delegate(E->getReplacement()); in VisitSubstNonTypeTemplateParmExpr()
2085 // This will only fail if we can't emit the APValue, so won't emit any in VisitConstantExpr()
2090 if (this->visitAPValue(E->getAPValueResult(), *T, E)) in VisitConstantExpr()
2093 return this->delegate(E->getSubExpr()); in VisitConstantExpr()
2099 return this->visit(*It); in VisitEmbedExpr()
2144 return this->emitInvalid(E); in VisitUnaryExprOrTypeTraitExpr()
2155 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
2168 return this->emitConst(CAT->getSize(), E); in VisitUnaryExprOrTypeTraitExpr()
2184 return this->emitConst(*Res, E); in VisitUnaryExprOrTypeTraitExpr()
2219 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
2224 return this->emitConst(VT->getNumElements(), E); in VisitUnaryExprOrTypeTraitExpr()
2226 return this->emitSizelessVectorElementSize(E); in VisitUnaryExprOrTypeTraitExpr()
2238 return this->emitConst(N, E); in VisitUnaryExprOrTypeTraitExpr()
2240 return this->emitConst(1, E); in VisitUnaryExprOrTypeTraitExpr()
2247 return this->emitConst(ASTCtx.toCharUnitsFromBits(Bits).getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
2252 return this->emitInvalid(E); in VisitUnaryExprOrTypeTraitExpr()
2254 return this->emitConst( in VisitUnaryExprOrTypeTraitExpr()
2270 return this->discard(Base); in VisitMemberExpr()
2278 return this->emitLoadPop(*T, E); in VisitMemberExpr()
2284 // and therefore registered as a global variable. But this will probably in VisitMemberExpr()
2287 return this->emitGetPtrGlobal(*GlobalIndex, E) && maybeLoadValue(); in VisitMemberExpr()
2292 if (!this->discard(Base) && !this->emitSideEffect(E)) in VisitMemberExpr()
2295 return this->visitDeclRef(Member, E); in VisitMemberExpr()
2299 if (!this->delegate(Base)) in VisitMemberExpr()
2302 if (!this->visit(Base)) in VisitMemberExpr()
2315 return this->emitGetFieldPop(PT_Ptr, F->Offset, E) && maybeLoadValue(); in VisitMemberExpr()
2316 return this->emitGetPtrFieldPop(F->Offset, E) && maybeLoadValue(); in VisitMemberExpr()
2325 return this->emitConst(*ArrayIndex, E); in VisitArrayInitIndexExpr()
2335 if (!this->discard(E->getCommonExpr())) in VisitArrayInitLoopExpr()
2338 // TODO: This compiles to quite a lot of bytecode if the array is larger. in VisitArrayInitLoopExpr()
2339 // Investigate compiling this to a loop. in VisitArrayInitLoopExpr()
2348 ArrayIndexScope<Emitter> IndexScope(this, I); in VisitArrayInitLoopExpr()
2349 BlockScope<Emitter> BS(this); in VisitArrayInitLoopExpr()
2351 if (!this->visitArrayElemInit(I, SubExpr, SubExprT)) in VisitArrayInitLoopExpr()
2366 return this->visitInitializer(SourceExpr); in VisitOpaqueValueExpr()
2370 return this->emitGetLocal(SubExprT, It->second, E); in VisitOpaqueValueExpr()
2372 if (!this->visit(SourceExpr)) in VisitOpaqueValueExpr()
2375 // At this point we either have the evaluated source expression or a pointer in VisitOpaqueValueExpr()
2377 // this value. in VisitOpaqueValueExpr()
2379 if (!this->emitSetLocal(SubExprT, LocalIndex, E)) in VisitOpaqueValueExpr()
2385 if (!this->emitGetLocal(SubExprT, LocalIndex, E)) in VisitOpaqueValueExpr()
2389 // This is cleaned up when the local variable is destroyed. in VisitOpaqueValueExpr()
2403 LocalScope<Emitter> S(this); in VisitAbstractConditionalOperator()
2404 if (!this->delegate(E)) in VisitAbstractConditionalOperator()
2421 LabelTy LabelEnd = this->getLabel(); // Label after the operator. in VisitAbstractConditionalOperator()
2422 LabelTy LabelFalse = this->getLabel(); // Label for the false expr. in VisitAbstractConditionalOperator()
2425 if (!this->emitStartSpeculation(E)) in VisitAbstractConditionalOperator()
2429 if (!this->visitBool(Condition)) { in VisitAbstractConditionalOperator()
2433 if (this->checkingForUndefinedBehavior()) { in VisitAbstractConditionalOperator()
2434 if (!this->discard(TrueExpr)) in VisitAbstractConditionalOperator()
2436 if (!this->discard(FalseExpr)) in VisitAbstractConditionalOperator()
2442 if (!this->jumpFalse(LabelFalse)) in VisitAbstractConditionalOperator()
2446 if (!this->jump(LabelEnd)) in VisitAbstractConditionalOperator()
2448 this->emitLabel(LabelFalse); in VisitAbstractConditionalOperator()
2451 this->fallthrough(LabelEnd); in VisitAbstractConditionalOperator()
2452 this->emitLabel(LabelEnd); in VisitAbstractConditionalOperator()
2455 return this->emitEndSpeculation(E); in VisitAbstractConditionalOperator()
2466 return this->emitGetPtrGlobal(StringIndex, E); in VisitStringLiteral()
2484 this->emitConstSint8(CodeUnit, E); in VisitStringLiteral()
2485 this->emitInitElemSint8(I, E); in VisitStringLiteral()
2487 this->emitConstUint16(CodeUnit, E); in VisitStringLiteral()
2488 this->emitInitElemUint16(I, E); in VisitStringLiteral()
2490 this->emitConstUint32(CodeUnit, E); in VisitStringLiteral()
2491 this->emitInitElemUint32(I, E); in VisitStringLiteral()
2500 this->emitConstSint8(0, E); in VisitStringLiteral()
2501 this->emitInitElemSint8(I, E); in VisitStringLiteral()
2503 this->emitConstUint16(0, E); in VisitStringLiteral()
2504 this->emitInitElemUint16(I, E); in VisitStringLiteral()
2506 this->emitConstUint32(0, E); in VisitStringLiteral()
2507 this->emitInitElemUint32(I, E); in VisitStringLiteral()
2520 return this->emitDummyPtr(E, E); in VisitObjCStringLiteral()
2531 return this->delegate(SL); in VisitObjCEncodeExpr()
2555 return this->emitGetPtrGlobal(StringIndex, E); in VisitSYCLUniqueStableNameExpr()
2562 return this->emitConst(E->getValue(), E); in VisitCharacterLiteral()
2590 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitFloatCompoundAssignOperator()
2591 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
2597 if (!this->emitLoad(LHST, E)) in VisitFloatCompoundAssignOperator()
2601 if (!this->emitPrimCast(LHST, classifyPrim(LHSComputationType), in VisitFloatCompoundAssignOperator()
2606 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
2611 if (!this->emitAddf(getFPOptions(E), E)) in VisitFloatCompoundAssignOperator()
2615 if (!this->emitSubf(getFPOptions(E), E)) in VisitFloatCompoundAssignOperator()
2619 if (!this->emitMulf(getFPOptions(E), E)) in VisitFloatCompoundAssignOperator()
2623 if (!this->emitDivf(getFPOptions(E), E)) in VisitFloatCompoundAssignOperator()
2630 if (!this->emitPrimCast(classifyPrim(ResultType), LHST, LHS->getType(), E)) in VisitFloatCompoundAssignOperator()
2634 return this->emitStorePop(LHST, E); in VisitFloatCompoundAssignOperator()
2635 return this->emitStore(LHST, E); in VisitFloatCompoundAssignOperator()
2656 if (!this->emitLoad(*LT, LHS)) in VisitPointerCompoundAssignOperator()
2663 if (!this->emitAddOffset(*RT, E)) in VisitPointerCompoundAssignOperator()
2666 if (!this->emitSubOffset(*RT, E)) in VisitPointerCompoundAssignOperator()
2671 return this->emitStorePopPtr(E); in VisitPointerCompoundAssignOperator()
2672 return this->emitStorePtr(E); in VisitPointerCompoundAssignOperator()
2690 return this->visit(RHS) && this->visit(LHS) && this->emitError(E); in VisitCompoundAssignOperator()
2715 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitCompoundAssignOperator()
2717 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
2724 if (!this->emitLoad(*LT, E)) in VisitCompoundAssignOperator()
2727 if (!this->emitCast(*LT, *LHSComputationT, E)) in VisitCompoundAssignOperator()
2732 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
2738 if (!this->emitAdd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2742 if (!this->emitSub(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2746 if (!this->emitMul(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2750 if (!this->emitDiv(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2754 if (!this->emitRem(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2758 if (!this->emitShl(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
2762 if (!this->emitShr(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
2766 if (!this->emitBitAnd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2770 if (!this->emitBitXor(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2774 if (!this->emitBitOr(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2783 if (!this->emitCast(*LHSComputationT, *ResultT, E)) in VisitCompoundAssignOperator()
2790 return this->emitStoreBitFieldPop(*ResultT, E); in VisitCompoundAssignOperator()
2791 return this->emitStorePop(*ResultT, E); in VisitCompoundAssignOperator()
2794 return this->emitStoreBitField(*ResultT, E); in VisitCompoundAssignOperator()
2795 return this->emitStore(*ResultT, E); in VisitCompoundAssignOperator()
2800 LocalScope<Emitter> ES(this); in VisitExprWithCleanups()
2803 return this->delegate(SubExpr) && ES.destroyLocals(E); in VisitExprWithCleanups()
2813 return this->delegate(SubExpr); in VisitMaterializeTemporaryExpr()
2818 return this->discard(SubExpr); in VisitMaterializeTemporaryExpr()
2835 if (!this->visit(SubExpr)) in VisitMaterializeTemporaryExpr()
2838 if (!this->emitInitGlobalTemp(*SubExprT, *GlobalIndex, TempDecl, E)) in VisitMaterializeTemporaryExpr()
2841 if (!this->emitInitGlobal(*SubExprT, *GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
2844 return this->emitGetPtrGlobal(*GlobalIndex, E); in VisitMaterializeTemporaryExpr()
2847 if (!this->checkLiteralType(SubExpr)) in VisitMaterializeTemporaryExpr()
2850 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
2852 if (!this->visitInitializer(SubExpr)) in VisitMaterializeTemporaryExpr()
2855 return this->emitInitGlobalTempComp(TempDecl, E); in VisitMaterializeTemporaryExpr()
2864 if (!this->visit(SubExpr)) in VisitMaterializeTemporaryExpr()
2866 if (!this->emitSetLocal(*SubExprT, LocalIndex, E)) in VisitMaterializeTemporaryExpr()
2868 return this->emitGetPtrLocal(LocalIndex, E); in VisitMaterializeTemporaryExpr()
2871 if (!this->checkLiteralType(SubExpr)) in VisitMaterializeTemporaryExpr()
2877 InitLinkScope<Emitter> ILS(this, InitLink::Temp(*LocalIndex)); in VisitMaterializeTemporaryExpr()
2878 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitMaterializeTemporaryExpr()
2880 return this->visitInitializer(SubExpr) && this->emitFinishInit(E); in VisitMaterializeTemporaryExpr()
2892 return this->delegate(SubExpr); in VisitCXXBindTemporaryExpr()
2897 if (!this->visit(SubExpr)) in VisitCXXBindTemporaryExpr()
2901 return this->emitPopPtr(E); in VisitCXXBindTemporaryExpr()
2909 return this->discard(Init); in VisitCompoundLiteralExpr()
2913 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2918 // Avoid creating a variable if this is a primitive RValue anyway. in VisitCompoundLiteralExpr()
2920 return this->delegate(Init); in VisitCompoundLiteralExpr()
2923 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCompoundLiteralExpr()
2927 if (!this->visit(Init)) in VisitCompoundLiteralExpr()
2929 return this->emitInitGlobal(*T, *GlobalIndex, E); in VisitCompoundLiteralExpr()
2932 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2941 return this->delegate(Init); in VisitCompoundLiteralExpr()
2946 LocalIndex = this->allocateLocalPrimitive(Init, *T, /*IsConst=*/false); in VisitCompoundLiteralExpr()
2947 else if (std::optional<unsigned> MaybeIndex = this->allocateLocal(Init)) in VisitCompoundLiteralExpr()
2952 if (!this->emitGetPtrLocal(LocalIndex, E)) in VisitCompoundLiteralExpr()
2956 return this->visit(Init) && this->emitInit(*T, E); in VisitCompoundLiteralExpr()
2957 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2966 return this->emitConstBool(E->getBoolValue(), E); in VisitTypeTraitExpr()
2967 return this->emitConst(E->getBoolValue(), E); in VisitTypeTraitExpr()
2970 return this->visitAPValue(E->getAPValue(), T, E); in VisitTypeTraitExpr()
2977 return this->emitConst(E->getValue(), E); in VisitArrayTypeTraitExpr()
3000 if (!this->visit(Init)) in VisitLambdaExpr()
3003 if (!this->emitInitField(*T, F.Offset, E)) in VisitLambdaExpr()
3006 if (!this->emitGetPtrField(F.Offset, E)) in VisitLambdaExpr()
3009 if (!this->visitInitializer(Init)) in VisitLambdaExpr()
3012 if (!this->emitPopPtr(E)) in VisitLambdaExpr()
3027 return this->emitGetPtrGlobal(StringIndex, E); in VisitPredefinedExpr()
3030 return this->delegate(E->getFunctionName()); in VisitPredefinedExpr()
3035 if (E->getSubExpr() && !this->discard(E->getSubExpr())) in VisitCXXThrowExpr()
3038 return this->emitInvalid(E); in VisitCXXThrowExpr()
3050 return this->emitInvalidCast(CastKind::Reinterpret, /*Fatal=*/true, E); in VisitCXXReinterpretCastExpr()
3074 if (!this->emitInvalidCast(CastKind::Reinterpret, Fatal, E)) in VisitCXXReinterpretCastExpr()
3078 return this->delegate(SubExpr); in VisitCXXReinterpretCastExpr()
3079 return this->VisitCastExpr(E); in VisitCXXReinterpretCastExpr()
3084 if (!this->emitInvalidCast(CastKind::Reinterpret, Fatal, E)) in VisitCXXReinterpretCastExpr()
3087 return this->VisitCastExpr(E); in VisitCXXReinterpretCastExpr()
3094 if (!this->emitInvalidCast(CastKind::Dynamic, /*Fatal=*/false, E)) in VisitCXXDynamicCastExpr()
3098 return this->VisitCastExpr(E); in VisitCXXDynamicCastExpr()
3107 return this->emitConstBool(E->getValue(), E); in VisitCXXNoexceptExpr()
3123 return this->visitInitializer(E->getArg(0)); in VisitCXXConstructExpr()
3136 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXConstructExpr()
3144 if (!this->visitZeroRecordInitializer(R, E)) in VisitCXXConstructExpr()
3160 // The This pointer is already on the stack because this is an initializer, in VisitCXXConstructExpr()
3162 if (!this->emitDupPtr(E)) in VisitCXXConstructExpr()
3167 if (!this->visit(Arg)) in VisitCXXConstructExpr()
3178 if (!this->emitCallVar(Func, VarArgSize, E)) in VisitCXXConstructExpr()
3181 if (!this->emitCall(Func, 0, E)) { in VisitCXXConstructExpr()
3186 (void)this->emitPopPtr(E); in VisitCXXConstructExpr()
3192 return this->emitPopPtr(E); in VisitCXXConstructExpr()
3193 return this->emitFinishInit(E); in VisitCXXConstructExpr()
3210 if (!this->emitConstUint64(I, E)) in VisitCXXConstructExpr()
3212 if (!this->emitArrayElemPtrUint64(E)) in VisitCXXConstructExpr()
3217 if (!this->visit(Arg)) in VisitCXXConstructExpr()
3221 if (!this->emitCall(Func, 0, E)) in VisitCXXConstructExpr()
3242 return this->emitConst(I, E); in VisitSourceLocExpr()
3250 return this->visit(LValueExpr); in VisitSourceLocExpr()
3265 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitSourceLocExpr()
3276 if (!this->visitAPValue(FieldValue, FieldT, E)) in VisitSourceLocExpr()
3278 if (!this->emitInitField(FieldT, F->Offset, E)) in VisitSourceLocExpr()
3299 if (!this->discard(ArrayIndexExpr)) in VisitOffsetOfExpr()
3304 if (!this->visit(ArrayIndexExpr)) in VisitOffsetOfExpr()
3308 if (!this->emitCast(IndexT, PT_Sint64, E)) in VisitOffsetOfExpr()
3318 return this->emitOffsetOf(T, E, E); in VisitOffsetOfExpr()
3330 return this->visitZeroInitializer(*T, Ty, E); in VisitCXXScalarValueInitExpr()
3337 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXScalarValueInitExpr()
3346 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitCXXScalarValueInitExpr()
3348 if (!this->emitInitElem(ElemT, I, E)) in VisitCXXScalarValueInitExpr()
3360 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXScalarValueInitExpr()
3369 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitCXXScalarValueInitExpr()
3371 if (!this->emitInitElem(ElemT, I, E)) in VisitCXXScalarValueInitExpr()
3382 return this->emitConst(E->getPackLength(), E); in VisitSizeOfPackExpr()
3388 return this->delegate(E->getResultExpr()); in VisitGenericSelectionExpr()
3393 return this->delegate(E->getChosenSubExpr()); in VisitChooseExpr()
3401 return this->emitConst(E->getValue(), E); in VisitObjCBoolLiteralExpr()
3410 const Function *F = this->getFunction(Ctor); in VisitCXXInheritedCtorInitExpr()
3415 if (!this->emitDupPtr(SourceInfo{})) in VisitCXXInheritedCtorInitExpr()
3420 // This is necessary because the calling code has pushed the pointer in VisitCXXInheritedCtorInitExpr()
3425 PrimType PT = this->classify(PD->getType()).value_or(PT_Ptr); in VisitCXXInheritedCtorInitExpr()
3427 if (!this->emitGetParam(PT, Offset, E)) in VisitCXXInheritedCtorInitExpr()
3432 return this->emitCall(F, 0, E); in VisitCXXInheritedCtorInitExpr()
3435 // FIXME: This function has become rather unwieldy, especially
3449 // FIXME: There is no restriction on this, but it's not clear that any in VisitCXXNewExpr()
3460 if (!this->discard(Arg1)) in VisitCXXNewExpr()
3465 if (!this->emitInvalidNewDeleteExpr(E, E)) in VisitCXXNewExpr()
3475 return this->emitInvalid(E); in VisitCXXNewExpr()
3479 return this->emitInvalidNewDeleteExpr(E, E); in VisitCXXNewExpr()
3485 Desc = nullptr; // We're not going to use it in this case. in VisitCXXNewExpr()
3515 if (!this->visit(Stripped)) in VisitCXXNewExpr()
3517 if (!this->emitSetLocal(SizeT, ArrayLen, E)) in VisitCXXNewExpr()
3521 if (!this->visit(PlacementDest)) in VisitCXXNewExpr()
3523 if (!this->emitStartLifetime(E)) in VisitCXXNewExpr()
3525 if (!this->emitGetLocal(SizeT, ArrayLen, E)) in VisitCXXNewExpr()
3527 if (!this->emitCheckNewTypeMismatchArray(SizeT, E, E)) in VisitCXXNewExpr()
3530 if (!this->emitGetLocal(SizeT, ArrayLen, E)) in VisitCXXNewExpr()
3535 if (!this->emitAllocN(SizeT, *ElemT, E, IsNoThrow, E)) in VisitCXXNewExpr()
3539 if (!this->emitAllocCN(SizeT, Desc, IsNoThrow, E)) in VisitCXXNewExpr()
3551 if (!this->visitInitializer(Init)) in VisitCXXNewExpr()
3561 // In this case, we need to get an initializer for the remaining elements. in VisitCXXNewExpr()
3578 LabelTy EndLabel = this->getLabel(); in VisitCXXNewExpr()
3579 LabelTy StartLabel = this->getLabel(); in VisitCXXNewExpr()
3584 if (!this->emitDupPtr(E)) in VisitCXXNewExpr()
3586 if (!this->emitNullPtr(0, nullptr, E)) in VisitCXXNewExpr()
3588 if (!this->emitEQPtr(E)) in VisitCXXNewExpr()
3590 if (!this->jumpTrue(EndLabel)) in VisitCXXNewExpr()
3597 if (!this->emitConst(StaticInitElems, SizeT, E)) in VisitCXXNewExpr()
3599 if (!this->emitSetLocal(SizeT, Iter, E)) in VisitCXXNewExpr()
3602 this->fallthrough(StartLabel); in VisitCXXNewExpr()
3603 this->emitLabel(StartLabel); in VisitCXXNewExpr()
3605 if (!this->emitGetLocal(SizeT, Iter, E)) in VisitCXXNewExpr()
3607 if (!this->emitGetLocal(SizeT, ArrayLen, E)) in VisitCXXNewExpr()
3609 if (!this->emitLT(SizeT, E)) in VisitCXXNewExpr()
3611 if (!this->jumpFalse(EndLabel)) in VisitCXXNewExpr()
3615 if (!this->emitGetLocal(SizeT, Iter, E)) in VisitCXXNewExpr()
3617 if (!this->emitArrayElemPtr(SizeT, E)) in VisitCXXNewExpr()
3625 if (!this->visitZeroInitializer(InitT, ElemType, E)) in VisitCXXNewExpr()
3627 if (!this->emitStorePop(InitT, E)) in VisitCXXNewExpr()
3631 if (!this->visit(DynamicInit)) in VisitCXXNewExpr()
3633 if (!this->emitStorePop(*InitT, E)) in VisitCXXNewExpr()
3636 if (!this->visitInitializer(DynamicInit)) in VisitCXXNewExpr()
3638 if (!this->emitPopPtr(E)) in VisitCXXNewExpr()
3643 if (!this->emitCall(CtorFunc, 0, E)) in VisitCXXNewExpr()
3648 if (!this->emitGetPtrLocal(Iter, E)) in VisitCXXNewExpr()
3650 if (!this->emitIncPop(SizeT, false, E)) in VisitCXXNewExpr()
3653 if (!this->jump(StartLabel)) in VisitCXXNewExpr()
3656 this->fallthrough(EndLabel); in VisitCXXNewExpr()
3657 this->emitLabel(EndLabel); in VisitCXXNewExpr()
3662 if (!this->visit(PlacementDest)) in VisitCXXNewExpr()
3664 if (!this->emitStartLifetime(E)) in VisitCXXNewExpr()
3666 if (!this->emitCheckNewTypeMismatch(E, E)) in VisitCXXNewExpr()
3670 if (!this->emitAlloc(Desc, E)) in VisitCXXNewExpr()
3676 if (!this->visit(Init)) in VisitCXXNewExpr()
3679 if (!this->emitInit(*ElemT, E)) in VisitCXXNewExpr()
3683 if (!this->visitInitializer(Init)) in VisitCXXNewExpr()
3690 return this->emitPopPtr(E); in VisitCXXNewExpr()
3702 return this->emitInvalidNewDeleteExpr(E, E); in VisitCXXDeleteExpr()
3705 if (!this->visit(Arg)) in VisitCXXDeleteExpr()
3708 return this->emitFree(E->isArrayForm(), E->isGlobalDelete(), E); in VisitCXXDeleteExpr()
3722 return this->emitGetFnPtr(Func, E); in VisitBlockExpr()
3738 return this->emitGetTypeid( in VisitCXXTypeidExpr()
3742 return this->emitGetTypeid( in VisitCXXTypeidExpr()
3751 if (!Ctx.getLangOpts().CPlusPlus20 && !this->emitDiagTypeid(E)) in VisitCXXTypeidExpr()
3754 if (!this->visit(E->getExprOperand())) in VisitCXXTypeidExpr()
3757 if (!this->emitGetTypeidPtr(TypeInfoType, E)) in VisitCXXTypeidExpr()
3760 return this->emitPopPtr(E); in VisitCXXTypeidExpr()
3767 return this->emitConstBool(E->getValue(), E); in VisitExpressionTraitExpr()
3782 return this->emitDummyPtr(GuidDecl, E); in VisitCXXUuidofExpr()
3787 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCXXUuidofExpr()
3790 assert(this->getRecord(E->getType())); in VisitCXXUuidofExpr()
3798 if (!this->visitAPValueInitializer(V, E, E->getType())) in VisitCXXUuidofExpr()
3801 return this->emitFinishInit(E); in VisitCXXUuidofExpr()
3809 return this->emitConstBool(E->isSatisfied(), E); in VisitRequiresExpr()
3818 return this->emitConstBool(E->isSatisfied(), E); in VisitConceptSpecializationExpr()
3824 return this->delegate(E->getSemanticForm()); in VisitCXXRewrittenBinaryOperator()
3838 if (!this->discard(OVE)) in VisitPseudoObjectExpr()
3841 if (!this->delegate(SemE)) in VisitPseudoObjectExpr()
3844 if (!this->discard(SemE)) in VisitPseudoObjectExpr()
3853 return this->delegate(E->getSelectedExpr()); in VisitPackIndexingExpr()
3858 return this->emitError(E); in VisitRecoveryExpr()
3868 return this->emitGetLocal(PT_Ptr, Offset, E); in VisitAddrLabelExpr()
3882 this->allocateLocalPrimitive(Src, PT_Ptr, /*IsConst=*/true); in VisitConvertVectorExpr()
3883 if (!this->visit(Src)) in VisitConvertVectorExpr()
3885 if (!this->emitSetLocal(PT_Ptr, SrcOffset, E)) in VisitConvertVectorExpr()
3889 if (!this->emitGetLocal(PT_Ptr, SrcOffset, E)) in VisitConvertVectorExpr()
3891 if (!this->emitArrayElemPop(SrcElemT, I, E)) in VisitConvertVectorExpr()
3896 if (!this->emitPrimCast(SrcElemT, ElemT, ElemType, E)) in VisitConvertVectorExpr()
3900 if (!this->emitCastFP(TargetSemantics, getRoundingMode(E), E)) in VisitConvertVectorExpr()
3903 if (!this->emitInitElem(ElemT, I, E)) in VisitConvertVectorExpr()
3926 this->allocateLocalPrimitive(Vecs[I], PT_Ptr, /*IsConst=*/true); in VisitShuffleVectorExpr()
3927 if (!this->visit(Vecs[I])) in VisitShuffleVectorExpr()
3929 if (!this->emitSetLocal(PT_Ptr, VectorOffsets[I], E)) in VisitShuffleVectorExpr()
3936 return this->emitInvalidShuffleVectorIndex(I, E); in VisitShuffleVectorExpr()
3939 if (!this->emitGetLocal(PT_Ptr, in VisitShuffleVectorExpr()
3943 if (!this->emitArrayElemPop(ElemT, InputVectorIndex, E)) in VisitShuffleVectorExpr()
3946 if (!this->emitInitElem(ElemT, I, E)) in VisitShuffleVectorExpr()
3965 if (!this->visit(Base)) in VisitExtVectorElementExpr()
3969 if (!this->emitConstUint32(Indices[0], E)) in VisitExtVectorElementExpr()
3971 return this->emitArrayElemPtrPop(PT_Uint32, E); in VisitExtVectorElementExpr()
3974 return this->emitArrayElemPop(classifyPrim(E->getType()), Indices[0], E); in VisitExtVectorElementExpr()
3979 if (!this->visit(Base)) in VisitExtVectorElementExpr()
3981 if (!this->emitSetLocal(PT_Ptr, BaseOffset, E)) in VisitExtVectorElementExpr()
3990 if (!this->emitGetPtrLocal(*ResultIndex, E)) in VisitExtVectorElementExpr()
4000 if (!this->emitGetLocal(PT_Ptr, BaseOffset, E)) in VisitExtVectorElementExpr()
4002 if (!this->emitArrayElemPop(ElemT, I, E)) in VisitExtVectorElementExpr()
4004 if (!this->emitInitElem(ElemT, DstIndex, E)) in VisitExtVectorElementExpr()
4018 return this->discard(SubExpr) && this->emitInvalid(E); in VisitObjCBoxedExpr()
4024 return this->emitDummyPtr(E, E); in VisitObjCBoxedExpr()
4037 if (!this->visit(SubExpr)) in VisitCXXStdInitializerListExpr()
4039 if (!this->emitConstUint8(0, E)) in VisitCXXStdInitializerListExpr()
4041 if (!this->emitArrayElemPtrPopUint8(E)) in VisitCXXStdInitializerListExpr()
4043 if (!this->emitInitFieldPtr(R->getField(0u)->Offset, E)) in VisitCXXStdInitializerListExpr()
4048 if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()), in VisitCXXStdInitializerListExpr()
4051 return this->emitInitField(SecondFieldT, R->getField(1u)->Offset, E); in VisitCXXStdInitializerListExpr()
4055 if (!this->emitGetFieldPtr(R->getField(0u)->Offset, E)) in VisitCXXStdInitializerListExpr()
4057 if (!this->emitExpandPtr(E)) in VisitCXXStdInitializerListExpr()
4059 if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()), PT_Uint64, E)) in VisitCXXStdInitializerListExpr()
4061 if (!this->emitArrayElemPtrPop(PT_Uint64, E)) in VisitCXXStdInitializerListExpr()
4063 return this->emitInitFieldPtr(R->getField(1u)->Offset, E); in VisitCXXStdInitializerListExpr()
4068 BlockScope<Emitter> BS(this); in VisitStmtExpr()
4069 StmtExprScope<Emitter> SS(this); in VisitStmtExpr()
4075 if (!this->visitStmt(S)) in VisitStmtExpr()
4082 return this->delegate(ResultExpr); in VisitStmtExpr()
4083 return this->emitUnsupported(E); in VisitStmtExpr()
4090 OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true, in discard()
4092 return this->Visit(E); in discard()
4097 // OptionScope<Emitter> Scope(this, DicardResult, Initializing); in delegate()
4099 return this->Visit(E); in delegate()
4107 return this->discard(E); in visit()
4116 if (!this->emitGetPtrLocal(*LocalIndex, E)) in visit()
4118 InitLinkScope<Emitter> ILS(this, InitLink::Temp(*LocalIndex)); in visit()
4119 return this->visitInitializer(E); in visit()
4124 OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false, in visit()
4126 return this->Visit(E); in visit()
4133 OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false, in visitInitializer()
4135 return this->Visit(E); in visitInitializer()
4143 if (!this->visit(E)) in visitBool()
4145 return this->emitComplexBoolCast(E); in visitBool()
4150 if (!this->visit(E)) in visitBool()
4158 return this->emitIsNonNullPtr(E); in visitBool()
4162 return this->emitCastFloatingIntegralBool(getFPOptions(E), E); in visitBool()
4165 return this->emitCast(*T, PT_Bool, E); in visitBool()
4176 return this->emitZeroBool(E); in visitZeroInitializer()
4178 return this->emitZeroSint8(E); in visitZeroInitializer()
4180 return this->emitZeroUint8(E); in visitZeroInitializer()
4182 return this->emitZeroSint16(E); in visitZeroInitializer()
4184 return this->emitZeroUint16(E); in visitZeroInitializer()
4186 return this->emitZeroSint32(E); in visitZeroInitializer()
4188 return this->emitZeroUint32(E); in visitZeroInitializer()
4190 return this->emitZeroSint64(E); in visitZeroInitializer()
4192 return this->emitZeroUint64(E); in visitZeroInitializer()
4194 return this->emitZeroIntAP(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
4196 return this->emitZeroIntAPS(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
4198 return this->emitNullPtr(Ctx.getASTContext().getTargetNullPointerValue(QT), in visitZeroInitializer()
4201 return this->emitNullMemberPtr(0, nullptr, E); in visitZeroInitializer()
4204 return this->emitFloat(F, E); in visitZeroInitializer()
4208 return this->emitConstFixedPoint(FixedPoint::zero(Sem), E); in visitZeroInitializer()
4228 if (!this->visitZeroInitializer(T, QT, E)) in visitZeroRecordInitializer()
4230 if (!this->emitInitField(T, Field.Offset, E)) in visitZeroRecordInitializer()
4237 if (!this->emitGetPtrField(Field.Offset, E)) in visitZeroRecordInitializer()
4244 if (!this->visitZeroInitializer(T, ET, E)) in visitZeroRecordInitializer()
4246 if (!this->emitInitElem(T, I, E)) in visitZeroRecordInitializer()
4251 if (!this->visitZeroArrayInitializer(D->getType(), E)) in visitZeroRecordInitializer()
4254 if (!this->visitZeroRecordInitializer(D->ElemRecord, E)) in visitZeroRecordInitializer()
4259 if (!this->emitFinishInitPop(E)) in visitZeroRecordInitializer()
4269 if (!this->emitGetPtrBase(B.Offset, E)) in visitZeroRecordInitializer()
4271 if (!this->visitZeroRecordInitializer(B.R, E)) in visitZeroRecordInitializer()
4273 if (!this->emitFinishInitPop(E)) in visitZeroRecordInitializer()
4291 if (!this->visitZeroInitializer(*ElemT, ElemType, E)) in visitZeroArrayInitializer()
4293 if (!this->emitInitElem(*ElemT, I, E)) in visitZeroArrayInitializer()
4301 if (!this->emitConstUint32(I, E)) in visitZeroArrayInitializer()
4303 if (!this->emitArrayElemPtr(PT_Uint32, E)) in visitZeroArrayInitializer()
4305 if (!this->visitZeroRecordInitializer(R, E)) in visitZeroArrayInitializer()
4307 if (!this->emitPopPtr(E)) in visitZeroArrayInitializer()
4313 if (!this->emitConstUint32(I, E)) in visitZeroArrayInitializer()
4315 if (!this->emitArrayElemPtr(PT_Uint32, E)) in visitZeroArrayInitializer()
4317 if (!this->visitZeroArrayInitializer(ElemType, E)) in visitZeroArrayInitializer()
4319 if (!this->emitPopPtr(E)) in visitZeroArrayInitializer()
4333 return this->emitConstSint8(Value, E); in emitConst()
4335 return this->emitConstUint8(Value, E); in emitConst()
4337 return this->emitConstSint16(Value, E); in emitConst()
4339 return this->emitConstUint16(Value, E); in emitConst()
4341 return this->emitConstSint32(Value, E); in emitConst()
4343 return this->emitConstUint32(Value, E); in emitConst()
4345 return this->emitConstSint64(Value, E); in emitConst()
4347 return this->emitConstUint64(Value, E); in emitConst()
4349 return this->emitConstBool(Value, E); in emitConst()
4365 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
4372 return this->emitConstIntAPS(Value, E); in emitConst()
4374 return this->emitConstIntAP(Value, E); in emitConst()
4377 return this->emitConst(Value.getSExtValue(), Ty, E); in emitConst()
4378 return this->emitConst(Value.getZExtValue(), Ty, E); in emitConst()
4383 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
4404 Scope::Local Local = this->createLocal(D); in allocateLocalPrimitive()
4449 Scope::Local Local = this->createLocal(D); in allocateLocal()
4471 Scope::Local Local = this->createLocal(D); in allocateTemporary()
4507 LocalScope<Emitter> RootScope(this); in visitExpr()
4511 if (!this->emitCheckAllocations(E)) in visitExpr()
4517 return RootScope.destroyLocals() && this->emitCheckAllocations(E); in visitExpr()
4518 return this->emitCheckAllocations(E); in visitExpr()
4525 return this->emitRetVoid(E) && maybeDestroyLocals(); in visitExpr()
4533 return this->emitRet(*T, E) && maybeDestroyLocals(); in visitExpr()
4539 if (std::optional<unsigned> LocalOffset = this->allocateLocal(E)) { in visitExpr()
4540 InitLinkScope<Emitter> ILS(this, InitLink::Temp(*LocalOffset)); in visitExpr()
4541 if (!this->emitGetPtrLocal(*LocalOffset, E)) in visitExpr()
4547 if (!this->emitFinishInit(E)) in visitExpr()
4552 return this->emitRetValue(E) && maybeDestroyLocals(); in visitExpr()
4555 return maybeDestroyLocals() && this->emitCheckAllocations(E) && false; in visitExpr()
4562 auto R = this->visitVarDecl(VD, /*Toplevel=*/true, IsConstexprUnknown); in visitDecl()
4594 DeclScope<Emitter> LS(this, VD); in visitDeclAndReturn()
4596 if (!this->visit(Init)) in visitDeclAndReturn()
4598 return this->emitRet(classify(Init).value_or(PT_Ptr), VD) && in visitDeclAndReturn()
4599 LS.destroyLocals() && this->emitCheckAllocations(VD); in visitDeclAndReturn()
4602 LocalScope<Emitter> VDScope(this, VD); in visitDeclAndReturn()
4603 if (!this->visitVarDecl(VD, /*Toplevel=*/true)) in visitDeclAndReturn()
4611 if (!this->emitGetGlobalUnchecked(*VarT, *GlobalIndex, VD)) in visitDeclAndReturn()
4614 if (!this->emitGetPtrGlobal(*GlobalIndex, VD)) in visitDeclAndReturn()
4621 if (!this->emitGetLocal(*VarT, Local->second.Offset, VD)) in visitDeclAndReturn()
4624 if (!this->emitGetPtrLocal(Local->second.Offset, VD)) in visitDeclAndReturn()
4630 if (!this->emitRet(VarT.value_or(PT_Ptr), VD)) { in visitDeclAndReturn()
4631 // If the Ret above failed and this is a global variable, mark it as in visitDeclAndReturn()
4646 return VDScope.destroyLocals() && this->emitCheckAllocations(VD); in visitDeclAndReturn()
4657 // This case is EvalEmitter-only. If we won't create any instructions for the in visitVarDecl()
4659 if (!this->isActive()) in visitVarDecl()
4671 return !NeedsOp || this->emitCheckDecl(VD, VD); in visitVarDecl()
4678 if (!this->visit(Init)) in visitVarDecl()
4681 return checkDecl() && this->emitInitGlobal(*VarT, GlobalIndex, VD); in visitVarDecl()
4687 if (!this->emitGetPtrGlobal(GlobalIndex, Init)) in visitVarDecl()
4693 return this->emitFinishInitGlobal(Init); in visitVarDecl()
4696 DeclScope<Emitter> LocalScope(this, VD); in visitVarDecl()
4698 // We've already seen and initialized this global. in visitVarDecl()
4704 // so let's try this one. in visitVarDecl()
4716 InitLinkScope<Emitter> ILS(this, InitLink::Decl(VD)); in visitVarDecl()
4719 unsigned Offset = this->allocateLocalPrimitive( in visitVarDecl()
4723 // If this is a toplevel declaration, create a scope for the in visitVarDecl()
4726 LocalScope<Emitter> Scope(this); in visitVarDecl()
4727 if (!this->visit(Init)) in visitVarDecl()
4729 return this->emitSetLocal(*VarT, Offset, VD) && Scope.destroyLocals(); in visitVarDecl()
4731 if (!this->visit(Init)) in visitVarDecl()
4733 return this->emitSetLocal(*VarT, Offset, VD); in visitVarDecl()
4737 if (std::optional<unsigned> Offset = this->allocateLocal( in visitVarDecl()
4742 if (!this->emitGetPtrLocal(*Offset, Init)) in visitVarDecl()
4748 return this->emitFinishInitPop(Init); in visitVarDecl()
4760 return this->emitConst(Val.getInt(), ValType, E); in visitAPValue()
4763 return this->emitFloat(F, E); in visitAPValue()
4768 return this->emitNull(ValType, 0, nullptr, E); in visitAPValue()
4771 return this->visit(BaseExpr); in visitAPValue()
4773 return this->visitDeclRef(VD, E); in visitAPValue()
4777 return this->emitGetMemberPtr(MemberDecl, E); in visitAPValue()
4778 return this->emitNullMemberPtr(0, nullptr, E); in visitAPValue()
4788 const Record *R = this->getRecord(T); in visitAPValueInitializer()
4796 if (!this->visitAPValue(F, *PT, E)) in visitAPValueInitializer()
4798 if (!this->emitInitField(*PT, RF->Offset, E)) in visitAPValueInitializer()
4801 if (!this->emitGetPtrField(RF->Offset, E)) in visitAPValueInitializer()
4803 if (!this->visitAPValueInitializer(F, E, FieldType)) in visitAPValueInitializer()
4805 if (!this->emitPopPtr(E)) in visitAPValueInitializer()
4812 const Record *R = this->getRecord(UnionField->getParent()); in visitAPValueInitializer()
4817 if (!this->visitAPValue(F, T, E)) in visitAPValueInitializer()
4819 return this->emitInitField(T, RF->Offset, E); in visitAPValueInitializer()
4826 if (!this->visitAPValue(Elem, *ElemT, E)) in visitAPValueInitializer()
4828 if (!this->emitInitElem(*ElemT, A, E)) in visitAPValueInitializer()
4831 if (!this->emitConstUint32(A, E)) in visitAPValueInitializer()
4833 if (!this->emitArrayElemPtrUint32(E)) in visitAPValueInitializer()
4835 if (!this->visitAPValueInitializer(Elem, E, ElemType)) in visitAPValueInitializer()
4837 if (!this->emitPopPtr(E)) in visitAPValueInitializer()
4857 return this->emitConst(0, E); in VisitBuiltinCallExpr()
4860 if (!this->emitStartSpeculation(E)) in VisitBuiltinCallExpr()
4862 LabelTy EndLabel = this->getLabel(); in VisitBuiltinCallExpr()
4863 if (!this->speculate(E, EndLabel)) in VisitBuiltinCallExpr()
4865 this->fallthrough(EndLabel); in VisitBuiltinCallExpr()
4866 if (!this->emitEndSpeculation(E)) in VisitBuiltinCallExpr()
4869 return this->emitPop(classifyPrim(E), E); in VisitBuiltinCallExpr()
4874 // to the CallExpr. This is needed to get the correct codegen. in VisitBuiltinCallExpr()
4881 return this->emitDummyPtr(E, E); in VisitBuiltinCallExpr()
4892 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitBuiltinCallExpr()
4899 if (!this->visit(Arg)) in VisitBuiltinCallExpr()
4904 if (!this->emitCallBI(E, BuiltinID, E)) in VisitBuiltinCallExpr()
4909 return this->emitPop(*ReturnT, E); in VisitBuiltinCallExpr()
4949 if (!this->visit(MemberCall->getImplicitObjectArgument())) in VisitCallExpr()
4951 return this->emitCheckDestruction(E) && this->emitEndLifetime(E) && in VisitCallExpr()
4952 this->emitPopPtr(E); in VisitCallExpr()
4956 BlockScope<Emitter> CallScope(this, ScopeKind::Call); in VisitCallExpr()
4966 // for this call. in VisitCallExpr()
4968 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
4976 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
4980 if (!this->emitDupPtr(E)) in VisitCallExpr()
4992 // first arg). We fix this by using a Flip op later. in VisitCallExpr()
5003 if (!this->discard(E->getArg(0))) in VisitCallExpr()
5012 // Add the (optional, implicit) This pointer. in VisitCallExpr()
5015 // If we end up creating a CallPtr op for this, we need the base of the in VisitCallExpr()
5020 this->allocateLocalPrimitive(Callee, PT_MemberPtr, /*IsConst=*/true); in VisitCallExpr()
5021 if (!this->visit(Callee)) in VisitCallExpr()
5023 if (!this->emitSetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
5025 if (!this->emitGetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
5027 if (!this->emitGetMemberPtrBase(E)) in VisitCallExpr()
5039 if (!this->visit(Stripped)) in VisitCallExpr()
5042 if (!this->visit(InstancePtr)) in VisitCallExpr()
5046 if (!this->visit(InstancePtr)) in VisitCallExpr()
5052 if (!this->emitCheckPseudoDtor(E)) in VisitCallExpr()
5056 return this->discard(Base); in VisitCallExpr()
5057 if (!this->visit(Base)) in VisitCallExpr()
5059 return this->emitEndLifetimePop(E); in VisitCallExpr()
5063 this->allocateLocalPrimitive(Callee, PT_Ptr, /*IsConst=*/true); in VisitCallExpr()
5064 if (!this->visit(Callee)) in VisitCallExpr()
5066 if (!this->emitSetLocal(PT_Ptr, *CalleeOffset, E)) in VisitCallExpr()
5070 if (!this->visitCallArgs(Args, FuncDecl)) in VisitCallExpr()
5078 if (!this->emitFlip(Arg2T, Arg1T, E)) in VisitCallExpr()
5106 if (!this->emitCallVirt(Func, VarArgSize, E)) in VisitCallExpr()
5114 if (!this->emitCallVar(Func, VarArgSize, E)) in VisitCallExpr()
5117 if (!this->emitCall(Func, 0, E)) in VisitCallExpr()
5133 if (!this->emitGetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
5135 if (!this->emitGetMemberPtrDecl(E)) in VisitCallExpr()
5138 if (!this->emitGetLocal(PT_Ptr, *CalleeOffset, E)) in VisitCallExpr()
5141 if (!this->emitCallPtr(ArgSize, E, E)) in VisitCallExpr()
5147 return this->emitPop(*T, E) && CallScope.destroyLocals(); in VisitCallExpr()
5154 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultInitExpr()
5156 return this->delegate(E->getExpr()); in VisitCXXDefaultInitExpr()
5161 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultArgExpr()
5163 return this->delegate(E->getExpr()); in VisitCXXDefaultArgExpr()
5171 return this->emitConstBool(E->getValue(), E); in VisitCXXBoolLiteralExpr()
5181 return this->emitNullPtr(Val, nullptr, E); in VisitCXXNullPtrLiteralExpr()
5192 return this->emitZero(T, E); in VisitGNUNullExpr()
5200 if (this->LambdaThisCapture.Offset > 0) { in VisitCXXThisExpr()
5201 if (this->LambdaThisCapture.IsPtr) in VisitCXXThisExpr()
5202 return this->emitGetThisFieldPtr(this->LambdaThisCapture.Offset, E); in VisitCXXThisExpr()
5203 return this->emitGetPtrThisField(this->LambdaThisCapture.Offset, E); in VisitCXXThisExpr()
5206 // In some circumstances, the 'this' pointer does not actually refer to the in VisitCXXThisExpr()
5209 // this scenario. in VisitCXXThisExpr()
5211 return this->emitThis(E); in VisitCXXThisExpr()
5225 // (e.g. a decl or This), optionally followed by field, elem, etc. in VisitCXXThisExpr()
5253 if (!InitStack[I].template emit<Emitter>(this, E)) in VisitCXXThisExpr()
5258 return this->emitThis(E); in VisitCXXThisExpr()
5299 return this->emitInvalid(S); in visitStmt()
5301 return this->visitStmt(cast<LabelStmt>(S)->getSubStmt()); in visitStmt()
5304 return this->discard(E); in visitStmt()
5312 BlockScope<Emitter> Scope(this); in visitCompoundStmt()
5323 if (auto *KD = BD->getHoldingVar(); KD && !this->visitVarDecl(KD)) in maybeEmitDeferredVarInit()
5340 if (!this->visitVarDecl(VD)) in visitDeclStmt()
5344 if (EvaluateConditionDecl && !this->maybeEmitDeferredVarInit(VD)) in visitDeclStmt()
5353 if (this->InStmtExpr) in visitReturnStmt()
5354 return this->emitUnsupported(RS); in visitReturnStmt()
5357 LocalScope<Emitter> RetScope(this); in visitReturnStmt()
5360 if (!this->visit(RE)) in visitReturnStmt()
5362 this->emitCleanup(); in visitReturnStmt()
5363 return this->emitRet(*ReturnType, RS); in visitReturnStmt()
5365 if (!this->visit(RE)) in visitReturnStmt()
5368 InitLinkScope<Emitter> ILS(this, InitLink::RVO()); in visitReturnStmt()
5370 if (!this->emitRVOPtr(RE)) in visitReturnStmt()
5372 if (!this->visitInitializer(RE)) in visitReturnStmt()
5374 if (!this->emitPopPtr(RE)) in visitReturnStmt()
5377 this->emitCleanup(); in visitReturnStmt()
5378 return this->emitRetVoid(RS); in visitReturnStmt()
5383 this->emitCleanup(); in visitReturnStmt()
5384 return this->emitRetVoid(RS); in visitReturnStmt()
5389 LocalScope<Emitter> SScope(this); in visitIfStmt()
5416 if (!this->emitIsConstantContext(IS)) in visitIfStmt()
5419 if (!this->emitIsConstantContext(IS)) in visitIfStmt()
5421 if (!this->emitInv(IS)) in visitIfStmt()
5424 if (!this->visitBool(IS->getCond())) in visitIfStmt()
5428 if (!this->maybeEmitDeferredVarInit(IS->getConditionVariable())) in visitIfStmt()
5432 LabelTy LabelElse = this->getLabel(); in visitIfStmt()
5433 LabelTy LabelEnd = this->getLabel(); in visitIfStmt()
5434 if (!this->jumpFalse(LabelElse)) in visitIfStmt()
5438 if (!this->jump(LabelEnd)) in visitIfStmt()
5440 this->emitLabel(LabelElse); in visitIfStmt()
5443 this->emitLabel(LabelEnd); in visitIfStmt()
5445 LabelTy LabelEnd = this->getLabel(); in visitIfStmt()
5446 if (!this->jumpFalse(LabelEnd)) in visitIfStmt()
5450 this->emitLabel(LabelEnd); in visitIfStmt()
5461 LabelTy CondLabel = this->getLabel(); // Label before the condition. in visitWhileStmt()
5462 LabelTy EndLabel = this->getLabel(); // Label after the loop. in visitWhileStmt()
5463 LoopScope<Emitter> LS(this, EndLabel, CondLabel); in visitWhileStmt()
5465 this->fallthrough(CondLabel); in visitWhileStmt()
5466 this->emitLabel(CondLabel); in visitWhileStmt()
5469 LocalScope<Emitter> CondScope(this); in visitWhileStmt()
5474 if (!this->visitBool(Cond)) in visitWhileStmt()
5477 if (!this->maybeEmitDeferredVarInit(S->getConditionVariable())) in visitWhileStmt()
5480 if (!this->jumpFalse(EndLabel)) in visitWhileStmt()
5483 if (!this->visitStmt(Body)) in visitWhileStmt()
5489 if (!this->jump(CondLabel)) in visitWhileStmt()
5491 this->fallthrough(EndLabel); in visitWhileStmt()
5492 this->emitLabel(EndLabel); in visitWhileStmt()
5501 LabelTy StartLabel = this->getLabel(); in visitDoStmt()
5502 LabelTy EndLabel = this->getLabel(); in visitDoStmt()
5503 LabelTy CondLabel = this->getLabel(); in visitDoStmt()
5504 LoopScope<Emitter> LS(this, EndLabel, CondLabel); in visitDoStmt()
5506 this->fallthrough(StartLabel); in visitDoStmt()
5507 this->emitLabel(StartLabel); in visitDoStmt()
5510 LocalScope<Emitter> CondScope(this); in visitDoStmt()
5511 if (!this->visitStmt(Body)) in visitDoStmt()
5513 this->fallthrough(CondLabel); in visitDoStmt()
5514 this->emitLabel(CondLabel); in visitDoStmt()
5515 if (!this->visitBool(Cond)) in visitDoStmt()
5521 if (!this->jumpTrue(StartLabel)) in visitDoStmt()
5524 this->fallthrough(EndLabel); in visitDoStmt()
5525 this->emitLabel(EndLabel); in visitDoStmt()
5537 LabelTy EndLabel = this->getLabel(); in visitForStmt()
5538 LabelTy CondLabel = this->getLabel(); in visitForStmt()
5539 LabelTy IncLabel = this->getLabel(); in visitForStmt()
5540 LoopScope<Emitter> LS(this, EndLabel, IncLabel); in visitForStmt()
5542 if (Init && !this->visitStmt(Init)) in visitForStmt()
5545 this->fallthrough(CondLabel); in visitForStmt()
5546 this->emitLabel(CondLabel); in visitForStmt()
5549 LocalScope<Emitter> CondScope(this); in visitForStmt()
5555 if (!this->visitBool(Cond)) in visitForStmt()
5557 if (!this->jumpFalse(EndLabel)) in visitForStmt()
5560 if (!this->maybeEmitDeferredVarInit(S->getConditionVariable())) in visitForStmt()
5563 if (Body && !this->visitStmt(Body)) in visitForStmt()
5566 this->fallthrough(IncLabel); in visitForStmt()
5567 this->emitLabel(IncLabel); in visitForStmt()
5568 if (Inc && !this->discard(Inc)) in visitForStmt()
5573 if (!this->jump(CondLabel)) in visitForStmt()
5577 this->emitLabel(EndLabel); in visitForStmt()
5593 LabelTy EndLabel = this->getLabel(); in visitCXXForRangeStmt()
5594 LabelTy CondLabel = this->getLabel(); in visitCXXForRangeStmt()
5595 LabelTy IncLabel = this->getLabel(); in visitCXXForRangeStmt()
5596 LoopScope<Emitter> LS(this, EndLabel, IncLabel); in visitCXXForRangeStmt()
5599 if (Init && !this->visitStmt(Init)) in visitCXXForRangeStmt()
5601 if (!this->visitStmt(RangeStmt)) in visitCXXForRangeStmt()
5603 if (!this->visitStmt(BeginStmt)) in visitCXXForRangeStmt()
5605 if (!this->visitStmt(EndStmt)) in visitCXXForRangeStmt()
5609 this->fallthrough(CondLabel); in visitCXXForRangeStmt()
5610 this->emitLabel(CondLabel); in visitCXXForRangeStmt()
5611 if (!this->visitBool(Cond)) in visitCXXForRangeStmt()
5613 if (!this->jumpFalse(EndLabel)) in visitCXXForRangeStmt()
5616 if (!this->visitDeclStmt(S->getLoopVarStmt(), /*EvaluateConditionDecl=*/true)) in visitCXXForRangeStmt()
5621 if (!this->visitStmt(Body)) in visitCXXForRangeStmt()
5624 this->fallthrough(IncLabel); in visitCXXForRangeStmt()
5625 this->emitLabel(IncLabel); in visitCXXForRangeStmt()
5626 if (!this->discard(Inc)) in visitCXXForRangeStmt()
5630 if (!this->jump(CondLabel)) in visitCXXForRangeStmt()
5633 this->fallthrough(EndLabel); in visitCXXForRangeStmt()
5634 this->emitLabel(EndLabel); in visitCXXForRangeStmt()
5646 return this->jump(*BreakLabel); in visitBreakStmt()
5657 return this->jump(*ContinueLabel); in visitContinueStmt()
5666 PrimType CondT = this->classifyPrim(Cond->getType()); in visitSwitchStmt()
5667 LocalScope<Emitter> LS(this); in visitSwitchStmt()
5669 LabelTy EndLabel = this->getLabel(); in visitSwitchStmt()
5672 this->allocateLocalPrimitive(Cond, CondT, /*IsConst=*/true); in visitSwitchStmt()
5683 if (!this->visit(Cond)) in visitSwitchStmt()
5685 if (!this->emitSetLocal(CondT, CondVar, S)) in visitSwitchStmt()
5688 if (!this->maybeEmitDeferredVarInit(S->getConditionVariable())) in visitSwitchStmt()
5699 CaseLabels[SC] = this->getLabel(); in visitSwitchStmt()
5702 PrimType ValueT = this->classifyPrim(Value->getType()); in visitSwitchStmt()
5705 if (!this->emitGetLocal(CondT, CondVar, CS)) in visitSwitchStmt()
5707 if (!this->visit(Value)) in visitSwitchStmt()
5711 if (!this->emitEQ(ValueT, S)) in visitSwitchStmt()
5713 if (!this->jumpTrue(CaseLabels[CS])) in visitSwitchStmt()
5717 DefaultLabel = this->getLabel(); in visitSwitchStmt()
5724 if (!this->jump(*DefaultLabel)) in visitSwitchStmt()
5727 if (!this->jump(EndLabel)) in visitSwitchStmt()
5731 SwitchScope<Emitter> SS(this, std::move(CaseLabels), EndLabel, DefaultLabel); in visitSwitchStmt()
5732 if (!this->visitStmt(S->getBody())) in visitSwitchStmt()
5734 this->emitLabel(EndLabel); in visitSwitchStmt()
5741 this->emitLabel(CaseLabels[S]); in visitCaseStmt()
5742 return this->visitStmt(S->getSubStmt()); in visitCaseStmt()
5747 this->emitLabel(*DefaultLabel); in visitDefaultStmt()
5748 return this->visitStmt(S->getSubStmt()); in visitDefaultStmt()
5753 if (this->Ctx.getLangOpts().CXXAssumptions && in visitAttributedStmt()
5754 !this->Ctx.getLangOpts().MSVCCompat) { in visitAttributedStmt()
5766 if (Assumption->HasSideEffects(this->Ctx.getASTContext())) in visitAttributedStmt()
5770 if (!this->visitBool(Assumption)) in visitAttributedStmt()
5773 if (!this->emitAssume(Assumption)) in visitAttributedStmt()
5779 return this->visitStmt(S->getSubStmt()); in visitAttributedStmt()
5785 return this->visitStmt(S->getTryBlock()); in visitCXXTryStmt()
5797 const Function *Func = this->getFunction(LambdaCallOp); in emitLambdaStaticInvokerBody()
5804 if (!this->emitRVOPtr(MD)) in emitLambdaStaticInvokerBody()
5810 // any captures, as verified above. Emit a null pointer. This is then in emitLambdaStaticInvokerBody()
5812 if (!this->emitNullPtr(0, nullptr, MD)) in emitLambdaStaticInvokerBody()
5817 auto It = this->Params.find(PVD); in emitLambdaStaticInvokerBody()
5818 assert(It != this->Params.end()); in emitLambdaStaticInvokerBody()
5822 PrimType ParamType = this->classify(PVD->getType()).value_or(PT_Ptr); in emitLambdaStaticInvokerBody()
5823 if (!this->emitGetParam(ParamType, It->second.Offset, MD)) in emitLambdaStaticInvokerBody()
5827 if (!this->emitCall(Func, 0, LambdaCallOp)) in emitLambdaStaticInvokerBody()
5830 this->emitCleanup(); in emitLambdaStaticInvokerBody()
5832 return this->emitRet(*ReturnType, MD); in emitLambdaStaticInvokerBody()
5835 return this->emitRetVoid(MD); in emitLambdaStaticInvokerBody()
5846 return this->emitCheckLiteralType(E->getType().getTypePtr(), E); in checkLiteralType()
5859 if (std::optional<PrimType> T = this->classify(InitExpr)) { in compileConstructor()
5860 if (!this->visit(InitExpr)) in compileConstructor()
5864 return this->emitInitThisBitField(*T, F, FieldOffset, InitExpr); in compileConstructor()
5865 return this->emitInitThisField(*T, FieldOffset, InitExpr); in compileConstructor()
5869 InitLinkScope<Emitter> FieldScope(this, InitLink::Field(F->Offset)); in compileConstructor()
5870 if (!this->emitGetPtrThisField(FieldOffset, InitExpr)) in compileConstructor()
5873 if (!this->visitInitializer(InitExpr)) in compileConstructor()
5876 return this->emitFinishInitPop(InitExpr); in compileConstructor()
5880 const Record *R = this->getRecord(RD); in compileConstructor()
5886 return this->emitRetVoid(Ctor); in compileConstructor()
5889 if (!this->emitThis(Ctor)) in compileConstructor()
5893 ParamOffset PO = this->Params[PVD]; // Must exist. in compileConstructor()
5895 if (!this->emitGetParam(PT_Ptr, PO.Offset, Ctor)) in compileConstructor()
5898 return this->emitMemcpy(Ctor) && this->emitPopPtr(Ctor) && in compileConstructor()
5899 this->emitRetVoid(Ctor); in compileConstructor()
5902 InitLinkScope<Emitter> InitScope(this, InitLink::This()); in compileConstructor()
5905 BlockScope<Emitter> Scope(this); in compileConstructor()
5919 if (!this->emitGetPtrThisVirtBase(BaseDecl, InitExpr)) in compileConstructor()
5924 // Get This Base and call initializer on it. in compileConstructor()
5927 if (!this->emitGetPtrThisBase(B->Offset, InitExpr)) in compileConstructor()
5931 if (!this->visitInitializer(InitExpr)) in compileConstructor()
5933 if (!this->emitFinishInitPop(InitExpr)) in compileConstructor()
5942 const Record *FieldRecord = this->P.getOrCreateRecord(FD->getParent()); in compileConstructor()
5959 const Record *FieldRecord = this->P.getOrCreateRecord(FD->getParent()); in compileConstructor()
5964 if (!this->emitGetPtrThisField(InitFieldOffset, InitExpr)) in compileConstructor()
5966 if (!this->emitFinishInitPop(InitExpr)) in compileConstructor()
5972 if (!this->emitThis(InitExpr)) in compileConstructor()
5974 if (!this->visitInitializer(Init->getInit())) in compileConstructor()
5976 if (!this->emitPopPtr(InitExpr)) in compileConstructor()
5988 return this->emitRetVoid(SourceInfo{}); in compileConstructor()
5994 const Record *R = this->getRecord(RD); in compileDestructor()
5999 if (!this->visitStmt(Dtor->getBody())) in compileDestructor()
6003 if (!this->emitThis(Dtor)) in compileDestructor()
6006 if (!this->emitCheckDestruction(Dtor)) in compileDestructor()
6015 if (!this->emitGetPtrField(Field.Offset, SourceInfo{})) in compileDestructor()
6017 if (!this->emitDestruction(D, SourceInfo{})) in compileDestructor()
6019 if (!this->emitPopPtr(SourceInfo{})) in compileDestructor()
6029 if (!this->emitGetPtrBase(Base.Offset, SourceInfo{})) in compileDestructor()
6031 if (!this->emitRecordDestruction(Base.R, {})) in compileDestructor()
6033 if (!this->emitPopPtr(SourceInfo{})) in compileDestructor()
6038 return this->emitPopPtr(Dtor) && this->emitRetVoid(Dtor); in compileDestructor()
6044 if (!this->emitThis(MD)) in compileUnionAssignmentOperator()
6048 ParamOffset PO = this->Params[PVD]; // Must exist. in compileUnionAssignmentOperator()
6050 if (!this->emitGetParam(PT_Ptr, PO.Offset, MD)) in compileUnionAssignmentOperator()
6053 return this->emitMemcpy(MD) && this->emitRet(PT_Ptr, MD); in compileUnionAssignmentOperator()
6059 ReturnType = this->classify(F->getReturnType()); in visitFunc()
6061 this->CompilingFunction = F; in visitFunc()
6064 return this->compileConstructor(Ctor); in visitFunc()
6066 return this->compileDestructor(Dtor); in visitFunc()
6068 // Emit custom code if this is a lambda static invoker. in visitFunc()
6074 return this->compileUnionAssignmentOperator(MD); in visitFunc()
6077 return this->emitLambdaStaticInvokerBody(MD); in visitFunc()
6087 return this->emitRetVoid(SourceInfo{}); in visitFunc()
6088 return this->emitNoRet(SourceInfo{}); in visitFunc()
6095 return this->VisitComplexUnaryOperator(E); in VisitUnaryOperator()
6097 return this->VisitVectorUnaryOperator(E); in VisitUnaryOperator()
6099 return this->VisitFixedPointUnaryOperator(E); in VisitUnaryOperator()
6105 return this->emitInvalid(E); in VisitUnaryOperator()
6107 return this->emitError(E); in VisitUnaryOperator()
6109 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6113 if (!this->emitIncPtr(E)) in VisitUnaryOperator()
6116 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
6120 return DiscardResult ? this->emitIncfPop(getFPOptions(E), E) in VisitUnaryOperator()
6121 : this->emitIncf(getFPOptions(E), E); in VisitUnaryOperator()
6124 return DiscardResult ? this->emitIncPop(*T, E->canOverflow(), E) in VisitUnaryOperator()
6125 : this->emitInc(*T, E->canOverflow(), E); in VisitUnaryOperator()
6129 return this->emitInvalid(E); in VisitUnaryOperator()
6131 return this->emitError(E); in VisitUnaryOperator()
6133 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6137 if (!this->emitDecPtr(E)) in VisitUnaryOperator()
6140 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
6144 return DiscardResult ? this->emitDecfPop(getFPOptions(E), E) in VisitUnaryOperator()
6145 : this->emitDecf(getFPOptions(E), E); in VisitUnaryOperator()
6148 return DiscardResult ? this->emitDecPop(*T, E->canOverflow(), E) in VisitUnaryOperator()
6149 : this->emitDec(*T, E->canOverflow(), E); in VisitUnaryOperator()
6153 return this->emitInvalid(E); in VisitUnaryOperator()
6155 return this->emitError(E); in VisitUnaryOperator()
6157 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6161 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
6163 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
6165 if (!this->emitAddOffsetUint8(E)) in VisitUnaryOperator()
6167 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
6173 return this->emitIncfPop(getFPOptions(E), E); in VisitUnaryOperator()
6174 return this->emitIncPop(*T, E->canOverflow(), E); in VisitUnaryOperator()
6179 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
6182 if (!this->emitFloat(F, E)) in VisitUnaryOperator()
6185 if (!this->emitAddf(getFPOptions(E), E)) in VisitUnaryOperator()
6187 if (!this->emitStoreFloat(E)) in VisitUnaryOperator()
6191 if (!this->emitPreInc(*T, E->canOverflow(), E)) in VisitUnaryOperator()
6194 return E->isGLValue() || this->emitLoadPop(*T, E); in VisitUnaryOperator()
6198 return this->emitInvalid(E); in VisitUnaryOperator()
6200 return this->emitError(E); in VisitUnaryOperator()
6202 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6206 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
6208 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
6210 if (!this->emitSubOffsetUint8(E)) in VisitUnaryOperator()
6212 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
6218 return this->emitDecfPop(getFPOptions(E), E); in VisitUnaryOperator()
6219 return this->emitDecPop(*T, E->canOverflow(), E); in VisitUnaryOperator()
6224 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
6227 if (!this->emitFloat(F, E)) in VisitUnaryOperator()
6230 if (!this->emitSubf(getFPOptions(E), E)) in VisitUnaryOperator()
6232 if (!this->emitStoreFloat(E)) in VisitUnaryOperator()
6236 if (!this->emitPreDec(*T, E->canOverflow(), E)) in VisitUnaryOperator()
6239 return E->isGLValue() || this->emitLoadPop(*T, E); in VisitUnaryOperator()
6243 return this->emitError(E); in VisitUnaryOperator()
6246 return this->discard(SubExpr); in VisitUnaryOperator()
6248 if (!this->visitBool(SubExpr)) in VisitUnaryOperator()
6251 if (!this->emitInv(E)) in VisitUnaryOperator()
6255 return this->emitCast(PT_Bool, ET, E); in VisitUnaryOperator()
6259 return this->emitError(E); in VisitUnaryOperator()
6261 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6263 return DiscardResult ? this->emitPop(*T, E) : this->emitNeg(*T, E); in VisitUnaryOperator()
6266 return this->emitError(E); in VisitUnaryOperator()
6268 if (!this->visit(SubExpr)) // noop in VisitUnaryOperator()
6270 return DiscardResult ? this->emitPop(*T, E) : true; in VisitUnaryOperator()
6275 return this->emitGetMemberPtr(cast<DeclRefExpr>(SubExpr)->getDecl(), E); in VisitUnaryOperator()
6278 return this->delegate(SubExpr); in VisitUnaryOperator()
6281 return this->discard(SubExpr); in VisitUnaryOperator()
6283 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6287 return this->emitNarrowPtr(E); in VisitUnaryOperator()
6292 return this->emitError(E); in VisitUnaryOperator()
6294 if (!this->visit(SubExpr)) in VisitUnaryOperator()
6296 return DiscardResult ? this->emitPop(*T, E) : this->emitComp(*T, E); in VisitUnaryOperator()
6299 return this->delegate(SubExpr); in VisitUnaryOperator()
6302 if (!this->discard(SubExpr)) in VisitUnaryOperator()
6304 return this->visitZeroInitializer(*T, SubExpr->getType(), SubExpr); in VisitUnaryOperator()
6307 return this->delegate(SubExpr); in VisitUnaryOperator()
6321 return this->discard(SubExpr); in VisitComplexUnaryOperator()
6329 return this->emitGetPtrLocal(*LocalIndex, E); in VisitComplexUnaryOperator()
6339 this->allocateLocalPrimitive(SubExpr, PT_Ptr, /*IsConst=*/true); in VisitComplexUnaryOperator()
6340 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
6342 return this->emitSetLocal(PT_Ptr, SubExprOffset, E); in VisitComplexUnaryOperator()
6347 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitComplexUnaryOperator()
6349 return this->emitArrayElemPop(ElemT, Index, E); in VisitComplexUnaryOperator()
6361 if (!this->emitNeg(ElemT, E)) in VisitComplexUnaryOperator()
6363 if (!this->emitInitElem(ElemT, I, E)) in VisitComplexUnaryOperator()
6371 return this->delegate(SubExpr); in VisitComplexUnaryOperator()
6374 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
6376 if (!this->emitComplexBoolCast(SubExpr)) in VisitComplexUnaryOperator()
6378 if (!this->emitInv(E)) in VisitComplexUnaryOperator()
6381 return this->emitCast(PT_Bool, ET, E); in VisitComplexUnaryOperator()
6385 return this->emitComplexReal(SubExpr); in VisitComplexUnaryOperator()
6388 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
6392 if (!this->emitConstUint8(1, E)) in VisitComplexUnaryOperator()
6394 return this->emitArrayElemPtrPopUint8(E); in VisitComplexUnaryOperator()
6399 return this->emitArrayElemPop(classifyPrim(E->getType()), 1, E); in VisitComplexUnaryOperator()
6402 if (!this->visit(SubExpr)) in VisitComplexUnaryOperator()
6405 if (!this->emitArrayElem(ElemT, 1, E)) in VisitComplexUnaryOperator()
6407 if (!this->emitNeg(ElemT, E)) in VisitComplexUnaryOperator()
6409 if (!this->emitInitElem(ElemT, 1, E)) in VisitComplexUnaryOperator()
6411 return DiscardResult ? this->emitPopPtr(E) : true; in VisitComplexUnaryOperator()
6414 return this->delegate(SubExpr); in VisitComplexUnaryOperator()
6417 return this->emitInvalid(E); in VisitComplexUnaryOperator()
6429 return this->discard(SubExpr); in VisitVectorUnaryOperator()
6433 return this->delegate(SubExpr); in VisitVectorUnaryOperator()
6437 return this->emitInvalid(E); in VisitVectorUnaryOperator()
6441 return this->delegate(SubExpr); in VisitVectorUnaryOperator()
6447 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitVectorUnaryOperator()
6453 this->allocateLocalPrimitive(SubExpr, PT_Ptr, /*IsConst=*/true); in VisitVectorUnaryOperator()
6454 if (!this->visit(SubExpr)) in VisitVectorUnaryOperator()
6456 if (!this->emitSetLocal(PT_Ptr, SubExprOffset, E)) in VisitVectorUnaryOperator()
6462 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitVectorUnaryOperator()
6464 return this->emitArrayElemPop(ElemT, Index, E); in VisitVectorUnaryOperator()
6472 if (!this->emitNeg(ElemT, E)) in VisitVectorUnaryOperator()
6474 if (!this->emitInitElem(ElemT, I, E)) in VisitVectorUnaryOperator()
6493 if (!this->emitPrimCast(ElemT, PT_Bool, Ctx.getASTContext().BoolTy, E)) in VisitVectorUnaryOperator()
6495 if (!this->emitInv(E)) in VisitVectorUnaryOperator()
6497 if (!this->emitPrimCast(PT_Bool, ElemT, VecTy->getElementType(), E)) in VisitVectorUnaryOperator()
6499 if (!this->emitNeg(ElemT, E)) in VisitVectorUnaryOperator()
6502 !this->emitPrimCast(ElemT, ResultVecElemT, ResultVecTy, E)) in VisitVectorUnaryOperator()
6504 if (!this->emitInitElem(ResultVecElemT, I, E)) in VisitVectorUnaryOperator()
6514 if (!this->emitInv(E)) in VisitVectorUnaryOperator()
6517 if (!this->emitComp(ElemT, E)) in VisitVectorUnaryOperator()
6520 if (!this->emitInitElem(ElemT, I, E)) in VisitVectorUnaryOperator()
6536 return this->emitConst(ECD->getInitVal(), E); in visitDeclRef()
6539 return F && this->emitGetFnPtr(F, E); in visitDeclRef()
6543 if (!this->emitGetPtrGlobal(*Index, E)) in visitDeclRef()
6546 if (!this->visitAPValue(TPOD->getValue(), *T, E)) in visitDeclRef()
6548 return this->emitInitGlobal(*T, *Index, E); in visitDeclRef()
6550 return this->visitAPValueInitializer(TPOD->getValue(), E, in visitDeclRef()
6566 return this->emitGetLocal(classifyPrim(E), Offset, E); in visitDeclRef()
6567 return this->emitGetPtrLocal(Offset, E); in visitDeclRef()
6573 return this->emitGetGlobal(classifyPrim(E), *GlobalIndex, E); in visitDeclRef()
6574 return this->emitGetGlobalUnchecked(classifyPrim(E), *GlobalIndex, E); in visitDeclRef()
6577 return this->emitGetPtrGlobal(*GlobalIndex, E); in visitDeclRef()
6581 if (auto It = this->Params.find(PVD); It != this->Params.end()) { in visitDeclRef()
6583 return this->emitGetParam(classifyPrim(E), It->second.Offset, E); in visitDeclRef()
6585 return this->emitGetPtrParam(It->second.Offset, E); in visitDeclRef()
6591 if (!this->emitPushCC(VD->hasConstantInitialization(), E)) in visitDeclRef()
6593 auto VarState = this->visitDecl(VD, /*IsConstexprUnknown=*/true); in visitDeclRef()
6595 if (!this->emitPopCC(E)) in visitDeclRef()
6603 return this->visitDeclRef(D, E); in visitDeclRef()
6607 if (auto It = this->LambdaCaptures.find(D); in visitDeclRef()
6608 It != this->LambdaCaptures.end()) { in visitDeclRef()
6612 return this->emitGetThisFieldPtr(Offset, E); in visitDeclRef()
6613 return this->emitGetPtrThisField(Offset, E); in visitDeclRef()
6623 return this->visit(BD->getBinding()); in visitDeclRef()
6627 return this->emitDummyPtr(D, E); in visitDeclRef()
6637 return this->emitDummyPtr(D, E); in visitDeclRef()
6643 return this->emitDummyPtr(D, E); in visitDeclRef()
6662 return this->visitDeclRef(D, E); in visitDeclRef()
6678 return this->emitDummyPtr(D, E); in visitDeclRef()
6680 return this->emitInvalidDeclRef(cast<DeclRefExpr>(E), in visitDeclRef()
6684 return this->emitDummyPtr(D, E); in visitDeclRef()
6690 return this->visitDeclRef(D, E); in VisitDeclRefExpr()
6721 return this->emitCastFP(ToSem, getRoundingMode(E), E); in emitPrimCast()
6725 return this->emitCastFloatingIntegralAP(Ctx.getBitWidth(ToQT), in emitPrimCast()
6728 return this->emitCastFloatingIntegralAPS(Ctx.getBitWidth(ToQT), in emitPrimCast()
6733 return this->emitCastFloatingIntegral(ToT, getFPOptions(E), E); in emitPrimCast()
6738 return this->emitCastAP(FromT, Ctx.getBitWidth(ToQT), E); in emitPrimCast()
6740 return this->emitCastAPS(FromT, Ctx.getBitWidth(ToQT), E); in emitPrimCast()
6744 return FromT != ToT ? this->emitCast(FromT, ToT, E) : true; in emitPrimCast()
6749 return this->emitCastIntegralFloating(FromT, ToSem, getFPOptions(E), E); in emitPrimCast()
6762 return this->discard(SubExpr); in emitComplexReal()
6764 if (!this->visit(SubExpr)) in emitComplexReal()
6767 if (!this->emitConstUint8(0, SubExpr)) in emitComplexReal()
6769 return this->emitArrayElemPtrPopUint8(SubExpr); in emitComplexReal()
6773 return this->emitArrayElemPop(classifyComplexElementType(SubExpr->getType()), in emitComplexReal()
6783 if (!this->emitArrayElem(ElemT, 0, E)) in emitComplexBoolCast()
6786 if (!this->emitCastFloatingIntegral(PT_Bool, getFPOptions(E), E)) in emitComplexBoolCast()
6789 if (!this->emitCast(ElemT, PT_Bool, E)) in emitComplexBoolCast()
6794 LabelTy LabelTrue = this->getLabel(); in emitComplexBoolCast()
6795 if (!this->jumpTrue(LabelTrue)) in emitComplexBoolCast()
6798 if (!this->emitArrayElemPop(ElemT, 1, E)) in emitComplexBoolCast()
6801 if (!this->emitCastFloatingIntegral(PT_Bool, getFPOptions(E), E)) in emitComplexBoolCast()
6804 if (!this->emitCast(ElemT, PT_Bool, E)) in emitComplexBoolCast()
6808 LabelTy EndLabel = this->getLabel(); in emitComplexBoolCast()
6809 this->jump(EndLabel); in emitComplexBoolCast()
6811 this->emitLabel(LabelTrue); in emitComplexBoolCast()
6812 if (!this->emitPopPtr(E)) in emitComplexBoolCast()
6814 if (!this->emitConstBool(true, E)) in emitComplexBoolCast()
6817 this->fallthrough(EndLabel); in emitComplexBoolCast()
6818 this->emitLabel(EndLabel); in emitComplexBoolCast()
6837 if (!this->visit(LHS)) in emitComplexComparison()
6839 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in emitComplexComparison()
6844 LHSOffset = this->allocateLocalPrimitive(LHS, LHST, /*IsConst=*/true); in emitComplexComparison()
6845 if (!this->visit(LHS)) in emitComplexComparison()
6847 if (!this->emitSetLocal(LHST, LHSOffset, E)) in emitComplexComparison()
6857 if (!this->visit(RHS)) in emitComplexComparison()
6859 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in emitComplexComparison()
6864 RHSOffset = this->allocateLocalPrimitive(RHS, RHST, /*IsConst=*/true); in emitComplexComparison()
6865 if (!this->visit(RHS)) in emitComplexComparison()
6867 if (!this->emitSetLocal(RHST, RHSOffset, E)) in emitComplexComparison()
6874 if (!this->emitGetLocal(PT_Ptr, LocalOffset, E)) in emitComplexComparison()
6876 return this->emitArrayElemPop(ElemT, Index, E); in emitComplexComparison()
6878 return this->emitGetLocal(ElemT, LocalOffset, E); in emitComplexComparison()
6888 if (!this->emitEQ(ElemT, E)) in emitComplexComparison()
6891 if (!this->emitCastBoolUint8(E)) in emitComplexComparison()
6896 if (!this->emitAddUint8(E)) in emitComplexComparison()
6898 if (!this->emitConstUint8(2, E)) in emitComplexComparison()
6902 if (!this->emitEQUint8(E)) in emitComplexComparison()
6905 if (!this->emitNEUint8(E)) in emitComplexComparison()
6910 // In C, this returns an int. in emitComplexComparison()
6912 return this->emitCast(PT_Bool, ResT, E); in emitComplexComparison()
6916 /// When calling this, we have a pointer of the local-to-destroy
6933 if (!this->emitDupPtr(Loc)) in emitRecordDestruction()
6935 return this->emitCall(DtorFunc, 0, Loc); in emitRecordDestruction()
6937 /// When calling this, we have a pointer of the local-to-destroy
6960 // If this is an array of record types, check if we need in emitDestruction()
6971 if (!this->emitConstUint64(I, Loc)) in emitDestruction()
6973 if (!this->emitArrayElemPtrUint64(Loc)) in emitDestruction()
6975 if (!this->emitDestruction(ElemDesc, Loc)) in emitDestruction()
6977 if (!this->emitPopPtr(Loc)) in emitDestruction()
6988 return this->emitRecordDestruction(Desc->ElemRecord, Loc); in emitDestruction()
6999 if (!this->emitGetPtrGlobal(DummyID, E)) in emitDummyPtr()
7007 return this->emitDecayPtr(PT_Ptr, PT, E); in emitDummyPtr()
7018 return this->emitConstFloat(Floating(F), E); in emitFloat()
7021 return this->emitConstFloat( in emitFloat()
7027 // This function is constexpr if and only if To, From, and the types of
7048 if (!this->emitGetPtrLocal(*LocalIndex, E)) in emitBuiltinBitCast()
7053 // For CK_LValueToRValueBitCast, this is always an lvalue and in emitBuiltinBitCast()
7055 // we call this function for other utility methods where in emitBuiltinBitCast()
7058 if (!this->visit(SubExpr)) in emitBuiltinBitCast()
7063 if (!this->visit(SubExpr)) in emitBuiltinBitCast()
7065 if (!this->emitSetLocal(*FromT, TempOffset, E)) in emitBuiltinBitCast()
7067 if (!this->emitGetPtrLocal(TempOffset, E)) in emitBuiltinBitCast()
7074 if (!this->emitBitCast(E)) in emitBuiltinBitCast()
7076 return DiscardResult ? this->emitPopPtr(E) : true; in emitBuiltinBitCast()
7090 if (!this->emitBitCastPrim(*ToT, ToTypeIsUChar || ToType->isStdByteType(), in emitBuiltinBitCast()
7095 return this->emitPop(*ToT, E); in emitBuiltinBitCast()