ExprConstant.cpp revision 51fe996231b1d7199f76e4005ff4c943d5deeecd
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" 1854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner#include "clang/Basic/Diagnostic.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 4287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner /// isEvaluated - True if the subexpression is required to be evaluated, false 4387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner /// if it is short-circuited (according to C rules). 4487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner bool isEvaluated; 4587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 4654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// ICEDiag - If the expression is unfoldable, then ICEDiag contains the 4754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// error diagnostic indicating why it is not foldable and DiagLoc indicates a 4854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// caret position for the error. If it is foldable, but the expression is 4954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// not an integer constant expression, ICEDiag contains the extension 5054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// diagnostic to emit which describes why it isn't an integer constant 5154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// expression. If this expression *is* an integer-constant-expr, then 5254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// ICEDiag is zero. 5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner /// 5454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// The caller can choose to emit this diagnostic or not, depending on whether 5554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// they require an i-c-e or a constant or not. DiagLoc indicates the caret 5654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// position for the report. 5754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// 5854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner /// If ICEDiag is zero, then this expression is an i-c-e. 5987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner unsigned ICEDiag; 6087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner SourceLocation DiagLoc; 6187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 6287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo(ASTContext &ctx) : Ctx(ctx), isEvaluated(true), ICEDiag(0) {} 6387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner}; 6487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 6587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info); 6787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info); 6887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 69d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 709ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonstatic bool EvaluateComplexFloat(const Expr *E, APValue &Result, 719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info); 72f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 73f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) { 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isPointerType()) { 914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Is this accurate for all kinds of bases? If not, what would 954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // the check look like? 964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset(); 974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 1054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 1074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator 1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 1134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 1158a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#if 0 1164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Remove this when we support more expressions. 1174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman printf("Unhandled pointer statement\n"); 1184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman S->dump(); 1198a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#endif 1204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 1244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitDeclRefExpr(DeclRefExpr *E) { return APValue(E, 0); } 1254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); } 1264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 1274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 1284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); } 1293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E); 1304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 1314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 1324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) { 1344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result.isLValue(); 1364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 1394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isFileScope()) 1404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(E, 0); 1414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 1454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 1494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType(); 1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman RecordDecl *RD = Ty->getAsRecordType()->getDecl(); 1594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman FieldDecl *FD = E->getMemberDecl(); 1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman unsigned i = 0, e = 0; 1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman for (i = 0, e = RD->getNumMembers(); i != e; i++) { 1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (RD->getMember(i) == FD) 1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 1704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.getLValueOffset() + RL.getFieldOffset(i) / 8); 1714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 1734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1753068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) 1763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{ 1773068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 1783068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1793068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 1803068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 1813068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1823068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 1833068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 1843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 1853068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1863068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8; 1873068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1883068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t Offset = Index.getSExtValue() * ElementSize; 1893068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setLValue(Result.getLValueBase(), 1903068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.getLValueOffset() + Offset); 1913068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 1923068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 1934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 195f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 196f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 197f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 198c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 1992bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator 2002bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 20187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 2022bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 2032bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 20487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 205f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2062bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 2072bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 2082bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 2092bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2102bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 2112bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 212650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 213650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitCastExpr(const CastExpr* E); 2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitUnaryOperator(const UnaryOperator *E); 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman { return APValue(E, 0); } 2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 2182bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 219f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 2202bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 22187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 222f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner if (!E->getType()->isPointerType()) 223f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 22487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 225f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 226f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 227650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 228f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 229650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 230650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 231650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 232650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 233650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 234650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 235650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 236f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 237650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 238650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 23987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 240650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 241f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 242650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 24387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 244650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 245650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType(); 2474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman uint64_t SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8; 2484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 249650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson uint64_t Offset = ResultLValue.getLValueOffset(); 2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 251650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 253650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 2544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 2554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 256650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(ResultLValue.getLValueBase(), Offset); 257650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 2604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getOpcode() == UnaryOperator::Extension) { 2614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Deal with warnings? 2624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Visit(E->getSubExpr()); 2634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getOpcode() == UnaryOperator::AddrOf) { 2664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 2674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 2684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 2694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 273650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 274650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 275b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 276650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr* SubExpr = E->getSubExpr(); 277650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 278650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Check for pointer->pointer cast 279650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (SubExpr->getType()->isPointerType()) { 280650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue Result; 28187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluatePointer(SubExpr, Result, Info)) 282650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 283f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return APValue(); 284650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 285650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 286d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman if (SubExpr->getType()->isIntegralType()) { 287650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt Result(32); 28887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluateInteger(SubExpr, Result, Info)) { 28987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result.extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(0, Result.getZExtValue()); 291650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 292650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isFunctionType() || 2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SubExpr->getType()->isArrayType()) { 2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 2994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman //assert(0 && "Unhandled cast"); 303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 304650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 305650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 3074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 3144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 3154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 318f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 319f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 321f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 323f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 324f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator 325b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 32687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 327b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner APSInt &Result; 328f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 32987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner IntExprEvaluator(EvalInfo &info, APSInt &result) 33087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 331f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3327a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner unsigned getIntTypeSizeInBits(QualType T) const { 33354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return (unsigned)Info.Ctx.getIntWidth(T); 33454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner } 33554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 33654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner bool Extension(SourceLocation L, diag::kind D) { 33754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Info.DiagLoc = L; 33854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Info.ICEDiag = D; 33954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return true; // still a constant. 34054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner } 34154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 34232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool Error(SourceLocation L, diag::kind D, QualType ExprTy) { 34354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // If this is in an unevaluated portion of the subexpression, ignore the 34454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // error. 34532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner if (!Info.isEvaluated) { 34632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // If error is ignored because the value isn't evaluated, get the real 34732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // type at least to prevent errors downstream. 34832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(ExprTy)); 34932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner Result.setIsUnsigned(ExprTy->isUnsignedIntegerType()); 35054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return true; 35132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 35254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 35332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 35432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner if (Info.ICEDiag == 0) { 35532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner Info.DiagLoc = L; 35632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner Info.ICEDiag = D; 35732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 35854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 3597a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 3607a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner 361f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 362f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Visitor Methods 363f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 36432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner 36532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitStmt(Stmt *) { 36632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert(0 && "This should be called on integers, stmts are not integers"); 36732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return false; 36832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 3697a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner 37032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitExpr(Expr *E) { 37132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getLocStart(), diag::err_expr_not_constant, E->getType()); 372f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 373f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 374b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 375f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3764c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 3774c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result = E->getValue(); 3784c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 3794c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 3804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 3814c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 3824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 3834c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result = E->getValue(); 3844c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 3854c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 3864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 3874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { 3884c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 389ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // Per gcc docs "this built-in function ignores top level 390ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // qualifiers". We need to use the canonical version to properly 391ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // be able to strip CRV qualifiers from the type. 392ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1()); 393ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2()); 394ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar Result = Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(), 395ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar T1.getUnqualifiedType()); 3964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 3974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 3984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitDeclRefExpr(const DeclRefExpr *E); 3994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCallExpr(const CallExpr *E); 400b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 401b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 402ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes bool VisitConditionalOperator(const ConditionalOperator *E); 403f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 404732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner bool VisitCastExpr(CastExpr* E) { 405732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return HandleCast(E->getLocStart(), E->getSubExpr(), E->getType()); 406f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 4070518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E); 4080518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 4093068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 410529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 4113068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result = E->getValue(); 4123068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 4133068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 4143068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 4153068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 4163068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { 4173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType())); 4183068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 4193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 4203068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 4213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 422fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 423732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner bool HandleCast(SourceLocation CastLoc, Expr *SubExpr, QualType DestType); 424f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 425f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 426f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 42787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 42887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 429f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 430f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 4314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 4324c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 4334c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) { 4344c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result = D->getInitVal(); 4354c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 4364c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 4374c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 4384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 43932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getLocStart(), diag::err_expr_not_constant, E->getType()); 4404c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 4414c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 442a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 443a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 444a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 445a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 446a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 447a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 448a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 449a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 450a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 451a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 452a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 453a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 454a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 455a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 456a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 457a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 458a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // If no argument was supplied, default to "no_type_class". This isn't 459a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 460a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 461a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 462a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 463a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 464a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 465a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 466a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 467a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 468a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 469a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 470a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 471a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 472a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 473a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 474a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 475a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 476a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 477a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 478a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 479a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 480a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 481a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 482a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 483a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 484a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 485a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 486a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 487a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 488a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 489a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 490a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 491a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 492a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 493a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 494a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 495a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 496a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 4974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 4984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 4994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 500019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner switch (E->isBuiltinCall()) { 501019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 50232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getLocStart(), diag::err_expr_not_constant, E->getType()); 503019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 504a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Result.setIsSigned(true); 505a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Result = EvaluateBuiltinClassifyType(E); 506019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner return true; 507019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 508019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_constant_p: { 509019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 510019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 511019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner APValue Res; 5126ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner Result = E->getArg(0)->Evaluate(Res, Info.Ctx); 513019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner return true; 514019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 515019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 5164c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 517f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 518b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 519a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 520a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // Evaluate the side that actually matters; this needs to be 521a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // handled specially because calling Visit() on the LHS can 522a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // have strange results when it doesn't have an integral type. 523f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes if (Visit(E->getRHS())) 524f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes return true; 525a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 526a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // Check for isEvaluated; the idea is that this might eventually 527a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // be useful for isICE and other similar uses that care about 528a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // whether a comma is evaluated. This isn't really used yet, though, 529a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // and I'm not sure it really works as intended. 530a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!Info.isEvaluated) 531f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes return Extension(E->getOperatorLoc(), diag::ext_comma_in_constant_expr); 532c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 533f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes return false; 534a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 535a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 536a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 537a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 538a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 539a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 54051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 54151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson if (HandleConversionToBool(E->getLHS(), bres, Info)) { 54251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 54351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 54451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson } else { 545a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't evaluate the LHS; however, sometimes the result 546a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 54751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson if (!HandleConversionToBool(E->getRHS(), bres, Info)) { 54851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We can't evaluate. 54951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson return false; 550a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 55151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson } 552a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 55351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // FIXME: If we evaluate the RHS, we need to check if the LHS has 55451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // any side effects. 55551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 55651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson if (bres == (E->getOpcode() == BinaryOperator::LOr) || 55751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson !bres == (E->getOpcode() == BinaryOperator::LAnd)) { 55851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 55951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 56051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson Result = bres; 56151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson return true; 562a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 563a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 564a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres2; 565a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (HandleConversionToBool(E->getRHS(), bres2, Info)) { 566c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 56732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 568a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::LOr) 569a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result = bres || bres2; 570a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman else 571a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result = bres && bres2; 572c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner return true; 573c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 574a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 575c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 57654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 577286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 578286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 579286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 580286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 581286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 582286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 583286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 584286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 585286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 586286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 587286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 588286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 589286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 590286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 591529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 592529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 593529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 594286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 595286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 596286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 597286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 598286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpLessThan; 599286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 600286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 601286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan; 602286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 603286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 604286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual; 605286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 606286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 607286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual; 608286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 609286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 610286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpEqual; 611286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 612286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 613286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpLessThan; 614286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 615286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 616286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 617286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 618286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return true; 619286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 620286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 6213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (E->getOpcode() == BinaryOperator::Sub) { 622529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 6233068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 6243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 6253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 6263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 6283068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 6293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 6303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson // FIXME: Is this correct? What if only one of the operands has a base? 6323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (LHSValue.getLValueBase() || RHSValue.getLValueBase()) 6333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 6343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson const QualType Type = E->getLHS()->getType(); 6363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson const QualType ElementType = Type->getAsPointerType()->getPointeeType(); 6373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset(); 6393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson D /= Info.Ctx.getTypeSize(ElementType) / 8; 6403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 642529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result = D; 6433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 6443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6453068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 6463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 6473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 648286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 649286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 650a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 651a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 652a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // FIXME: Deal with EQ and friends. 653a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 654a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 655a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 656a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 657a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman llvm::APSInt RHS(32); 658a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!Visit(E->getLHS())) { 659a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 660a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 661d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 662d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 663d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // FIXME Maybe we want to succeed even where we can't evaluate the 664d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // right side of LAnd/LOr? 665d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // For example, see http://llvm.org/bugs/show_bug.cgi?id=2525 66654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (!EvaluateInteger(E->getRHS(), RHS, Info)) 667b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 668a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 669a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 67032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 67132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getOperatorLoc(), diag::err_expr_not_constant,E->getType()); 67254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Mul: Result *= RHS; return true; 67354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Add: Result += RHS; return true; 67454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Sub: Result -= RHS; return true; 67554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::And: Result &= RHS; return true; 67654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Xor: Result ^= RHS; return true; 67754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Or: Result |= RHS; return true; 678a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 67954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 68032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getOperatorLoc(), diag::err_expr_divide_by_zero, 68132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner E->getType()); 682b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result /= RHS; 68332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner break; 684a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 68554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 68632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getOperatorLoc(), diag::err_expr_divide_by_zero, 68732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner E->getType()); 688a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result %= RHS; 68932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner break; 690a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Shl: 69154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 692b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result <<= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1); 693a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson break; 694a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Shr: 695b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result >>= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1); 696a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson break; 697b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner 698ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::LT: 699ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result < RHS; 700ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 701ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 702ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::GT: 703ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result > RHS; 704ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 705ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 706ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::LE: 707ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result <= RHS; 708ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 709ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 710ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::GE: 711ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result >= RHS; 712ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 713ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 714ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::EQ: 715ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result == RHS; 716ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 717ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 718ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::NE: 719ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result != RHS; 720ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 721ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 72254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::LAnd: 72354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result = Result != 0 && RHS != 0; 72454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 72554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner break; 72654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::LOr: 72754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result = Result != 0 || RHS != 0; 72854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 72954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner break; 730b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 731a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 732a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 733b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 734a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 735a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 736ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 737a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 738a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 739ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 740ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 741a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 742ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 743ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 7440518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 7450518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 7460518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 7470518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType DstTy = E->getType(); 748fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // Return the result in the right width. 749fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(DstTy)); 750fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result.setIsUnsigned(DstTy->isUnsignedIntegerType()); 751fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 7520518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 7530518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 754fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(void) and __alignof__(void) = 1 as a gcc extension. 7554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SrcTy->isVoidType()) { 756fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result = 1; 7574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 7584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 759fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 760fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 7614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: But alignof(vla) is! 762fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (!SrcTy->isConstantSizeType()) { 763fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // FIXME: Should we attempt to evaluate this? 764fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 765fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner } 7660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 7670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isSizeOf = E->isSizeOf(); 768fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 769fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // GCC extension: sizeof(function) = 1. 770fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (SrcTy->isFunctionType()) { 771fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // FIXME: AlignOf shouldn't be unconditionally 4! 772fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result = isSizeOf ? 1 : 4; 773fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return true; 774fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner } 775fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 776fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // Get information about the size or align. 77787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 778fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (isSizeOf) 7794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = Info.Ctx.getTypeSize(SrcTy) / CharSize; 780fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner else 78187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = Info.Ctx.getTypeAlign(SrcTy) / CharSize; 782fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return true; 783fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 784fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 785b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 7864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 7874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 78875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner if (E->isOffsetOfOp()) { 7894c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 79087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = E->evaluateOffsetOf(Info.Ctx); 79175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 79275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return true; 79375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner } 794a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 795a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 796a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 797a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 798a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 799a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 800a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 801a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 802a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result = !bres; 803a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return true; 804a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 805a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 80687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 80787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 80875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 809a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 81075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 8114c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 81275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 81375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 81432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(E->getOperatorLoc(), diag::err_expr_not_constant, 81532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner E->getType()); 81675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 8174c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 8184c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 81975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 8204c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // The result is always just the subexpr. 82175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 82275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 82375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result = -Result; 82475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 82575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 82675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result = ~Result; 82775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 82806a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 82906a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 830a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 831b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 832a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 833a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 834732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 835732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 836732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattnerbool IntExprEvaluator::HandleCast(SourceLocation CastLoc, 837732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Expr *SubExpr, QualType DestType) { 8387a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner unsigned DestWidth = getIntTypeSizeInBits(DestType); 83906a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 8404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 8414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 8424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 8434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 8444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.zextOrTrunc(DestWidth); 8454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 8464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = BoolResult; 8474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 8484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 8494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 850a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 851a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (SubExpr->getType()->isIntegralType()) { 852732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 853b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 8542bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 855a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Figure out if this is a truncate, extend or noop cast. 856a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // If the input is signed, do a sign extend, noop, or truncate. 8574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.extOrTrunc(DestWidth); 858732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 859732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return true; 860732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 861732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 862732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 863732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (SubExpr->getType()->isPointerType()) { 864a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 86587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 866b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 8674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 868a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson if (LV.getLValueBase()) 869b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 8704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 871559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson Result.extOrTrunc(DestWidth); 872559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson Result = LV.getLValueOffset(); 873732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 874732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return true; 8752bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 8764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 877732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!SubExpr->getType()->isRealFloatingType()) 87832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(CastLoc, diag::err_expr_not_constant, DestType); 879732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 880d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 881d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 88232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return Error(CastLoc, diag::err_expr_not_constant, DestType); 883732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 884732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // Determine whether we are converting to unsigned or signed. 885732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner bool DestSigned = DestType->isSignedIntegerType(); 886732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 887732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Warning for overflow. 888ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen uint64_t Space[4]; 889ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen bool ignored; 890d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman (void)F.convertToInteger(Space, DestWidth, DestSigned, 891ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen llvm::APFloat::rmTowardZero, &ignored); 892732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result = llvm::APInt(DestWidth, 4, Space); 893732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(!DestSigned); 894b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 895a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 8962bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 897f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 898d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 899d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 900d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 901d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 902d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator 903d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 904d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 905d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 906d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 907d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 908d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 909d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 910d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 911d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 912d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 913d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 914d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 915019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 916d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 9175db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 918d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 919d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 9204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 9214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 922d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 923d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 924d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 925d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 926d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 927d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 928d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 929019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 930019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner switch (E->isBuiltinCall()) { 93134a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 932019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 933019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 934019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 935019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 936019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 9377cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 9387cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 9397cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 94034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 94134a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 9427cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 9439e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner 9449e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 9459e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 9469e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 9479e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // If this is __builtin_nan("") turn this into a simple nan, otherwise we 9489e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 9499e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (const StringLiteral *S = 9509e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 9519e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (!S->isWide() && S->getByteLength() == 0) { // empty string. 9527cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 9537cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 9549e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner Result = llvm::APFloat::getNaN(Sem); 9559e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 9569e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 9579e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 9589e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 9595db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9605db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 9615db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 9625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 9635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 9645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 9655db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9665db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 9675db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 9685db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 9695db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9705db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysign: 9715db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignf: 9725db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 9735db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 9745db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 9755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 9765db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 9775db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 9785db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 9795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 980019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 981019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 982019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 9835db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 984a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 985a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 986a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 9875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 9885db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 9895db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9905db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 9915db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 9925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Plus: 9935db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 9945db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 9955db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 9965db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 9975db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 9985db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 999019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1000d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1001d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1002d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 10035db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1004d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1005d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1006d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1007d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1008d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1009d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1010d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1011d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1012d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1013d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1014d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1015d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1016d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1017d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1018d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1019d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1020d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1021d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1022d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1023d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Rem: 1024d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.mod(RHS, APFloat::rmNearestTiesToEven); 1025d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1026d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1027d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1028d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1029d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1030d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1031d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1032d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1033d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 10344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 10354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 10364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const llvm::fltSemantics& destSemantics = 10374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Info.Ctx.getFloatTypeSemantics(E->getType()); 10384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 10394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 10404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 10414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 10424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat(destSemantics, 1); 10434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.convertFromAPInt(IntResult, IntResult.isSigned(), 10444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat::rmNearestTiesToEven); 10454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 10474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 10484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 10494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 10504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool ignored; 10514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.convert(destSemantics, APFloat::rmNearestTiesToEven, &ignored); 10524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 10544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 10554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 10564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 10574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 10584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 10594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 10604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 10624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1063d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 10649ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson// Complex Float Evaluation 10659ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 10669ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10679ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 10689ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonclass VISIBILITY_HIDDEN ComplexFloatExprEvaluator 10699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson : public StmtVisitor<ComplexFloatExprEvaluator, APValue> { 10709ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 10719ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10729ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 10739ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson ComplexFloatExprEvaluator(EvalInfo &info) : Info(info) {} 10749ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10759ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 10769ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 10779ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 10789ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10799ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 10809ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson assert(0 && "This should be called on complex floats"); 10819ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 10829ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 10839ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10849ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 10859ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10869ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 10879ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APFloat Result(0.0); 10889ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 10899ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 10909ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10919ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(APFloat(0.0), Result); 10929ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 10939ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1094ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1095ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1096ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1097ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (SubExpr->getType()->isRealFloatingType()) { 1098ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 1099ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1100ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1101ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1102ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1103ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(Result, APFloat(0.0)); 1104ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1105ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1106ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1107ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1108ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1109ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1110ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1111ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 11129ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 11139ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 11149ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 11159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonstatic bool EvaluateComplexFloat(const Expr *E, APValue &Result, EvalInfo &Info) 11169ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{ 11179ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson Result = ComplexFloatExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 11189ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return Result.isComplexFloat(); 11199ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 11209ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1121ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders CarlssonAPValue ComplexFloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) 1122ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{ 1123ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 1124ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1125ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateComplexFloat(E->getLHS(), Result, Info)) 1126ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1127ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1128ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateComplexFloat(E->getRHS(), RHS, Info)) 1129ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1130ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1131ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1132ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1133ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1134ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1135ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1136ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1137ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1138ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1139ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1140ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1141ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1142ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1143ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1144ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1145ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1146ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1147ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 11489ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 11496ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1150f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1151f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 11526ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1153019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1154019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1155019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 11566ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattnerbool Expr::Evaluate(APValue &Result, ASTContext &Ctx) const { 115787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo Info(Ctx); 115806a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson if (getType()->isIntegerType()) { 1159d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APSInt sInt(32); 116087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluateInteger(this, sInt, Info)) { 116106a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson Result = APValue(sInt); 116206a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson return true; 116306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 1164d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isPointerType()) { 1165d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (EvaluatePointer(this, Result, Info)) { 1166d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1167d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1168d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1169d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 1170d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (EvaluateFloat(this, f, Info)) { 1171d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = APValue(f); 1172d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1173d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 11749ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } else if (getType()->isComplexType()) { 11759ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson if (EvaluateComplexFloat(this, Result, Info)) 11769ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return true; 11779ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 1178165a70fd0b75a4f23456531824e1b76a9f1c4f9cAnders Carlsson 1179c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson return false; 1180c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson} 118145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner 11826ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 118345b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 118445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 118545b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner APValue V; 11866ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner return Evaluate(V, Ctx); 118745b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 118851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 118951fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 119051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson APValue V; 119151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson bool Result = Evaluate(V, Ctx); 119251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 119351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(V.isInt() && "Expression did not evaluate to integer"); 119451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 119551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson return V.getInt(); 119651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 1197