ExprConstant.cpp revision 21fb98ee003e992b0c4e204d98a19e0ef544cae3
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" 1619cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 170fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h" 18500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h" 191b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 2006a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h" 217462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.h" 22c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson#include "llvm/Support/Compiler.h" 234572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump#include <cstring> 244572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump 25c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang; 26f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt; 27d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat; 28c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture 3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded. It retains information 3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded 3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression. 3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C 3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression. If not, this struct 3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not. 3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding 3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C 4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules. For example, the RHS of (0 && foo()) is not evaluated. We can 4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows 4287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations. 4387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstruct EvalInfo { 4487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner ASTContext &Ctx; 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson /// EvalResult - Contains information about the evaluation. 4754da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Expr::EvalResult &EvalResult; 48f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 49b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman /// AnyLValue - Stack based LValue results are not discarded. 50b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman bool AnyLValue; 51b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 52b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult, 53b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman bool anylvalue = false) 54b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman : Ctx(ctx), EvalResult(evalresult), AnyLValue(anylvalue) {} 5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner}; 5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 5787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info); 5987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info); 6087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 6169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue &Result, EvalInfo &Info); 62d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 63a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info); 64f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 65f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 695bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedmanstatic bool EvalPointerValueAsBool(APValue& Value, bool& Result) { 705bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // FIXME: Is this accurate for all kinds of bases? If not, what would 715bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // the check look like? 725bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman Result = Value.getLValueBase() || Value.getLValueOffset(); 735bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return true; 745bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman} 755bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman 764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) { 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 89a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->hasPointerRepresentation()) { 904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 935bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return EvalPointerValueAsBool(PointerResult, Result); 94a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->isAnyComplexType()) { 95a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman APValue ComplexResult; 96a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (!EvaluateComplex(E, ComplexResult, Info)) 97a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return false; 98a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (ComplexResult.isComplexFloat()) { 99a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = !ComplexResult.getComplexFloatReal().isZero() || 100a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman !ComplexResult.getComplexFloatImag().isZero(); 101a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else { 102a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = ComplexResult.getComplexIntReal().getBoolValue() || 103a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman ComplexResult.getComplexIntImag().getBoolValue(); 104a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } 105a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 1064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 112a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool DestSigned = DestType->isSignedIntegerType(); 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar uint64_t Space[4]; 119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar (void)Value.convertToInteger(Space, DestWidth, DestSigned, 121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar llvm::APFloat::rmTowardZero, &ignored); 122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned); 123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.convert(Ctx.getFloatTypeSemantics(DestType), 130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 135a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 136a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.extOrTrunc(DestWidth); 141a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 142a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 143a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 144a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 146a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 147a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 149a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 150a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 151a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 152a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 153a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 1584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator 1594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 1664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 1674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 17035873c49adad211ff466e34342a52665742794f5Anders Carlsson APValue VisitDeclRefExpr(DeclRefExpr *E); 1713aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff APValue VisitBlockExpr(BlockExpr *E); 1724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); } 1734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 1744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 1754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); } 176eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E, 0); } 1773068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E); 178e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue VisitUnaryDeref(UnaryOperator *E); 179ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 180ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 181ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 182ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 183ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__, __imag__ 1844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 1854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 1864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) { 1884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result.isLValue(); 1904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) { 19350c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (isa<FunctionDecl>(E->getDecl())) { 19450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(E, 0); 19550c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) { 196b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman if (!Info.AnyLValue && !VD->hasGlobalStorage()) 197d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman return APValue(); 19850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (!VD->getType()->isReferenceType()) 19950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(E, 0); 200d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman // FIXME: Check whether VD might be overridden! 20150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (VD->getInit()) 20250c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return Visit(VD->getInit()); 20350c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman } 20450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 20550c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(); 20635873c49adad211ff466e34342a52665742794f5Anders Carlsson} 20735873c49adad211ff466e34342a52665742794f5Anders Carlsson 2081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E) { 2093aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff if (E->hasBlockDeclRefExprs()) 2103aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff return APValue(); 2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2123aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff return APValue(E, 0); 2133aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff} 2143aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 216b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman if (!Info.AnyLValue && !E->isFileScope()) 217b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return APValue(); 218b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return APValue(E, 0); 2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 2234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 2254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 2264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2276217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); 2284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 2294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 2304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 2314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 2334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2356217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = Ty->getAs<RecordType>()->getDecl(); 2364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 23786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 23886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 23986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (!FD) // FIXME: deal with other kinds of member expressions 24086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return APValue(); 2412be586108bb401019647791feca19ea03fd477ceEli Friedman 2422be586108bb401019647791feca19ea03fd477ceEli Friedman if (FD->getType()->isReferenceType()) 2432be586108bb401019647791feca19ea03fd477ceEli Friedman return APValue(); 2442be586108bb401019647791feca19ea03fd477ceEli Friedman 2454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 24644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned i = 0; 24717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RD->field_begin(), 24817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RD->field_end(); 24944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Field != FieldEnd; (void)++Field, ++i) { 25044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (*Field == FD) 2514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 2554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.getLValueOffset() + RL.getFieldOffset(i) / 8); 2564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 2584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 2613068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2633068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 2643068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2663068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 2673068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 2683068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 2693068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2703068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8; 2713068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 2723068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t Offset = Index.getSExtValue() * ElementSize; 2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setLValue(Result.getLValueBase(), 2743068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.getLValueOffset() + Offset); 2753068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 2763068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 2774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) { 279e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue Result; 280e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 281e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return APValue(); 282e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return Result; 283e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 284e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 2854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 286f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 287f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 288f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 289c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 2902bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator 2912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 29287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 2932bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 296f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 2972bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 2982bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 2992bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 3002bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 3012bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 3022bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 303650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 304650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitCastExpr(const CastExpr* E); 3052217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 3062217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman { return Visit(E->getSubExpr()); } 3072217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryAddrOf(const UnaryOperator *E); 3084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 3094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman { return APValue(E, 0); } 310f01158941ba4560c63150032073bb231ce38999eEli Friedman APValue VisitAddrLabelExpr(AddrLabelExpr *E) 311f01158941ba4560c63150032073bb231ce38999eEli Friedman { return APValue(E, 0); } 3123941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman APValue VisitCallExpr(CallExpr *E); 313b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump APValue VisitBlockExpr(BlockExpr *E) { 314b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump if (!E->hasBlockDeclRefExprs()) 315b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(E, 0); 316b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(); 317b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 31891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) 31991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return APValue((Expr*)0, 0); } 3204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 321ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(ChooseExpr *E) 3226e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return Visit(E->getChosenSubExpr(Info.Ctx)); } 3236e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) 3246e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return APValue((Expr*)0, 0); } 325ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 3262bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 327f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 3282bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 32987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 3308958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar if (!E->getType()->hasPointerRepresentation()) 331f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 33287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 333f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 334f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 335650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 336f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 338650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 339650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 341650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 342650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 343650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 344f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 346650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 34787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 348650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 350650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 35187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 352650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 353650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 3546217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType PointeeType = PExp->getType()->getAs<PointerType>()->getPointeeType(); 3554d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson uint64_t SizeOfPointee; 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3574d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson // Explicitly handle GNU void* and function pointer arithmetic extensions. 3584d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson if (PointeeType->isVoidType() || PointeeType->isFunctionType()) 3594d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson SizeOfPointee = 1; 3604d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson else 3614d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8; 3624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 363650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson uint64_t Offset = ResultLValue.getLValueOffset(); 3644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 365650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 3664efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 367650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 3684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 3694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 370650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(ResultLValue.getLValueBase(), Offset); 371650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 3724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3732217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 3742217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue result; 3752217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 3762217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman return result; 3774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 3784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 380650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 381b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 382650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr* SubExpr = E->getSubExpr(); 383650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 384650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Check for pointer->pointer cast 38514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (SubExpr->getType()->isPointerType() || 386c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson SubExpr->getType()->isObjCObjectPointerType() || 387c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson SubExpr->getType()->isNullPtrType()) { 388650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue Result; 38987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluatePointer(SubExpr, Result, Info)) 390650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 391f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return APValue(); 392650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman if (SubExpr->getType()->isIntegralType()) { 39569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar APValue Result; 39669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(SubExpr, Result, Info)) 39769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return APValue(); 39869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 39969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (Result.isInt()) { 40069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 40169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return APValue(0, Result.getInt().getZExtValue()); 402650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar // Cast is of an lvalue, no need to change value. 40569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return Result; 406650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isFunctionType() || 4093aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff SubExpr->getType()->isBlockPointerType() || 4104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SubExpr->getType()->isArrayType()) { 4114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 4124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 4134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 4144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 4164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 417650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 4181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 419650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 4203941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) { 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (E->isBuiltinCall(Info.Ctx) == 4223c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor Builtin::BI__builtin___CFStringMakeConstantString) 4233941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(E, 0); 4243941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(); 4253941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman} 4263941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman 4274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 4284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 4294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 4304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 4334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 4354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 4364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 4374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 439f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 440f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 44359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 44459b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 44559b5da6d853b4368b984700315adf7b37de05764Nate Begeman class VISIBILITY_HIDDEN VectorExprEvaluator 44659b5da6d853b4368b984700315adf7b37de05764Nate Begeman : public StmtVisitor<VectorExprEvaluator, APValue> { 44759b5da6d853b4368b984700315adf7b37de05764Nate Begeman EvalInfo &Info; 44891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue GetZeroVector(QualType VecType); 44959b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45159b5da6d853b4368b984700315adf7b37de05764Nate Begeman VectorExprEvaluator(EvalInfo &info) : Info(info) {} 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45359b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitStmt(Stmt *S) { 45459b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 45559b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitParenExpr(ParenExpr *E) 45891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 45991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 46091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 46191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryPlus(const UnaryOperator *E) 46291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 46391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryReal(const UnaryOperator *E) 46491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 46591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) 46691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return GetZeroVector(E->getType()); } 46759b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCastExpr(const CastExpr* E); 46859b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 46959b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitInitListExpr(const InitListExpr *E); 47091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitConditionalOperator(const ConditionalOperator *E); 471ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 472ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 47391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryImag(const UnaryOperator *E); 47491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 4752217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 47691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 47791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 47891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 47959b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 48059b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 48159b5da6d853b4368b984700315adf7b37de05764Nate Begeman 48259b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 48359b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!E->getType()->isVectorType()) 48459b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 48559b5da6d853b4368b984700315adf7b37de05764Nate Begeman Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 48659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return !Result.isUninit(); 48759b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 48859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 48959b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 490183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VTy = E->getType()->getAs<VectorType>(); 491c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman QualType EltTy = VTy->getElementType(); 492c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned NElts = VTy->getNumElements(); 493c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned EltWidth = Info.Ctx.getTypeSize(EltTy); 4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49559b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr* SE = E->getSubExpr(); 496e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman QualType SETy = SE->getType(); 497e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APValue Result = APValue(); 49859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 499e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman // Check for vector->vector bitcast and scalar->vector splat. 500e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman if (SETy->isVectorType()) { 50159b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(SE)); 502e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } else if (SETy->isIntegerType()) { 503e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APSInt IntResult; 504d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar if (!EvaluateInteger(SE, IntResult, Info)) 505d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar return APValue(); 506d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar Result = APValue(IntResult); 507e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } else if (SETy->isRealFloatingType()) { 508e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APFloat F(0.0); 509d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar if (!EvaluateFloat(SE, F, Info)) 510d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar return APValue(); 511d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar Result = APValue(F); 512d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar } else 513c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 51459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 515c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // For casts of a scalar to ExtVector, convert the scalar to the element type 516c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // and splat it to all elements. 517c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (E->getType()->isExtVectorType()) { 518c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (EltTy->isIntegerType() && Result.isInt()) 519c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(), 520c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 521c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isIntegerType()) 522c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(), 523c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 524c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType() && Result.isInt()) 525c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(), 526c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 527c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType()) 528c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(), 529c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 530c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else 531c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 532c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 533c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // Splat and create vector APValue. 534c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman llvm::SmallVector<APValue, 4> Elts(NElts, Result); 535c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(&Elts[0], Elts.size()); 536e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } 537c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 538c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // For casts of a scalar to regular gcc-style vector type, bitcast the scalar 539c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // to the vector. To construct the APValue vector initializer, bitcast the 540c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // initializing value to an APInt, and shift out the bits pertaining to each 541c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // element. 542c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman APSInt Init; 543c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt(); 5441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 545c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman llvm::SmallVector<APValue, 4> Elts; 546c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman for (unsigned i = 0; i != NElts; ++i) { 547c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman APSInt Tmp = Init; 548c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Tmp.extOrTrunc(EltWidth); 5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 550c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (EltTy->isIntegerType()) 551c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Elts.push_back(APValue(Tmp)); 552c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType()) 553c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Elts.push_back(APValue(APFloat(Tmp))); 554c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else 555c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 556c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 557c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Init >>= EltWidth; 558c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman } 559c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(&Elts[0], Elts.size()); 56059b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 56159b5da6d853b4368b984700315adf7b37de05764Nate Begeman 5621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 56359b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 56459b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(E->getInitializer())); 56559b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 56659b5da6d853b4368b984700315adf7b37de05764Nate Begeman 5671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 56859b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 569183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = E->getType()->getAs<VectorType>(); 57059b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 57191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 5721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57359b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 57459b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::SmallVector<APValue, 4> Elements; 57559b5da6d853b4368b984700315adf7b37de05764Nate Begeman 57691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman for (unsigned i = 0; i < NumElements; i++) { 57759b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 57859b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 57991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 58091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateInteger(E->getInit(i), sInt, Info)) 58191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 58291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 58391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman sInt = Info.Ctx.MakeIntValue(0, EltTy); 58491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 58559b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(sInt)); 58659b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 58759b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 58891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 58991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateFloat(E->getInit(i), f, Info)) 59091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 59191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 59291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 59391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 59459b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(f)); 59559b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 59659b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 59759b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(&Elements[0], Elements.size()); 59859b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 59959b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 60191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) { 602183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = T->getAs<VectorType>(); 60391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 60491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 60591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 60691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 60791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 60891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 60991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 61091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 61191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 61291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(&Elements[0], Elements.size()); 61391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 61491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 61591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 61691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman bool BoolResult; 61791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 61891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 61991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 62091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 62191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 62291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue Result; 62391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EvaluateVector(EvalExpr, Result, Info)) 62491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return Result; 62591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 62691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 62791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 62891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 62991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 63091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Info.EvalResult.HasSideEffects = true; 63191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return GetZeroVector(E->getType()); 63291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 63391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 63459b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 635f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 636f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 637f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 638f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 639f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator 640b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 64187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 64230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue &Result; 643f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 64430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar IntExprEvaluator(EvalInfo &info, APValue &result) 64587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 646f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 6473f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar bool Success(const llvm::APSInt &SI, const Expr *E) { 6484fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 64930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.isSigned() == E->getType()->isSignedIntegerType() && 6503f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 65130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 6523f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 65330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(SI); 6543f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 6553f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 6563f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 657131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 6584fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 65930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 6603f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 66130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(APSInt(I)); 66230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType()); 663131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 664131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 665131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 666131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 6674fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 66830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); 669131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 670131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 671131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 67282206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 67332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 67454da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson if (Info.EvalResult.Diag == 0) { 67554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 67654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 67782206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 67832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 67954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 6807a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 682f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 683f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Visitor Methods 684f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitStmt(Stmt *) { 68732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert(0 && "This should be called on integers, stmts are not integers"); 68832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return false; 68932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitExpr(Expr *E) { 6920e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 693f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 695b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 696f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 6974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 698131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 6994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 701131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7024c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7034c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { 704ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // Per gcc docs "this built-in function ignores top level 705ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // qualifiers". We need to use the canonical version to properly 706ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // be able to strip CRV qualifiers from the type. 707ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1()); 708ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2()); 7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(), 710131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar T1.getUnqualifiedType()), 711131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 7124c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7134c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitDeclRefExpr(const DeclRefExpr *E); 7144c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCallExpr(const CallExpr *E); 715b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 716b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 717ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes bool VisitConditionalOperator(const ConditionalOperator *E); 718f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 719a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool VisitCastExpr(CastExpr* E); 7200518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E); 7210518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 7223068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 723131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7263f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 727131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 7283f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson } 7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { 731131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 7323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 7333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 734664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 735664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 736664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 737664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 73864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 7395e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor return Success(E->EvaluateTrait(Info.Ctx), E); 74064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 74164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 742ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) { 743ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman return Visit(E->getChosenSubExpr(Info.Ctx)); 744ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman } 745ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 746722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 747664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 748664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 749fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 750af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfExpr(const Expr *E); 751af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfType(QualType T); 752664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 753f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 754f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 755f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 75669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) { 7573f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!E->getType()->isIntegralType()) 7583f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return false; 7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 76069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 76169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 76269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 76369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 76430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue Val; 76569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt()) 76630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 76730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 76830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 769f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 770f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 7714c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 7724c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 7734c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) { 774e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // FIXME: This is an ugly hack around the fact that enums don't set their 7753f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // signedness consistently; see PR3173. 7763f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar APSInt SI = D->getInitVal(); 7773f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar SI.setIsUnsigned(!E->getType()->isSignedIntegerType()); 7783f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // FIXME: This is an ugly hack around the fact that enums don't 7793f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // set their width (!?!) consistently; see PR3173. 7803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar SI.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); 7813f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(SI, E); 7824c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 783b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 784b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl // In C++, const, non-volatile integers initialized with ICEs are ICEs. 785e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman // In C, they can also be folded, although they are not ICEs. 786e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman if (E->getType().getCVRQualifiers() == QualType::Const) { 787b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) { 78878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (APValue *V = D->getEvaluatedValue()) 78978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return Success(V->getInt(), E); 79078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (const Expr *Init = D->getInit()) { 79178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Visit(const_cast<Expr*>(Init))) { 79278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // Cache the evaluated value in the variable declaration. 79378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor D->setEvaluatedValue(Info.Ctx, Result); 79478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return true; 79578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 79678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 79778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return false; 79878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 799b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 800b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 801b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 8024c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 8030e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 8044c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 8054c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 806a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 807a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 808a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 809a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 8107c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 811a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 812a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 813a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 814a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 815a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 816a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 817a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 818a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 819a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 820a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 821a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If no argument was supplied, default to "no_type_class". This isn't 824a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 825a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 826a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 828a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 829a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 830a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 831a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 832a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 833a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 834a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 835a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 836a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 837a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 838a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 839a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 840a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 841a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 842a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 843a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 844a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 845a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 846a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 847a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 848a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 849a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 850a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 851a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 852a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 853a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 854a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 855a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 856a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 857a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 858a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 859a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 860a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 861a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 8624c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 8633c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 864019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 8650e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 866019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 867131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 8681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8694bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 870019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 871019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 872131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E); 87321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 87421fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case Builtin::BI__builtin_eh_return_data_regno: { 87521fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner int Operand = E->getArg(0)->EvaluateAsInt(Info.Ctx).getZExtValue(); 87621fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand); 87721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner return Success(Operand, E); 87821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 879019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 8804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 881f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 882b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 883a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 884027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson if (!Visit(E->getRHS())) 885027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return false; 8864fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 88733ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // If we can't evaluate the LHS, it might have side effects; 88833ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // conservatively mark it. 88933ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (!E->getLHS()->isEvaluatable(Info.Ctx)) 89033ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman Info.EvalResult.HasSideEffects = true; 891c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 892027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return true; 893a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 894a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 895a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 896a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 897a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 898fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 900fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) { 90151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 90251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 90333ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (lhsResult == (E->getOpcode() == BinaryOperator::LOr)) 9043f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 905a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 906fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 9074bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if (E->getOpcode() == BinaryOperator::LOr) 908131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 9094bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 910131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 9114bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 9124bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 913fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 9144bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 9154bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) || 917fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 918131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 919fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 920fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Info.EvalResult.HasSideEffects = true; 921131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 922131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 9234bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 9244bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 925a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 926a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 927a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 928c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 92954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 930286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 931286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 9324087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 9334087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 9344087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 9354087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APValue LHS, RHS; 9364087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 9374087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 9384087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 9394087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 9404087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 9414087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 9424087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 9434087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 9441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_r = 9454087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_i = 9474087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 9484087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 9494087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 950131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 951131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 952131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 953131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 954131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 9551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(((CR_r == APFloat::cmpGreaterThan || 956131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_r == APFloat::cmpLessThan) && 9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (CR_i == APFloat::cmpGreaterThan || 958131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpLessThan)), E); 959131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 9604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 9614087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 962131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 963131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 964131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 965131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 966131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 967131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 968131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 969131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 9704087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 9714087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 9721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 973286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 974286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 975286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 977286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 978286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 9791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 980286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 981286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 983286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 984529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 985286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 986286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 987286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 988286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 989131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 990286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 991131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 992286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 993131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 994286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 9951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 996131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 997286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 998131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 999286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan 1001131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar || CR == APFloat::cmpLessThan, E); 1002286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 1003286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 10041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1005ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 1006ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) { 10073068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 10083068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 10093068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 1010a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 10113068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 10123068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 10133068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 1014a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 10155bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // Reject any bases from the normal codepath; we special-case comparisons 10165bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // to null. 10175bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (LHSValue.getLValueBase()) { 10185bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 10195bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 10205bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (RHSValue.getLValueBase() || RHSValue.getLValueOffset()) 10215bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 10225bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman bool bres; 10235bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!EvalPointerValueAsBool(LHSValue, bres)) 10245bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 10255bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E); 10265bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } else if (RHSValue.getLValueBase()) { 10275bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 10285bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 10295bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (LHSValue.getLValueBase() || LHSValue.getLValueOffset()) 10305bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 10315bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman bool bres; 10325bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!EvalPointerValueAsBool(RHSValue, bres)) 10335bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 10345bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E); 10355bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } 1036a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1037ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub) { 1038ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman const QualType Type = E->getLHS()->getType(); 10396217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); 10403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1041ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset(); 1042ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman if (!ElementType->isVoidType() && !ElementType->isFunctionType()) 1043ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman D /= Info.Ctx.getTypeSize(ElementType) / 8; 1044a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1045ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(D, E); 1046ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 1047ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman bool Result; 1048ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::EQ) { 1049ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset(); 1050267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman } else { 1051ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset(); 1052ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 1053ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(Result, E); 10543068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 10553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 1056286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 1057286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 1058a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 1059a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 1060a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1061a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1062a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1063a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 106430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Visit(E->getLHS())) 1065a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 1066d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 106742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APValue RHSVal; 106842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info)) 106930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 107042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 107142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 107242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) { 107342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman uint64_t offset = Result.getLValueOffset(); 107442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add) 107542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset += RHSVal.getInt().getZExtValue(); 107642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 107742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset -= RHSVal.getInt().getZExtValue(); 107842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman Result = APValue(Result.getLValueBase(), offset); 107942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 108042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 108142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 108242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 108342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add && 108442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman RHSVal.isLValue() && Result.isInt()) { 108542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman uint64_t offset = RHSVal.getLValueOffset(); 108642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset += Result.getInt().getZExtValue(); 108742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman Result = APValue(RHSVal.getLValueBase(), offset); 108842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 108942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 109042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 109142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 109242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!Result.isInt() || !RHSVal.isInt()) 1093b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1094a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 109542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APSInt& RHS = RHSVal.getInt(); 109642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 1097a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 109832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 10990e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 110030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E); 110130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Add: return Success(Result.getInt() + RHS, E); 110230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E); 110330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::And: return Success(Result.getInt() & RHS, E); 110430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E); 110530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Or: return Success(Result.getInt() | RHS, E); 1106a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 110754176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 11080e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 110930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() / RHS, E); 1110a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 111154176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 11120e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 111330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() % RHS, E); 11143f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shl: { 111554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 11161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 111730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 111830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() << SA, E); 11193f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 11203f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shr: { 11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 112230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 112330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() >> SA, E); 11243f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 112630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LT: return Success(Result.getInt() < RHS, E); 112730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GT: return Success(Result.getInt() > RHS, E); 112830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E); 112930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E); 113030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E); 113130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::NE: return Success(Result.getInt() != RHS, E); 1132b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 1133a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 1134a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 1135ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 1136a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 1137a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 1138ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 1139ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1140a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 1141ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 1142ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1143af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) { 1144e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the alignment. 1145e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 114618857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 11472be586108bb401019647791feca19ea03fd477ceEli Friedman // __alignof is defined to return the preferred alignment. 114818857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize; 1149e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1150e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1151af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 1152af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 1153af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1154af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to 1 in those cases. 1156af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 1157b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar return Info.Ctx.getDeclAlignInBytes(DRE->getDecl()); 1158a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1159af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 1160b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl()); 1161af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1162e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 1163e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1164e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1165e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 11660518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 11670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 11680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 11690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType DstTy = E->getType(); 1170fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1171e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Handle alignof separately. 1172e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!E->isSizeOf()) { 1173e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 1174131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(GetAlignOfType(E->getArgumentType()), E); 1175e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 1176131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(GetAlignOfExpr(E->getArgumentExpr()), E); 1177e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 1178a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 11790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 11800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 1181131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 1182131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // extension. 1183131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar if (SrcTy->isVoidType() || SrcTy->isFunctionType()) 1184131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(1, E); 1185a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1186fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 1187e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!SrcTy->isConstantSizeType()) 1188fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 1189f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 1190e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the size. 119124cbfb96f09318f59dc73eaaf4909a79788ec5acDaniel Dunbar unsigned BitWidth = Info.Ctx.getTypeSize(SrcTy); 1192ff89666e8d143b52f2bb5d2c3a108125d523abb7Daniel Dunbar return Success(BitWidth / Info.Ctx.Target.getCharWidth(), E); 1193fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 1194fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1195b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 11964c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 11974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 119835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (E->isOffsetOfOp()) { 119935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // The AST for offsetof is defined in such a way that we can just 120035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // directly Evaluate it as an l-value. 120135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman APValue LV; 120235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (!EvaluateLValue(E->getSubExpr(), LV, Info)) 120335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 120435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (LV.getLValueBase()) 120535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 120635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return Success(LV.getLValueOffset(), E); 120735183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman } 1208a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1209a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 1210a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 1211a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 1212a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 1213a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1214131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(!bres, E); 1215a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1216a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 12174fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar // Only handle integral operations... 12184fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar if (!E->getSubExpr()->getType()->isIntegralType()) 12194fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar return false; 12204fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar 122187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 122287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 122375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 1224a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 122575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 12264c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 122775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 122875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 12290e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 123075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 12314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 12324c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 12333f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 123475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // The result is always just the subexpr. 12363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 123775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 123830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 123930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(-Result.getInt(), E); 124075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 124130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 124230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(~Result.getInt(), E); 124306a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 1244a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 12451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1246732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 1247732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 1248a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) { 124982206e267ce6cc709797127616f64672d255b310Anders Carlsson Expr *SubExpr = E->getSubExpr(); 125082206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 1251b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 125282206e267ce6cc709797127616f64672d255b310Anders Carlsson 12534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 12544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 12554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 12564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1257131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 12584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 12594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1260a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 1261b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isIntegralType()) { 1262732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 1263b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1264a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1265be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 1266be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 1267be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 1268be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 126930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 1270dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 127130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 1272732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 12731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1274732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 1275b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isPointerType()) { 1276a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 127787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 1278b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 12794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1280dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 1281dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 1282dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 1283dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return false; 1284dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 1285dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar Result = LV; 1286dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 1287dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 12884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1289dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset(), SrcType); 1290dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 12912bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 12924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1293be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (SrcType->isArrayType() || SrcType->isFunctionType()) { 1294be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // This handles double-conversion cases, where there's both 1295be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // an l-value promotion and an implicit conversion to int. 1296be26570e3faa009bdcefedfaf04473e518940520Eli Friedman APValue LV; 1297be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!EvaluateLValue(SubExpr, LV, Info)) 1298be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1299be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1300be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy)) 1301be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1302be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1303be26570e3faa009bdcefedfaf04473e518940520Eli Friedman Result = LV; 1304be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return true; 1305be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 1306be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 13071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (SrcType->isAnyComplexType()) { 13081725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APValue C; 13091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 13101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 13111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (C.isComplexFloat()) 13121725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleFloatToIntCast(DestType, SrcType, 13131725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexFloatReal(), Info.Ctx), 13141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman E); 13151725f683432715e5afe34d476024bd6f16eac3fcEli Friedman else 13161725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleIntToIntCast(DestType, SrcType, 13171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexIntReal(), Info.Ctx), E); 13181725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 13192217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle vectors 13202217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1321b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (!SrcType->isRealFloatingType()) 13220e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1323732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1324d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 1325d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 13260e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1328b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); 1329a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 13302bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1331722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 1332722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 1333722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1334722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1335722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1336722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 1337722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1338722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1339722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 1340722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 1341722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1342664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 1343722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 1344722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1345722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1346722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1347722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 1348722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1349722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1350664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 1351664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman Info.EvalResult.HasSideEffects = true; 1352664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 1353664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 1354664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 1355f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1356d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 1357d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1358d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1359d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 1360d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator 1361d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 1362d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 1363d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 1364d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 1365d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 1366d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 1367d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1368d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 1369d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1370d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1371d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1372d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 1373019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 1374d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 13755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 1376d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 1377d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 13784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 13794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 13802217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1381ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) 1382ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1383ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitUnaryExtension(const UnaryOperator *E) 1384ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1385ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 1386ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__/__imag__, array subscript of vector, 1387ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // member of vector, ImplicitValueInitExpr, 13882217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 1389d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 1390d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 1391d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1392d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 1393d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 1394d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1395d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1396019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 13973c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 139834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 1399019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 1400019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 1401019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 1402019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 1403019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 14047cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 14057cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 14067cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 140734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 140834a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 14097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 14101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14119e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 14129e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 14139e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 14144572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump // If this is __builtin_nan() turn this into a nan, otherwise we 14159e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 14161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const StringLiteral *S = 14179e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 14184572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump if (!S->isWide()) { 14197cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 14207cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 14217462b39a9bccaf4392687831036713f09f9c0681Mike Stump llvm::SmallString<16> s; 14227462b39a9bccaf4392687831036713f09f9c0681Mike Stump s.append(S->getStrData(), S->getStrData() + S->getByteLength()); 14237462b39a9bccaf4392687831036713f09f9c0681Mike Stump s += '\0'; 14244572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump long l; 14254572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump char *endp; 14267462b39a9bccaf4392687831036713f09f9c0681Mike Stump l = strtol(&s[0], &endp, 0); 14277462b39a9bccaf4392687831036713f09f9c0681Mike Stump if (endp != s.end()-1) 14284572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump return false; 14294572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump unsigned type = (unsigned int)l;; 14304572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump Result = llvm::APFloat::getNaN(Sem, false, type); 14319e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 14329e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 14339e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 14349e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 14355db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 14365db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 14375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 14385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 14395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 14405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 14411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 14435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 14445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 14455db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 14461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysign: 14471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysignf: 14485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 14495db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 14505db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 14515db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 14525db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 14535db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 14545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 14555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 1456019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 1457019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 1458019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 14595db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 1460a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 1461a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 1462a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 14635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 14645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 14655db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 14665db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 14675db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 14681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case UnaryOperator::Plus: 14695db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 14705db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 14715db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 14725db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 14735db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 14745db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 1475019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1476d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1477d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1478d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 14795db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1480d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1481d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1482d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1483d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1484d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1485d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1486d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1487d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1488d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1489d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1490d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1491d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1492d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1493d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1494d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1495d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1496d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1497d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1498d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1499d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1500d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1501d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1502d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1503d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1504d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1505d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1506d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 15074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 15084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 15091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 15114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 15123f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!EvaluateInteger(SubExpr, IntResult, Info)) 15134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 15141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 1515a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 15164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 15174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 15184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 15194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 15204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1521a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 1522a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 15234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 15244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 15252217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle complex types 15264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 15274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 15284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 15294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 15304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 15314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 15324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 15334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 15344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1535d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1536a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 15379ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 15389ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 15399ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 1540a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator 1541a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar : public StmtVisitor<ComplexExprEvaluator, APValue> { 15429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 15431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15449ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 1545a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar ComplexExprEvaluator(EvalInfo &info) : Info(info) {} 15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15479ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 15489ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 15499ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 15509ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 15519ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 15529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 15539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 15541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15559ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 15569ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 15579ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 1558a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Expr* SubExpr = E->getSubExpr(); 1559a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1560a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (SubExpr->getType()->isRealFloatingType()) { 1561a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat Result(0.0); 1562a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1563a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateFloat(SubExpr, Result, Info)) 1564a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 15651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false), 1567a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result); 1568a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 15691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(SubExpr->getType()->isIntegerType() && 1570a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Unexpected imaginary literal."); 1571a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1572a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Result; 1573a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1574a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 15751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1576a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 1577a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Zero = 0; 1578a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(Zero, Result); 1579a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 15809ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 15819ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1582ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1583ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1584183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall QualType EltType = E->getType()->getAs<ComplexType>()->getElementType(); 1585a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SubType = SubExpr->getType(); 1586ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1587a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (SubType->isRealFloatingType()) { 1588ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 15891725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1590ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1591ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 15921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 15931725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 15941725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx); 15951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(Result, 15961725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(Result.getSemantics(), APFloat::fcZero, false)); 15971725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 15981725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt IResult; 15991725f683432715e5afe34d476024bd6f16eac3fcEli Friedman IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx); 16001725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned()); 16011725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 16021725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(IResult, Zero); 16031725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1604a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (SubType->isIntegerType()) { 1605a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APSInt Result; 16061725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1607a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1608a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1609a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 16101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 16111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat FResult = 16121725f683432715e5afe34d476024bd6f16eac3fcEli Friedman HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx); 16131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(FResult, 16141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(FResult.getSemantics(), APFloat::fcZero, false)); 16151725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 16161725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx); 16171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 16181725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 16191725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(Result, Zero); 16201725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1621183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const ComplexType *CT = SubType->getAs<ComplexType>()) { 1622a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APValue Src; 16231725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1624a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (!EvaluateComplex(SubExpr, Src, Info)) 1625a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(); 1626a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1627a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SrcType = CT->getElementType(); 1628a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1629a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (Src.isComplexFloat()) { 1630a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 16311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(HandleFloatToFloatCast(EltType, SrcType, 1632a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1633a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleFloatToFloatCast(EltType, SrcType, 1635a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1636a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1637a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1638a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToIntCast(EltType, SrcType, 1639a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1640a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleFloatToIntCast(EltType, SrcType, 1642a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 16431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Info.Ctx)); 1644a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1645a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1646a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar assert(Src.isComplexInt() && "Invalid evaluate result."); 1647a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 16481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(HandleIntToFloatCast(EltType, SrcType, 1649a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1650a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 16511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleIntToFloatCast(EltType, SrcType, 1652a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1653a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1654a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1655a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToIntCast(EltType, SrcType, 1656a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1657a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleIntToIntCast(EltType, SrcType, 1659a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Info.Ctx)); 1661a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1662a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1663ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1664ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1665ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1666ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1667ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1669ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1670ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 1671ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1672ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 1673ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1674ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr, 16752217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 16769ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 16779ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 16789ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) { 1680a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1681a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert((!Result.isComplexFloat() || 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (&Result.getComplexFloatReal().getSemantics() == 16831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump &Result.getComplexFloatImag().getSemantics())) && 1684a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Invalid complex evaluation."); 1685a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return Result.isComplexFloat() || Result.isComplexInt(); 16869ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 16879ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 16881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1689ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1691a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getLHS(), Result, Info)) 1692ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1694a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 1695ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1696a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 16973f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 16983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 1699ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1700ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1701ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1702a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1703a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1704a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1705a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1706a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1707a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1708a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 1709a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 1710a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 17113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1712ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1713a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1714a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1715a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1716a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1717a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1718a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1719a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 1720a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 1721a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 17223f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 17233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar case BinaryOperator::Mul: 17243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 17253f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 17263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 17273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 17283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 17293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 17301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 17323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 17333f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 17343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 17353f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 17363f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 17373f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 17383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 17393f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 17403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 17413f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 17423f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 17433f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 17443f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 17453f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntReal() = 17473f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 17483f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntImag() = 17503f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 17513f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 17523f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 17533f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1754ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1755ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1756ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1757ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1758ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 17599ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 17606ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1761f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1762f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 17636ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1764019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1765019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1766019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 17675b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { 17685b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson EvalInfo Info(Ctx, Result); 176954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 177059b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (getType()->isVectorType()) { 177159b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateVector(this, Result.Val, Info)) 177259b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 177359b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else if (getType()->isIntegerType()) { 177430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this))) 17756dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 17768958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar } else if (getType()->hasPointerRepresentation()) { 17775b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluatePointer(this, Result.Val, Info)) 17786dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1779d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1780d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 17816dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateFloat(this, f, Info)) 17826dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 17831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17845b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(f); 1785a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else if (getType()->isAnyComplexType()) { 1786a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(this, Result.Val, Info)) 17876dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1788a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else 17899d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson return false; 17906dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 17915b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson return true; 17925b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson} 17935b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 17941b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const { 17951b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 17961b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 17971b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 17981b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson} 17991b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 1800b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedmanbool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const { 1801b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman EvalInfo Info(Ctx, Result, true); 1802b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 1803b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 1804b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman} 1805b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 18066ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 180745b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 180845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 18094fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 18104fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson return Evaluate(Result, Ctx) && !Result.HasSideEffects; 181145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 181251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 181351fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 18141c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 18151c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson bool Result = Evaluate(EvalResult, Ctx); 1816f185319f25efd6094870f287030270fad26085baDaniel Dunbar Result = Result; 181751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 18181c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 181951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 18201c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 182151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 1822