ExprConstant.cpp revision b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1
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 45f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson /// ShortCircuit - will be greater than zero if the current subexpression has 46f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson /// will not be evaluated because it's short-circuited (according to C rules). 47f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson unsigned ShortCircuit; 4854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 4954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx), 50f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson EvalResult(evalresult), ShortCircuit(0) {} 5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner}; 5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info); 5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info); 5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 57d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 58a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info); 59f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 60f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) { 654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isPointerType()) { 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Is this accurate for all kinds of bases? If not, what would 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // the check look like? 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset(); 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 90a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 91a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 92a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 93a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 94a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool DestSigned = DestType->isSignedIntegerType(); 95a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 96a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 97a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar uint64_t Space[4]; 98a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 99a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar (void)Value.convertToInteger(Space, DestWidth, DestSigned, 100a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar llvm::APFloat::rmTowardZero, &ignored); 101a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned); 102a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 103a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 104a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 105a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 106a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 107a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 108a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convert(Ctx.getFloatTypeSemantics(DestType), 109a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 110a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 111a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.extOrTrunc(DestWidth); 120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 1354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 1374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator 1384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 1394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 1404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 1414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 1458a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#if 0 1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Remove this when we support more expressions. 1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman printf("Unhandled pointer statement\n"); 1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman S->dump(); 1498a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#endif 1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 15435873c49adad211ff466e34342a52665742794f5Anders Carlsson APValue VisitDeclRefExpr(DeclRefExpr *E); 1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); } 1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); } 1593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E); 1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 1624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) { 1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result.isLValue(); 1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16835873c49adad211ff466e34342a52665742794f5Anders CarlssonAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) 16935873c49adad211ff466e34342a52665742794f5Anders Carlsson{ 17035873c49adad211ff466e34342a52665742794f5Anders Carlsson if (!E->hasGlobalStorage()) 17135873c49adad211ff466e34342a52665742794f5Anders Carlsson return APValue(); 17235873c49adad211ff466e34342a52665742794f5Anders Carlsson 17335873c49adad211ff466e34342a52665742794f5Anders Carlsson return APValue(E, 0); 17435873c49adad211ff466e34342a52665742794f5Anders Carlsson} 17535873c49adad211ff466e34342a52665742794f5Anders Carlsson 1764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 1774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isFileScope()) 1784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(E, 0); 1794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 1834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 1844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 1854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 1864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 1874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType(); 1894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 1904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 1914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 1924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 1944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman RecordDecl *RD = Ty->getAsRecordType()->getDecl(); 1974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 19886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 19986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 20086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (!FD) // FIXME: deal with other kinds of member expressions 20186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return APValue(); 2024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 20444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned i = 0; 20544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor for (RecordDecl::field_iterator Field = RD->field_begin(), 20644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor FieldEnd = RD->field_end(); 20744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Field != FieldEnd; (void)++Field, ++i) { 20844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (*Field == FD) 2094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.getLValueOffset() + RL.getFieldOffset(i) / 8); 2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2183068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) 2193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{ 2203068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 2213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2223068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 2233068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 2243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 2263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 2273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 2283068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8; 2303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t Offset = Index.getSExtValue() * ElementSize; 2323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setLValue(Result.getLValueBase(), 2333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.getLValueOffset() + Offset); 2343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 2353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 2364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 238f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 239f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 240f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 241c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 2422bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator 2432bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 24487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 2452bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 2462bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 24787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 248f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2492bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 2502bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 2512bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 2522bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2532bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 2542bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 255650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 256650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitCastExpr(const CastExpr* E); 2574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitUnaryOperator(const UnaryOperator *E); 2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman { return APValue(E, 0); } 260f01158941ba4560c63150032073bb231ce38999eEli Friedman APValue VisitAddrLabelExpr(AddrLabelExpr *E) 261f01158941ba4560c63150032073bb231ce38999eEli Friedman { return APValue(E, 0); } 2623941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman APValue VisitCallExpr(CallExpr *E); 2634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 2642bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 265f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 2662bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 26787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 268f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner if (!E->getType()->isPointerType()) 269f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 27087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 271f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 272f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 273650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 274f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 275650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 276650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 277650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 278650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 279650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 280650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 281650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 282f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 283650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 284650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 28587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 286650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 287f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 288650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 28987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 291650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType(); 2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman uint64_t SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8; 2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 295650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson uint64_t Offset = ResultLValue.getLValueOffset(); 2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 297650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 299650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 3014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 302650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(ResultLValue.getLValueBase(), Offset); 303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getOpcode() == UnaryOperator::Extension) { 3074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Deal with warnings? 3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Visit(E->getSubExpr()); 3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getOpcode() == UnaryOperator::AddrOf) { 3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 3144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 3154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 319d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson 320650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 321b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 322650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr* SubExpr = E->getSubExpr(); 323650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 324650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Check for pointer->pointer cast 325650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (SubExpr->getType()->isPointerType()) { 326650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue Result; 32787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluatePointer(SubExpr, Result, Info)) 328650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 329f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return APValue(); 330650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 331650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 332d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman if (SubExpr->getType()->isIntegralType()) { 333650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt Result(32); 33487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluateInteger(SubExpr, Result, Info)) { 33587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result.extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 336650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(0, Result.getZExtValue()); 337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 338650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 3394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isFunctionType() || 3414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SubExpr->getType()->isArrayType()) { 3424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 3434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 3444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 3454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman //assert(0 && "Unhandled cast"); 349650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 350650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 351650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 3523941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) { 3533941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman if (E->isBuiltinCall() == Builtin::BI__builtin___CFStringMakeConstantString) 3543941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(E, 0); 3553941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(); 3563941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman} 3573941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman 3584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 3594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 3604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 3614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 3644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 3664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 3674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 3684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 370f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 371f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 37259b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 37359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 37459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 37559b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 37659b5da6d853b4368b984700315adf7b37de05764Nate Begeman class VISIBILITY_HIDDEN VectorExprEvaluator 37759b5da6d853b4368b984700315adf7b37de05764Nate Begeman : public StmtVisitor<VectorExprEvaluator, APValue> { 37859b5da6d853b4368b984700315adf7b37de05764Nate Begeman EvalInfo &Info; 37959b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 38059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 38159b5da6d853b4368b984700315adf7b37de05764Nate Begeman VectorExprEvaluator(EvalInfo &info) : Info(info) {} 38259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 38359b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitStmt(Stmt *S) { 38459b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 38559b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 38659b5da6d853b4368b984700315adf7b37de05764Nate Begeman 38759b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 38859b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCastExpr(const CastExpr* E); 38959b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 39059b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitInitListExpr(const InitListExpr *E); 39159b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 39259b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 39359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 39459b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 39559b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!E->getType()->isVectorType()) 39659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 39759b5da6d853b4368b984700315adf7b37de05764Nate Begeman Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 39859b5da6d853b4368b984700315adf7b37de05764Nate Begeman return !Result.isUninit(); 39959b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 40059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 40159b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 40259b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr* SE = E->getSubExpr(); 40359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 40459b5da6d853b4368b984700315adf7b37de05764Nate Begeman // Check for vector->vector bitcast. 40559b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (SE->getType()->isVectorType()) 40659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(SE)); 40759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 40859b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 40959b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 41059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 41159b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue 41259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 41359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(E->getInitializer())); 41459b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 41559b5da6d853b4368b984700315adf7b37de05764Nate Begeman 41659b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue 41759b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 41859b5da6d853b4368b984700315adf7b37de05764Nate Begeman const VectorType *VT = E->getType()->getAsVectorType(); 41959b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 42059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 42159b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!VT || VT->getNumElements() != NumInits) 42259b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 42359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 42459b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 42559b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::SmallVector<APValue, 4> Elements; 42659b5da6d853b4368b984700315adf7b37de05764Nate Begeman 42759b5da6d853b4368b984700315adf7b37de05764Nate Begeman for (unsigned i = 0; i < NumInits; i++) { 42859b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 42959b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 43059b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateInteger(E->getInit(i), sInt, Info)) 43159b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 43259b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(sInt)); 43359b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 43459b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 43559b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateFloat(E->getInit(i), f, Info)) 43659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 43759b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(f)); 43859b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 43959b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 44059b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(&Elements[0], Elements.size()); 44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 44359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 444f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 445f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 446f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 447f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 448f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator 449b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 45087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 451b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner APSInt &Result; 452f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 45387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner IntExprEvaluator(EvalInfo &info, APSInt &result) 45487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 455f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 4567a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner unsigned getIntTypeSizeInBits(QualType T) const { 45754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return (unsigned)Info.Ctx.getIntWidth(T); 45854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner } 45954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 46082206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Extension(SourceLocation L, diag::kind D, const Expr *E) { 46154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 46254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 46382206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 46454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return true; // still a constant. 46554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner } 46654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 46782206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 46854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // If this is in an unevaluated portion of the subexpression, ignore the 46954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // error. 470f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson if (Info.ShortCircuit) { 47132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // If error is ignored because the value isn't evaluated, get the real 47232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // type at least to prevent errors downstream. 47382206e267ce6cc709797127616f64672d255b310Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 47482206e267ce6cc709797127616f64672d255b310Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 47554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return true; 47632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 47754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 47832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 47954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson if (Info.EvalResult.Diag == 0) { 48054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 48154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 48282206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 48332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 48454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 4857a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 4867a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner 487f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 488f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Visitor Methods 489f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 49032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner 49132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitStmt(Stmt *) { 49232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert(0 && "This should be called on integers, stmts are not integers"); 49332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return false; 49432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 4957a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner 49632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitExpr(Expr *E) { 4970e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 498f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 499f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 500b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 501f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 5024c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 5034c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result = E->getValue(); 5044c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 5054c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 5064c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 5074c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 5084c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 5094c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result = E->getValue(); 5104c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 5114c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 5124c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 5134c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { 5144c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 515ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // Per gcc docs "this built-in function ignores top level 516ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // qualifiers". We need to use the canonical version to properly 517ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // be able to strip CRV qualifiers from the type. 518ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1()); 519ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2()); 520ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar Result = Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(), 521ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar T1.getUnqualifiedType()); 5224c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 5234c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 5244c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitDeclRefExpr(const DeclRefExpr *E); 5254c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCallExpr(const CallExpr *E); 526b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 527b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 528ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes bool VisitConditionalOperator(const ConditionalOperator *E); 529f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 530a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool VisitCastExpr(CastExpr* E); 5310518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E); 5320518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 5333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 534529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 5353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result = E->getValue(); 5363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 5373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 5383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 5393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 5403f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 5413f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType())); 5423f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 5433f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson return true; 5443f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson } 5453f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson 5463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { 5473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType())); 5483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 5493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 5503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 5513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 55264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 55364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 55464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl Result = E->Evaluate(); 55564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl return true; 55664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 55764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 558fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 559af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfExpr(const Expr *E); 560af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfType(QualType T); 561f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 562f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 563f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 56487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 56587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 566f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 567f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 5684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 5694c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 5704c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) { 5714c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result = D->getInitVal(); 572e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // FIXME: This is an ugly hack around the fact that enums don't set their 573e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // signedness consistently; see PR3173 574e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman Result.setIsUnsigned(!E->getType()->isSignedIntegerType()); 5754c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 5764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 577b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 578b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl // In C++, const, non-volatile integers initialized with ICEs are ICEs. 579b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl if (Info.Ctx.getLangOptions().CPlusPlus && 580b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl E->getType().getCVRQualifiers() == QualType::Const) { 581b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) { 582b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl if (const Expr *Init = D->getInit()) 583b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl return Visit(const_cast<Expr*>(Init)); 584b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 585b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 586b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 5874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 5880e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 5894c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 5904c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 591a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 592a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 593a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 594a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 595a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 596a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 597a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 598a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 599a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 600a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 601a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 602a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 603a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 604a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 605a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 606a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 607a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // If no argument was supplied, default to "no_type_class". This isn't 608a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 609a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 610a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 611a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 612a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 613a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 614a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 615a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 616a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 617a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 618a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 619a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 620a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 621a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 622a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 623a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 624a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 625a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 626a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 627a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 628a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 629a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 630a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 631a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 632a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 633a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 634a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 635a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 636a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 637a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 638a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 639a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 640a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 641a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 642a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 643a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 644a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 645a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 6464c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 6474c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 6484c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 649019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner switch (E->isBuiltinCall()) { 650019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 6510e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 652019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 653a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Result.setIsSigned(true); 654a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Result = EvaluateBuiltinClassifyType(E); 655019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner return true; 656019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 6574bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 658019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 659019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 6604bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result = E->getArg(0)->isEvaluatable(Info.Ctx); 661019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner return true; 662019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 6634c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 664f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 665b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 666a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 667027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson if (!Visit(E->getRHS())) 668027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return false; 6694fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 6704fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson if (!Info.ShortCircuit) { 6714fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson // If we can't evaluate the LHS, it must be because it has 6724fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson // side effects. 6734fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson if (!E->getLHS()->isEvaluatable(Info.Ctx)) 6744fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson Info.EvalResult.HasSideEffects = true; 6754fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 6760e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E); 6774fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson } 678c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 679027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return true; 680a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 681a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 682a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 683a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 684a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 685fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 68651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 687fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) { 68851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 68951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 690fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (lhsResult == (E->getOpcode() == BinaryOperator::LOr) || 691fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !lhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 6924bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 6934bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 694fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = lhsResult; 6954bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson 696f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson Info.ShortCircuit++; 697fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool rhsEvaluated = HandleConversionToBool(E->getRHS(), rhsResult, Info); 698f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson Info.ShortCircuit--; 699f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 700fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (rhsEvaluated) 701fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson return true; 702fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 703fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // FIXME: Return an extension warning saying that the RHS could not be 704fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // evaluated. 7054bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return true; 706a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 707a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 708fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 7094bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 7104bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 7114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if (E->getOpcode() == BinaryOperator::LOr) 712fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = lhsResult || rhsResult; 7134bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 714fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = lhsResult && rhsResult; 7154bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return true; 7164bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 7174bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 718fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 7194bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 7204bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 721fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) || 722fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 7234bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 7244bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 725fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = rhsResult; 726fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 727fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // Since we werent able to evaluate the left hand side, it 728fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 729fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Info.EvalResult.HasSideEffects = true; 730fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 7314bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return true; 7324bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 7334bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 734a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 735a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 736a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 737c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 73854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 739286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 740286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 7414087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 7424087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 7434087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 7444087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APValue LHS, RHS; 7454087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 7464087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 7474087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 7484087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 7494087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 7504087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 7514087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 7524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 7534087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APFloat::cmpResult CR_r = 7544087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 7554087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APFloat::cmpResult CR_i = 7564087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 7574087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 7584087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 7594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 7604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result = (CR_r == APFloat::cmpEqual && 7614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar CR_i == APFloat::cmpEqual); 7624087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar else if (E->getOpcode() == BinaryOperator::NE) 7634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result = ((CR_r == APFloat::cmpGreaterThan || 7644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar CR_r == APFloat::cmpLessThan) && 7654087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar (CR_i == APFloat::cmpGreaterThan || 7664087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar CR_i == APFloat::cmpLessThan)); 7674087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar else 7684087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(0 && "Invalid complex compartison."); 7694087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 7704087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return true; 7714087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 7724087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 7734087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 7744087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result = (LHS.getComplexIntReal() == RHS.getComplexIntReal() && 7754087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()); 7764087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar else if (E->getOpcode() == BinaryOperator::NE) 7774087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result = (LHS.getComplexIntReal() != RHS.getComplexIntReal() || 7784087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()); 7794087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar else 7804087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(0 && "Invalid complex compartison."); 7814087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 7824087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return true; 7834087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 7844087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 785286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 786286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 787286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 788286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 789286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 790286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 791286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 792286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 793286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 794286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 795286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 796286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 797529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 798529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 799529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 800286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 801286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 802286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 803286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 804286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpLessThan; 805286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 806286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 807286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan; 808286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 809286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 810286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual; 811286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 812286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 813286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual; 814286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 815286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 816286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpEqual; 817286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 818286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 819286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpLessThan; 820286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 821286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 822286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 823286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 824286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return true; 825286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 826286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 8273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (E->getOpcode() == BinaryOperator::Sub) { 828529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 8293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 8303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 8313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 8323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 8333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 8343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 8353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 8363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 8373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson // FIXME: Is this correct? What if only one of the operands has a base? 8383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (LHSValue.getLValueBase() || RHSValue.getLValueBase()) 8393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 8403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 8413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson const QualType Type = E->getLHS()->getType(); 8423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson const QualType ElementType = Type->getAsPointerType()->getPointeeType(); 8433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 8443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset(); 8453068d117951a8df54bae9db039b56201ab10962bAnders Carlsson D /= Info.Ctx.getTypeSize(ElementType) / 8; 8463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 8473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 848529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result = D; 8493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 8503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 8513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 8523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 8533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 854286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 855286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 856a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 857a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 858a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // FIXME: Deal with EQ and friends. 859a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 860a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 861a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 862a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 863a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman llvm::APSInt RHS(32); 864a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!Visit(E->getLHS())) { 865a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 866a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 867d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 868d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 869d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // FIXME Maybe we want to succeed even where we can't evaluate the 870d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // right side of LAnd/LOr? 871d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // For example, see http://llvm.org/bugs/show_bug.cgi?id=2525 87254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (!EvaluateInteger(E->getRHS(), RHS, Info)) 873b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 874a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 875a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 87632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 8770e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 87854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Mul: Result *= RHS; return true; 87954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Add: Result += RHS; return true; 88054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Sub: Result -= RHS; return true; 88154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::And: Result &= RHS; return true; 88254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Xor: Result ^= RHS; return true; 88354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Or: Result |= RHS; return true; 884a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 88554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 8860e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 887b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result /= RHS; 88832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner break; 889a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 89054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 8910e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 892a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result %= RHS; 89332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner break; 894a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Shl: 89554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 896b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result <<= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1); 897a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson break; 898a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Shr: 899b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result >>= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1); 900a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson break; 901b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner 902ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::LT: 903ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result < RHS; 904ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 905ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 906ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::GT: 907ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result > RHS; 908ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 909ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 910ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::LE: 911ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result <= RHS; 912ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 913ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 914ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::GE: 915ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result >= RHS; 916ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 917ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 918ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::EQ: 919ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result == RHS; 920ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 921ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 922ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::NE: 923ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result != RHS; 924ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 925ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 92654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::LAnd: 92754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result = Result != 0 && RHS != 0; 92854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 92954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner break; 93054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::LOr: 93154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result = Result != 0 || RHS != 0; 93254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 93354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner break; 934b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 935a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 936a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 937b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 938a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 939a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 940ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 941a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 942a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 943ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 944ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 945a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 946ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 947ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 948af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) { 949e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner const Type *Ty = Info.Ctx.getCanonicalType(T).getTypePtr(); 950e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 951e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // __alignof__(void) = 1 as a gcc extension. 952e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (Ty->isVoidType()) 953e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return 1; 954e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 955e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // GCC extension: alignof(function) = 4. 956e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // FIXME: AlignOf shouldn't be unconditionally 4! It should listen to the 957e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // attribute(align) directive. 958e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (Ty->isFunctionType()) 959e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return 4; 960e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 961e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(Ty)) 962e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(QualType(ASQT->getBaseType(), 0)); 963e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 964e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // alignof VLA/incomplete array. 965e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (const ArrayType *VAT = dyn_cast<ArrayType>(Ty)) 966e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(VAT->getElementType()); 967e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 968e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // sizeof (objc class)? 969e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (isa<ObjCInterfaceType>(Ty)) 970e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return 1; // FIXME: This probably isn't right. 971e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 972e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the alignment. 973e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 974e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return Info.Ctx.getTypeAlign(Ty) / CharSize; 975e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 976e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 977af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 978af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 979af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 980af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 981af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // to 1 in those cases. 982af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 983af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner return Info.Ctx.getDeclAlign(DRE->getDecl()); 984af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 985af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 986af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner return Info.Ctx.getDeclAlign(ME->getMemberDecl()); 987af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 988e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 989e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 990e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 991e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 9920518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 9930518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 9940518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 9950518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType DstTy = E->getType(); 996fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // Return the result in the right width. 997fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(DstTy)); 998fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result.setIsUnsigned(DstTy->isUnsignedIntegerType()); 999fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1000e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Handle alignof separately. 1001e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!E->isSizeOf()) { 1002e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 1003e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner Result = GetAlignOfType(E->getArgumentType()); 1004e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 1005e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner Result = GetAlignOfExpr(E->getArgumentExpr()); 1006e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return true; 1007e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 1008e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 10090518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 10100518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 1011fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(void) and __alignof__(void) = 1 as a gcc extension. 10124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SrcTy->isVoidType()) { 1013fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result = 1; 10144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1016fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1017fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 1018e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!SrcTy->isConstantSizeType()) 1019fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 102067303c1c78345c53abbf19516170f5bd79b0534dFariborz Jahanian 1021fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // GCC extension: sizeof(function) = 1. 1022fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (SrcTy->isFunctionType()) { 1023e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner Result = 1; 1024fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return true; 1025fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner } 1026f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 1027f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman if (SrcTy->isObjCInterfaceType()) { 1028f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman // Slightly unusual case: the size of an ObjC interface type is the 1029f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman // size of the class. This code intentionally falls through to the normal 1030f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman // case. 1031f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman ObjCInterfaceDecl *OI = SrcTy->getAsObjCInterfaceType()->getDecl(); 1032f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman RecordDecl *RD = const_cast<RecordDecl*>(Info.Ctx.addRecordToClass(OI)); 1033f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman SrcTy = Info.Ctx.getTagDeclType(static_cast<TagDecl*>(RD)); 1034f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman } 1035f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 1036e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the size. 103787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 1038e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner Result = Info.Ctx.getTypeSize(SrcTy) / CharSize; 1039fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return true; 1040fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 1041fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1042b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 10434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 10444c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 104575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner if (E->isOffsetOfOp()) { 10464c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 104787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = E->evaluateOffsetOf(Info.Ctx); 104875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 104975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return true; 105075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner } 1051a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1052a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 1053a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 1054a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 1055a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 1056a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1057a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 1058a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 1059a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result = !bres; 1060a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return true; 1061a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1062a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 106387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 106487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 106575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 1066a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 106775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 10684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 106975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 107075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 10710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 107275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 10734c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 10744c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 107575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 10764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // The result is always just the subexpr. 107775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 107875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 107975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result = -Result; 108075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 108175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 108275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result = ~Result; 108375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 108406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 108506a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 1086a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 1087b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 1088a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 1089a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 1090732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 1091732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 1092a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) { 109382206e267ce6cc709797127616f64672d255b310Anders Carlsson Expr *SubExpr = E->getSubExpr(); 109482206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 109582206e267ce6cc709797127616f64672d255b310Anders Carlsson 10967a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner unsigned DestWidth = getIntTypeSizeInBits(DestType); 109706a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 10984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 10994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 11004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 11014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 11024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.zextOrTrunc(DestWidth); 11034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 11044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = BoolResult; 11054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 11064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 11074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1108a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 1109a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (SubExpr->getType()->isIntegralType()) { 1110732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 1111b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleIntToIntCast(DestType, SubExpr->getType(), Result, Info.Ctx); 1114732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return true; 1115732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 1116732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1117732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 1118732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (SubExpr->getType()->isPointerType()) { 1119a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 112087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 1121b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 11224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1123a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson if (LV.getLValueBase()) 1124b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 11254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1126559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson Result.extOrTrunc(DestWidth); 1127559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson Result = LV.getLValueOffset(); 1128732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 1129732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return true; 11302bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 11314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1132732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!SubExpr->getType()->isRealFloatingType()) 11330e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1134732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1135d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 1136d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 11370e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1138732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToIntCast(DestType, SubExpr->getType(), F, Info.Ctx); 1140b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 1141a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 11422bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1143f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1144d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 1145d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1146d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1147d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 1148d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator 1149d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 1150d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 1151d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 1152d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 1153d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 1154d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 1155d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1156d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 1157d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1158d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1159d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1160d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 1161019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 1162d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 11635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 1164d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 1165d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 11664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 11674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 1168d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 1169d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 1170d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1171d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 1172d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 1173d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1174d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1175019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 1176019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner switch (E->isBuiltinCall()) { 117734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 1178019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 1179019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 1180019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 1181019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 1182019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 11837cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 11847cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 11857cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 118634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 118734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 11887cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 11899e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner 11909e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 11919e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 11929e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 11939e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // If this is __builtin_nan("") turn this into a simple nan, otherwise we 11949e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 11959e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (const StringLiteral *S = 11969e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 11979e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (!S->isWide() && S->getByteLength() == 0) { // empty string. 11987cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 11997cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 12009e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner Result = llvm::APFloat::getNaN(Sem); 12019e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 12029e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 12039e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 12049e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 12055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 12065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 12075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 12085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 12095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 12105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 12115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 12125db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 12135db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 12145db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 12155db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 12165db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysign: 12175db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignf: 12185db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 12195db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 12205db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 12215db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 12225db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 12235db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 12245db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 12255db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 1226019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 1227019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 1228019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 12295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 1230a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 1231a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 1232a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 12335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 12345db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 12355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 12365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 12375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 12385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Plus: 12395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 12405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 12415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 12425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 12435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 12445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 1245019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1246d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1247d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1248d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 12495db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1250d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1251d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1252d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1253d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1254d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1255d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1256d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1257d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1258d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1259d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1260d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1261d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1262d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1263d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1264d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1265d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1266d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1267d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1268d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1269d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Rem: 1270d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.mod(RHS, APFloat::rmNearestTiesToEven); 1271d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1272d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1273d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1274d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1275d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1276d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1277d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1278d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1279d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 12804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 12814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 128259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 12834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 12844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 12854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 12864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1287a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 1288a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 12894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 12904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 12914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 12924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 12934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1294a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 1295a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 12964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 12974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 12984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 12994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 13004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 13014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 13024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 13034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 13044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 13054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 13064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1307d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1308a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 13099ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 13109ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13119ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 1312a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator 1313a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar : public StmtVisitor<ComplexExprEvaluator, APValue> { 13149ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 13159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13169ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 1317a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar ComplexExprEvaluator(EvalInfo &info) : Info(info) {} 13189ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13199ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 13209ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 13219ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 13229ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13239ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 13249ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 13259ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 13269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 13289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 1330a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Expr* SubExpr = E->getSubExpr(); 1331a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1332a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (SubExpr->getType()->isRealFloatingType()) { 1333a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat Result(0.0); 1334a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1335a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateFloat(SubExpr, Result, Info)) 1336a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 13379ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 13383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false), 1339a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result); 1340a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1341a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert(SubExpr->getType()->isIntegerType() && 1342a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Unexpected imaginary literal."); 1343a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1344a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Result; 1345a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1346a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1347a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1348a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 1349a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Zero = 0; 1350a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(Zero, Result); 1351a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 13529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 13539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1354ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1355ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1356a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType EltType = E->getType()->getAsComplexType()->getElementType(); 1357a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SubType = SubExpr->getType(); 1358ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1359a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (SubType->isRealFloatingType()) { 1360ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 1361ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1362ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1363ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1364ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1365a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Apply float conversion if necessary. 1366a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx); 13678f826f0e0c90b05ab04e84c29157d2e965713288Daniel Dunbar return APValue(Result, 13683f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat(Result.getSemantics(), APFloat::fcZero, false)); 1369a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (SubType->isIntegerType()) { 1370a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APSInt Result; 1371a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1372a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1373a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1374a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1375a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Apply integer conversion if necessary. 1376a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx); 1377a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 1378a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Zero = 0; 1379a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(Result, Zero); 1380a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (const ComplexType *CT = SubType->getAsComplexType()) { 1381a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APValue Src; 1382a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1383a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (!EvaluateComplex(SubExpr, Src, Info)) 1384a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(); 1385a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1386a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SrcType = CT->getElementType(); 1387a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1388a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (Src.isComplexFloat()) { 1389a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 1390a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToFloatCast(EltType, SrcType, 1391a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1392a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1393a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleFloatToFloatCast(EltType, SrcType, 1394a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1395a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1396a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1397a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToIntCast(EltType, SrcType, 1398a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1399a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1400a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleFloatToIntCast(EltType, SrcType, 1401a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1402a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1403a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1404a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1405a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar assert(Src.isComplexInt() && "Invalid evaluate result."); 1406a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 1407a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToFloatCast(EltType, SrcType, 1408a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1409a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1410a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleIntToFloatCast(EltType, SrcType, 1411a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1412a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1413a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1414a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToIntCast(EltType, SrcType, 1415a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1416a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 1417a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar HandleIntToIntCast(EltType, SrcType, 1418a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1419a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1420a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1421a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1422ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1423ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1424ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1425ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1426ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1427ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1428ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1429ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 14309ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 14319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 14329ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1433a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) 14349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{ 1435a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1436a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert((!Result.isComplexFloat() || 1437a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar (&Result.getComplexFloatReal().getSemantics() == 1438a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar &Result.getComplexFloatImag().getSemantics())) && 1439a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Invalid complex evaluation."); 1440a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return Result.isComplexFloat() || Result.isComplexInt(); 14419ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 14429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1443a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel DunbarAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) 1444ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{ 1445ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 1446ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1447a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getLHS(), Result, Info)) 1448ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1449ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1450a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 1451ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1452a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 14533f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 14543f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 1455ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1456ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1457ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1458a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1459a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1460a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1461a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1462a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1463a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1464a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 1465a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 1466a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 14673f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1468ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1469a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1470a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1471a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1472a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1473a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1474a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1475a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 1476a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 1477a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 14783f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 14793f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar case BinaryOperator::Mul: 14803f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 14813f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 14823f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 14833f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 14843f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 14853f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 14863f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 14873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 14883f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 14893f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 14903f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 14913f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 14923f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 14933f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 14943f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 14953f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 14963f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 14973f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 14983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 14993f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 15003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 15013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 15023f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexIntReal() = 15033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 15043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 15053f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexIntImag() = 15063f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 15073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 15083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 15093f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1510ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1511ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1512ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1513ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1514ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 15159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 15166ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1517f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1518f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 15196ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1520019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1521019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1522019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 15235b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { 15245b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson EvalInfo Info(Ctx, Result); 152554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 152659b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (getType()->isVectorType()) { 152759b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateVector(this, Result.Val, Info)) 152859b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 152959b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else if (getType()->isIntegerType()) { 1530d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APSInt sInt(32); 15316dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateInteger(this, sInt, Info)) 15326dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 15336dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 15345b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(sInt); 1535d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isPointerType()) { 15365b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluatePointer(this, Result.Val, Info)) 15376dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1538d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1539d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 15406dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateFloat(this, f, Info)) 15416dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 15426dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 15435b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(f); 1544a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else if (getType()->isAnyComplexType()) { 1545a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(this, Result.Val, Info)) 15466dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1547a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else 15489d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson return false; 15496dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 15505b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson return true; 15515b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson} 15525b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 15536ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 155445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 155545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 15564fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 15574fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson return Evaluate(Result, Ctx) && !Result.HasSideEffects; 155845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 155951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 156051fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 15611c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 15621c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson bool Result = Evaluate(EvalResult, Ctx); 1563f185319f25efd6094870f287030270fad26085baDaniel Dunbar Result = Result; 156451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 15651c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 156651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 15671c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 156851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 1569