Lines Matching refs:E
81 bool InitLink::emit(Compiler<Emitter> *Ctx, const Expr *E) const { in emit()
84 return Ctx->emitThis(E); in emit()
87 return Ctx->emitGetPtrFieldPop(Offset, E); in emit()
89 return Ctx->emitGetPtrLocal(Offset, E); in emit()
91 return Ctx->visitDeclRef(D, E); in emit()
650 bool Compiler<Emitter>::VisitFloatingLiteral(const FloatingLiteral *E) { in VisitFloatingLiteral() argument
654 return this->emitConstFloat(E->getValue(), E); in VisitFloatingLiteral()
658 bool Compiler<Emitter>::VisitImaginaryLiteral(const ImaginaryLiteral *E) { in VisitImaginaryLiteral() argument
659 assert(E->getType()->isAnyComplexType()); in VisitImaginaryLiteral()
664 std::optional<unsigned> LocalIndex = allocateLocal(E); in VisitImaginaryLiteral()
667 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitImaginaryLiteral()
671 const Expr *SubExpr = E->getSubExpr(); in VisitImaginaryLiteral()
682 bool Compiler<Emitter>::VisitParenExpr(const ParenExpr *E) { in VisitParenExpr() argument
683 return this->delegate(E->getSubExpr()); in VisitParenExpr()
859 bool Compiler<Emitter>::VisitPointerArithBinOp(const BinaryOperator *E) { in VisitPointerArithBinOp() argument
860 BinaryOperatorKind Op = E->getOpcode(); in VisitPointerArithBinOp()
861 const Expr *LHS = E->getLHS(); in VisitPointerArithBinOp()
862 const Expr *RHS = E->getRHS(); in VisitPointerArithBinOp()
878 assert(E->getType()->isIntegerType()); in VisitPointerArithBinOp()
882 return this->emitSubPtr(classifyPrim(E->getType()), E); in VisitPointerArithBinOp()
899 return this->emitAddOffset(OffsetType, E); in VisitPointerArithBinOp()
901 return this->emitSubOffset(OffsetType, E); in VisitPointerArithBinOp()
907 bool Compiler<Emitter>::VisitLogicalBinOp(const BinaryOperator *E) { in VisitLogicalBinOp() argument
908 assert(E->isLogicalOp()); in VisitLogicalBinOp()
909 BinaryOperatorKind Op = E->getOpcode(); in VisitLogicalBinOp()
910 const Expr *LHS = E->getLHS(); in VisitLogicalBinOp()
911 const Expr *RHS = E->getRHS(); in VisitLogicalBinOp()
912 std::optional<PrimType> T = classify(E->getType()); in VisitLogicalBinOp()
930 this->emitConstBool(true, E); in VisitLogicalBinOp()
952 this->emitConstBool(false, E); in VisitLogicalBinOp()
958 return this->emitPopBool(E); in VisitLogicalBinOp()
963 return this->emitCast(PT_Bool, *T, E); in VisitLogicalBinOp()
968 bool Compiler<Emitter>::VisitComplexBinOp(const BinaryOperator *E) { in VisitComplexBinOp() argument
971 std::optional<unsigned> LocalIndex = allocateLocal(E); in VisitComplexBinOp()
974 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitComplexBinOp()
980 const Expr *LHS = E->getLHS(); in VisitComplexBinOp()
981 const Expr *RHS = E->getRHS(); in VisitComplexBinOp()
983 PrimType ResultElemT = this->classifyComplexElementType(E->getType()); in VisitComplexBinOp()
986 ResultOffset = this->allocateLocalPrimitive(E, PT_Ptr, true, false); in VisitComplexBinOp()
990 if (!this->emitDupPtr(E)) in VisitComplexBinOp()
992 if (!this->emitSetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
1008 BinaryOperatorKind Op = E->getOpcode(); in VisitComplexBinOp()
1018 return this->emitMulc(ElemT, E); in VisitComplexBinOp()
1035 if (!this->emitGetPtrLocal(LHSOffset, E)) in VisitComplexBinOp()
1041 if (!this->emitInitElem(ElemT, 0, E)) in VisitComplexBinOp()
1044 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitComplexBinOp()
1046 if (!this->emitInitElem(ElemT, 1, E)) in VisitComplexBinOp()
1055 return this->emitDivc(ElemT, E); in VisitComplexBinOp()
1063 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in VisitComplexBinOp()
1070 if (!this->emitSetLocal(LHST, LHSOffset, E)) in VisitComplexBinOp()
1080 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in VisitComplexBinOp()
1087 if (!this->emitSetLocal(RHST, RHSOffset, E)) in VisitComplexBinOp()
1096 const Expr *E) -> bool { in VisitComplexBinOp() argument
1098 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitComplexBinOp()
1100 return this->emitArrayElemPop(classifyComplexElementType(E->getType()), in VisitComplexBinOp()
1101 ElemIndex, E); in VisitComplexBinOp()
1104 return this->emitGetLocal(classifyPrim(E->getType()), Offset, E); in VisitComplexBinOp()
1105 return this->visitZeroInitializer(classifyPrim(E->getType()), E->getType(), in VisitComplexBinOp()
1106 E); in VisitComplexBinOp()
1113 if (!this->emitGetLocal(PT_Ptr, ResultOffset, E)) in VisitComplexBinOp()
1126 if (!this->emitAddf(getRoundingMode(E), E)) in VisitComplexBinOp()
1129 if (!this->emitAdd(ResultElemT, E)) in VisitComplexBinOp()
1140 if (!this->emitSubf(getRoundingMode(E), E)) in VisitComplexBinOp()
1143 if (!this->emitSub(ResultElemT, E)) in VisitComplexBinOp()
1155 if (!this->emitMulf(getRoundingMode(E), E)) in VisitComplexBinOp()
1158 if (!this->emitMul(ResultElemT, E)) in VisitComplexBinOp()
1171 if (!this->emitDivf(getRoundingMode(E), E)) in VisitComplexBinOp()
1174 if (!this->emitDiv(ResultElemT, E)) in VisitComplexBinOp()
1185 if (!this->emitInitElemPop(ResultElemT, ElemIndex, E)) in VisitComplexBinOp()
1188 if (!this->emitPop(ResultElemT, E)) in VisitComplexBinOp()
1197 const ImplicitValueInitExpr *E) { in VisitImplicitValueInitExpr() argument
1198 QualType QT = E->getType(); in VisitImplicitValueInitExpr()
1201 return this->visitZeroInitializer(*T, QT, E); in VisitImplicitValueInitExpr()
1226 return this->visitZeroRecordInitializer(R, E); in VisitImplicitValueInitExpr()
1240 if (!this->visitZeroInitializer(ElemT, CAT->getElementType(), E)) in VisitImplicitValueInitExpr()
1242 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1249 if (const auto *ComplexTy = E->getType()->getAs<ComplexType>()) { in VisitImplicitValueInitExpr()
1254 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitImplicitValueInitExpr()
1256 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1262 if (const auto *VecT = E->getType()->getAs<VectorType>()) { in VisitImplicitValueInitExpr()
1268 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitImplicitValueInitExpr()
1270 if (!this->emitInitElem(ElemT, I, E)) in VisitImplicitValueInitExpr()
1280 bool Compiler<Emitter>::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) { in VisitArraySubscriptExpr() argument
1281 const Expr *Base = E->getBase(); in VisitArraySubscriptExpr()
1282 const Expr *Index = E->getIdx(); in VisitArraySubscriptExpr()
1296 return this->emitArrayElemPtrPop(IndexT, E); in VisitArraySubscriptExpr()
1301 const Expr *ArrayFiller, const Expr *E) { in visitInitList() argument
1303 QualType QT = E->getType(); in visitInitList()
1309 return this->emitInvalid(E); in visitInitList()
1324 return this->visitZeroInitializer(*T, QT, E); in visitInitList()
1332 if (Inits.size() == 1 && E->getType() == Inits[0]->getType()) in visitInitList()
1342 return this->emitInitBitField(T, FieldToInit, E); in visitInitList()
1343 return this->emitInitField(T, FieldToInit->Offset, E); in visitInitList()
1356 return this->emitPopPtr(E); in visitInitList()
1363 return this->emitFinishInit(E); in visitInitList()
1367 if (!this->visitZeroInitializer(*T, FieldType, E)) in visitInitList()
1369 if (!this->emitInitField(*T, FieldToInit->Offset, E)) in visitInitList()
1376 if (const auto *ILE = dyn_cast<InitListExpr>(E)) in visitInitList()
1379 FToInit = cast<CXXParenListInitExpr>(E)->getInitializedFieldInUnion(); in visitInitList()
1390 return this->emitFinishInit(E); in visitInitList()
1415 if (!this->emitFinishInitPop(E)) in visitInitList()
1427 return this->emitFinishInit(E); in visitInitList()
1445 if (!this->emitCast(InitT, TargetT, E)) in visitInitList()
1472 return this->emitFinishInit(E); in visitInitList()
1486 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in visitInitList()
1488 if (!this->emitInitElem(ElemT, I, E)) in visitInitList()
1497 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1522 InitVecT->getNumElements(), E)) in visitInitList()
1526 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1536 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in visitInitList()
1538 if (!this->emitInitElem(ElemT, InitIndex, E)) in visitInitList()
1571 bool Compiler<Emitter>::VisitInitListExpr(const InitListExpr *E) { in VisitInitListExpr() argument
1572 return this->visitInitList(E->inits(), E->getArrayFiller(), E); in VisitInitListExpr()
1577 const CXXParenListInitExpr *E) { in VisitCXXParenListInitExpr() argument
1578 return this->visitInitList(E->getInitExprs(), E->getArrayFiller(), E); in VisitCXXParenListInitExpr()
1583 const SubstNonTypeTemplateParmExpr *E) { in VisitSubstNonTypeTemplateParmExpr() argument
1584 return this->delegate(E->getReplacement()); in VisitSubstNonTypeTemplateParmExpr()
1588 bool Compiler<Emitter>::VisitConstantExpr(const ConstantExpr *E) { in VisitConstantExpr() argument
1589 std::optional<PrimType> T = classify(E->getType()); in VisitConstantExpr()
1590 if (T && E->hasAPValueResult()) { in VisitConstantExpr()
1597 if (this->visitAPValue(E->getAPValueResult(), *T, E)) in VisitConstantExpr()
1600 return this->delegate(E->getSubExpr()); in VisitConstantExpr()
1604 bool Compiler<Emitter>::VisitEmbedExpr(const EmbedExpr *E) { in VisitEmbedExpr() argument
1605 auto It = E->begin(); in VisitEmbedExpr()
1634 const UnaryExprOrTypeTraitExpr *E) { in VisitUnaryExprOrTypeTraitExpr() argument
1635 UnaryExprOrTypeTrait Kind = E->getKind(); in VisitUnaryExprOrTypeTraitExpr()
1639 QualType ArgType = E->getTypeOfArgument(); in VisitUnaryExprOrTypeTraitExpr()
1662 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
1668 if (E->isArgumentType()) { in VisitUnaryExprOrTypeTraitExpr()
1669 QualType ArgType = E->getTypeOfArgument(); in VisitUnaryExprOrTypeTraitExpr()
1674 const Expr *Arg = E->getArgumentExpr()->IgnoreParens(); in VisitUnaryExprOrTypeTraitExpr()
1695 return this->emitConst(Size.getQuantity(), E); in VisitUnaryExprOrTypeTraitExpr()
1699 if (const auto *VT = E->getTypeOfArgument()->getAs<VectorType>()) in VisitUnaryExprOrTypeTraitExpr()
1700 return this->emitConst(VT->getNumElements(), E); in VisitUnaryExprOrTypeTraitExpr()
1701 assert(E->getTypeOfArgument()->isSizelessVectorType()); in VisitUnaryExprOrTypeTraitExpr()
1702 return this->emitSizelessVectorElementSize(E); in VisitUnaryExprOrTypeTraitExpr()
1706 if (const auto *VT = E->getTypeOfArgument()->getAs<VectorType>()) { in VisitUnaryExprOrTypeTraitExpr()
1714 return this->emitConst(N, E); in VisitUnaryExprOrTypeTraitExpr()
1716 return this->emitConst(1, E); in VisitUnaryExprOrTypeTraitExpr()
1723 bool Compiler<Emitter>::VisitMemberExpr(const MemberExpr *E) { in VisitMemberExpr() argument
1725 const Expr *Base = E->getBase(); in VisitMemberExpr()
1726 const ValueDecl *Member = E->getMemberDecl(); in VisitMemberExpr()
1734 if (E->isGLValue()) in VisitMemberExpr()
1736 if (std::optional<PrimType> T = classify(E)) in VisitMemberExpr()
1737 return this->emitLoadPop(*T, E); in VisitMemberExpr()
1746 return this->emitGetPtrGlobal(*GlobalIndex, E) && maybeLoadValue(); in VisitMemberExpr()
1751 return this->discard(Base) && this->visitDeclRef(Member, E); in VisitMemberExpr()
1770 return this->emitGetFieldPop(PT_Ptr, F->Offset, E) && maybeLoadValue(); in VisitMemberExpr()
1771 return this->emitGetPtrFieldPop(F->Offset, E) && maybeLoadValue(); in VisitMemberExpr()
1775 bool Compiler<Emitter>::VisitArrayInitIndexExpr(const ArrayInitIndexExpr *E) { in VisitArrayInitIndexExpr() argument
1780 return this->emitConst(*ArrayIndex, E); in VisitArrayInitIndexExpr()
1784 bool Compiler<Emitter>::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E) { in VisitArrayInitLoopExpr() argument
1790 if (!this->discard(E->getCommonExpr())) in VisitArrayInitLoopExpr()
1795 const Expr *SubExpr = E->getSubExpr(); in VisitArrayInitLoopExpr()
1796 size_t Size = E->getArraySize().getZExtValue(); in VisitArrayInitLoopExpr()
1814 bool Compiler<Emitter>::VisitOpaqueValueExpr(const OpaqueValueExpr *E) { in VisitOpaqueValueExpr() argument
1815 const Expr *SourceExpr = E->getSourceExpr(); in VisitOpaqueValueExpr()
1823 if (auto It = OpaqueExprs.find(E); It != OpaqueExprs.end()) in VisitOpaqueValueExpr()
1824 return this->emitGetLocal(SubExprT, It->second, E); in VisitOpaqueValueExpr()
1832 unsigned LocalIndex = allocateLocalPrimitive(E, SubExprT, /*IsConst=*/true); in VisitOpaqueValueExpr()
1833 if (!this->emitSetLocal(SubExprT, LocalIndex, E)) in VisitOpaqueValueExpr()
1839 if (!this->emitGetLocal(SubExprT, LocalIndex, E)) in VisitOpaqueValueExpr()
1844 OpaqueExprs.insert({E, LocalIndex}); in VisitOpaqueValueExpr()
1851 const AbstractConditionalOperator *E) { in VisitAbstractConditionalOperator() argument
1852 const Expr *Condition = E->getCond(); in VisitAbstractConditionalOperator()
1853 const Expr *TrueExpr = E->getTrueExpr(); in VisitAbstractConditionalOperator()
1854 const Expr *FalseExpr = E->getFalseExpr(); in VisitAbstractConditionalOperator()
1882 bool Compiler<Emitter>::VisitStringLiteral(const StringLiteral *E) { in VisitStringLiteral() argument
1887 unsigned StringIndex = P.createGlobalString(E); in VisitStringLiteral()
1888 return this->emitGetPtrGlobal(StringIndex, E); in VisitStringLiteral()
1893 Ctx.getASTContext().getAsConstantArrayType(E->getType()); in VisitStringLiteral()
1899 unsigned N = std::min(ArraySize, E->getLength()); in VisitStringLiteral()
1900 size_t CharWidth = E->getCharByteWidth(); in VisitStringLiteral()
1903 uint32_t CodeUnit = E->getCodeUnit(I); in VisitStringLiteral()
1906 this->emitConstSint8(CodeUnit, E); in VisitStringLiteral()
1907 this->emitInitElemSint8(I, E); in VisitStringLiteral()
1909 this->emitConstUint16(CodeUnit, E); in VisitStringLiteral()
1910 this->emitInitElemUint16(I, E); in VisitStringLiteral()
1912 this->emitConstUint32(CodeUnit, E); in VisitStringLiteral()
1913 this->emitInitElemUint32(I, E); in VisitStringLiteral()
1922 this->emitConstSint8(0, E); in VisitStringLiteral()
1923 this->emitInitElemSint8(I, E); in VisitStringLiteral()
1925 this->emitConstUint16(0, E); in VisitStringLiteral()
1926 this->emitInitElemUint16(I, E); in VisitStringLiteral()
1928 this->emitConstUint32(0, E); in VisitStringLiteral()
1929 this->emitInitElemUint32(I, E); in VisitStringLiteral()
1939 bool Compiler<Emitter>::VisitObjCStringLiteral(const ObjCStringLiteral *E) { in VisitObjCStringLiteral() argument
1940 return this->delegate(E->getString()); in VisitObjCStringLiteral()
1944 bool Compiler<Emitter>::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { in VisitObjCEncodeExpr() argument
1947 A.getObjCEncodingForType(E->getEncodedType(), Str); in VisitObjCEncodeExpr()
1950 /*Pascal=*/false, E->getType(), E->getAtLoc()); in VisitObjCEncodeExpr()
1956 const SYCLUniqueStableNameExpr *E) { in VisitSYCLUniqueStableNameExpr() argument
1963 std::string ResultStr = E->ComputeName(A); in VisitSYCLUniqueStableNameExpr()
1972 /*Pascal=*/false, ArrayTy, E->getLocation()); in VisitSYCLUniqueStableNameExpr()
1975 return this->emitGetPtrGlobal(StringIndex, E); in VisitSYCLUniqueStableNameExpr()
1979 bool Compiler<Emitter>::VisitCharacterLiteral(const CharacterLiteral *E) { in VisitCharacterLiteral() argument
1982 return this->emitConst(E->getValue(), E); in VisitCharacterLiteral()
1987 const CompoundAssignOperator *E) { in VisitFloatCompoundAssignOperator() argument
1989 const Expr *LHS = E->getLHS(); in VisitFloatCompoundAssignOperator()
1990 const Expr *RHS = E->getRHS(); in VisitFloatCompoundAssignOperator()
1992 QualType LHSComputationType = E->getComputationLHSType(); in VisitFloatCompoundAssignOperator()
1993 QualType ResultType = E->getComputationResultType(); in VisitFloatCompoundAssignOperator()
2010 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitFloatCompoundAssignOperator()
2011 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
2017 if (!this->emitLoad(LHST, E)) in VisitFloatCompoundAssignOperator()
2022 LHSComputationType, E)) in VisitFloatCompoundAssignOperator()
2026 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitFloatCompoundAssignOperator()
2029 llvm::RoundingMode RM = getRoundingMode(E); in VisitFloatCompoundAssignOperator()
2030 switch (E->getOpcode()) { in VisitFloatCompoundAssignOperator()
2032 if (!this->emitAddf(RM, E)) in VisitFloatCompoundAssignOperator()
2036 if (!this->emitSubf(RM, E)) in VisitFloatCompoundAssignOperator()
2040 if (!this->emitMulf(RM, E)) in VisitFloatCompoundAssignOperator()
2044 if (!this->emitDivf(RM, E)) in VisitFloatCompoundAssignOperator()
2051 if (!this->emitPrimCast(classifyPrim(ResultType), LHST, LHS->getType(), E)) in VisitFloatCompoundAssignOperator()
2055 return this->emitStorePop(LHST, E); in VisitFloatCompoundAssignOperator()
2056 return this->emitStore(LHST, E); in VisitFloatCompoundAssignOperator()
2061 const CompoundAssignOperator *E) { in VisitPointerCompoundAssignOperator() argument
2062 BinaryOperatorKind Op = E->getOpcode(); in VisitPointerCompoundAssignOperator()
2063 const Expr *LHS = E->getLHS(); in VisitPointerCompoundAssignOperator()
2064 const Expr *RHS = E->getRHS(); in VisitPointerCompoundAssignOperator()
2084 if (!this->emitAddOffset(*RT, E)) in VisitPointerCompoundAssignOperator()
2087 if (!this->emitSubOffset(*RT, E)) in VisitPointerCompoundAssignOperator()
2092 return this->emitStorePopPtr(E); in VisitPointerCompoundAssignOperator()
2093 return this->emitStorePtr(E); in VisitPointerCompoundAssignOperator()
2098 const CompoundAssignOperator *E) { in VisitCompoundAssignOperator() argument
2100 const Expr *LHS = E->getLHS(); in VisitCompoundAssignOperator()
2101 const Expr *RHS = E->getRHS(); in VisitCompoundAssignOperator()
2103 classify(E->getComputationLHSType()); in VisitCompoundAssignOperator()
2106 std::optional<PrimType> ResultT = classify(E->getType()); in VisitCompoundAssignOperator()
2109 return this->visit(RHS) && this->visit(LHS) && this->emitError(E); in VisitCompoundAssignOperator()
2118 return VisitFloatCompoundAssignOperator(E); in VisitCompoundAssignOperator()
2120 if (E->getType()->isPointerType()) in VisitCompoundAssignOperator()
2121 return VisitPointerCompoundAssignOperator(E); in VisitCompoundAssignOperator()
2123 assert(!E->getType()->isPointerType() && "Handled above"); in VisitCompoundAssignOperator()
2124 assert(!E->getType()->isFloatingType() && "Handled above"); in VisitCompoundAssignOperator()
2134 unsigned TempOffset = this->allocateLocalPrimitive(E, *RT, /*IsConst=*/true); in VisitCompoundAssignOperator()
2136 if (!this->emitSetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
2143 if (!this->emitLoad(*LT, E)) in VisitCompoundAssignOperator()
2146 if (!this->emitCast(*LT, *LHSComputationT, E)) in VisitCompoundAssignOperator()
2151 if (!this->emitGetLocal(*RT, TempOffset, E)) in VisitCompoundAssignOperator()
2155 switch (E->getOpcode()) { in VisitCompoundAssignOperator()
2157 if (!this->emitAdd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2161 if (!this->emitSub(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2165 if (!this->emitMul(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2169 if (!this->emitDiv(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2173 if (!this->emitRem(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2177 if (!this->emitShl(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
2181 if (!this->emitShr(*LHSComputationT, *RT, E)) in VisitCompoundAssignOperator()
2185 if (!this->emitBitAnd(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2189 if (!this->emitBitXor(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2193 if (!this->emitBitOr(*LHSComputationT, E)) in VisitCompoundAssignOperator()
2202 if (!this->emitCast(*LHSComputationT, *ResultT, E)) in VisitCompoundAssignOperator()
2209 return this->emitStoreBitFieldPop(*ResultT, E); in VisitCompoundAssignOperator()
2210 return this->emitStorePop(*ResultT, E); in VisitCompoundAssignOperator()
2213 return this->emitStoreBitField(*ResultT, E); in VisitCompoundAssignOperator()
2214 return this->emitStore(*ResultT, E); in VisitCompoundAssignOperator()
2218 bool Compiler<Emitter>::VisitExprWithCleanups(const ExprWithCleanups *E) { in VisitExprWithCleanups() argument
2220 const Expr *SubExpr = E->getSubExpr(); in VisitExprWithCleanups()
2222 assert(E->getNumObjects() == 0 && "TODO: Implement cleanups"); in VisitExprWithCleanups()
2229 const MaterializeTemporaryExpr *E) { in VisitMaterializeTemporaryExpr() argument
2230 const Expr *SubExpr = E->getSubExpr(); in VisitMaterializeTemporaryExpr()
2244 bool IsStatic = E->getStorageDuration() == SD_Static; in VisitMaterializeTemporaryExpr()
2246 std::optional<unsigned> GlobalIndex = P.createGlobal(E); in VisitMaterializeTemporaryExpr()
2251 E->getLifetimeExtendedTemporaryDecl(); in VisitMaterializeTemporaryExpr()
2259 if (!this->emitInitGlobalTemp(*SubExprT, *GlobalIndex, TempDecl, E)) in VisitMaterializeTemporaryExpr()
2262 if (!this->emitInitGlobal(*SubExprT, *GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
2265 return this->emitGetPtrGlobal(*GlobalIndex, E); in VisitMaterializeTemporaryExpr()
2269 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitMaterializeTemporaryExpr()
2274 return this->emitInitGlobalTempComp(TempDecl, E); in VisitMaterializeTemporaryExpr()
2284 if (!this->emitSetLocal(*SubExprT, LocalIndex, E)) in VisitMaterializeTemporaryExpr()
2286 return this->emitGetPtrLocal(LocalIndex, E); in VisitMaterializeTemporaryExpr()
2288 const Expr *Inner = E->getSubExpr()->skipRValueSubobjectAdjustments(); in VisitMaterializeTemporaryExpr()
2290 allocateLocal(Inner, E->getExtendingDecl())) { in VisitMaterializeTemporaryExpr()
2292 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitMaterializeTemporaryExpr()
2302 const CXXBindTemporaryExpr *E) { in VisitCXXBindTemporaryExpr() argument
2303 return this->delegate(E->getSubExpr()); in VisitCXXBindTemporaryExpr()
2307 bool Compiler<Emitter>::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { in VisitCompoundLiteralExpr() argument
2308 const Expr *Init = E->getInitializer(); in VisitCompoundLiteralExpr()
2311 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2314 std::optional<PrimType> T = classify(E->getType()); in VisitCompoundLiteralExpr()
2315 if (E->isFileScope()) { in VisitCompoundLiteralExpr()
2317 if (T && !E->isLValue()) in VisitCompoundLiteralExpr()
2320 if (std::optional<unsigned> GlobalIndex = P.createGlobal(E)) { in VisitCompoundLiteralExpr()
2321 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCompoundLiteralExpr()
2327 return this->emitInitGlobal(*T, *GlobalIndex, E); in VisitCompoundLiteralExpr()
2330 return this->visitInitializer(Init) && this->emitFinishInit(E); in VisitCompoundLiteralExpr()
2337 if (T && !E->isLValue()) { in VisitCompoundLiteralExpr()
2350 if (!this->emitGetPtrLocal(LocalIndex, E)) in VisitCompoundLiteralExpr()
2357 return this->emitInit(*T, E); in VisitCompoundLiteralExpr()
2359 if (!this->visitInitializer(Init) || !this->emitFinishInit(E)) in VisitCompoundLiteralExpr()
2364 return this->emitPopPtr(E); in VisitCompoundLiteralExpr()
2372 bool Compiler<Emitter>::VisitTypeTraitExpr(const TypeTraitExpr *E) { in VisitTypeTraitExpr() argument
2375 if (E->getType()->isBooleanType()) in VisitTypeTraitExpr()
2376 return this->emitConstBool(E->getValue(), E); in VisitTypeTraitExpr()
2377 return this->emitConst(E->getValue(), E); in VisitTypeTraitExpr()
2381 bool Compiler<Emitter>::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { in VisitArrayTypeTraitExpr() argument
2384 return this->emitConst(E->getValue(), E); in VisitArrayTypeTraitExpr()
2388 bool Compiler<Emitter>::VisitLambdaExpr(const LambdaExpr *E) { in VisitLambdaExpr() argument
2393 const Record *R = P.getOrCreateRecord(E->getLambdaClass()); in VisitLambdaExpr()
2395 auto *CaptureInitIt = E->capture_init_begin(); in VisitLambdaExpr()
2409 if (!this->emitInitField(*T, F.Offset, E)) in VisitLambdaExpr()
2412 if (!this->emitGetPtrField(F.Offset, E)) in VisitLambdaExpr()
2418 if (!this->emitPopPtr(E)) in VisitLambdaExpr()
2427 bool Compiler<Emitter>::VisitPredefinedExpr(const PredefinedExpr *E) { in VisitPredefinedExpr() argument
2431 return this->delegate(E->getFunctionName()); in VisitPredefinedExpr()
2435 bool Compiler<Emitter>::VisitCXXThrowExpr(const CXXThrowExpr *E) { in VisitCXXThrowExpr() argument
2436 if (E->getSubExpr() && !this->discard(E->getSubExpr())) in VisitCXXThrowExpr()
2439 return this->emitInvalid(E); in VisitCXXThrowExpr()
2444 const CXXReinterpretCastExpr *E) { in VisitCXXReinterpretCastExpr() argument
2445 if (!this->discard(E->getSubExpr())) in VisitCXXReinterpretCastExpr()
2448 return this->emitInvalidCast(CastKind::Reinterpret, E); in VisitCXXReinterpretCastExpr()
2452 bool Compiler<Emitter>::VisitCXXNoexceptExpr(const CXXNoexceptExpr *E) { in VisitCXXNoexceptExpr() argument
2453 assert(E->getType()->isBooleanType()); in VisitCXXNoexceptExpr()
2457 return this->emitConstBool(E->getValue(), E); in VisitCXXNoexceptExpr()
2461 bool Compiler<Emitter>::VisitCXXConstructExpr(const CXXConstructExpr *E) { in VisitCXXConstructExpr() argument
2462 QualType T = E->getType(); in VisitCXXConstructExpr()
2466 const CXXConstructorDecl *Ctor = E->getConstructor(); in VisitCXXConstructExpr()
2471 E->getArg(0)->isTemporaryObject(Ctx.getASTContext(), in VisitCXXConstructExpr()
2473 return this->visitInitializer(E->getArg(0)); in VisitCXXConstructExpr()
2481 std::optional<unsigned> LocalIndex = allocateLocal(E); in VisitCXXConstructExpr()
2486 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXConstructExpr()
2491 if (E->requiresZeroInitialization()) { in VisitCXXConstructExpr()
2492 const Record *R = getRecord(E->getType()); in VisitCXXConstructExpr()
2494 if (!this->visitZeroRecordInitializer(R, E)) in VisitCXXConstructExpr()
2512 if (!this->emitDupPtr(E)) in VisitCXXConstructExpr()
2516 for (const auto *Arg : E->arguments()) { in VisitCXXConstructExpr()
2524 for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I) { in VisitCXXConstructExpr()
2526 align(primSize(classify(E->getArg(I)->getType()).value_or(PT_Ptr))); in VisitCXXConstructExpr()
2528 if (!this->emitCallVar(Func, VarArgSize, E)) in VisitCXXConstructExpr()
2531 if (!this->emitCall(Func, 0, E)) in VisitCXXConstructExpr()
2537 if (!this->emitRecordDestruction(getRecord(E->getType()))) in VisitCXXConstructExpr()
2539 if (!this->emitPopPtr(E)) in VisitCXXConstructExpr()
2547 Ctx.getASTContext().getAsConstantArrayType(E->getType()); in VisitCXXConstructExpr()
2552 const Function *Func = getFunction(E->getConstructor()); in VisitCXXConstructExpr()
2559 if (!this->emitConstUint64(I, E)) in VisitCXXConstructExpr()
2561 if (!this->emitArrayElemPtrUint64(E)) in VisitCXXConstructExpr()
2565 for (const auto *Arg : E->arguments()) { in VisitCXXConstructExpr()
2570 if (!this->emitCall(Func, 0, E)) in VisitCXXConstructExpr()
2580 bool Compiler<Emitter>::VisitSourceLocExpr(const SourceLocExpr *E) { in VisitSourceLocExpr() argument
2585 E->EvaluateInContext(Ctx.getASTContext(), SourceLocDefaultExpr); in VisitSourceLocExpr()
2588 if (E->getType()->isIntegerType()) { in VisitSourceLocExpr()
2591 return this->emitConst(I, E); in VisitSourceLocExpr()
2595 assert(E->getType()->isPointerType()); in VisitSourceLocExpr()
2614 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitSourceLocExpr()
2617 const Record *R = getRecord(E->getType()); in VisitSourceLocExpr()
2625 if (!this->visitAPValue(FieldValue, FieldT, E)) in VisitSourceLocExpr()
2627 if (!this->emitInitField(FieldT, F->Offset, E)) in VisitSourceLocExpr()
2636 bool Compiler<Emitter>::VisitOffsetOfExpr(const OffsetOfExpr *E) { in VisitOffsetOfExpr() argument
2637 unsigned N = E->getNumComponents(); in VisitOffsetOfExpr()
2642 const OffsetOfNode &Node = E->getComponent(I); in VisitOffsetOfExpr()
2644 const Expr *ArrayIndexExpr = E->getIndexExpr(Node.getArrayExprIndex()); in VisitOffsetOfExpr()
2657 if (!this->emitCast(IndexT, PT_Sint64, E)) in VisitOffsetOfExpr()
2666 PrimType T = classifyPrim(E->getType()); in VisitOffsetOfExpr()
2667 return this->emitOffsetOf(T, E, E); in VisitOffsetOfExpr()
2672 const CXXScalarValueInitExpr *E) { in VisitCXXScalarValueInitExpr() argument
2673 QualType Ty = E->getType(); in VisitCXXScalarValueInitExpr()
2679 return this->visitZeroInitializer(*T, Ty, E); in VisitCXXScalarValueInitExpr()
2683 std::optional<unsigned> LocalIndex = allocateLocal(E); in VisitCXXScalarValueInitExpr()
2686 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXScalarValueInitExpr()
2695 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitCXXScalarValueInitExpr()
2697 if (!this->emitInitElem(ElemT, I, E)) in VisitCXXScalarValueInitExpr()
2706 std::optional<unsigned> LocalIndex = allocateLocal(E); in VisitCXXScalarValueInitExpr()
2709 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCXXScalarValueInitExpr()
2718 if (!this->visitZeroInitializer(ElemT, ElemQT, E)) in VisitCXXScalarValueInitExpr()
2720 if (!this->emitInitElem(ElemT, I, E)) in VisitCXXScalarValueInitExpr()
2730 bool Compiler<Emitter>::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { in VisitSizeOfPackExpr() argument
2731 return this->emitConst(E->getPackLength(), E); in VisitSizeOfPackExpr()
2736 const GenericSelectionExpr *E) { in VisitGenericSelectionExpr() argument
2737 return this->delegate(E->getResultExpr()); in VisitGenericSelectionExpr()
2741 bool Compiler<Emitter>::VisitChooseExpr(const ChooseExpr *E) { in VisitChooseExpr() argument
2742 return this->delegate(E->getChosenSubExpr()); in VisitChooseExpr()
2746 bool Compiler<Emitter>::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *E) { in VisitObjCBoolLiteralExpr() argument
2750 return this->emitConst(E->getValue(), E); in VisitObjCBoolLiteralExpr()
2755 const CXXInheritedCtorInitExpr *E) { in VisitCXXInheritedCtorInitExpr() argument
2756 const CXXConstructorDecl *Ctor = E->getConstructor(); in VisitCXXInheritedCtorInitExpr()
2776 if (!this->emitGetParam(PT, Offset, E)) in VisitCXXInheritedCtorInitExpr()
2781 return this->emitCall(F, 0, E); in VisitCXXInheritedCtorInitExpr()
2785 bool Compiler<Emitter>::VisitCXXNewExpr(const CXXNewExpr *E) { in VisitCXXNewExpr() argument
2786 assert(classifyPrim(E->getType()) == PT_Ptr); in VisitCXXNewExpr()
2787 const Expr *Init = E->getInitializer(); in VisitCXXNewExpr()
2788 QualType ElementType = E->getAllocatedType(); in VisitCXXNewExpr()
2790 unsigned PlacementArgs = E->getNumPlacementArgs(); in VisitCXXNewExpr()
2805 if (PlacementArgs != 1 || !E->getPlacementArg(0)->getType()->isNothrowT()) in VisitCXXNewExpr()
2806 return this->emitInvalid(E); in VisitCXXNewExpr()
2808 if (!this->discard(E->getPlacementArg(0))) in VisitCXXNewExpr()
2815 if (E->isArray()) in VisitCXXNewExpr()
2818 Desc = P.createDescriptor(E, *ElemT, Descriptor::InlineDescMD, in VisitCXXNewExpr()
2823 E, ElementType.getTypePtr(), in VisitCXXNewExpr()
2824 E->isArray() ? std::nullopt : Descriptor::InlineDescMD, in VisitCXXNewExpr()
2828 if (E->isArray()) { in VisitCXXNewExpr()
2829 std::optional<const Expr *> ArraySizeExpr = E->getArraySize(); in VisitCXXNewExpr()
2847 if (!this->emitAllocN(SizeT, *ElemT, E, IsNoThrow, E)) in VisitCXXNewExpr()
2851 if (!this->emitAllocCN(SizeT, Desc, IsNoThrow, E)) in VisitCXXNewExpr()
2860 if (!this->emitAlloc(Desc, E)) in VisitCXXNewExpr()
2868 if (!this->emitInit(*ElemT, E)) in VisitCXXNewExpr()
2879 return this->emitPopPtr(E); in VisitCXXNewExpr()
2885 bool Compiler<Emitter>::VisitCXXDeleteExpr(const CXXDeleteExpr *E) { in VisitCXXDeleteExpr() argument
2886 const Expr *Arg = E->getArgument(); in VisitCXXDeleteExpr()
2892 return this->emitFree(E->isArrayForm(), E); in VisitCXXDeleteExpr()
2896 bool Compiler<Emitter>::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { in VisitExpressionTraitExpr() argument
2898 return this->emitConstBool(E->getValue(), E); in VisitExpressionTraitExpr()
2902 bool Compiler<Emitter>::VisitCXXUuidofExpr(const CXXUuidofExpr *E) { in VisitCXXUuidofExpr() argument
2907 const MSGuidDecl *GuidDecl = E->getGuidDecl(); in VisitCXXUuidofExpr()
2914 return this->emitGetPtrGlobal(*I, E); in VisitCXXUuidofExpr()
2921 if (!this->emitGetPtrGlobal(*GlobalIndex, E)) in VisitCXXUuidofExpr()
2924 assert(this->getRecord(E->getType())); in VisitCXXUuidofExpr()
2932 if (!this->visitAPValueInitializer(V, E)) in VisitCXXUuidofExpr()
2935 return this->emitFinishInit(E); in VisitCXXUuidofExpr()
2939 bool Compiler<Emitter>::VisitRequiresExpr(const RequiresExpr *E) { in VisitRequiresExpr() argument
2940 assert(classifyPrim(E->getType()) == PT_Bool); in VisitRequiresExpr()
2943 return this->emitConstBool(E->isSatisfied(), E); in VisitRequiresExpr()
2948 const ConceptSpecializationExpr *E) { in VisitConceptSpecializationExpr() argument
2949 assert(classifyPrim(E->getType()) == PT_Bool); in VisitConceptSpecializationExpr()
2952 return this->emitConstBool(E->isSatisfied(), E); in VisitConceptSpecializationExpr()
2957 const CXXRewrittenBinaryOperator *E) { in VisitCXXRewrittenBinaryOperator() argument
2958 return this->delegate(E->getSemanticForm()); in VisitCXXRewrittenBinaryOperator()
2962 bool Compiler<Emitter>::VisitPseudoObjectExpr(const PseudoObjectExpr *E) { in VisitPseudoObjectExpr() argument
2964 for (const Expr *SemE : E->semantics()) { in VisitPseudoObjectExpr()
2966 if (SemE == E->getResultExpr()) in VisitPseudoObjectExpr()
2974 } else if (SemE == E->getResultExpr()) { in VisitPseudoObjectExpr()
2986 bool Compiler<Emitter>::VisitPackIndexingExpr(const PackIndexingExpr *E) { in VisitPackIndexingExpr() argument
2987 return this->delegate(E->getSelectedExpr()); in VisitPackIndexingExpr()
2991 bool Compiler<Emitter>::VisitRecoveryExpr(const RecoveryExpr *E) { in VisitRecoveryExpr() argument
2992 return this->emitError(E); in VisitRecoveryExpr()
2996 bool Compiler<Emitter>::VisitAddrLabelExpr(const AddrLabelExpr *E) { in VisitAddrLabelExpr() argument
2997 assert(E->getType()->isVoidPointerType()); in VisitAddrLabelExpr()
3000 E->getLabel(), PT_Ptr, /*IsConst=*/true, /*IsExtended=*/false); in VisitAddrLabelExpr()
3002 return this->emitGetLocal(PT_Ptr, Offset, E); in VisitAddrLabelExpr()
3006 bool Compiler<Emitter>::VisitConvertVectorExpr(const ConvertVectorExpr *E) { in VisitConvertVectorExpr() argument
3008 const auto *VT = E->getType()->castAs<VectorType>(); in VisitConvertVectorExpr()
3011 const Expr *Src = E->getSrcExpr(); in VisitConvertVectorExpr()
3018 if (!this->emitSetLocal(PT_Ptr, SrcOffset, E)) in VisitConvertVectorExpr()
3022 if (!this->emitGetLocal(PT_Ptr, SrcOffset, E)) in VisitConvertVectorExpr()
3024 if (!this->emitArrayElemPop(SrcElemT, I, E)) in VisitConvertVectorExpr()
3027 if (!this->emitPrimCast(SrcElemT, ElemT, ElemType, E)) in VisitConvertVectorExpr()
3030 if (!this->emitInitElem(ElemT, I, E)) in VisitConvertVectorExpr()
3038 bool Compiler<Emitter>::VisitShuffleVectorExpr(const ShuffleVectorExpr *E) { in VisitShuffleVectorExpr() argument
3040 assert(E->getNumSubExprs() > 2); in VisitShuffleVectorExpr()
3042 const Expr *Vecs[] = {E->getExpr(0), E->getExpr(1)}; in VisitShuffleVectorExpr()
3046 unsigned NumOutputElems = E->getNumSubExprs() - 2; in VisitShuffleVectorExpr()
3056 if (!this->emitSetLocal(PT_Ptr, VectorOffsets[I], E)) in VisitShuffleVectorExpr()
3060 APSInt ShuffleIndex = E->getShuffleMaskIdx(Ctx.getASTContext(), I); in VisitShuffleVectorExpr()
3062 return this->emitInvalid(E); // FIXME: Better diagnostic. in VisitShuffleVectorExpr()
3066 VectorOffsets[ShuffleIndex >= NumInputElems], E)) in VisitShuffleVectorExpr()
3069 if (!this->emitArrayElemPop(ElemT, InputVectorIndex, E)) in VisitShuffleVectorExpr()
3072 if (!this->emitInitElem(ElemT, I, E)) in VisitShuffleVectorExpr()
3081 const ExtVectorElementExpr *E) { in VisitExtVectorElementExpr() argument
3082 const Expr *Base = E->getBase(); in VisitExtVectorElementExpr()
3088 E->getEncodedElementAccess(Indices); in VisitExtVectorElementExpr()
3094 if (E->isGLValue()) { in VisitExtVectorElementExpr()
3095 if (!this->emitConstUint32(Indices[0], E)) in VisitExtVectorElementExpr()
3097 return this->emitArrayElemPtrPop(PT_Uint32, E); in VisitExtVectorElementExpr()
3100 return this->emitArrayElemPop(classifyPrim(E->getType()), Indices[0], E); in VisitExtVectorElementExpr()
3108 if (!this->emitSetLocal(PT_Ptr, BaseOffset, E)) in VisitExtVectorElementExpr()
3114 ResultIndex = allocateLocal(E); in VisitExtVectorElementExpr()
3117 if (!this->emitGetPtrLocal(*ResultIndex, E)) in VisitExtVectorElementExpr()
3121 assert(Indices.size() == E->getType()->getAs<VectorType>()->getNumElements()); in VisitExtVectorElementExpr()
3124 classifyPrim(E->getType()->getAs<VectorType>()->getElementType()); in VisitExtVectorElementExpr()
3127 if (!this->emitGetLocal(PT_Ptr, BaseOffset, E)) in VisitExtVectorElementExpr()
3129 if (!this->emitArrayElemPop(ElemT, I, E)) in VisitExtVectorElementExpr()
3131 if (!this->emitInitElem(ElemT, DstIndex, E)) in VisitExtVectorElementExpr()
3142 bool Compiler<Emitter>::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) { in VisitObjCBoxedExpr() argument
3143 if (!E->isExpressibleAsConstantInitializer()) in VisitObjCBoxedExpr()
3144 return this->emitInvalid(E); in VisitObjCBoxedExpr()
3146 return this->delegate(E->getSubExpr()); in VisitObjCBoxedExpr()
3151 const CXXStdInitializerListExpr *E) { in VisitCXXStdInitializerListExpr() argument
3152 const Expr *SubExpr = E->getSubExpr(); in VisitCXXStdInitializerListExpr()
3155 const Record *R = getRecord(E->getType()); in VisitCXXStdInitializerListExpr()
3161 if (!this->emitInitFieldPtr(R->getField(0u)->Offset, E)) in VisitCXXStdInitializerListExpr()
3167 SecondFieldT, E)) in VisitCXXStdInitializerListExpr()
3169 return this->emitInitField(SecondFieldT, R->getField(1u)->Offset, E); in VisitCXXStdInitializerListExpr()
3173 if (!this->emitGetFieldPtr(R->getField(0u)->Offset, E)) in VisitCXXStdInitializerListExpr()
3175 if (!this->emitConst(static_cast<APSInt>(ArrayType->getSize()), PT_Uint64, E)) in VisitCXXStdInitializerListExpr()
3177 if (!this->emitArrayElemPtrPop(PT_Uint64, E)) in VisitCXXStdInitializerListExpr()
3179 return this->emitInitFieldPtr(R->getField(1u)->Offset, E); in VisitCXXStdInitializerListExpr()
3183 bool Compiler<Emitter>::VisitStmtExpr(const StmtExpr *E) { in VisitStmtExpr() argument
3187 const CompoundStmt *CS = E->getSubStmt(); in VisitStmtExpr()
3209 template <class Emitter> bool Compiler<Emitter>::discard(const Expr *E) { in discard() argument
3212 return this->Visit(E); in discard()
3215 template <class Emitter> bool Compiler<Emitter>::delegate(const Expr *E) { in delegate() argument
3216 if (E->containsErrors()) in delegate()
3217 return this->emitError(E); in delegate()
3222 return this->Visit(E); in delegate()
3225 template <class Emitter> bool Compiler<Emitter>::visit(const Expr *E) { in visit() argument
3226 if (E->getType().isNull()) in visit()
3229 if (E->getType()->isVoidType()) in visit()
3230 return this->discard(E); in visit()
3233 if (!E->isGLValue() && !E->getType()->isAnyComplexType() && in visit()
3234 !classify(E->getType())) { in visit()
3235 std::optional<unsigned> LocalIndex = allocateLocal(E); in visit()
3239 if (!this->emitGetPtrLocal(*LocalIndex, E)) in visit()
3241 return this->visitInitializer(E); in visit()
3248 return this->Visit(E); in visit()
3252 bool Compiler<Emitter>::visitInitializer(const Expr *E) { in visitInitializer() argument
3253 assert(!classify(E->getType())); in visitInitializer()
3255 if (E->containsErrors()) in visitInitializer()
3256 return this->emitError(E); in visitInitializer()
3260 return this->Visit(E); in visitInitializer()
3263 template <class Emitter> bool Compiler<Emitter>::visitBool(const Expr *E) { in visitBool() argument
3264 std::optional<PrimType> T = classify(E->getType()); in visitBool()
3267 if (E->getType()->isAnyComplexType()) { in visitBool()
3268 if (!this->visit(E)) in visitBool()
3270 return this->emitComplexBoolCast(E); in visitBool()
3275 if (!this->visit(E)) in visitBool()
3283 if (!this->emitNull(*T, nullptr, E)) in visitBool()
3285 return this->emitNE(*T, E); in visitBool()
3290 return this->emitCastFloatingIntegralBool(E); in visitBool()
3293 return this->emitCast(*T, PT_Bool, E); in visitBool()
3298 const Expr *E) { in visitZeroInitializer() argument
3301 return this->emitZeroBool(E); in visitZeroInitializer()
3303 return this->emitZeroSint8(E); in visitZeroInitializer()
3305 return this->emitZeroUint8(E); in visitZeroInitializer()
3307 return this->emitZeroSint16(E); in visitZeroInitializer()
3309 return this->emitZeroUint16(E); in visitZeroInitializer()
3311 return this->emitZeroSint32(E); in visitZeroInitializer()
3313 return this->emitZeroUint32(E); in visitZeroInitializer()
3315 return this->emitZeroSint64(E); in visitZeroInitializer()
3317 return this->emitZeroUint64(E); in visitZeroInitializer()
3319 return this->emitZeroIntAP(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
3321 return this->emitZeroIntAPS(Ctx.getBitWidth(QT), E); in visitZeroInitializer()
3323 return this->emitNullPtr(nullptr, E); in visitZeroInitializer()
3325 return this->emitNullFnPtr(nullptr, E); in visitZeroInitializer()
3327 return this->emitNullMemberPtr(nullptr, E); in visitZeroInitializer()
3329 return this->emitConstFloat(APFloat::getZero(Ctx.getFloatSemantics(QT)), E); in visitZeroInitializer()
3337 const Expr *E) { in visitZeroRecordInitializer() argument
3338 assert(E); in visitZeroRecordInitializer()
3346 if (!this->visitZeroInitializer(T, QT, E)) in visitZeroRecordInitializer()
3348 if (!this->emitInitField(T, Field.Offset, E)) in visitZeroRecordInitializer()
3353 if (!this->emitGetPtrField(Field.Offset, E)) in visitZeroRecordInitializer()
3360 if (!this->visitZeroInitializer(T, ET, E)) in visitZeroRecordInitializer()
3362 if (!this->emitInitElem(T, I, E)) in visitZeroRecordInitializer()
3369 if (!this->emitConstUint32(I, E)) in visitZeroRecordInitializer()
3371 if (!this->emitArrayElemPtr(PT_Uint32, E)) in visitZeroRecordInitializer()
3373 if (!this->visitZeroRecordInitializer(ElemRecord, E)) in visitZeroRecordInitializer()
3375 if (!this->emitPopPtr(E)) in visitZeroRecordInitializer()
3379 if (!this->visitZeroRecordInitializer(D->ElemRecord, E)) in visitZeroRecordInitializer()
3385 if (!this->emitPopPtr(E)) in visitZeroRecordInitializer()
3390 if (!this->emitGetPtrBase(B.Offset, E)) in visitZeroRecordInitializer()
3392 if (!this->visitZeroRecordInitializer(B.R, E)) in visitZeroRecordInitializer()
3394 if (!this->emitFinishInitPop(E)) in visitZeroRecordInitializer()
3405 bool Compiler<Emitter>::emitConst(T Value, PrimType Ty, const Expr *E) { in emitConst() argument
3408 return this->emitConstSint8(Value, E); in emitConst()
3410 return this->emitConstUint8(Value, E); in emitConst()
3412 return this->emitConstSint16(Value, E); in emitConst()
3414 return this->emitConstUint16(Value, E); in emitConst()
3416 return this->emitConstSint32(Value, E); in emitConst()
3418 return this->emitConstUint32(Value, E); in emitConst()
3420 return this->emitConstSint64(Value, E); in emitConst()
3422 return this->emitConstUint64(Value, E); in emitConst()
3424 return this->emitConstBool(Value, E); in emitConst()
3439 bool Compiler<Emitter>::emitConst(T Value, const Expr *E) { in emitConst() argument
3440 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
3445 const Expr *E) { in emitConst() argument
3447 return this->emitConstIntAPS(Value, E); in emitConst()
3449 return this->emitConstIntAP(Value, E); in emitConst()
3452 return this->emitConst(Value.getSExtValue(), Ty, E); in emitConst()
3453 return this->emitConst(Value.getZExtValue(), Ty, E); in emitConst()
3457 bool Compiler<Emitter>::emitConst(const APSInt &Value, const Expr *E) { in emitConst() argument
3458 return this->emitConst(Value, classifyPrim(E->getType()), E); in emitConst()
3506 if (auto *E = Src.dyn_cast<const Expr *>()) { in allocateLocal() local
3508 Ty = E->getType(); in allocateLocal()
3550 template <class Emitter> bool Compiler<Emitter>::visitExpr(const Expr *E) { in visitExpr() argument
3553 if (E->getType()->isVoidType()) { in visitExpr()
3554 if (!visit(E)) in visitExpr()
3556 return this->emitRetVoid(E) && RootScope.destroyLocals(); in visitExpr()
3560 if (std::optional<PrimType> T = classify(E)) { in visitExpr()
3561 if (!visit(E)) in visitExpr()
3563 return this->emitRet(*T, E) && RootScope.destroyLocals(); in visitExpr()
3569 if (std::optional<unsigned> LocalOffset = this->allocateLocal(E)) { in visitExpr()
3570 if (!this->emitGetPtrLocal(*LocalOffset, E)) in visitExpr()
3573 if (!visitInitializer(E)) in visitExpr()
3576 if (!this->emitFinishInit(E)) in visitExpr()
3581 return this->emitRetValue(E) && RootScope.destroyLocals(); in visitExpr()
3784 const Expr *E) { in visitAPValue() argument
3787 return this->emitConst(Val.getInt(), ValType, E); in visitAPValue()
3789 return this->emitConstFloat(Val.getFloat(), E); in visitAPValue()
3793 return this->emitNull(ValType, nullptr, E); in visitAPValue()
3798 return this->visitDeclRef(VD, E); in visitAPValue()
3802 return this->emitGetMemberPtr(MemberDecl, E); in visitAPValue()
3803 return this->emitNullMemberPtr(nullptr, E); in visitAPValue()
3811 const Expr *E) { in visitAPValueInitializer() argument
3814 const Record *R = this->getRecord(E->getType()); in visitAPValueInitializer()
3822 if (!this->visitAPValue(F, T, E)) in visitAPValueInitializer()
3824 if (!this->emitInitField(T, RF->Offset, E)) in visitAPValueInitializer()
3832 if (!this->emitGetPtrField(RF->Offset, E)) in visitAPValueInitializer()
3836 if (!this->visitAPValue(F.getArrayInitializedElt(A), ElemT, E)) in visitAPValueInitializer()
3838 if (!this->emitInitElem(ElemT, A, E)) in visitAPValueInitializer()
3842 if (!this->emitPopPtr(E)) in visitAPValueInitializer()
3845 if (!this->emitGetPtrField(RF->Offset, E)) in visitAPValueInitializer()
3847 if (!this->visitAPValueInitializer(F, E)) in visitAPValueInitializer()
3849 if (!this->emitPopPtr(E)) in visitAPValueInitializer()
3863 if (!this->visitAPValue(F, T, E)) in visitAPValueInitializer()
3865 return this->emitInitField(T, RF->Offset, E); in visitAPValueInitializer()
3873 bool Compiler<Emitter>::VisitBuiltinCallExpr(const CallExpr *E) { in VisitBuiltinCallExpr() argument
3874 const Function *Func = getFunction(E->getDirectCallee()); in VisitBuiltinCallExpr()
3880 unsigned Builtin = E->getBuiltinCallee(); in VisitBuiltinCallExpr()
3885 if (std::optional<unsigned> GlobalOffset = P.createGlobal(E)) { in VisitBuiltinCallExpr()
3886 if (!this->emitGetPtrGlobal(*GlobalOffset, E)) in VisitBuiltinCallExpr()
3889 if (PrimType PT = classifyPrim(E); PT != PT_Ptr && isPtrType(PT)) in VisitBuiltinCallExpr()
3890 return this->emitDecayPtr(PT_Ptr, PT, E); in VisitBuiltinCallExpr()
3896 QualType ReturnType = E->getType(); in VisitBuiltinCallExpr()
3897 std::optional<PrimType> ReturnT = classify(E); in VisitBuiltinCallExpr()
3901 std::optional<unsigned> LocalIndex = allocateLocal(E); in VisitBuiltinCallExpr()
3904 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitBuiltinCallExpr()
3910 for (const auto *Arg : E->arguments()) { in VisitBuiltinCallExpr()
3916 if (!this->emitCallBI(Func, E, E)) in VisitBuiltinCallExpr()
3921 return this->emitPop(*ReturnT, E); in VisitBuiltinCallExpr()
3928 bool Compiler<Emitter>::VisitCallExpr(const CallExpr *E) { in VisitCallExpr() argument
3929 if (E->getBuiltinCallee()) in VisitCallExpr()
3930 return VisitBuiltinCallExpr(E); in VisitCallExpr()
3932 QualType ReturnType = E->getCallReturnType(Ctx.getASTContext()); in VisitCallExpr()
3935 const FunctionDecl *FuncDecl = E->getDirectCallee(); in VisitCallExpr()
3942 if (std::optional<unsigned> LocalIndex = allocateLocal(E)) { in VisitCallExpr()
3943 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
3950 if (std::optional<unsigned> LocalIndex = allocateLocal(E)) { in VisitCallExpr()
3951 if (!this->emitGetPtrLocal(*LocalIndex, E)) in VisitCallExpr()
3955 if (!this->emitDupPtr(E)) in VisitCallExpr()
3960 auto Args = llvm::ArrayRef(E->getArgs(), E->getNumArgs()); in VisitCallExpr()
3964 if (isa<CXXOperatorCallExpr>(E)) { in VisitCallExpr()
3967 if (!this->discard(E->getArg(0))) in VisitCallExpr()
3975 if (const auto *MC = dyn_cast<CXXMemberCallExpr>(E)) { in VisitCallExpr()
3976 if (!FuncDecl && classifyPrim(E->getCallee()) == PT_MemberPtr) { in VisitCallExpr()
3980 const Expr *Callee = E->getCallee(); in VisitCallExpr()
3985 if (!this->emitSetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
3987 if (!this->emitGetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
3989 if (!this->emitGetMemberPtrBase(E)) in VisitCallExpr()
4021 if (const auto *ME = dyn_cast<MemberExpr>(E->getCallee())) in VisitCallExpr()
4034 Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E); in VisitCallExpr()
4035 for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I) in VisitCallExpr()
4036 VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr))); in VisitCallExpr()
4038 if (!this->emitCallVirt(Func, VarArgSize, E)) in VisitCallExpr()
4043 Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E); in VisitCallExpr()
4044 for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I) in VisitCallExpr()
4045 VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr))); in VisitCallExpr()
4046 if (!this->emitCallVar(Func, VarArgSize, E)) in VisitCallExpr()
4049 if (!this->emitCall(Func, 0, E)) in VisitCallExpr()
4059 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) in VisitCallExpr()
4060 ArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr))); in VisitCallExpr()
4065 if (!this->emitGetLocal(PT_MemberPtr, *CalleeOffset, E)) in VisitCallExpr()
4067 if (!this->emitGetMemberPtrDecl(E)) in VisitCallExpr()
4069 if (!this->emitCallPtr(ArgSize, E, E)) in VisitCallExpr()
4072 if (!this->visit(E->getCallee())) in VisitCallExpr()
4075 if (!this->emitCallPtr(ArgSize, E, E)) in VisitCallExpr()
4082 return this->emitPop(*T, E); in VisitCallExpr()
4088 bool Compiler<Emitter>::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *E) { in VisitCXXDefaultInitExpr() argument
4089 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultInitExpr()
4091 return this->delegate(E->getExpr()); in VisitCXXDefaultInitExpr()
4095 bool Compiler<Emitter>::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { in VisitCXXDefaultArgExpr() argument
4096 SourceLocScope<Emitter> SLS(this, E); in VisitCXXDefaultArgExpr()
4098 const Expr *SubExpr = E->getExpr(); in VisitCXXDefaultArgExpr()
4099 if (std::optional<PrimType> T = classify(E->getExpr())) in VisitCXXDefaultArgExpr()
4107 bool Compiler<Emitter>::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { in VisitCXXBoolLiteralExpr() argument
4111 return this->emitConstBool(E->getValue(), E); in VisitCXXBoolLiteralExpr()
4116 const CXXNullPtrLiteralExpr *E) { in VisitCXXNullPtrLiteralExpr() argument
4120 return this->emitNullPtr(nullptr, E); in VisitCXXNullPtrLiteralExpr()
4124 bool Compiler<Emitter>::VisitGNUNullExpr(const GNUNullExpr *E) { in VisitGNUNullExpr() argument
4128 assert(E->getType()->isIntegerType()); in VisitGNUNullExpr()
4130 PrimType T = classifyPrim(E->getType()); in VisitGNUNullExpr()
4131 return this->emitZero(T, E); in VisitGNUNullExpr()
4135 bool Compiler<Emitter>::VisitCXXThisExpr(const CXXThisExpr *E) { in VisitCXXThisExpr() argument
4141 return this->emitGetThisFieldPtr(this->LambdaThisCapture.Offset, E); in VisitCXXThisExpr()
4142 return this->emitGetPtrThisField(this->LambdaThisCapture.Offset, E); in VisitCXXThisExpr()
4149 if (!InitStackActive || !E->isImplicit()) in VisitCXXThisExpr()
4150 return this->emitThis(E); in VisitCXXThisExpr()
4160 if (!InitStack[I].template emit<Emitter>(this, E)) in VisitCXXThisExpr()
4165 return this->emitThis(E); in VisitCXXThisExpr()
4210 if (const auto *E = dyn_cast<Expr>(S)) in visitStmt() local
4211 return this->discard(E); in visitStmt()
4818 bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) { in VisitUnaryOperator() argument
4819 const Expr *SubExpr = E->getSubExpr(); in VisitUnaryOperator()
4821 return this->VisitComplexUnaryOperator(E); in VisitUnaryOperator()
4824 switch (E->getOpcode()) { in VisitUnaryOperator()
4827 return this->emitInvalid(E); in VisitUnaryOperator()
4829 return this->emitError(E); in VisitUnaryOperator()
4835 if (!this->emitIncPtr(E)) in VisitUnaryOperator()
4838 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
4842 return DiscardResult ? this->emitIncfPop(getRoundingMode(E), E) in VisitUnaryOperator()
4843 : this->emitIncf(getRoundingMode(E), E); in VisitUnaryOperator()
4846 return DiscardResult ? this->emitIncPop(*T, E) : this->emitInc(*T, E); in VisitUnaryOperator()
4850 return this->emitInvalid(E); in VisitUnaryOperator()
4852 return this->emitError(E); in VisitUnaryOperator()
4858 if (!this->emitDecPtr(E)) in VisitUnaryOperator()
4861 return DiscardResult ? this->emitPopPtr(E) : true; in VisitUnaryOperator()
4865 return DiscardResult ? this->emitDecfPop(getRoundingMode(E), E) in VisitUnaryOperator()
4866 : this->emitDecf(getRoundingMode(E), E); in VisitUnaryOperator()
4869 return DiscardResult ? this->emitDecPop(*T, E) : this->emitDec(*T, E); in VisitUnaryOperator()
4873 return this->emitInvalid(E); in VisitUnaryOperator()
4875 return this->emitError(E); in VisitUnaryOperator()
4881 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
4883 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
4885 if (!this->emitAddOffsetUint8(E)) in VisitUnaryOperator()
4887 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
4893 return this->emitIncfPop(getRoundingMode(E), E); in VisitUnaryOperator()
4894 return this->emitIncPop(*T, E); in VisitUnaryOperator()
4898 const auto &TargetSemantics = Ctx.getFloatSemantics(E->getType()); in VisitUnaryOperator()
4899 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
4901 if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E)) in VisitUnaryOperator()
4903 if (!this->emitAddf(getRoundingMode(E), E)) in VisitUnaryOperator()
4905 if (!this->emitStoreFloat(E)) in VisitUnaryOperator()
4909 if (!this->emitLoad(*T, E)) in VisitUnaryOperator()
4911 if (!this->emitConst(1, E)) in VisitUnaryOperator()
4913 if (!this->emitAdd(*T, E)) in VisitUnaryOperator()
4915 if (!this->emitStore(*T, E)) in VisitUnaryOperator()
4918 return E->isGLValue() || this->emitLoadPop(*T, E); in VisitUnaryOperator()
4922 return this->emitInvalid(E); in VisitUnaryOperator()
4924 return this->emitError(E); in VisitUnaryOperator()
4930 if (!this->emitLoadPtr(E)) in VisitUnaryOperator()
4932 if (!this->emitConstUint8(1, E)) in VisitUnaryOperator()
4934 if (!this->emitSubOffsetUint8(E)) in VisitUnaryOperator()
4936 return DiscardResult ? this->emitStorePopPtr(E) : this->emitStorePtr(E); in VisitUnaryOperator()
4942 return this->emitDecfPop(getRoundingMode(E), E); in VisitUnaryOperator()
4943 return this->emitDecPop(*T, E); in VisitUnaryOperator()
4947 const auto &TargetSemantics = Ctx.getFloatSemantics(E->getType()); in VisitUnaryOperator()
4948 if (!this->emitLoadFloat(E)) in VisitUnaryOperator()
4950 if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E)) in VisitUnaryOperator()
4952 if (!this->emitSubf(getRoundingMode(E), E)) in VisitUnaryOperator()
4954 if (!this->emitStoreFloat(E)) in VisitUnaryOperator()
4958 if (!this->emitLoad(*T, E)) in VisitUnaryOperator()
4960 if (!this->emitConst(1, E)) in VisitUnaryOperator()
4962 if (!this->emitSub(*T, E)) in VisitUnaryOperator()
4964 if (!this->emitStore(*T, E)) in VisitUnaryOperator()
4967 return E->isGLValue() || this->emitLoadPop(*T, E); in VisitUnaryOperator()
4971 return this->emitError(E); in VisitUnaryOperator()
4979 if (!this->emitInvBool(E)) in VisitUnaryOperator()
4982 if (PrimType ET = classifyPrim(E->getType()); ET != PT_Bool) in VisitUnaryOperator()
4983 return this->emitCast(PT_Bool, ET, E); in VisitUnaryOperator()
4987 return this->emitError(E); in VisitUnaryOperator()
4991 return DiscardResult ? this->emitPop(*T, E) : this->emitNeg(*T, E); in VisitUnaryOperator()
4994 return this->emitError(E); in VisitUnaryOperator()
4998 return DiscardResult ? this->emitPop(*T, E) : true; in VisitUnaryOperator()
5000 if (E->getType()->isMemberPointerType()) { in VisitUnaryOperator()
5003 return this->emitGetMemberPtr(cast<DeclRefExpr>(SubExpr)->getDecl(), E); in VisitUnaryOperator()
5013 return this->emitError(E); in VisitUnaryOperator()
5017 return DiscardResult ? this->emitPop(*T, E) : this->emitComp(*T, E); in VisitUnaryOperator()
5037 bool Compiler<Emitter>::VisitComplexUnaryOperator(const UnaryOperator *E) { in VisitComplexUnaryOperator() argument
5038 const Expr *SubExpr = E->getSubExpr(); in VisitComplexUnaryOperator()
5044 std::optional<PrimType> ResT = classify(E); in VisitComplexUnaryOperator()
5050 return this->emitGetPtrLocal(*LocalIndex, E); in VisitComplexUnaryOperator()
5062 return this->emitSetLocal(PT_Ptr, SubExprOffset, E); in VisitComplexUnaryOperator()
5067 if (!this->emitGetLocal(PT_Ptr, Offset, E)) in VisitComplexUnaryOperator()
5069 return this->emitArrayElemPop(ElemT, Index, E); in VisitComplexUnaryOperator()
5072 switch (E->getOpcode()) { in VisitComplexUnaryOperator()
5081 if (!this->emitNeg(ElemT, E)) in VisitComplexUnaryOperator()
5083 if (!this->emitInitElem(ElemT, I, E)) in VisitComplexUnaryOperator()
5098 if (!this->emitInvBool(E)) in VisitComplexUnaryOperator()
5100 if (PrimType ET = classifyPrim(E->getType()); ET != PT_Bool) in VisitComplexUnaryOperator()
5101 return this->emitCast(PT_Bool, ET, E); in VisitComplexUnaryOperator()
5112 if (!this->emitConstUint8(1, E)) in VisitComplexUnaryOperator()
5114 return this->emitArrayElemPtrPopUint8(E); in VisitComplexUnaryOperator()
5119 return this->emitArrayElemPop(classifyPrim(E->getType()), 1, E); in VisitComplexUnaryOperator()
5125 if (!this->emitArrayElem(ElemT, 1, E)) in VisitComplexUnaryOperator()
5127 if (!this->emitNeg(ElemT, E)) in VisitComplexUnaryOperator()
5129 if (!this->emitInitElem(ElemT, 1, E)) in VisitComplexUnaryOperator()
5131 return DiscardResult ? this->emitPopPtr(E) : true; in VisitComplexUnaryOperator()
5137 return this->emitInvalid(E); in VisitComplexUnaryOperator()
5144 bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) { in visitDeclRef() argument
5149 return this->emitConst(ECD->getInitVal(), E); in visitDeclRef()
5154 return F && this->emitGetFnPtr(F, E); in visitDeclRef()
5157 if (!this->emitGetPtrGlobal(*Index, E)) in visitDeclRef()
5159 if (std::optional<PrimType> T = classify(E->getType())) { in visitDeclRef()
5160 if (!this->visitAPValue(TPOD->getValue(), *T, E)) in visitDeclRef()
5162 return this->emitInitGlobal(*T, *Index, E); in visitDeclRef()
5164 return this->visitAPValueInitializer(TPOD->getValue(), E); in visitDeclRef()
5179 return this->emitGetLocal(PT_Ptr, Offset, E); in visitDeclRef()
5180 return this->emitGetPtrLocal(Offset, E); in visitDeclRef()
5184 return this->emitGetGlobal(classifyPrim(E), *GlobalIndex, E); in visitDeclRef()
5185 return this->emitGetGlobalUnchecked(classifyPrim(E), *GlobalIndex, E); in visitDeclRef()
5188 return this->emitGetPtrGlobal(*GlobalIndex, E); in visitDeclRef()
5192 return this->emitGetParam(classifyPrim(E), It->second.Offset, E); in visitDeclRef()
5194 return this->emitGetPtrParam(It->second.Offset, E); in visitDeclRef()
5207 return this->visitDeclRef(D, E); in visitDeclRef()
5216 return this->emitGetThisFieldPtr(Offset, E); in visitDeclRef()
5217 return this->emitGetPtrThisField(Offset, E); in visitDeclRef()
5218 } else if (const auto *DRE = dyn_cast<DeclRefExpr>(E); in visitDeclRef()
5252 if (!this->emitGetPtrGlobal(*I, E)) in visitDeclRef()
5254 if (E->getType()->isVoidType()) in visitDeclRef()
5257 if (PrimType PT = classifyPrim(E); PT != PT_Ptr) { in visitDeclRef()
5259 return this->emitDecayPtr(PT_Ptr, PT, E); in visitDeclRef()
5265 if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) in visitDeclRef()
5266 return this->emitInvalidDeclRef(DRE, E); in visitDeclRef()
5271 bool Compiler<Emitter>::VisitDeclRefExpr(const DeclRefExpr *E) { in VisitDeclRefExpr() argument
5272 const auto *D = E->getDecl(); in VisitDeclRefExpr()
5273 return this->visitDeclRef(D, E); in VisitDeclRefExpr()
5298 QualType ToQT, const Expr *E) { in emitPrimCast() argument
5304 return this->emitCastFP(ToSem, getRoundingMode(E), E); in emitPrimCast()
5308 return this->emitCastFloatingIntegralAP(Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5310 return this->emitCastFloatingIntegralAPS(Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5314 return this->emitCastFloatingIntegral(ToT, E); in emitPrimCast()
5319 return this->emitCastAP(FromT, Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5321 return this->emitCastAPS(FromT, Ctx.getBitWidth(ToQT), E); in emitPrimCast()
5325 return FromT != ToT ? this->emitCast(FromT, ToT, E) : true; in emitPrimCast()
5330 return this->emitCastIntegralFloating(FromT, ToSem, getRoundingMode(E), in emitPrimCast()
5331 E); in emitPrimCast()
5360 bool Compiler<Emitter>::emitComplexBoolCast(const Expr *E) { in emitComplexBoolCast() argument
5362 PrimType ElemT = classifyComplexElementType(E->getType()); in emitComplexBoolCast()
5365 if (!this->emitArrayElem(ElemT, 0, E)) in emitComplexBoolCast()
5368 if (!this->emitCastFloatingIntegral(PT_Bool, E)) in emitComplexBoolCast()
5371 if (!this->emitCast(ElemT, PT_Bool, E)) in emitComplexBoolCast()
5380 if (!this->emitArrayElemPop(ElemT, 1, E)) in emitComplexBoolCast()
5383 if (!this->emitCastFloatingIntegral(PT_Bool, E)) in emitComplexBoolCast()
5386 if (!this->emitCast(ElemT, PT_Bool, E)) in emitComplexBoolCast()
5394 if (!this->emitPopPtr(E)) in emitComplexBoolCast()
5396 if (!this->emitConstBool(true, E)) in emitComplexBoolCast()
5407 const BinaryOperator *E) { in emitComplexComparison() argument
5408 assert(E->isComparisonOp()); in emitComplexComparison()
5422 if (!this->emitSetLocal(PT_Ptr, LHSOffset, E)) in emitComplexComparison()
5430 if (!this->emitSetLocal(LHST, LHSOffset, E)) in emitComplexComparison()
5443 if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) in emitComplexComparison()
5451 if (!this->emitSetLocal(RHST, RHSOffset, E)) in emitComplexComparison()
5458 if (!this->emitGetLocal(PT_Ptr, LocalOffset, E)) in emitComplexComparison()
5460 return this->emitArrayElemPop(ElemT, Index, E); in emitComplexComparison()
5462 return this->emitGetLocal(ElemT, LocalOffset, E); in emitComplexComparison()
5472 if (!this->emitEQ(ElemT, E)) in emitComplexComparison()
5475 if (!this->emitCastBoolUint8(E)) in emitComplexComparison()
5480 if (!this->emitAddUint8(E)) in emitComplexComparison()
5482 if (!this->emitConstUint8(2, E)) in emitComplexComparison()
5485 if (E->getOpcode() == BO_EQ) { in emitComplexComparison()
5486 if (!this->emitEQUint8(E)) in emitComplexComparison()
5488 } else if (E->getOpcode() == BO_NE) { in emitComplexComparison()
5489 if (!this->emitNEUint8(E)) in emitComplexComparison()
5495 if (PrimType ResT = classifyPrim(E->getType()); ResT != PT_Bool) in emitComplexComparison()
5496 return this->emitCast(PT_Bool, ResT, E); in emitComplexComparison()