ExprConstant.cpp revision 50c39ea4858265f3f5f42a0c624557ce2281936b
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===// 2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// The LLVM Compiler Infrastructure 4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source 6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details. 7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Expr constant evaluator. 11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h" 15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h" 164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman#include "clang/AST/RecordLayout.h" 170fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h" 18500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h" 1906a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h" 20c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson#include "llvm/Support/Compiler.h" 21c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang; 22f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt; 23d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat; 24c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 2587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture 2687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded. It retains information 2787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded 2887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression. 2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C 3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression. If not, this struct 3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not. 3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding 3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C 3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules. For example, the RHS of (0 && foo()) is not evaluated. We can 3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows 3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations. 3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstruct EvalInfo { 4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner ASTContext &Ctx; 4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 4254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson /// EvalResult - Contains information about the evaluation. 4354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Expr::EvalResult &EvalResult; 44f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 4554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx), 4633ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman EvalResult(evalresult) {} 4787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner}; 4887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 4987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info); 5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info); 5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 5369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue &Result, EvalInfo &Info); 54d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 55a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info); 56f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 57f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) { 624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 74a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->hasPointerRepresentation()) { 754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Is this accurate for all kinds of bases? If not, what would 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // the check look like? 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset(); 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 82a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->isAnyComplexType()) { 83a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman APValue ComplexResult; 84a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (!EvaluateComplex(E, ComplexResult, Info)) 85a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return false; 86a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (ComplexResult.isComplexFloat()) { 87a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = !ComplexResult.getComplexFloatReal().isZero() || 88a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman !ComplexResult.getComplexFloatImag().isZero(); 89a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else { 90a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = ComplexResult.getComplexIntReal().getBoolValue() || 91a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman ComplexResult.getComplexIntImag().getBoolValue(); 92a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } 93a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 99a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 100a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 101a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 102a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 103a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool DestSigned = DestType->isSignedIntegerType(); 104a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 105a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 106a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar uint64_t Space[4]; 107a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 108a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar (void)Value.convertToInteger(Space, DestWidth, DestSigned, 109a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar llvm::APFloat::rmTowardZero, &ignored); 110a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned); 111a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convert(Ctx.getFloatTypeSemantics(DestType), 118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.extOrTrunc(DestWidth); 129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 134a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 135a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 136a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 141a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator 1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 1494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 15835873c49adad211ff466e34342a52665742794f5Anders Carlsson APValue VisitDeclRefExpr(DeclRefExpr *E); 1593aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff APValue VisitBlockExpr(BlockExpr *E); 1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); } 1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 1624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); } 164eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E, 0); } 1653068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E); 166e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue VisitUnaryDeref(UnaryOperator *E); 167ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 168ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 169ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 170ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 171ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__, __imag__ 1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 1734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 1744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) { 1764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result.isLValue(); 1784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 18035873c49adad211ff466e34342a52665742794f5Anders CarlssonAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) 18150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman{ 18235873c49adad211ff466e34342a52665742794f5Anders Carlsson if (!E->hasGlobalStorage()) 18335873c49adad211ff466e34342a52665742794f5Anders Carlsson return APValue(); 18450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 18550c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (isa<FunctionDecl>(E->getDecl())) { 18650c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(E, 0); 18750c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) { 18850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (!VD->getType()->isReferenceType()) 18950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(E, 0); 19050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (VD->getInit()) 19150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return Visit(VD->getInit()); 19250c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman } 19350c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 19450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(); 19535873c49adad211ff466e34342a52665742794f5Anders Carlsson} 19635873c49adad211ff466e34342a52665742794f5Anders Carlsson 1973aaa482ea5b8d20b705f6ac8573b539be88d273aSteve NaroffAPValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E) 1983aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff{ 1993aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff if (E->hasBlockDeclRefExprs()) 2003aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff return APValue(); 2013aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff 2023aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff return APValue(E, 0); 2033aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff} 2043aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff 2054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 2064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isFileScope()) 2074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(E, 0); 2084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType(); 2184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 2234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman RecordDecl *RD = Ty->getAsRecordType()->getDecl(); 2264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 22786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 22886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 22986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (!FD) // FIXME: deal with other kinds of member expressions 23086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return APValue(); 2314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 23344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned i = 0; 2346ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor for (RecordDecl::field_iterator Field = RD->field_begin(Info.Ctx), 2356ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor FieldEnd = RD->field_end(Info.Ctx); 23644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Field != FieldEnd; (void)++Field, ++i) { 23744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (*Field == FD) 2384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 2394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 2424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.getLValueOffset() + RL.getFieldOffset(i) / 8); 2434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 2454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2473068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) 2483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{ 2493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 2503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 2523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 2533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 2553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 2563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 2573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2583068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8; 2593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2603068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t Offset = Index.getSExtValue() * ElementSize; 2613068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setLValue(Result.getLValueBase(), 2623068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.getLValueOffset() + Offset); 2633068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 2643068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 2654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 266e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli FriedmanAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) 267e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman{ 268e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue Result; 269e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 270e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return APValue(); 271e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return Result; 272e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 273e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 2744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 275f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 276f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 277f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 278c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 2792bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator 2802bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 28187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 2822bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 2832bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 28487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 285f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2862bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 2872bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 2882bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 2892bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2902bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 2912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 292650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 293650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitCastExpr(const CastExpr* E); 2942217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 2952217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman { return Visit(E->getSubExpr()); } 2962217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryAddrOf(const UnaryOperator *E); 2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman { return APValue(E, 0); } 299f01158941ba4560c63150032073bb231ce38999eEli Friedman APValue VisitAddrLabelExpr(AddrLabelExpr *E) 300f01158941ba4560c63150032073bb231ce38999eEli Friedman { return APValue(E, 0); } 3013941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman APValue VisitCallExpr(CallExpr *E); 302b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump APValue VisitBlockExpr(BlockExpr *E) { 303b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump if (!E->hasBlockDeclRefExprs()) 304b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(E, 0); 305b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(); 306b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 30791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) 30891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return APValue((Expr*)0, 0); } 3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 310ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(ChooseExpr *E) 3116e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return Visit(E->getChosenSubExpr(Info.Ctx)); } 3126e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) 3136e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return APValue((Expr*)0, 0); } 314ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 3152bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 316f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 3172bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 31887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 3198958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar if (!E->getType()->hasPointerRepresentation()) 320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 32187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 323f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 324650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 325f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 326650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 327650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 328650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 329650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 330650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 331650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 332650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 333f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 334650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 335650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 33687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 338f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 339650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 34087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 341650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 342650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 3434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType(); 3444d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson uint64_t SizeOfPointee; 3454d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson 3464d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson // Explicitly handle GNU void* and function pointer arithmetic extensions. 3474d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson if (PointeeType->isVoidType() || PointeeType->isFunctionType()) 3484d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson SizeOfPointee = 1; 3494d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson else 3504d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8; 3514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 352650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson uint64_t Offset = ResultLValue.getLValueOffset(); 3534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 354650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 3554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 356650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 3574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 3584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 359650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(ResultLValue.getLValueBase(), Offset); 360650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 3614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3622217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 3632217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue result; 3642217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 3652217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman return result; 3664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 368d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson 369650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 370b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 371650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr* SubExpr = E->getSubExpr(); 372650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 373650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Check for pointer->pointer cast 374650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (SubExpr->getType()->isPointerType()) { 375650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue Result; 37687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluatePointer(SubExpr, Result, Info)) 377650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 378f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return APValue(); 379650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 380650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 381d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman if (SubExpr->getType()->isIntegralType()) { 38269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar APValue Result; 38369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(SubExpr, Result, Info)) 38469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return APValue(); 38569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 38669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (Result.isInt()) { 38769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 38869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return APValue(0, Result.getInt().getZExtValue()); 389650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 39069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 39169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar // Cast is of an lvalue, no need to change value. 39269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return Result; 393650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 3944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isFunctionType() || 3963aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff SubExpr->getType()->isBlockPointerType() || 3974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SubExpr->getType()->isArrayType()) { 3984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 3994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 4004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 4014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 4034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 404650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 405650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 406650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 4073941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) { 4083c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (E->isBuiltinCall(Info.Ctx) == 4093c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor Builtin::BI__builtin___CFStringMakeConstantString) 4103941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(E, 0); 4113941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(); 4123941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman} 4133941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman 4144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 4154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 4164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 4174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 4204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 4224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 4234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 4244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 426f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 427f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 42859b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 42959b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 43059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 43159b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 43259b5da6d853b4368b984700315adf7b37de05764Nate Begeman class VISIBILITY_HIDDEN VectorExprEvaluator 43359b5da6d853b4368b984700315adf7b37de05764Nate Begeman : public StmtVisitor<VectorExprEvaluator, APValue> { 43459b5da6d853b4368b984700315adf7b37de05764Nate Begeman EvalInfo &Info; 43591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue GetZeroVector(QualType VecType); 43659b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 43759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 43859b5da6d853b4368b984700315adf7b37de05764Nate Begeman VectorExprEvaluator(EvalInfo &info) : Info(info) {} 43959b5da6d853b4368b984700315adf7b37de05764Nate Begeman 44059b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitStmt(Stmt *S) { 44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 44359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 44491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitParenExpr(ParenExpr *E) 44591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 44691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 44791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 44891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryPlus(const UnaryOperator *E) 44991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 45091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryReal(const UnaryOperator *E) 45191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 45291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) 45391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return GetZeroVector(E->getType()); } 45459b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCastExpr(const CastExpr* E); 45559b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 45659b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitInitListExpr(const InitListExpr *E); 45791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitConditionalOperator(const ConditionalOperator *E); 458ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 459ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 46091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryImag(const UnaryOperator *E); 46191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 4622217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 46391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 46491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 46591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 46659b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 46759b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 46859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 46959b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 47059b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!E->getType()->isVectorType()) 47159b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 47259b5da6d853b4368b984700315adf7b37de05764Nate Begeman Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 47359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return !Result.isUninit(); 47459b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 47559b5da6d853b4368b984700315adf7b37de05764Nate Begeman 47659b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 47759b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr* SE = E->getSubExpr(); 47859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 47959b5da6d853b4368b984700315adf7b37de05764Nate Begeman // Check for vector->vector bitcast. 48059b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (SE->getType()->isVectorType()) 48159b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(SE)); 48259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 48359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 48459b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 48559b5da6d853b4368b984700315adf7b37de05764Nate Begeman 48659b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue 48759b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 48859b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(E->getInitializer())); 48959b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 49059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 49159b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue 49259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 49359b5da6d853b4368b984700315adf7b37de05764Nate Begeman const VectorType *VT = E->getType()->getAsVectorType(); 49459b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 49591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 49659b5da6d853b4368b984700315adf7b37de05764Nate Begeman 49759b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 49859b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::SmallVector<APValue, 4> Elements; 49959b5da6d853b4368b984700315adf7b37de05764Nate Begeman 50091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman for (unsigned i = 0; i < NumElements; i++) { 50159b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 50259b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 50391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 50491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateInteger(E->getInit(i), sInt, Info)) 50591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 50691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 50791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman sInt = Info.Ctx.MakeIntValue(0, EltTy); 50891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 50959b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(sInt)); 51059b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 51159b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 51291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 51391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateFloat(E->getInit(i), f, Info)) 51491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 51591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 51691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 51791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 51859b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(f)); 51959b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 52059b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 52159b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(&Elements[0], Elements.size()); 52259b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 52359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 52491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue 52591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) { 52691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman const VectorType *VT = T->getAsVectorType(); 52791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 52891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 52991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 53091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 53191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 53291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 53391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 53491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 53591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 53691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(&Elements[0], Elements.size()); 53791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 53891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 53991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 54091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman bool BoolResult; 54191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 54291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 54391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 54491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 54591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 54691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue Result; 54791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EvaluateVector(EvalExpr, Result, Info)) 54891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return Result; 54991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 55091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 55191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 55291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 55391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 55491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Info.EvalResult.HasSideEffects = true; 55591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return GetZeroVector(E->getType()); 55691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 55791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 55859b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 559f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 560f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 561f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 562f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 563f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator 564b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 56587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 56630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue &Result; 567f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 56830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar IntExprEvaluator(EvalInfo &info, APValue &result) 56987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 570f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 5713f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar bool Success(const llvm::APSInt &SI, const Expr *E) { 5724fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 57330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.isSigned() == E->getType()->isSignedIntegerType() && 5743f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 57530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 5763f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 57730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(SI); 5783f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 5793f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 5803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 581131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 5824fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 58330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 5843f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 58530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(APSInt(I)); 58630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType()); 587131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 588131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 589131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 590131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 5914fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 59230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); 593131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 594131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 595131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 59682206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 59732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 59854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson if (Info.EvalResult.Diag == 0) { 59954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 60054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 60182206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 60232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 60354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 6047a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 6057a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner 606f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 607f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Visitor Methods 608f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 60932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner 61032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitStmt(Stmt *) { 61132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert(0 && "This should be called on integers, stmts are not integers"); 61232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return false; 61332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 6147a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner 61532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitExpr(Expr *E) { 6160e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 617f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 618f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 619b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 620f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 6214c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 622131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 6234c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 6244c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 625131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 6264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 6274c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { 628ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // Per gcc docs "this built-in function ignores top level 629ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // qualifiers". We need to use the canonical version to properly 630ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // be able to strip CRV qualifiers from the type. 631ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1()); 632ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2()); 633131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(), 634131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar T1.getUnqualifiedType()), 635131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 6364c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 6374c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitDeclRefExpr(const DeclRefExpr *E); 6384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCallExpr(const CallExpr *E); 639b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 640b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 641ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes bool VisitConditionalOperator(const ConditionalOperator *E); 642f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 643a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool VisitCastExpr(CastExpr* E); 6440518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E); 6450518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 6463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 647131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 6483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 6493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6503f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 651131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 6523f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson } 6533f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson 6543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { 655131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 6563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 6573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 658664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 659664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 660664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 661664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 66264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 663131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->EvaluateTrait(), E); 66464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 66564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 666ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) { 667ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman return Visit(E->getChosenSubExpr(Info.Ctx)); 668ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman } 669ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 670722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 671664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 672664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 673fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 674af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfExpr(const Expr *E); 675af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfType(QualType T); 676664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 677f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 678f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 679f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 68069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) { 6813f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!E->getType()->isIntegralType()) 6823f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return false; 68330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 68469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 68569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 68669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 68769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 68830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue Val; 68969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt()) 69030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 69130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 69230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 693f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 694f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 6954c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 6964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 6974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) { 698e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // FIXME: This is an ugly hack around the fact that enums don't set their 6993f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // signedness consistently; see PR3173. 7003f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar APSInt SI = D->getInitVal(); 7013f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar SI.setIsUnsigned(!E->getType()->isSignedIntegerType()); 7023f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // FIXME: This is an ugly hack around the fact that enums don't 7033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // set their width (!?!) consistently; see PR3173. 7043f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar SI.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); 7053f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(SI, E); 7064c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 707b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 708b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl // In C++, const, non-volatile integers initialized with ICEs are ICEs. 709e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman // In C, they can also be folded, although they are not ICEs. 710e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman if (E->getType().getCVRQualifiers() == QualType::Const) { 711b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) { 71278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (APValue *V = D->getEvaluatedValue()) 71378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return Success(V->getInt(), E); 71478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (const Expr *Init = D->getInit()) { 71578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Visit(const_cast<Expr*>(Init))) { 71678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // Cache the evaluated value in the variable declaration. 71778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor D->setEvaluatedValue(Info.Ctx, Result); 71878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return true; 71978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 72078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 72178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return false; 72278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 723b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 724b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 725b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 7264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 7270e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 7284c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 7294c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 730a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 731a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 732a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 733a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 7347c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 735a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 736a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 737a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 738a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 739a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 740a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 741a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 742a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 743a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 744a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 745a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 746a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 747a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // If no argument was supplied, default to "no_type_class". This isn't 748a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 749a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 750a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 751a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 752a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 753a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 754a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 755a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 756a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 757a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 758a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 759a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 760a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 761a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 762a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 763a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 764a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 765a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 766a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 767a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 768a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 769a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 770a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 771a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 772a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 773a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 774a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 775a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 776a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 777a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 778a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 779a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 780a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 781a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 782a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 783a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 784a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 785a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 7864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 7873c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 788019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 7890e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 790019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 791131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 792019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 7934bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 794019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 795019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 796131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E); 797019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 7984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 799f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 800b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 801a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 802027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson if (!Visit(E->getRHS())) 803027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return false; 8044fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 80533ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // If we can't evaluate the LHS, it might have side effects; 80633ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // conservatively mark it. 80733ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (!E->getLHS()->isEvaluatable(Info.Ctx)) 80833ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman Info.EvalResult.HasSideEffects = true; 809c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 810027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return true; 811a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 812a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 813a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 814a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 815a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 816fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 81751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 818fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) { 81951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 82051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 82133ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (lhsResult == (E->getOpcode() == BinaryOperator::LOr)) 8223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 823a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 824fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 8254bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if (E->getOpcode() == BinaryOperator::LOr) 826131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 8274bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 828131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 8294bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 8304bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 831fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 8324bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 8334bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 834fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) || 835fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 836131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 837fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 838fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Info.EvalResult.HasSideEffects = true; 839131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 840131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 8414bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 8424bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 843a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 844a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 845a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 846c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 84754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 848286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 849286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 8504087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 8514087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 8524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 8534087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APValue LHS, RHS; 8544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 8554087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 8564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 8574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 8584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 8594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 8604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 8614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 8624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APFloat::cmpResult CR_r = 8634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 8644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APFloat::cmpResult CR_i = 8654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 8664087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 8674087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 868131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 869131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 870131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 871131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 872131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 873131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(((CR_r == APFloat::cmpGreaterThan || 874131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_r == APFloat::cmpLessThan) && 875131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar (CR_i == APFloat::cmpGreaterThan || 876131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpLessThan)), E); 877131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 8784087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 8794087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 880131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 881131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 882131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 883131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 884131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 885131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 886131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 887131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 8884087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 8894087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 890286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 891286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 892286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 893286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 894286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 895286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 896286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 897286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 898286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 899286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 900286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 901286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 902529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 903286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 904286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 905286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 906286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 907131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 908286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 909131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 910286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 911131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 912286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 913131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 914131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 915286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 916131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 917286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 918131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan 919131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar || CR == APFloat::cmpLessThan, E); 920286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 921286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 922286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 923ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 924ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) { 9253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 9263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 9273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 928a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 9293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 9303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 9313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 932a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 933a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman // Reject any bases; this is conservative, but good enough for 934a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman // common uses 9353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (LHSValue.getLValueBase() || RHSValue.getLValueBase()) 9363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 937a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 938ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub) { 939ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman const QualType Type = E->getLHS()->getType(); 940ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman const QualType ElementType = Type->getAsPointerType()->getPointeeType(); 9413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 942ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset(); 943ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman D /= Info.Ctx.getTypeSize(ElementType) / 8; 944a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 945ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(D, E); 946ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 947ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman bool Result; 948ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::EQ) { 949ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset(); 950267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman } else { 951ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset(); 952ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 953ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(Result, E); 9543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 9553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 956286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 957286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 958a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 959a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 960a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 961a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 962a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 963a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 96430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Visit(E->getLHS())) 965a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 966d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 96742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APValue RHSVal; 96842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info)) 96930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 97042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 97142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 97242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) { 97342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman uint64_t offset = Result.getLValueOffset(); 97442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add) 97542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset += RHSVal.getInt().getZExtValue(); 97642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 97742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset -= RHSVal.getInt().getZExtValue(); 97842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman Result = APValue(Result.getLValueBase(), offset); 97942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 98042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 98142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 98242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 98342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add && 98442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman RHSVal.isLValue() && Result.isInt()) { 98542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman uint64_t offset = RHSVal.getLValueOffset(); 98642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset += Result.getInt().getZExtValue(); 98742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman Result = APValue(RHSVal.getLValueBase(), offset); 98842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 98942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 99042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 99142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 99242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!Result.isInt() || !RHSVal.isInt()) 993b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 994a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 99542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APSInt& RHS = RHSVal.getInt(); 99642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 997a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 99832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 9990e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 100030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E); 100130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Add: return Success(Result.getInt() + RHS, E); 100230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E); 100330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::And: return Success(Result.getInt() & RHS, E); 100430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E); 100530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Or: return Success(Result.getInt() | RHS, E); 1006a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 100754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 10080e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 100930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() / RHS, E); 1010a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 101154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 10120e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 101330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() % RHS, E); 10143f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shl: { 101554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 101630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar unsigned SA = 101730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 101830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() << SA, E); 10193f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 10203f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shr: { 102130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar unsigned SA = 102230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 102330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() >> SA, E); 10243f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 1025b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner 102630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LT: return Success(Result.getInt() < RHS, E); 102730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GT: return Success(Result.getInt() > RHS, E); 102830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E); 102930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E); 103030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E); 103130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::NE: return Success(Result.getInt() != RHS, E); 1032b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 1033a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 1034a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 1035ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 1036a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 1037a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 1038ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 1039ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1040a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 1041ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 1042ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1043af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) { 1044e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the alignment. 1045e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 104618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 104718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor // FIXME: Why do we ask for the preferred alignment? 104818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize; 1049e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1050e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1051af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 1052af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 1053af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1054af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 1055af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // to 1 in those cases. 1056af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 1057b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar return Info.Ctx.getDeclAlignInBytes(DRE->getDecl()); 1058a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1059af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 1060b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl()); 1061af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1062e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 1063e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1064e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1065e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 10660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 10670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 10680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 10690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType DstTy = E->getType(); 1070fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1071e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Handle alignof separately. 1072e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!E->isSizeOf()) { 1073e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 1074131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(GetAlignOfType(E->getArgumentType()), E); 1075e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 1076131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(GetAlignOfExpr(E->getArgumentExpr()), E); 1077e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 1078a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 10790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 10800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 1081131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 1082131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // extension. 1083131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar if (SrcTy->isVoidType() || SrcTy->isFunctionType()) 1084131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(1, E); 1085a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1086fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 1087e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!SrcTy->isConstantSizeType()) 1088fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 1089f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 1090e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the size. 109124cbfb96f09318f59dc73eaaf4909a79788ec5acDaniel Dunbar unsigned BitWidth = Info.Ctx.getTypeSize(SrcTy); 1092ff89666e8d143b52f2bb5d2c3a108125d523abb7Daniel Dunbar return Success(BitWidth / Info.Ctx.Target.getCharWidth(), E); 1093fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 1094fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1095b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 10964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 10974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 109835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (E->isOffsetOfOp()) { 109935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // The AST for offsetof is defined in such a way that we can just 110035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // directly Evaluate it as an l-value. 110135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman APValue LV; 110235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (!EvaluateLValue(E->getSubExpr(), LV, Info)) 110335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 110435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (LV.getLValueBase()) 110535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 110635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return Success(LV.getLValueOffset(), E); 110735183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman } 1108a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1109a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 1110a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 1111a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 1112a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 1113a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1114131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(!bres, E); 1115a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1116a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 11174fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar // Only handle integral operations... 11184fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar if (!E->getSubExpr()->getType()->isIntegralType()) 11194fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar return false; 11204fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar 112187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 112287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 112375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 1124a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 112575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 11264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 112775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 112875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 11290e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 113075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 11314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 11324c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 11333f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 113475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 11354c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // The result is always just the subexpr. 11363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 113775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 113830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 113930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(-Result.getInt(), E); 114075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 114130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 114230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(~Result.getInt(), E); 114306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 1144a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 1145a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 1146732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 1147732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 1148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) { 114982206e267ce6cc709797127616f64672d255b310Anders Carlsson Expr *SubExpr = E->getSubExpr(); 115082206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 1151b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 115282206e267ce6cc709797127616f64672d255b310Anders Carlsson 11534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 11544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 11554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 11564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1157131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 11584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 11594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1160a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 1161b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isIntegralType()) { 1162732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 1163b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1164a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1165be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 1166be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 1167be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 1168be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 116930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 1170dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 117130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 1172732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 1173732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1174732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 1175b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isPointerType()) { 1176a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 117787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 1178b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 11794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1180dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 1181dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 1182dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 1183dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return false; 1184dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 1185dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar Result = LV; 1186dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 1187dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 11884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1189dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset(), SrcType); 1190dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 11912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 11924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1193be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (SrcType->isArrayType() || SrcType->isFunctionType()) { 1194be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // This handles double-conversion cases, where there's both 1195be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // an l-value promotion and an implicit conversion to int. 1196be26570e3faa009bdcefedfaf04473e518940520Eli Friedman APValue LV; 1197be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!EvaluateLValue(SubExpr, LV, Info)) 1198be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1199be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1200be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy)) 1201be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1202be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1203be26570e3faa009bdcefedfaf04473e518940520Eli Friedman Result = LV; 1204be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return true; 1205be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 1206be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 12071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (SrcType->isAnyComplexType()) { 12081725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APValue C; 12091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 12101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 12111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (C.isComplexFloat()) 12121725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleFloatToIntCast(DestType, SrcType, 12131725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexFloatReal(), Info.Ctx), 12141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman E); 12151725f683432715e5afe34d476024bd6f16eac3fcEli Friedman else 12161725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleIntToIntCast(DestType, SrcType, 12171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexIntReal(), Info.Ctx), E); 12181725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 12192217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle vectors 12202217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1221b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (!SrcType->isRealFloatingType()) 12220e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1223732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1224d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 1225d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 12260e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1227732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1228b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); 1229a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 12302bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1231722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 1232722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 1233722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1234722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1235722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1236722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 1237722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1238722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1239722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 1240722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 1241722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1242664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 1243722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 1244722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1245722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1246722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1247722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 1248722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1249722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1250664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 1251664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman Info.EvalResult.HasSideEffects = true; 1252664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 1253664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 1254664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 1255f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1256d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 1257d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1258d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1259d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 1260d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator 1261d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 1262d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 1263d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 1264d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 1265d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 1266d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 1267d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1268d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 1269d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1270d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1271d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1272d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 1273019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 1274d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 12755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 1276d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 1277d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 12784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 12794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 12802217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1281ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) 1282ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1283ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitUnaryExtension(const UnaryOperator *E) 1284ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1285ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 1286ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__/__imag__, array subscript of vector, 1287ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // member of vector, ImplicitValueInitExpr, 12882217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 1289d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 1290d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 1291d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1292d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 1293d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 1294d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1295d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1296019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 12973c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 129834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 1299019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 1300019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 1301019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 1302019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 1303019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 13047cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 13057cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 13067cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 130734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 130834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 13097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 13109e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner 13119e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 13129e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 13139e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 13149e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // If this is __builtin_nan("") turn this into a simple nan, otherwise we 13159e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 13169e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (const StringLiteral *S = 13179e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 13189e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (!S->isWide() && S->getByteLength() == 0) { // empty string. 13197cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 13207cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 13219e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner Result = llvm::APFloat::getNaN(Sem); 13229e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 13239e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 13249e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 13259e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 13265db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 13275db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 13285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 13295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 13305db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 13315db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 13325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 13335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 13345db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 13355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 13365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 13375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysign: 13385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignf: 13395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 13405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 13415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 13425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 13435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 13445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 13455db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 13465db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 1347019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 1348019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 1349019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 13505db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 1351a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 1352a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 1353a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 13545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 13555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 13565db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 13575db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 13585db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 13595db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Plus: 13605db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 13615db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 13625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 13635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 13645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 13655db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 1366019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1367d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1368d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1369d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 13705db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1371d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1372d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1373d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1374d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1375d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1376d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1377d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1378d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1379d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1380d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1381d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1382d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1383d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1384d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1385d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1386d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1387d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1388d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1389d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1390d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1391d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1392d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1393d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1394d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1395d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1396d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1397d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 13984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 13994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 140059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 14014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 14024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 14033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!EvaluateInteger(SubExpr, IntResult, Info)) 14044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1405a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 1406a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 14074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 14084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 14094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 14104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 14114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1412a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 1413a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 14144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 14154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 14162217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle complex types 14174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 14184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 14194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 14204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 14214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 14224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 14234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 14244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 14254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1426d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1427a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 14289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 14299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14309ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 1431a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator 1432a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar : public StmtVisitor<ComplexExprEvaluator, APValue> { 14339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 14349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14359ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 1436a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar ComplexExprEvaluator(EvalInfo &info) : Info(info) {} 14379ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14389ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 14399ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 14409ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 14419ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 14439ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 14449ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 14459ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14469ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 14479ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14489ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 1449a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Expr* SubExpr = E->getSubExpr(); 1450a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1451a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (SubExpr->getType()->isRealFloatingType()) { 1452a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat Result(0.0); 1453a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1454a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateFloat(SubExpr, Result, Info)) 1455a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 14569ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 14573f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false), 1458a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result); 1459a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1460a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert(SubExpr->getType()->isIntegerType() && 1461a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Unexpected imaginary literal."); 1462a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1463a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Result; 1464a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1465a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1466a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1467a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 1468a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Zero = 0; 1469a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(Zero, Result); 1470a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 14719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 14729ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1473ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1474ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1475a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType EltType = E->getType()->getAsComplexType()->getElementType(); 1476a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SubType = SubExpr->getType(); 1477ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1478a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (SubType->isRealFloatingType()) { 1479ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 14801725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1481ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1482ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 14831725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 14841725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 14851725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx); 14861725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(Result, 14871725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(Result.getSemantics(), APFloat::fcZero, false)); 14881725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 14891725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt IResult; 14901725f683432715e5afe34d476024bd6f16eac3fcEli Friedman IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx); 14911725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned()); 14921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 14931725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(IResult, Zero); 14941725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1495a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (SubType->isIntegerType()) { 1496a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APSInt Result; 14971725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1498a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1499a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1500a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 15011725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 15021725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat FResult = 15031725f683432715e5afe34d476024bd6f16eac3fcEli Friedman HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx); 15041725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(FResult, 15051725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(FResult.getSemantics(), APFloat::fcZero, false)); 15061725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 15071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx); 15081725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 15091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 15101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(Result, Zero); 15111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1512a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (const ComplexType *CT = SubType->getAsComplexType()) { 1513a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APValue Src; 15141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1515a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (!EvaluateComplex(SubExpr, Src, Info)) 1516a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(); 1517a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1518a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SrcType = CT->getElementType(); 1519a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1520a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (Src.isComplexFloat()) { 1521a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 1522a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToFloatCast(EltType, SrcType, 1523a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1524a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1525a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleFloatToFloatCast(EltType, SrcType, 1526a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1527a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1528a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1529a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToIntCast(EltType, SrcType, 1530a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1531a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1532a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleFloatToIntCast(EltType, SrcType, 1533a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1534a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1535a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1536a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1537a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar assert(Src.isComplexInt() && "Invalid evaluate result."); 1538a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 1539a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToFloatCast(EltType, SrcType, 1540a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1541a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1542a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleIntToFloatCast(EltType, SrcType, 1543a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1544a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1545a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1546a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToIntCast(EltType, SrcType, 1547a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1548a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1549a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleIntToIntCast(EltType, SrcType, 1550a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1551a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1552a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1553a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1554ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1555ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1556ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1557ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1558ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1559ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1560ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1561ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 1562ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1563ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 1564ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1565ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr, 15662217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 15679ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 15689ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 15699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1570a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) 15719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{ 1572a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1573a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert((!Result.isComplexFloat() || 1574a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar (&Result.getComplexFloatReal().getSemantics() == 1575a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar &Result.getComplexFloatImag().getSemantics())) && 1576a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Invalid complex evaluation."); 1577a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return Result.isComplexFloat() || Result.isComplexInt(); 15789ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 15799ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1580a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel DunbarAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) 1581ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{ 1582ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 1583ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1584a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getLHS(), Result, Info)) 1585ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1586ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1587a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 1588ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1589a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 15903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 15913f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 1592ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1593ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1594ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1595a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1596a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1597a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1598a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1599a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1600a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1601a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 1602a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 1603a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 16043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1605ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1606a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1607a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1608a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1609a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1610a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1611a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1612a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 1613a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 1614a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 16153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 16163f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar case BinaryOperator::Mul: 16173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 16183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 16193f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 16203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 16213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 16223f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 16233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 16243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 16253f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 16263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 16273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 16283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 16293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 16303f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 16313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 16323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 16333f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 16343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 16353f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 16363f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 16373f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 16383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 16393f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexIntReal() = 16403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 16413f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 16423f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexIntImag() = 16433f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 16443f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 16453f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 16463f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1647ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1648ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1649ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1650ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1651ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 16529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 16536ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1654f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1655f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 16566ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1657019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1658019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1659019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 16605b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { 16615b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson EvalInfo Info(Ctx, Result); 166254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 166359b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (getType()->isVectorType()) { 166459b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateVector(this, Result.Val, Info)) 166559b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 166659b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else if (getType()->isIntegerType()) { 166730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this))) 16686dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 16698958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar } else if (getType()->hasPointerRepresentation()) { 16705b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluatePointer(this, Result.Val, Info)) 16716dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1672d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1673d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 16746dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateFloat(this, f, Info)) 16756dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 16766dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 16775b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(f); 1678a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else if (getType()->isAnyComplexType()) { 1679a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(this, Result.Val, Info)) 16806dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1681a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else 16829d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson return false; 16836dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 16845b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson return true; 16855b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson} 16865b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 16871b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const { 16881b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 16891b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 16901b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 16911b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson} 16921b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 16936ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 169445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 169545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 16964fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 16974fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson return Evaluate(Result, Ctx) && !Result.HasSideEffects; 169845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 169951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 170051fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 17011c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 17021c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson bool Result = Evaluate(EvalResult, Ctx); 1703f185319f25efd6094870f287030270fad26085baDaniel Dunbar Result = Result; 170451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 17051c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 170651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 17071c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 170851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 1709