ExprConstant.cpp revision 1c0cfd4599e816cfd7a8f348286bf0ad79652ffc
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 4254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson /// EvalResult - Contains information about the evaluation. 4354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Expr::EvalResult &EvalResult; 44f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 45f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson /// ShortCircuit - will be greater than zero if the current subexpression has 46f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson /// will not be evaluated because it's short-circuited (according to C rules). 47f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson unsigned ShortCircuit; 4854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 4954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx), 50f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson EvalResult(evalresult), ShortCircuit(0) {} 5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner}; 5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info); 5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info); 5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 57d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 589ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonstatic bool EvaluateComplexFloat(const Expr *E, APValue &Result, 599ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info); 60f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 61f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) { 664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isPointerType()) { 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Is this accurate for all kinds of bases? If not, what would 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // the check look like? 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = PointerResult.getLValueBase() || PointerResult.getLValueOffset(); 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator 964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 1014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 1038a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#if 0 1044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Remove this when we support more expressions. 1054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman printf("Unhandled pointer statement\n"); 1064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman S->dump(); 1078a7b7c6d4c96ace3667204bed4a48bad91b7c0f0Daniel Dunbar#endif 1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 11235873c49adad211ff466e34342a52665742794f5Anders Carlsson APValue VisitDeclRefExpr(DeclRefExpr *E); 1134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); } 1144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 1154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 1164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); } 1173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E); 1184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 1194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 1204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) { 1224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result.isLValue(); 1244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 12635873c49adad211ff466e34342a52665742794f5Anders CarlssonAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) 12735873c49adad211ff466e34342a52665742794f5Anders Carlsson{ 12835873c49adad211ff466e34342a52665742794f5Anders Carlsson if (!E->hasGlobalStorage()) 12935873c49adad211ff466e34342a52665742794f5Anders Carlsson return APValue(); 13035873c49adad211ff466e34342a52665742794f5Anders Carlsson 13135873c49adad211ff466e34342a52665742794f5Anders Carlsson return APValue(E, 0); 13235873c49adad211ff466e34342a52665742794f5Anders Carlsson} 13335873c49adad211ff466e34342a52665742794f5Anders Carlsson 1344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 1354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isFileScope()) 1364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(E, 0); 1374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1394efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 1414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 1424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 1434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 1444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 1454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType()->getAsPointerType()->getPointeeType(); 1474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 1484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 1494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman RecordDecl *RD = Ty->getAsRecordType()->getDecl(); 1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman FieldDecl *FD = E->getMemberDecl(); 1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 15944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned i = 0; 16044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor for (RecordDecl::field_iterator Field = RD->field_begin(), 16144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor FieldEnd = RD->field_end(); 16244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Field != FieldEnd; (void)++Field, ++i) { 16344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (*Field == FD) 1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 1684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.getLValueOffset() + RL.getFieldOffset(i) / 8); 1694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 1714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1733068d117951a8df54bae9db039b56201ab10962bAnders CarlssonAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) 1743068d117951a8df54bae9db039b56201ab10962bAnders Carlsson{ 1753068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 1763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1773068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 1783068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 1793068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1803068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 1813068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 1823068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 1833068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8; 1853068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1863068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t Offset = Index.getSExtValue() * ElementSize; 1873068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setLValue(Result.getLValueBase(), 1883068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.getLValueOffset() + Offset); 1893068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 1903068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 1914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 193f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 194f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 195f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 196c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 1972bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator 1982bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 19987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 2002bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 2012bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 20287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 203f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2042bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 2052bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 2062bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 2072bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 2082bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 2092bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 210650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 211650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitCastExpr(const CastExpr* E); 2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitUnaryOperator(const UnaryOperator *E); 2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman { return APValue(E, 0); } 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 2162bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 217f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 2182bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 21987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 220f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner if (!E->getType()->isPointerType()) 221f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 22287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 223f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 224f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 225650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 226f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 227650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 228650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 229650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 230650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 231650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 232650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 233650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 234f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 235650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 236650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 23787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 238650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 239f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 240650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 24187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 242650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 243650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 2444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType PointeeType = PExp->getType()->getAsPointerType()->getPointeeType(); 2454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman uint64_t SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8; 2464efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 247650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson uint64_t Offset = ResultLValue.getLValueOffset(); 2484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 249650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 251650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 254650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(ResultLValue.getLValueBase(), Offset); 255650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 2564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getOpcode() == UnaryOperator::Extension) { 2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: Deal with warnings? 2604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Visit(E->getSubExpr()); 2614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getOpcode() == UnaryOperator::AddrOf) { 2644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 2654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 2664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 2674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 271d407a7619904c81d38b41a9ee850de413105084bAnders Carlsson 272650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 273b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 274650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr* SubExpr = E->getSubExpr(); 275650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 276650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Check for pointer->pointer cast 277650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (SubExpr->getType()->isPointerType()) { 278650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue Result; 27987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluatePointer(SubExpr, Result, Info)) 280650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 281f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return APValue(); 282650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 283650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 284d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman if (SubExpr->getType()->isIntegralType()) { 285650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt Result(32); 28687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluateInteger(SubExpr, Result, Info)) { 28787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result.extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 288650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(0, Result.getZExtValue()); 289650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 290650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 2914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isFunctionType() || 2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SubExpr->getType()->isArrayType()) { 2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman //assert(0 && "Unhandled cast"); 301650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 302650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 3054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 3064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 3074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 3144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 316f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 317f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 318f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 319f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 320f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 321f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 322f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator 323b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 32487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 325b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner APSInt &Result; 326f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 32787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner IntExprEvaluator(EvalInfo &info, APSInt &result) 32887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 329f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3307a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner unsigned getIntTypeSizeInBits(QualType T) const { 33154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return (unsigned)Info.Ctx.getIntWidth(T); 33254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner } 33354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 33482206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Extension(SourceLocation L, diag::kind D, const Expr *E) { 33554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 33654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 33782206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 33854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return true; // still a constant. 33954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner } 34054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 34182206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 34254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // If this is in an unevaluated portion of the subexpression, ignore the 34354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // error. 344f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson if (Info.ShortCircuit) { 34532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // If error is ignored because the value isn't evaluated, get the real 34632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // type at least to prevent errors downstream. 34782206e267ce6cc709797127616f64672d255b310Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 34882206e267ce6cc709797127616f64672d255b310Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 34954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return true; 35032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 35154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 35232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 35354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson if (Info.EvalResult.Diag == 0) { 35454da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 35554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 35682206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 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) { 3710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 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) { 40582206e267ce6cc709797127616f64672d255b310Anders Carlsson return HandleCast(E); 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: 42382206e267ce6cc709797127616f64672d255b310Anders Carlsson bool HandleCast(CastExpr* E); 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(); 435e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // FIXME: This is an ugly hack around the fact that enums don't set their 436e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // signedness consistently; see PR3173 437e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman Result.setIsUnsigned(!E->getType()->isSignedIntegerType()); 4384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner return true; 4394c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 4404c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 4414c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 4420e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 4434c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 4444c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 445a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 446a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 447a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 448a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 449a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 450a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 451a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 452a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 453a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 454a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 455a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 456a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 457a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 458a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 459a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 460a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 461a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // If no argument was supplied, default to "no_type_class". This isn't 462a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 463a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 464a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 465a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 466a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 467a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 468a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 469a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 470a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 471a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 472a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 473a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 474a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 475a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 476a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 477a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 478a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 479a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 480a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 481a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 482a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 483a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 484a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 485a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 486a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 487a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 488a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 489a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 490a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 491a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 492a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 493a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 494a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 495a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 496a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 497a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 498a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 499a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 5004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 5014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 5024c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 503019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner switch (E->isBuiltinCall()) { 504019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 5050e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 506019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 507a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Result.setIsSigned(true); 508a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner Result = EvaluateBuiltinClassifyType(E); 509019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner return true; 510019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 5114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 512019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 513019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 5144bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result = E->getArg(0)->isEvaluatable(Info.Ctx); 515019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner return true; 516019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 5174c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 518f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 519b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 520a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 521027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson if (!Visit(E->getRHS())) 522027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return false; 5234fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 5244fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson if (!Info.ShortCircuit) { 5254fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson // If we can't evaluate the LHS, it must be because it has 5264fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson // side effects. 5274fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson if (!E->getLHS()->isEvaluatable(Info.Ctx)) 5284fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson Info.EvalResult.HasSideEffects = true; 5294fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 5300e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E); 5314fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson } 532c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 533027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return true; 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 539fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 54051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 541fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getLHS(), lhsResult, 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 544fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (lhsResult == (E->getOpcode() == BinaryOperator::LOr) || 545fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !lhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 5464bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 5474bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 548fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = lhsResult; 5494bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson 550f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson Info.ShortCircuit++; 551fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool rhsEvaluated = HandleConversionToBool(E->getRHS(), rhsResult, Info); 552f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson Info.ShortCircuit--; 553f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 554fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (rhsEvaluated) 555fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson return true; 556fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 557fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // FIXME: Return an extension warning saying that the RHS could not be 558fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // evaluated. 5594bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return true; 560a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 561a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 562fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 5634bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 5644bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 5654bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if (E->getOpcode() == BinaryOperator::LOr) 566fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = lhsResult || rhsResult; 5674bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 568fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = lhsResult && rhsResult; 5694bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return true; 5704bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 5714bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 572fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 5734bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 5744bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 575fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) || 576fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 5774bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 5784bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 579fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Result = rhsResult; 580fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 581fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // Since we werent able to evaluate the left hand side, it 582fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 583fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Info.EvalResult.HasSideEffects = true; 584fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson 5854bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson return true; 5864bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 5874bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 588a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 589a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 590a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 591c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 59254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 593286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 594286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 595286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 596286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 597286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 598286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 599286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 600286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 601286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 602286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 603286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 604286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 605286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 606286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 607529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 608529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 609529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 610286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 611286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 612286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 613286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 614286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpLessThan; 615286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 616286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 617286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan; 618286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 619286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 620286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual; 621286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 622286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 623286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual; 624286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 625286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 626286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpEqual; 627286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 628286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 629286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result = CR == APFloat::cmpGreaterThan || CR == APFloat::cmpLessThan; 630286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson break; 631286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 632286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 633286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 634286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return true; 635286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 636286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson 6373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (E->getOpcode() == BinaryOperator::Sub) { 638529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 6393068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 6403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 6413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 6423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 6443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 6453068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 6463068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6473068d117951a8df54bae9db039b56201ab10962bAnders Carlsson // FIXME: Is this correct? What if only one of the operands has a base? 6483068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (LHSValue.getLValueBase() || RHSValue.getLValueBase()) 6493068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 6503068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson const QualType Type = E->getLHS()->getType(); 6523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson const QualType ElementType = Type->getAsPointerType()->getPointeeType(); 6533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset(); 6553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson D /= Info.Ctx.getTypeSize(ElementType) / 8; 6563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 658529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson Result = D; 6593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 6603068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 6613068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return true; 6623068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 6633068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 664286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 665286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 666a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 667a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 668a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // FIXME: Deal with EQ and friends. 669a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 670a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 671a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 672a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 673a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman llvm::APSInt RHS(32); 674a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!Visit(E->getLHS())) { 675a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 676a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 677d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 678d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 679d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // FIXME Maybe we want to succeed even where we can't evaluate the 680d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // right side of LAnd/LOr? 681d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman // For example, see http://llvm.org/bugs/show_bug.cgi?id=2525 68254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (!EvaluateInteger(E->getRHS(), RHS, Info)) 683b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 684a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 685a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 68632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 6870e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 68854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Mul: Result *= RHS; return true; 68954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Add: Result += RHS; return true; 69054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Sub: Result -= RHS; return true; 69154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::And: Result &= RHS; return true; 69254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Xor: Result ^= RHS; return true; 69354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::Or: Result |= RHS; return true; 694a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 69554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 6960e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 697b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result /= RHS; 69832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner break; 699a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 70054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 7010e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 702a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result %= RHS; 70332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner break; 704a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Shl: 70554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 706b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result <<= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1); 707a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson break; 708a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Shr: 709b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner Result >>= (unsigned)RHS.getLimitedValue(Result.getBitWidth()-1); 710a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson break; 711b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner 712ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::LT: 713ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result < RHS; 714ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 715ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 716ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::GT: 717ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result > RHS; 718ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 719ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 720ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::LE: 721ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result <= RHS; 722ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 723ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 724ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::GE: 725ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result >= RHS; 726ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 727ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 728ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::EQ: 729ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result == RHS; 730ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 731ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 732ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner case BinaryOperator::NE: 733ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result = Result != RHS; 734ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 735ac7cb603979a0e5a6a216ccbd20eee7647c96b54Chris Lattner break; 73654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::LAnd: 73754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result = Result != 0 && RHS != 0; 73854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 73954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner break; 74054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner case BinaryOperator::LOr: 74154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result = Result != 0 || RHS != 0; 74254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 74354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner break; 744b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 745a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 746a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 747b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 748a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 749a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 750ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 751a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 752a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 753ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 754ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 755a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 756ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 757ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 7580518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 7590518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 7600518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 7610518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType DstTy = E->getType(); 762fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // Return the result in the right width. 763fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(DstTy)); 764fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result.setIsUnsigned(DstTy->isUnsignedIntegerType()); 765fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 7660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 7670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 768fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(void) and __alignof__(void) = 1 as a gcc extension. 7694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SrcTy->isVoidType()) { 770fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result = 1; 7714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 7724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 773fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 774fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 7754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: But alignof(vla) is! 776fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (!SrcTy->isConstantSizeType()) { 777fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // FIXME: Should we attempt to evaluate this? 778fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 779fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner } 7800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 7810518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool isSizeOf = E->isSizeOf(); 782fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 783fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // GCC extension: sizeof(function) = 1. 784fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (SrcTy->isFunctionType()) { 785fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // FIXME: AlignOf shouldn't be unconditionally 4! 786fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner Result = isSizeOf ? 1 : 4; 787fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return true; 788fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner } 789fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 790fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // Get information about the size or align. 79187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 792fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner if (isSizeOf) 7934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = Info.Ctx.getTypeSize(SrcTy) / CharSize; 794fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner else 79587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = Info.Ctx.getTypeAlign(SrcTy) / CharSize; 796fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return true; 797fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 798fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 799b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 8004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 8014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 80275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner if (E->isOffsetOfOp()) { 8034c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 80487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = E->evaluateOffsetOf(Info.Ctx); 80575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 80675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return true; 80775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner } 808a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 809a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 810a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 811a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 812a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 813a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 814a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result.zextOrTrunc(getIntTypeSizeInBits(E->getType())); 815a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 816a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman Result = !bres; 817a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return true; 818a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 819a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 82087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 82187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 82275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 823a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 82475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 8254c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 82675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 82775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 8280e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 82975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 8304c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 8314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 83275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 8334c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // The result is always just the subexpr. 83475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 83575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 83675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result = -Result; 83775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 83875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 83975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner Result = ~Result; 84075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner break; 84106a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 84206a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 843a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson Result.setIsUnsigned(E->getType()->isUnsignedIntegerType()); 844b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 845a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 846a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 847732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 848732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 84982206e267ce6cc709797127616f64672d255b310Anders Carlssonbool IntExprEvaluator::HandleCast(CastExpr *E) { 85082206e267ce6cc709797127616f64672d255b310Anders Carlsson Expr *SubExpr = E->getSubExpr(); 85182206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 85282206e267ce6cc709797127616f64672d255b310Anders Carlsson 8537a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner unsigned DestWidth = getIntTypeSizeInBits(DestType); 85406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson 8554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 8564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 8574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 8584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 8594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.zextOrTrunc(DestWidth); 8604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 8614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = BoolResult; 8624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 8634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 8644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 865a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 866a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (SubExpr->getType()->isIntegralType()) { 867732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 868b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 8692bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 870a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Figure out if this is a truncate, extend or noop cast. 871a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // If the input is signed, do a sign extend, noop, or truncate. 8724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.extOrTrunc(DestWidth); 873732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 874732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return true; 875732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 876732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 877732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 878732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (SubExpr->getType()->isPointerType()) { 879a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 88087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 881b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 8824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 883a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson if (LV.getLValueBase()) 884b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 8854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 886559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson Result.extOrTrunc(DestWidth); 887559e56b3a201316ae0b7e7389879a8054f6a3a82Anders Carlsson Result = LV.getLValueOffset(); 888732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 889732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner return true; 8902bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 8914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 892732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!SubExpr->getType()->isRealFloatingType()) 8930e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 894732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 895d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 896d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 8970e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 898732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 899732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // Determine whether we are converting to unsigned or signed. 900732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner bool DestSigned = DestType->isSignedIntegerType(); 901732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 902732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Warning for overflow. 903ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen uint64_t Space[4]; 904ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen bool ignored; 905d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman (void)F.convertToInteger(Space, DestWidth, DestSigned, 906ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen llvm::APFloat::rmTowardZero, &ignored); 907732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result = llvm::APInt(DestWidth, 4, Space); 908732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner Result.setIsUnsigned(!DestSigned); 909b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return true; 910a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 9112bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 912f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 913d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 914d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 915d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 916d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 917d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator 918d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 919d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 920d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 921d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 922d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 923d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 924d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 925d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 926d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 927d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 928d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 929d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 930019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 931d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 9325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 933d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 934d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 9354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 9364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 937d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 938d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 939d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 940d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 941d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 942d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 943d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 944019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 945019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner switch (E->isBuiltinCall()) { 94634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 947019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 948019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 949019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 950019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 951019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 9527cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 9537cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 9547cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 95534a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 95634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 9577cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 9589e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner 9599e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 9609e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 9619e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 9629e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // If this is __builtin_nan("") turn this into a simple nan, otherwise we 9639e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 9649e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (const StringLiteral *S = 9659e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 9669e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner if (!S->isWide() && S->getByteLength() == 0) { // empty string. 9677cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 9687cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 9699e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner Result = llvm::APFloat::getNaN(Sem); 9709e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 9719e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 9729e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 9739e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 9745db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 9765db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 9775db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 9785db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 9795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 9805db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9815db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 9825db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 9835db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 9845db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 9855db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysign: 9865db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignf: 9875db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 9885db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 9895db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 9905db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 9915db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 9925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 9935db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 9945db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 995019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 996019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 997019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 9985db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 999a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 1000a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 1001a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 10025db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 10035db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 10045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 10055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 10065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 10075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Plus: 10085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 10095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 10105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 10115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 10125db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 10135db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 1014019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1015d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1016d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1017d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 10185db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1019d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1020d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1021d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1022d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1023d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1024d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1025d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1026d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1027d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1028d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1029d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1030d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1031d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1032d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1033d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1034d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1035d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1036d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1037d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1038d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Rem: 1039d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.mod(RHS, APFloat::rmNearestTiesToEven); 1040d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1041d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1042d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1043d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1044d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1045d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1046d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1047d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1048d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 10494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 10504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 10514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const llvm::fltSemantics& destSemantics = 10524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Info.Ctx.getFloatTypeSemantics(E->getType()); 10534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 10544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 10554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 10564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 10574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat(destSemantics, 1); 10584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.convertFromAPInt(IntResult, IntResult.isSigned(), 10594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat::rmNearestTiesToEven); 10604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 10624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 10634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 10644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 10654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool ignored; 10664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result.convert(destSemantics, APFloat::rmNearestTiesToEven, &ignored); 10674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 10694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 10704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 10714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 10724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 10734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 10744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 10754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 10764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 10774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1078d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 10799ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson// Complex Float Evaluation 10809ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 10819ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10829ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 10839ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonclass VISIBILITY_HIDDEN ComplexFloatExprEvaluator 10849ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson : public StmtVisitor<ComplexFloatExprEvaluator, APValue> { 10859ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 10869ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10879ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 10889ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson ComplexFloatExprEvaluator(EvalInfo &info) : Info(info) {} 10899ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10909ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 10919ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 10929ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 10939ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10949ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 10959ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 10969ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 10979ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 10989ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 10999ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 11009ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 11019ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APFloat Result(0.0); 11029ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 11039ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 11049ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 11059ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(APFloat(0.0), Result); 11069ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 11079ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1108ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1109ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1110ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1111ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (SubExpr->getType()->isRealFloatingType()) { 1112ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 1113ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1114ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1115ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1116ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1117ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(Result, APFloat(0.0)); 1118ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1119ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1120ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1121ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1122ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1123ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1124ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1125ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 11269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 11279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 11289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 11299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonstatic bool EvaluateComplexFloat(const Expr *E, APValue &Result, EvalInfo &Info) 11309ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson{ 11319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson Result = ComplexFloatExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 11329ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return Result.isComplexFloat(); 11339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 11349ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1135ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders CarlssonAPValue ComplexFloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) 1136ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson{ 1137ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 1138ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1139ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateComplexFloat(E->getLHS(), Result, Info)) 1140ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1141ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1142ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateComplexFloat(E->getRHS(), RHS, Info)) 1143ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1144ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1145ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1146ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1147ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1148ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1149ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1150ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1151ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1152ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1153ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1154ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1155ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1156ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat::rmNearestTiesToEven); 1157ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1158ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1159ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1160ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1161ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 11629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 11636ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1164f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1165f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 11666ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1167019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1168019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1169019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 11705b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { 11715b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson EvalInfo Info(Ctx, Result); 117254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 117306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson if (getType()->isIntegerType()) { 1174d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APSInt sInt(32); 11756dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateInteger(this, sInt, Info)) 11766dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 11776dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 11785b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(sInt); 1179d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isPointerType()) { 11805b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluatePointer(this, Result.Val, Info)) 11816dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1182d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1183d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 11846dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateFloat(this, f, Info)) 11856dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 11866dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 11875b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(f); 11889ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } else if (getType()->isComplexType()) { 11895b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluateComplexFloat(this, Result.Val, Info)) 11906dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 11919d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson } else 11929d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson return false; 11936dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 11945b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson return true; 11955b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson} 11965b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 11976ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 119845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 119945b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 12004fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 12014fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson return Evaluate(Result, Ctx) && !Result.HasSideEffects; 120245b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 120351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 120451fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 12051c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 12061c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson bool Result = Evaluate(EvalResult, Ctx); 120751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 12081c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 120951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 12101c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 121151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 1212