Lines Matching refs:E
335 bool ByteCodeExprGen<Emitter>::VisitFloatingLiteral(const FloatingLiteral *E) { in VisitFloatingLiteral() argument
339 return this->emitConstFloat(E->getValue(), E); in VisitFloatingLiteral()
343 bool ByteCodeExprGen<Emitter>::VisitParenExpr(const ParenExpr *E) { in VisitParenExpr() argument
344 return this->delegate(E->getSubExpr()); in VisitParenExpr()
490 bool ByteCodeExprGen<Emitter>::VisitPointerArithBinOp(const BinaryOperator *E) { in VisitPointerArithBinOp() argument
491 BinaryOperatorKind Op = E->getOpcode(); in VisitPointerArithBinOp()
492 const Expr *LHS = E->getLHS(); in VisitPointerArithBinOp()
493 const Expr *RHS = E->getRHS(); in VisitPointerArithBinOp()
509 assert(E->getType()->isIntegerType()); in VisitPointerArithBinOp()
513 return this->emitSubPtr(classifyPrim(E->getType()), E); in VisitPointerArithBinOp()
530 return this->emitAddOffset(OffsetType, E); in VisitPointerArithBinOp()
532 return this->emitSubOffset(OffsetType, E); in VisitPointerArithBinOp()
538 bool ByteCodeExprGen<Emitter>::VisitLogicalBinOp(const BinaryOperator *E) { in VisitLogicalBinOp() argument
539 assert(E->isLogicalOp()); in VisitLogicalBinOp()
540 BinaryOperatorKind Op = E->getOpcode(); in VisitLogicalBinOp()
541 const Expr *LHS = E->getLHS(); in VisitLogicalBinOp()
542 const Expr *RHS = E->getRHS(); in VisitLogicalBinOp()
543 std::optional<PrimType> T = classify(E->getType()); in VisitLogicalBinOp()
561 this->emitConstBool(true, E); in VisitLogicalBinOp()
583 this->emitConstBool(false, E); in VisitLogicalBinOp()
589 return this->emitPopBool(E); in VisitLogicalBinOp()
594 return this->emitCast(PT_Bool, *T, E); in VisitLogicalBinOp()
599 bool ByteCodeExprGen<Emitter>::VisitComplexBinOp(const BinaryOperator *E) { in VisitComplexBinOp() argument
602 const Expr *LHS = E->getLHS(); in VisitComplexBinOp()
603 const Expr *RHS = E->getRHS(); in VisitComplexBinOp()
611 ResultOffset = this->allocateLocalPrimitive(E, PT_Ptr, true, false); in VisitComplexBinOp()
617 if (!this->emitDupPtr(E)) in VisitComplexBinOp()
619 if (!this->emitSetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
626 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in VisitComplexBinOp()
632 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in VisitComplexBinOp()
636 BinaryOperatorKind Op = E->getOpcode(); in VisitComplexBinOp()
640 if (!this->emitGetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
644 if (!this->emitGetLocal(PT_Ptr, LHSOffset, E)) in VisitComplexBinOp()
646 if (!this->emitConstUint8(ElemIndex, E)) in VisitComplexBinOp()
648 if (!this->emitArrayElemPtrPopUint8(E)) in VisitComplexBinOp()
650 if (!this->emitLoadPop(LHSElemT, E)) in VisitComplexBinOp()
653 if (!this->emitGetLocal(PT_Ptr, RHSOffset, E)) in VisitComplexBinOp()
655 if (!this->emitConstUint8(ElemIndex, E)) in VisitComplexBinOp()
657 if (!this->emitArrayElemPtrPopUint8(E)) in VisitComplexBinOp()
659 if (!this->emitLoadPop(RHSElemT, E)) in VisitComplexBinOp()
666 if (!this->emitAddf(getRoundingMode(E), E)) in VisitComplexBinOp()
669 if (!this->emitAdd(LHSElemT, E)) in VisitComplexBinOp()
675 if (!this->emitSubf(getRoundingMode(E), E)) in VisitComplexBinOp()
678 if (!this->emitSub(LHSElemT, E)) in VisitComplexBinOp()
689 if (!this->emitInitElemPop(LHSElemT, ElemIndex, E)) in VisitComplexBinOp()
692 if (!this->emitPop(LHSElemT, E)) in VisitComplexBinOp()
700 bool ByteCodeExprGen<Emitter>::VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { in VisitImplicitValueInitExpr() argument
701 QualType QT = E->getType(); in VisitImplicitValueInitExpr()
704 return this->visitZeroInitializer(*T, QT, E); in VisitImplicitValueInitExpr()
720 if (!this->visitZeroInitializer(ElemT, CAT->getElementType(), E)) in VisitImplicitValueInitExpr()
722 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
734 const ArraySubscriptExpr *E) { in VisitArraySubscriptExpr() argument
735 const Expr *Base = E->getBase(); in VisitArraySubscriptExpr()
736 const Expr *Index = E->getIdx(); in VisitArraySubscriptExpr()
750 return this->emitArrayElemPtrPop(IndexT, E); in VisitArraySubscriptExpr()
755 const Expr *E) { in visitInitList() argument
756 assert(E->getType()->isRecordType()); in visitInitList()
757 const Record *R = getRecord(E->getType()); in visitInitList()
761 if (!this->emitDupPtr(E)) in visitInitList()
770 if (!this->emitInitBitField(*T, FieldToInit, E)) in visitInitList()
773 if (!this->emitInitField(*T, FieldToInit->Offset, E)) in visitInitList()
777 if (!this->emitPopPtr(E)) in visitInitList()
789 if (!this->emitInitPtrPop(E)) in visitInitList()
803 if (!this->emitPopPtr(E)) in visitInitList()
836 bool ByteCodeExprGen<Emitter>::VisitInitListExpr(const InitListExpr *E) { in VisitInitListExpr() argument
839 for (const Expr *Init : E->inits()) { in VisitInitListExpr()
847 if (std::optional<PrimType> T = classify(E->getType())) { in VisitInitListExpr()
849 if (E->getNumInits() == 0) in VisitInitListExpr()
850 return this->visitZeroInitializer(*T, E->getType(), E); in VisitInitListExpr()
851 assert(E->getNumInits() == 1); in VisitInitListExpr()
852 return this->delegate(E->inits()[0]); in VisitInitListExpr()
855 QualType T = E->getType(); in VisitInitListExpr()
857 return this->visitInitList(E->inits(), E); in VisitInitListExpr()
862 for (const Expr *Init : E->inits()) { in VisitInitListExpr()
871 unsigned NumInits = E->getNumInits(); in VisitInitListExpr()
874 return this->delegate(E->inits()[0]); in VisitInitListExpr()
876 QualType ElemQT = E->getType()->getAs<ComplexType>()->getElementType(); in VisitInitListExpr()
881 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitInitListExpr()
883 if (!this->emitInitElem(ElemT, I, E)) in VisitInitListExpr()
888 for (const Expr *Init : E->inits()) { in VisitInitListExpr()
892 if (!this->emitInitElem(ElemT, InitIndex, E)) in VisitInitListExpr()
905 const CXXParenListInitExpr *E) { in VisitCXXParenListInitExpr() argument
907 for (const Expr *Init : E->getInitExprs()) { in VisitCXXParenListInitExpr()
914 assert(E->getType()->isRecordType()); in VisitCXXParenListInitExpr()
915 return this->visitInitList(E->getInitExprs(), E); in VisitCXXParenListInitExpr()
920 const SubstNonTypeTemplateParmExpr *E) { in VisitSubstNonTypeTemplateParmExpr() argument
921 return this->delegate(E->getReplacement()); in VisitSubstNonTypeTemplateParmExpr()
925 bool ByteCodeExprGen<Emitter>::VisitConstantExpr(const ConstantExpr *E) { in VisitConstantExpr() argument
929 std::optional<PrimType> T = classify(E->getType()); in VisitConstantExpr()
930 if (T && E->hasAPValueResult() && in VisitConstantExpr()
931 this->visitAPValue(E->getAPValueResult(), *T, E)) in VisitConstantExpr()
934 return this->delegate(E->getSubExpr()); in VisitConstantExpr()
959 const UnaryExprOrTypeTraitExpr *E) { in VisitUnaryExprOrTypeTraitExpr() argument
960 UnaryExprOrTypeTrait Kind = E->getKind(); in VisitUnaryExprOrTypeTraitExpr()
964 QualType ArgType = E->getTypeOfArgument(); in VisitUnaryExprOrTypeTraitExpr()
978 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
984 if (E->isArgumentType()) { in VisitUnaryExprOrTypeTraitExpr()
985 QualType ArgType = E->getTypeOfArgument(); in VisitUnaryExprOrTypeTraitExpr()
990 const Expr *Arg = E->getArgumentExpr()->IgnoreParens(); in VisitUnaryExprOrTypeTraitExpr()
1011 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
1018 bool ByteCodeExprGen<Emitter>::VisitMemberExpr(const MemberExpr *E) { in VisitMemberExpr() argument
1020 const Expr *Base = E->getBase(); in VisitMemberExpr()
1030 const ValueDecl *Member = E->getMemberDecl(); in VisitMemberExpr()
1037 return this->emitGetFieldPop(PT_Ptr, F->Offset, E); in VisitMemberExpr()
1038 return this->emitGetPtrField(F->Offset, E); in VisitMemberExpr()
1046 const ArrayInitIndexExpr *E) { in VisitArrayInitIndexExpr() argument
1051 return this->emitConst(*ArrayIndex, E); in VisitArrayInitIndexExpr()
1056 const ArrayInitLoopExpr *E) { in VisitArrayInitLoopExpr() argument
1062 const Expr *SubExpr = E->getSubExpr(); in VisitArrayInitLoopExpr()
1063 const Expr *CommonExpr = E->getCommonExpr(); in VisitArrayInitLoopExpr()
1064 size_t Size = E->getArraySize().getZExtValue(); in VisitArrayInitLoopExpr()
1088 bool ByteCodeExprGen<Emitter>::VisitOpaqueValueExpr(const OpaqueValueExpr *E) { in VisitOpaqueValueExpr() argument
1090 return this->visitInitializer(E->getSourceExpr()); in VisitOpaqueValueExpr()
1092 PrimType SubExprT = classify(E->getSourceExpr()).value_or(PT_Ptr); in VisitOpaqueValueExpr()
1093 if (auto It = OpaqueExprs.find(E); It != OpaqueExprs.end()) in VisitOpaqueValueExpr()
1094 return this->emitGetLocal(SubExprT, It->second, E); in VisitOpaqueValueExpr()
1096 if (!this->visit(E->getSourceExpr())) in VisitOpaqueValueExpr()
1103 allocateLocalPrimitive(E, SubExprT, /*IsConst=*/true); in VisitOpaqueValueExpr()
1106 if (!this->emitSetLocal(SubExprT, *LocalIndex, E)) in VisitOpaqueValueExpr()
1112 if (!this->emitGetLocal(SubExprT, *LocalIndex, E)) in VisitOpaqueValueExpr()
1117 OpaqueExprs.insert({E, *LocalIndex}); in VisitOpaqueValueExpr()
1124 const AbstractConditionalOperator *E) { in VisitAbstractConditionalOperator() argument
1125 const Expr *Condition = E->getCond(); in VisitAbstractConditionalOperator()
1126 const Expr *TrueExpr = E->getTrueExpr(); in VisitAbstractConditionalOperator()
1127 const Expr *FalseExpr = E->getFalseExpr(); in VisitAbstractConditionalOperator()
1155 bool ByteCodeExprGen<Emitter>::VisitStringLiteral(const StringLiteral *E) { in VisitStringLiteral() argument
1160 unsigned StringIndex = P.createGlobalString(E); in VisitStringLiteral()
1161 return this->emitGetPtrGlobal(StringIndex, E); in VisitStringLiteral()
1166 Ctx.getASTContext().getAsConstantArrayType(E->getType()); in VisitStringLiteral()
1172 unsigned N = std::min(ArraySize, E->getLength()); in VisitStringLiteral()
1173 size_t CharWidth = E->getCharByteWidth(); in VisitStringLiteral()
1176 uint32_t CodeUnit = E->getCodeUnit(I); in VisitStringLiteral()
1179 this->emitConstSint8(CodeUnit, E); in VisitStringLiteral()
1180 this->emitInitElemSint8(I, E); in VisitStringLiteral()
1182 this->emitConstUint16(CodeUnit, E); in VisitStringLiteral()
1183 this->emitInitElemUint16(I, E); in VisitStringLiteral()
1185 this->emitConstUint32(CodeUnit, E); in VisitStringLiteral()
1186 this->emitInitElemUint32(I, E); in VisitStringLiteral()
1195 this->emitConstSint8(0, E); in VisitStringLiteral()
1196 this->emitInitElemSint8(I, E); in VisitStringLiteral()
1198 this->emitConstUint16(0, E); in VisitStringLiteral()
1199 this->emitInitElemUint16(I, E); in VisitStringLiteral()
1201 this->emitConstUint32(0, E); in VisitStringLiteral()
1202 this->emitInitElemUint32(I, E); in VisitStringLiteral()
1213 const CharacterLiteral *E) { in VisitCharacterLiteral() argument
1216 return this->emitConst(E->getValue(), E); in VisitCharacterLiteral()
1221 const CompoundAssignOperator *E) { in VisitFloatCompoundAssignOperator() argument
1223 const Expr *LHS = E->getLHS(); in VisitFloatCompoundAssignOperator()
1224 const Expr *RHS = E->getRHS(); in VisitFloatCompoundAssignOperator()
1226 QualType LHSComputationType = E->getComputationLHSType(); in VisitFloatCompoundAssignOperator()
1227 QualType ResultType = E->getComputationResultType(); in VisitFloatCompoundAssignOperator()
1244 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitFloatCompoundAssignOperator()
1245 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
1251 if (!this->emitLoad(LHST, E)) in VisitFloatCompoundAssignOperator()
1256 LHSComputationType, E)) in VisitFloatCompoundAssignOperator()
1260 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
1263 llvm::RoundingMode RM = getRoundingMode(E); in VisitFloatCompoundAssignOperator()
1264 switch (E->getOpcode()) { in VisitFloatCompoundAssignOperator()
1266 if (!this->emitAddf(RM, E)) in VisitFloatCompoundAssignOperator()
1270 if (!this->emitSubf(RM, E)) in VisitFloatCompoundAssignOperator()
1274 if (!this->emitMulf(RM, E)) in VisitFloatCompoundAssignOperator()
1278 if (!this->emitDivf(RM, E)) in VisitFloatCompoundAssignOperator()
1285 if (!this->emitPrimCast(classifyPrim(ResultType), LHST, LHS->getType(), E)) in VisitFloatCompoundAssignOperator()
1289 return this->emitStorePop(LHST, E); in VisitFloatCompoundAssignOperator()
1290 return this->emitStore(LHST, E); in VisitFloatCompoundAssignOperator()
1295 const CompoundAssignOperator *E) { in VisitPointerCompoundAssignOperator() argument
1296 BinaryOperatorKind Op = E->getOpcode(); in VisitPointerCompoundAssignOperator()
1297 const Expr *LHS = E->getLHS(); in VisitPointerCompoundAssignOperator()
1298 const Expr *RHS = E->getRHS(); in VisitPointerCompoundAssignOperator()
1319 this->emitAddOffset(*RT, E); in VisitPointerCompoundAssignOperator()
1321 this->emitSubOffset(*RT, E); in VisitPointerCompoundAssignOperator()
1324 return this->emitStorePopPtr(E); in VisitPointerCompoundAssignOperator()
1325 return this->emitStorePtr(E); in VisitPointerCompoundAssignOperator()
1330 const CompoundAssignOperator *E) { in VisitCompoundAssignOperator() argument
1332 const Expr *LHS = E->getLHS(); in VisitCompoundAssignOperator()
1333 const Expr *RHS = E->getRHS(); in VisitCompoundAssignOperator()
1335 classify(E->getComputationLHSType()); in VisitCompoundAssignOperator()
1337 std::optional<PrimType> RT = classify(E->getComputationResultType()); in VisitCompoundAssignOperator()
1338 std::optional<PrimType> ResultT = classify(E->getType()); in VisitCompoundAssignOperator()
1347 return VisitFloatCompoundAssignOperator(E); in VisitCompoundAssignOperator()
1349 if (E->getType()->isPointerType()) in VisitCompoundAssignOperator()
1350 return VisitPointerCompoundAssignOperator(E); in VisitCompoundAssignOperator()
1352 assert(!E->getType()->isPointerType() && "Handled above"); in VisitCompoundAssignOperator()
1353 assert(!E->getType()->isFloatingType() && "Handled above"); in VisitCompoundAssignOperator()
1363 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitCompoundAssignOperator()
1365 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
1372 if (!this->emitLoad(*LT, E)) in VisitCompoundAssignOperator()
1375 if (!this->emitCast(*LT, *LHSComputationT, E)) in VisitCompoundAssignOperator()
1380 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
1384 switch (E->getOpcode()) { in VisitCompoundAssignOperator()
1386 if (!this->emitAdd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1390 if (!this->emitSub(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1394 if (!this->emitMul(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1398 if (!this->emitDiv(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1402 if (!this->emitRem(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1406 if (!this->emitShl(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
1410 if (!this->emitShr(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
1414 if (!this->emitBitAnd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1418 if (!this->emitBitXor(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1422 if (!this->emitBitOr(*LHSComputationT, E)) in VisitCompoundAssignOperator()
1431 if (!this->emitCast(*LHSComputationT, *ResultT, E)) in VisitCompoundAssignOperator()
1438 return this->emitStoreBitFieldPop(*ResultT, E); in VisitCompoundAssignOperator()
1439 return this->emitStorePop(*ResultT, E); in VisitCompoundAssignOperator()
1442 return this->emitStoreBitField(*ResultT, E); in VisitCompoundAssignOperator()
1443 return this->emitStore(*ResultT, E); in VisitCompoundAssignOperator()
1448 const ExprWithCleanups *E) { in VisitExprWithCleanups() argument
1449 const Expr *SubExpr = E->getSubExpr(); in VisitExprWithCleanups()
1451 assert(E->getNumObjects() == 0 && "TODO: Implement cleanups"); in VisitExprWithCleanups()
1458 const MaterializeTemporaryExpr *E) { in VisitMaterializeTemporaryExpr() argument
1459 const Expr *SubExpr = E->getSubExpr(); in VisitMaterializeTemporaryExpr()
1473 bool IsStatic = E->getStorageDuration() == SD_Static; in VisitMaterializeTemporaryExpr()
1475 std::optional<unsigned> GlobalIndex = P.createGlobal(E); in VisitMaterializeTemporaryExpr()
1480 E->getLifetimeExtendedTemporaryDecl(); in VisitMaterializeTemporaryExpr()
1488 if (!this->emitInitGlobalTemp(*SubExprT, *GlobalIndex, TempDecl, E)) in VisitMaterializeTemporaryExpr()
1491 if (!this->emitInitGlobal(*SubExprT, *GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
1494 return this->emitGetPtrGlobal(*GlobalIndex, E); in VisitMaterializeTemporaryExpr()
1498 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
1503 return this->emitInitGlobalTempComp(TempDecl, E); in VisitMaterializeTemporaryExpr()
1513 this->emitSetLocal(*SubExprT, *LocalIndex, E); in VisitMaterializeTemporaryExpr()
1514 return this->emitGetPtrLocal(*LocalIndex, E); in VisitMaterializeTemporaryExpr()
1519 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitMaterializeTemporaryExpr()
1529 const CXXBindTemporaryExpr *E) { in VisitCXXBindTemporaryExpr() argument
1530 return this->delegate(E->getSubExpr()); in VisitCXXBindTemporaryExpr()
1535 const CompoundLiteralExpr *E) { in VisitCompoundLiteralExpr() argument
1536 const Expr *Init = E->getInitializer(); in VisitCompoundLiteralExpr()
1542 std::optional<PrimType> T = classify(E->getType()); in VisitCompoundLiteralExpr()
1543 if (E->isFileScope()) { in VisitCompoundLiteralExpr()
1544 if (std::optional<unsigned> GlobalIndex = P.createGlobal(E)) { in VisitCompoundLiteralExpr()
1545 if (classify(E->getType())) in VisitCompoundLiteralExpr()
1547 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCompoundLiteralExpr()
1559 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCompoundLiteralExpr()
1564 return this->emitPopPtr(E); in VisitCompoundLiteralExpr()
1573 bool ByteCodeExprGen<Emitter>::VisitTypeTraitExpr(const TypeTraitExpr *E) { in VisitTypeTraitExpr() argument
1576 return this->emitConstBool(E->getValue(), E); in VisitTypeTraitExpr()
1580 bool ByteCodeExprGen<Emitter>::VisitLambdaExpr(const LambdaExpr *E) { in VisitLambdaExpr() argument
1582 const Record *R = P.getOrCreateRecord(E->getLambdaClass()); in VisitLambdaExpr()
1584 auto *CaptureInitIt = E->capture_init_begin(); in VisitLambdaExpr()
1595 if (!this->emitSetField(*T, F.Offset, E)) in VisitLambdaExpr()
1598 if (!this->emitDupPtr(E)) in VisitLambdaExpr()
1601 if (!this->emitGetPtrField(F.Offset, E)) in VisitLambdaExpr()
1607 if (!this->emitPopPtr(E)) in VisitLambdaExpr()
1616 bool ByteCodeExprGen<Emitter>::VisitPredefinedExpr(const PredefinedExpr *E) { in VisitPredefinedExpr() argument
1621 return this->visit(E->getFunctionName()); in VisitPredefinedExpr()
1625 bool ByteCodeExprGen<Emitter>::VisitCXXThrowExpr(const CXXThrowExpr *E) { in VisitCXXThrowExpr() argument
1626 if (E->getSubExpr() && !this->discard(E->getSubExpr())) in VisitCXXThrowExpr()
1629 return this->emitInvalid(E); in VisitCXXThrowExpr()
1634 const CXXReinterpretCastExpr *E) { in VisitCXXReinterpretCastExpr() argument
1635 if (!this->discard(E->getSubExpr())) in VisitCXXReinterpretCastExpr()
1638 return this->emitInvalidCast(CastKind::Reinterpret, E); in VisitCXXReinterpretCastExpr()
1642 bool ByteCodeExprGen<Emitter>::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { in VisitCXXNoexceptExpr() argument
1643 assert(E->getType()->isBooleanType()); in VisitCXXNoexceptExpr()
1647 return this->emitConstBool(E->getValue(), E); in VisitCXXNoexceptExpr()
1652 const CXXConstructExpr *E) { in VisitCXXConstructExpr() argument
1653 QualType T = E->getType(); in VisitCXXConstructExpr()
1657 const CXXConstructorDecl *Ctor = E->getConstructor(); in VisitCXXConstructExpr()
1660 if (E->requiresZeroInitialization() && Ctor->isTrivial()) { in VisitCXXConstructExpr()
1661 const Record *R = getRecord(E->getType()); in VisitCXXConstructExpr()
1662 return this->visitZeroRecordInitializer(R, E); in VisitCXXConstructExpr()
1678 allocateLocal(E, /*IsExtended=*/true); in VisitCXXConstructExpr()
1683 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXConstructExpr()
1689 if (!this->emitDupPtr(E)) in VisitCXXConstructExpr()
1693 for (const auto *Arg : E->arguments()) { in VisitCXXConstructExpr()
1698 if (!this->emitCall(Func, E)) in VisitCXXConstructExpr()
1703 if (!this->emitPopPtr(E)) in VisitCXXConstructExpr()
1711 Ctx.getASTContext().getAsConstantArrayType(E->getType()); in VisitCXXConstructExpr()
1714 const Function *Func = getFunction(E->getConstructor()); in VisitCXXConstructExpr()
1721 if (!this->emitConstUint64(I, E)) in VisitCXXConstructExpr()
1723 if (!this->emitArrayElemPtrUint64(E)) in VisitCXXConstructExpr()
1727 for (const auto *Arg : E->arguments()) { in VisitCXXConstructExpr()
1732 if (!this->emitCall(Func, E)) in VisitCXXConstructExpr()
1742 bool ByteCodeExprGen<Emitter>::VisitSourceLocExpr(const SourceLocExpr *E) { in VisitSourceLocExpr() argument
1747 E->EvaluateInContext(Ctx.getASTContext(), SourceLocDefaultExpr); in VisitSourceLocExpr()
1750 if (E->getType()->isIntegerType()) { in VisitSourceLocExpr()
1753 return this->emitConst(I, E); in VisitSourceLocExpr()
1757 assert(E->getType()->isPointerType()); in VisitSourceLocExpr()
1776 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitSourceLocExpr()
1779 const Record *R = getRecord(E->getType()); in VisitSourceLocExpr()
1787 if (!this->visitAPValue(FieldValue, FieldT, E)) in VisitSourceLocExpr()
1789 if (!this->emitInitField(FieldT, F->Offset, E)) in VisitSourceLocExpr()
1798 bool ByteCodeExprGen<Emitter>::VisitOffsetOfExpr(const OffsetOfExpr *E) { in VisitOffsetOfExpr() argument
1799 unsigned N = E->getNumComponents(); in VisitOffsetOfExpr()
1804 const OffsetOfNode &Node = E->getComponent(I); in VisitOffsetOfExpr()
1806 const Expr *ArrayIndexExpr = E->getIndexExpr(Node.getArrayExprIndex()); in VisitOffsetOfExpr()
1819 if (!this->emitCast(IndexT, PT_Sint64, E)) in VisitOffsetOfExpr()
1828 PrimType T = classifyPrim(E->getType()); in VisitOffsetOfExpr()
1829 return this->emitOffsetOf(T, E, E); in VisitOffsetOfExpr()
1834 const CXXScalarValueInitExpr *E) { in VisitCXXScalarValueInitExpr() argument
1835 QualType Ty = E->getType(); in VisitCXXScalarValueInitExpr()
1840 return this->visitZeroInitializer(classifyPrim(Ty), Ty, E); in VisitCXXScalarValueInitExpr()
1844 bool ByteCodeExprGen<Emitter>::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { in VisitSizeOfPackExpr() argument
1845 return this->emitConst(E->getPackLength(), E); in VisitSizeOfPackExpr()
1848 template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { in discard() argument
1849 if (E->containsErrors()) in discard()
1854 return this->Visit(E); in discard()
1858 bool ByteCodeExprGen<Emitter>::delegate(const Expr *E) { in delegate() argument
1859 if (E->containsErrors()) in delegate()
1865 return this->Visit(E); in delegate()
1868 template <class Emitter> bool ByteCodeExprGen<Emitter>::visit(const Expr *E) { in visit() argument
1869 if (E->containsErrors()) in visit()
1872 if (E->getType()->isVoidType()) in visit()
1873 return this->discard(E); in visit()
1876 if (!E->isGLValue() && !E->getType()->isAnyComplexType() && in visit()
1877 !classify(E->getType())) { in visit()
1878 std::optional<unsigned> LocalIndex = allocateLocal(E, /*IsExtended=*/true); in visit()
1882 if (!this->emitGetPtrLocal(*LocalIndex, E)) in visit()
1884 return this->visitInitializer(E); in visit()
1891 return this->Visit(E); in visit()
1895 bool ByteCodeExprGen<Emitter>::visitInitializer(const Expr *E) { in visitInitializer() argument
1896 assert(!classify(E->getType())); in visitInitializer()
1898 if (E->containsErrors()) in visitInitializer()
1903 return this->Visit(E); in visitInitializer()
1907 bool ByteCodeExprGen<Emitter>::visitBool(const Expr *E) { in visitBool() argument
1908 std::optional<PrimType> T = classify(E->getType()); in visitBool()
1912 if (!this->visit(E)) in visitBool()
1920 if (!this->emitNull(*T, E)) in visitBool()
1922 return this->emitNE(*T, E); in visitBool()
1927 return this->emitCastFloatingIntegralBool(E); in visitBool()
1930 return this->emitCast(*T, PT_Bool, E); in visitBool()
1935 const Expr *E) { in visitZeroInitializer() argument
1938 return this->emitZeroBool(E); in visitZeroInitializer()
1940 return this->emitZeroSint8(E); in visitZeroInitializer()
1942 return this->emitZeroUint8(E); in visitZeroInitializer()
1944 return this->emitZeroSint16(E); in visitZeroInitializer()
1946 return this->emitZeroUint16(E); in visitZeroInitializer()
1948 return this->emitZeroSint32(E); in visitZeroInitializer()
1950 return this->emitZeroUint32(E); in visitZeroInitializer()
1952 return this->emitZeroSint64(E); in visitZeroInitializer()
1954 return this->emitZeroUint64(E); in visitZeroInitializer()
1956 return this->emitZeroIntAP(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
1958 return this->emitZeroIntAPS(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
1960 return this->emitNullPtr(E); in visitZeroInitializer()
1962 return this->emitNullFnPtr(E); in visitZeroInitializer()
1964 return this->emitConstFloat(APFloat::getZero(Ctx.getFloatSemantics(QT)), E); in visitZeroInitializer()
1972 const Expr *E) { in visitZeroRecordInitializer() argument
1973 assert(E); in visitZeroRecordInitializer()
1981 if (!this->visitZeroInitializer(T, QT, E)) in visitZeroRecordInitializer()
1983 if (!this->emitInitField(T, Field.Offset, E)) in visitZeroRecordInitializer()
1989 if (!this->emitDupPtr(E)) in visitZeroRecordInitializer()
1991 if (!this->emitGetPtrField(Field.Offset, E)) in visitZeroRecordInitializer()
1998 if (!this->visitZeroInitializer(T, ET, E)) in visitZeroRecordInitializer()
2000 if (!this->emitInitElem(T, I, E)) in visitZeroRecordInitializer()
2007 if (!this->emitConstUint32(I, E)) in visitZeroRecordInitializer()
2009 if (!this->emitArrayElemPtr(PT_Uint32, E)) in visitZeroRecordInitializer()
2011 if (!this->visitZeroRecordInitializer(ElemRecord, E)) in visitZeroRecordInitializer()
2013 if (!this->emitPopPtr(E)) in visitZeroRecordInitializer()
2017 if (!this->visitZeroRecordInitializer(D->ElemRecord, E)) in visitZeroRecordInitializer()
2023 if (!this->emitPopPtr(E)) in visitZeroRecordInitializer()
2028 if (!this->emitGetPtrBase(B.Offset, E)) in visitZeroRecordInitializer()
2030 if (!this->visitZeroRecordInitializer(B.R, E)) in visitZeroRecordInitializer()
2032 if (!this->emitInitPtrPop(E)) in visitZeroRecordInitializer()
2183 bool ByteCodeExprGen<Emitter>::emitConst(T Value, PrimType Ty, const Expr *E) { in emitConst() argument
2186 return this->emitConstSint8(Value, E); in emitConst()
2188 return this->emitConstUint8(Value, E); in emitConst()
2190 return this->emitConstSint16(Value, E); in emitConst()
2192 return this->emitConstUint16(Value, E); in emitConst()
2194 return this->emitConstSint32(Value, E); in emitConst()
2196 return this->emitConstUint32(Value, E); in emitConst()
2198 return this->emitConstSint64(Value, E); in emitConst()
2200 return this->emitConstUint64(Value, E); in emitConst()
2206 return this->emitConstBool(Value, E); in emitConst()
2218 bool ByteCodeExprGen<Emitter>::emitConst(T Value, const Expr *E) { in emitConst() argument
2219 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
2224 const Expr *E) { in emitConst() argument
2226 return this->emitConst(Value.getSExtValue(), Ty, E); in emitConst()
2227 return this->emitConst(Value.getZExtValue(), Ty, E); in emitConst()
2231 bool ByteCodeExprGen<Emitter>::emitConst(const APSInt &Value, const Expr *E) { in emitConst() argument
2232 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
2280 if (auto *E = Src.dyn_cast<const Expr *>()) { in allocateLocal() local
2282 Ty = E->getType(); in allocateLocal()
2323 bool ByteCodeExprGen<Emitter>::visitExpr(const Expr *E) { in visitExpr() argument
2326 if (E->getType()->isVoidType()) { in visitExpr()
2327 if (!visit(E)) in visitExpr()
2329 return this->emitRetVoid(E); in visitExpr()
2333 if (std::optional<PrimType> T = classify(E)) { in visitExpr()
2334 if (!visit(E)) in visitExpr()
2336 return this->emitRet(*T, E); in visitExpr()
2342 if (std::optional<unsigned> LocalOffset = this->allocateLocal(E)) { in visitExpr()
2343 if (!this->visitLocalInitializer(E, *LocalOffset)) in visitExpr()
2346 if (!this->emitGetPtrLocal(*LocalOffset, E)) in visitExpr()
2348 return this->emitRetValue(E); in visitExpr()
2454 PrimType ValType, const Expr *E) { in visitAPValue() argument
2457 return this->emitConst(Val.getInt(), ValType, E); in visitAPValue()
2469 bool ByteCodeExprGen<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) { in VisitBuiltinCallExpr() argument
2470 const Function *Func = getFunction(E->getDirectCallee()); in VisitBuiltinCallExpr()
2476 for (const auto *Arg : E->arguments()) { in VisitBuiltinCallExpr()
2482 if (!this->emitCallBI(Func, E, E)) in VisitBuiltinCallExpr()
2485 QualType ReturnType = E->getCallReturnType(Ctx.getASTContext()); in VisitBuiltinCallExpr()
2488 return this->emitPop(T, E); in VisitBuiltinCallExpr()
2495 bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) { in VisitCallExpr() argument
2496 if (E->getBuiltinCallee()) in VisitCallExpr()
2497 return VisitBuiltinCallExpr(E); in VisitCallExpr()
2499 QualType ReturnType = E->getCallReturnType(Ctx.getASTContext()); in VisitCallExpr()
2508 if (std::optional<unsigned> LocalIndex = allocateLocal(E)) { in VisitCallExpr()
2509 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
2514 if (!this->emitDupPtr(E)) in VisitCallExpr()
2520 if (const auto *MC = dyn_cast<CXXMemberCallExpr>(E)) { in VisitCallExpr()
2526 for (const auto *Arg : E->arguments()) { in VisitCallExpr()
2531 if (const FunctionDecl *FuncDecl = E->getDirectCallee()) { in VisitCallExpr()
2546 if (const auto *ME = dyn_cast<MemberExpr>(E->getCallee())) in VisitCallExpr()
2557 if (!this->emitCallVirt(Func, E)) in VisitCallExpr()
2560 if (!this->emitCall(Func, E)) in VisitCallExpr()
2567 if (!this->visit(E->getCallee())) in VisitCallExpr()
2570 if (!this->emitCallPtr(E)) in VisitCallExpr()
2576 return this->emitPop(*T, E); in VisitCallExpr()
2583 const CXXDefaultInitExpr *E) { in VisitCXXDefaultInitExpr() argument
2584 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultInitExpr()
2586 return this->visitInitializer(E->getExpr()); in VisitCXXDefaultInitExpr()
2588 assert(classify(E->getType())); in VisitCXXDefaultInitExpr()
2589 return this->visit(E->getExpr()); in VisitCXXDefaultInitExpr()
2594 const CXXDefaultArgExpr *E) { in VisitCXXDefaultArgExpr() argument
2595 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultArgExpr()
2597 const Expr *SubExpr = E->getExpr(); in VisitCXXDefaultArgExpr()
2598 if (std::optional<PrimType> T = classify(E->getExpr())) in VisitCXXDefaultArgExpr()
2607 const CXXBoolLiteralExpr *E) { in VisitCXXBoolLiteralExpr() argument
2611 return this->emitConstBool(E->getValue(), E); in VisitCXXBoolLiteralExpr()
2616 const CXXNullPtrLiteralExpr *E) { in VisitCXXNullPtrLiteralExpr() argument
2620 return this->emitNullPtr(E); in VisitCXXNullPtrLiteralExpr()
2624 bool ByteCodeExprGen<Emitter>::VisitGNUNullExpr(const GNUNullExpr *E) { in VisitGNUNullExpr() argument
2628 assert(E->getType()->isIntegerType()); in VisitGNUNullExpr()
2630 PrimType T = classifyPrim(E->getType()); in VisitGNUNullExpr()
2631 return this->emitZero(T, E); in VisitGNUNullExpr()
2635 bool ByteCodeExprGen<Emitter>::VisitCXXThisExpr(const CXXThisExpr *E) { in VisitCXXThisExpr() argument
2640 return this->emitGetThisFieldPtr(this->LambdaThisCapture, E); in VisitCXXThisExpr()
2642 return this->emitThis(E); in VisitCXXThisExpr()
2646 bool ByteCodeExprGen<Emitter>::VisitUnaryOperator(const UnaryOperator *E) { in VisitUnaryOperator() argument
2647 const Expr *SubExpr = E->getSubExpr(); in VisitUnaryOperator()
2650 switch (E->getOpcode()) { in VisitUnaryOperator()
2656 if (!this->emitIncPtr(E)) in VisitUnaryOperator()
2659 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
2663 return DiscardResult ? this->emitIncfPop(getRoundingMode(E), E) in VisitUnaryOperator()
2664 : this->emitIncf(getRoundingMode(E), E); in VisitUnaryOperator()
2667 return DiscardResult ? this->emitIncPop(*T, E) : this->emitInc(*T, E); in VisitUnaryOperator()
2674 if (!this->emitDecPtr(E)) in VisitUnaryOperator()
2677 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
2681 return DiscardResult ? this->emitDecfPop(getRoundingMode(E), E) in VisitUnaryOperator()
2682 : this->emitDecf(getRoundingMode(E), E); in VisitUnaryOperator()
2685 return DiscardResult ? this->emitDecPop(*T, E) : this->emitDec(*T, E); in VisitUnaryOperator()
2692 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
2694 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
2696 if (!this->emitAddOffsetUint8(E)) in VisitUnaryOperator()
2698 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
2704 return this->emitIncfPop(getRoundingMode(E), E); in VisitUnaryOperator()
2705 return this->emitIncPop(*T, E); in VisitUnaryOperator()
2709 const auto &TargetSemantics = Ctx.getFloatSemantics(E->getType()); in VisitUnaryOperator()
2710 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
2712 if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E)) in VisitUnaryOperator()
2714 if (!this->emitAddf(getRoundingMode(E), E)) in VisitUnaryOperator()
2716 return this->emitStoreFloat(E); in VisitUnaryOperator()
2718 if (!this->emitLoad(*T, E)) in VisitUnaryOperator()
2720 if (!this->emitConst(1, E)) in VisitUnaryOperator()
2722 if (!this->emitAdd(*T, E)) in VisitUnaryOperator()
2724 return this->emitStore(*T, E); in VisitUnaryOperator()
2731 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
2733 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
2735 if (!this->emitSubOffsetUint8(E)) in VisitUnaryOperator()
2737 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
2743 return this->emitDecfPop(getRoundingMode(E), E); in VisitUnaryOperator()
2744 return this->emitDecPop(*T, E); in VisitUnaryOperator()
2748 const auto &TargetSemantics = Ctx.getFloatSemantics(E->getType()); in VisitUnaryOperator()
2749 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
2751 if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E)) in VisitUnaryOperator()
2753 if (!this->emitSubf(getRoundingMode(E), E)) in VisitUnaryOperator()
2755 return this->emitStoreFloat(E); in VisitUnaryOperator()
2757 if (!this->emitLoad(*T, E)) in VisitUnaryOperator()
2759 if (!this->emitConst(1, E)) in VisitUnaryOperator()
2761 if (!this->emitSub(*T, E)) in VisitUnaryOperator()
2763 return this->emitStore(*T, E); in VisitUnaryOperator()
2772 if (!this->emitInvBool(E)) in VisitUnaryOperator()
2775 if (PrimType ET = classifyPrim(E->getType()); ET != PT_Bool) in VisitUnaryOperator()
2776 return this->emitCast(PT_Bool, ET, E); in VisitUnaryOperator()
2781 return DiscardResult ? this->emitPop(*T, E) : this->emitNeg(*T, E); in VisitUnaryOperator()
2785 return DiscardResult ? this->emitPop(*T, E) : true; in VisitUnaryOperator()
2796 [this, E](PrimType T) { in VisitUnaryOperator()
2797 return DiscardResult ? this->emitPop(T, E) : true; in VisitUnaryOperator()
2802 return DiscardResult ? this->emitPop(*T, E) : this->emitComp(*T, E); in VisitUnaryOperator()
2815 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
2817 if (!this->emitArrayElemPtrPopUint8(E)) in VisitUnaryOperator()
2823 return this->emitLoadPop(classifyPrim(E->getType()), E); in VisitUnaryOperator()
2836 bool ByteCodeExprGen<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) { in VisitDeclRefExpr() argument
2840 const auto *D = E->getDecl(); in VisitDeclRefExpr()
2843 return this->emitConst(ECD->getInitVal(), E); in VisitDeclRefExpr()
2848 return F && this->emitGetFnPtr(F, E); in VisitDeclRefExpr()
2862 return this->emitGetLocal(PT_Ptr, Offset, E); in VisitDeclRefExpr()
2863 return this->emitGetPtrLocal(Offset, E); in VisitDeclRefExpr()
2866 return this->emitGetGlobalPtr(*GlobalIndex, E); in VisitDeclRefExpr()
2868 return this->emitGetPtrGlobal(*GlobalIndex, E); in VisitDeclRefExpr()
2872 return this->emitGetParamPtr(It->second.Offset, E); in VisitDeclRefExpr()
2874 return this->emitGetPtrParam(It->second.Offset, E); in VisitDeclRefExpr()
2884 return this->emitGetThisFieldPtr(Offset, E); in VisitDeclRefExpr()
2885 return this->emitGetPtrThisField(Offset, E); in VisitDeclRefExpr()
2897 return this->VisitDeclRefExpr(E); in VisitDeclRefExpr()
2901 return this->emitGetPtrGlobal(*I, E); in VisitDeclRefExpr()
2904 return this->emitInvalidDeclRef(E, E); in VisitDeclRefExpr()
2947 QualType ToQT, const Expr *E) { in emitPrimCast() argument
2953 return this->emitCastFP(ToSem, getRoundingMode(E), E); in emitPrimCast()
2958 return this->emitCastFloatingIntegral(ToT, E); in emitPrimCast()
2964 return FromT != ToT ? this->emitCast(FromT, ToT, E) : true; in emitPrimCast()
2969 return this->emitCastIntegralFloating(FromT, ToSem, getRoundingMode(E), in emitPrimCast()
2970 E); in emitPrimCast()