ExprConstant.cpp revision 8b752f10c394b140f9ef89e049cbad1a7676fc25
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" 16199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h" 1719cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 180fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h" 19500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h" 201b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 2106a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h" 227462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.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); 61d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattnerstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue &Result, 62d9becd1846e2c72bf6ad283faa1b048f33dd3afeChris Lattner EvalInfo &Info); 63d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info); 64a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info); 65f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 66f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities 684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 705bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedmanstatic bool EvalPointerValueAsBool(APValue& Value, bool& Result) { 715bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // FIXME: Is this accurate for all kinds of bases? If not, what would 725bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // the check look like? 73a73058324197b7bdfd19307965954f626e26199dKen Dyck Result = Value.getLValueBase() || !Value.getLValueOffset().isZero(); 745bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return true; 755bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman} 765bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman 77cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCallstatic bool HandleConversionToBool(const Expr* E, bool& Result, 78cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall EvalInfo &Info) { 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 91a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->hasPointerRepresentation()) { 924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 955bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return EvalPointerValueAsBool(PointerResult, Result); 96a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->isAnyComplexType()) { 97a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman APValue ComplexResult; 98a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (!EvaluateComplex(E, ComplexResult, Info)) 99a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return false; 100a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (ComplexResult.isComplexFloat()) { 101a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = !ComplexResult.getComplexFloatReal().isZero() || 102a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman !ComplexResult.getComplexFloatImag().isZero(); 103a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else { 104a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = ComplexResult.getComplexIntReal().getBoolValue() || 105a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman ComplexResult.getComplexIntImag().getBoolValue(); 106a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } 107a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool DestSigned = DestType->isSignedIntegerType(); 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar uint64_t Space[4]; 121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar (void)Value.convertToInteger(Space, DestWidth, DestSigned, 123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar llvm::APFloat::rmTowardZero, &ignored); 124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned); 125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 130a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.convert(Ctx.getFloatTypeSemantics(DestType), 132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 134a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 135a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 141a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 142a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.extOrTrunc(DestWidth); 143a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 144a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 145a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 146a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 149a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 150a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 151a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 152a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 153a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 154a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 155a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 156c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace { 157770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass HasSideEffect 158c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump : public StmtVisitor<HasSideEffect, bool> { 159c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump EvalInfo &Info; 160c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic: 161c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 162c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump HasSideEffect(EvalInfo &info) : Info(info) {} 163c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 164c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // Unhandled nodes conservatively default to having side effects. 165c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitStmt(Stmt *S) { 166c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 167c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 168c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 169c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 170c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitDeclRefExpr(DeclRefExpr *E) { 171df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 172c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 173c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return false; 174c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 175c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // We don't want to evaluate BlockExprs multiple times, as they generate 176c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // a ton of code. 177c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitBlockExpr(BlockExpr *E) { return true; } 178c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitPredefinedExpr(PredefinedExpr *E) { return false; } 179c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E) 180c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getInitializer()); } 181c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitMemberExpr(MemberExpr *E) { return Visit(E->getBase()); } 182c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitIntegerLiteral(IntegerLiteral *E) { return false; } 183c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitFloatingLiteral(FloatingLiteral *E) { return false; } 184c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitStringLiteral(StringLiteral *E) { return false; } 185c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitCharacterLiteral(CharacterLiteral *E) { return false; } 186c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { return false; } 187c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitArraySubscriptExpr(ArraySubscriptExpr *E) 188980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 189c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitChooseExpr(ChooseExpr *E) 190c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getChosenSubExpr(Info.Ctx)); } 191c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitCastExpr(CastExpr *E) { return Visit(E->getSubExpr()); } 192c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitBinAssign(BinaryOperator *E) { return true; } 1933f0147e161df4725ff15fbb731f4f727afcc229fMike Stump bool VisitCompoundAssignOperator(BinaryOperator *E) { return true; } 194980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump bool VisitBinaryOperator(BinaryOperator *E) 195980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 196c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPreInc(UnaryOperator *E) { return true; } 197c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPostInc(UnaryOperator *E) { return true; } 198c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPreDec(UnaryOperator *E) { return true; } 199c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPostDec(UnaryOperator *E) { return true; } 200c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryDeref(UnaryOperator *E) { 201df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 202c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 203980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump return Visit(E->getSubExpr()); 204c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 205c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryOperator(UnaryOperator *E) { return Visit(E->getSubExpr()); } 206c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump}; 207c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 208c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace 209c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 214770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass LValueExprEvaluator 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 2181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 22635873c49adad211ff466e34342a52665742794f5Anders Carlsson APValue VisitDeclRefExpr(DeclRefExpr *E); 227a73058324197b7bdfd19307965954f626e26199dKen Dyck APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E); } 2284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 2294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 230a73058324197b7bdfd19307965954f626e26199dKen Dyck APValue VisitStringLiteral(StringLiteral *E) { return APValue(E); } 231a73058324197b7bdfd19307965954f626e26199dKen Dyck APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E); } 2323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E); 233e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue VisitUnaryDeref(UnaryOperator *E); 234ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 235ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 236ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 237ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 23826bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 23926bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson APValue VisitCastExpr(CastExpr *E) { 24026bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson switch (E->getCastKind()) { 24126bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson default: 24226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson return APValue(); 24326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson 24426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson case CastExpr::CK_NoOp: 24526bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson return Visit(E->getSubExpr()); 24626bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 24726bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson } 248ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__, __imag__ 2494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}; 2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace 2514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) { 2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 2544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result.isLValue(); 2554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) { 25850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (isa<FunctionDecl>(E->getDecl())) { 259a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(E); 26050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) { 261b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman if (!Info.AnyLValue && !VD->hasGlobalStorage()) 262d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman return APValue(); 26350c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman if (!VD->getType()->isReferenceType()) 264a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(E); 265d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman // FIXME: Check whether VD might be overridden! 266cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor const VarDecl *Def = 0; 267cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor if (const Expr *Init = VD->getDefinition(Def)) 268cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor return Visit(const_cast<Expr *>(Init)); 26950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman } 27050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman 27150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(); 27235873c49adad211ff466e34342a52665742794f5Anders Carlsson} 27335873c49adad211ff466e34342a52665742794f5Anders Carlsson 2744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 275b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman if (!Info.AnyLValue && !E->isFileScope()) 276b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return APValue(); 277a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(E); 2784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 2814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 2824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 2834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 2844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 2854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2866217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); 2874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 2884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 2894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 2904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2946217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = Ty->getAs<RecordType>()->getDecl(); 2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 29686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 29786f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 29886f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (!FD) // FIXME: deal with other kinds of member expressions 29986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return APValue(); 3002be586108bb401019647791feca19ea03fd477ceEli Friedman 3012be586108bb401019647791feca19ea03fd477ceEli Friedman if (FD->getType()->isReferenceType()) 3022be586108bb401019647791feca19ea03fd477ceEli Friedman return APValue(); 3032be586108bb401019647791feca19ea03fd477ceEli Friedman 3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 30544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned i = 0; 30617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RD->field_begin(), 30717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RD->field_end(); 30844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Field != FieldEnd; (void)++Field, ++i) { 30944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (*Field == FD) 3104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 314a73058324197b7bdfd19307965954f626e26199dKen Dyck result.getLValueOffset() + 315a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits::fromQuantity(RL.getFieldOffset(i) / 8)); 3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 3184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 3194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 3213068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3233068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 3243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 3273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 3283068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 3293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 330199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits ElementSize = Info.Ctx.getTypeSizeInChars(E->getType()); 3313068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 332199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits Offset = Index.getSExtValue() * ElementSize; 3331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setLValue(Result.getLValueBase(), 334a73058324197b7bdfd19307965954f626e26199dKen Dyck Result.getLValueOffset() + Offset); 3353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 3363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 3374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) { 339e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue Result; 340e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 341e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return APValue(); 342e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return Result; 343e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 344e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 3454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 346f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 347f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 348f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 349c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 350770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass PointerExprEvaluator 3512bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 35287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 3532bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 3541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 356f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3572bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 3582bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 3592bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 3602bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 3612bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 3622bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 363650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 36409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman APValue VisitCastExpr(CastExpr* E); 3652217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 3662217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman { return Visit(E->getSubExpr()); } 3672217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryAddrOf(const UnaryOperator *E); 3684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 369a73058324197b7bdfd19307965954f626e26199dKen Dyck { return APValue(E); } 370f01158941ba4560c63150032073bb231ce38999eEli Friedman APValue VisitAddrLabelExpr(AddrLabelExpr *E) 371a73058324197b7bdfd19307965954f626e26199dKen Dyck { return APValue(E); } 3723941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman APValue VisitCallExpr(CallExpr *E); 373b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump APValue VisitBlockExpr(BlockExpr *E) { 374b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump if (!E->hasBlockDeclRefExprs()) 375a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(E); 376b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(); 377b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 37891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) 379a73058324197b7bdfd19307965954f626e26199dKen Dyck { return APValue((Expr*)0); } 3804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 381ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(ChooseExpr *E) 3826e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return Visit(E->getChosenSubExpr(Info.Ctx)); } 3836e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) 384a73058324197b7bdfd19307965954f626e26199dKen Dyck { return APValue((Expr*)0); } 385ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 3862bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 387f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 3882bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 38987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 3908958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar if (!E->getType()->hasPointerRepresentation()) 391f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 39287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 393f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 394f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 395650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 396f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 397650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 398650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 399650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 401650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 402650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 403650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 404f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 406650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 40787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 408650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 410650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 41187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 412650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 413650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 4146217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType PointeeType = PExp->getType()->getAs<PointerType>()->getPointeeType(); 415199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits SizeOfPointee; 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4174d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson // Explicitly handle GNU void* and function pointer arithmetic extensions. 4184d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson if (PointeeType->isVoidType() || PointeeType->isFunctionType()) 419199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck SizeOfPointee = CharUnits::One(); 4204d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson else 421199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck SizeOfPointee = Info.Ctx.getTypeSizeInChars(PointeeType); 4224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 423a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits Offset = ResultLValue.getLValueOffset(); 4244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 425650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 4264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 427650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 4284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 4294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 430a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(ResultLValue.getLValueBase(), Offset); 431650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 4324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4332217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 4342217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue result; 4352217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 4362217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman return result; 4374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 440650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 44109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli FriedmanAPValue PointerExprEvaluator::VisitCastExpr(CastExpr* E) { 44209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman Expr* SubExpr = E->getSubExpr(); 443650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 44409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman switch (E->getCastKind()) { 44509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman default: 44609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 44709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 44809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_Unknown: { 44909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman // FIXME: The handling for CK_Unknown is ugly/shouldn't be necessary! 45009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 45109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman // Check for pointer->pointer cast 45209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman if (SubExpr->getType()->isPointerType() || 45309a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman SubExpr->getType()->isObjCObjectPointerType() || 45409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman SubExpr->getType()->isNullPtrType() || 45509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman SubExpr->getType()->isBlockPointerType()) 45609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman return Visit(SubExpr); 45709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 45809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman if (SubExpr->getType()->isIntegralType()) { 45909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman APValue Result; 46009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman if (!EvaluateIntegerOrLValue(SubExpr, Result, Info)) 46109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 46209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 46309a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman if (Result.isInt()) { 46409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 465a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(0, 466a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits::fromQuantity(Result.getInt().getZExtValue())); 46709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman } 46809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 46909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman // Cast is of an lvalue, no need to change value. 470650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 47109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman } 47209a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 473650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_NoOp: 47609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_BitCast: 47709a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_AnyPointerToObjCPointerCast: 47809a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_AnyPointerToBlockPointerCast: 47909a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman return Visit(SubExpr); 48009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman 48109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_IntegralToPointer: { 48269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar APValue Result; 48369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(SubExpr, Result, Info)) 48409a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 48569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 48669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (Result.isInt()) { 48769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 488a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(0, 489a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits::fromQuantity(Result.getInt().getZExtValue())); 490650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar // Cast is of an lvalue, no need to change value. 49369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return Result; 494650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 49509a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_ArrayToPointerDecay: 49609a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman case CastExpr::CK_FunctionToPointerDecay: { 4974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 4984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 4994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 50009a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman break; 50109a8a0e6ec1252cad52666e9dbb21002b9c80f38Eli Friedman } 5024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 5034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 504650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 506650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 5073941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) { 5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (E->isBuiltinCall(Info.Ctx) == 5090d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall Builtin::BI__builtin___CFStringMakeConstantString || 5100d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall E->isBuiltinCall(Info.Ctx) == 5110d13f6fdbdd6f06e2449b8834dda53334abd399aDavid Chisnall Builtin::BI__builtin___NSStringMakeConstantString) 512a73058324197b7bdfd19307965954f626e26199dKen Dyck return APValue(E); 5133941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(); 5143941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman} 5153941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman 5164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 5174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 5184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 5194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 5204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 5214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 5224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 5234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 5244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 5254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 5264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 5274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 528f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 529f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 53059b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 53159b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 53259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 53359b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 534770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class VectorExprEvaluator 53559b5da6d853b4368b984700315adf7b37de05764Nate Begeman : public StmtVisitor<VectorExprEvaluator, APValue> { 53659b5da6d853b4368b984700315adf7b37de05764Nate Begeman EvalInfo &Info; 53791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue GetZeroVector(QualType VecType); 53859b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54059b5da6d853b4368b984700315adf7b37de05764Nate Begeman VectorExprEvaluator(EvalInfo &info) : Info(info) {} 5411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54259b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitStmt(Stmt *S) { 54359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 54459b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitParenExpr(ParenExpr *E) 54791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 54891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 54991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 55091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryPlus(const UnaryOperator *E) 55191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 55291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryReal(const UnaryOperator *E) 55391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 55491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) 55591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return GetZeroVector(E->getType()); } 55659b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCastExpr(const CastExpr* E); 55759b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 55859b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitInitListExpr(const InitListExpr *E); 55991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitConditionalOperator(const ConditionalOperator *E); 560ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 561ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 56291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryImag(const UnaryOperator *E); 56391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 5642217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 56591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 56691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 56791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 56859b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 56959b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 57059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 57159b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 57259b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!E->getType()->isVectorType()) 57359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 57459b5da6d853b4368b984700315adf7b37de05764Nate Begeman Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 57559b5da6d853b4368b984700315adf7b37de05764Nate Begeman return !Result.isUninit(); 57659b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 57759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 57859b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 579183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VTy = E->getType()->getAs<VectorType>(); 580c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman QualType EltTy = VTy->getElementType(); 581c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned NElts = VTy->getNumElements(); 582c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned EltWidth = Info.Ctx.getTypeSize(EltTy); 5831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58459b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr* SE = E->getSubExpr(); 585e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman QualType SETy = SE->getType(); 586e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APValue Result = APValue(); 58759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 588e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman // Check for vector->vector bitcast and scalar->vector splat. 589e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman if (SETy->isVectorType()) { 59059b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(SE)); 591e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } else if (SETy->isIntegerType()) { 592e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APSInt IntResult; 593d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar if (!EvaluateInteger(SE, IntResult, Info)) 594d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar return APValue(); 595d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar Result = APValue(IntResult); 596e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } else if (SETy->isRealFloatingType()) { 597e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APFloat F(0.0); 598d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar if (!EvaluateFloat(SE, F, Info)) 599d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar return APValue(); 600d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar Result = APValue(F); 601d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar } else 602c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 60359b5da6d853b4368b984700315adf7b37de05764Nate Begeman 604c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // For casts of a scalar to ExtVector, convert the scalar to the element type 605c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // and splat it to all elements. 606c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (E->getType()->isExtVectorType()) { 607c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (EltTy->isIntegerType() && Result.isInt()) 608c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(), 609c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 610c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isIntegerType()) 611c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(), 612c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 613c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType() && Result.isInt()) 614c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(), 615c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 616c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType()) 617c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(), 618c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 619c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else 620c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 621c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 622c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // Splat and create vector APValue. 623c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman llvm::SmallVector<APValue, 4> Elts(NElts, Result); 624c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(&Elts[0], Elts.size()); 625e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } 626c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 627c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // For casts of a scalar to regular gcc-style vector type, bitcast the scalar 628c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // to the vector. To construct the APValue vector initializer, bitcast the 629c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // initializing value to an APInt, and shift out the bits pertaining to each 630c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // element. 631c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman APSInt Init; 632c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt(); 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 634c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman llvm::SmallVector<APValue, 4> Elts; 635c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman for (unsigned i = 0; i != NElts; ++i) { 636c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman APSInt Tmp = Init; 637c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Tmp.extOrTrunc(EltWidth); 6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 639c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (EltTy->isIntegerType()) 640c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Elts.push_back(APValue(Tmp)); 641c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType()) 642c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Elts.push_back(APValue(APFloat(Tmp))); 643c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else 644c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 645c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 646c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Init >>= EltWidth; 647c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman } 648c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(&Elts[0], Elts.size()); 64959b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 65059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 65259b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 65359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(E->getInitializer())); 65459b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 65559b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 65759b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 658183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = E->getType()->getAs<VectorType>(); 65959b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 66091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66259b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 66359b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::SmallVector<APValue, 4> Elements; 66459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 66591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman for (unsigned i = 0; i < NumElements; i++) { 66659b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 66759b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 66891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 66991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateInteger(E->getInit(i), sInt, Info)) 67091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 67191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 67291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman sInt = Info.Ctx.MakeIntValue(0, EltTy); 67391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 67459b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(sInt)); 67559b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 67659b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 67791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 67891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateFloat(E->getInit(i), f, Info)) 67991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 68091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 68191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 68291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 68359b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(f)); 68459b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 68559b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 68659b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(&Elements[0], Elements.size()); 68759b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 68859b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 69091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) { 691183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = T->getAs<VectorType>(); 69291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 69391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 69491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 69591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 69691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 69791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 69891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 69991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 70091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 70191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(&Elements[0], Elements.size()); 70291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 70391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 70491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 70591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman bool BoolResult; 70691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 70791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 70891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 70991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 71091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 71191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue Result; 71291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EvaluateVector(EvalExpr, Result, Info)) 71391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return Result; 71491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 71591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 71691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 71791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 71891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 71991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Info.EvalResult.HasSideEffects = true; 72091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return GetZeroVector(E->getType()); 72191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 72291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 72359b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 724f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 725f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 726f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 727f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 728770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass IntExprEvaluator 729b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 73087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 73130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue &Result; 732f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 73330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar IntExprEvaluator(EvalInfo &info, APValue &result) 73487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 735f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 7363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar bool Success(const llvm::APSInt &SI, const Expr *E) { 7374fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 73830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.isSigned() == E->getType()->isSignedIntegerType() && 7393f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 74030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 7413f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 74230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(SI); 7433f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 7443f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 7453f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 746131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 7474fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 74830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 7493f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 75030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(APSInt(I)); 75130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType()); 752131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 753131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 754131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 755131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 7564fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 75730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); 758131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 759131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 760131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 76182206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 76232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 76354da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson if (Info.EvalResult.Diag == 0) { 76454da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 76554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 76682206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 76732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 76854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 7697a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 771f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 772f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Visitor Methods 773f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 7741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 77532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitStmt(Stmt *) { 77632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert(0 && "This should be called on integers, stmts are not integers"); 77732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return false; 77832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 7791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 78032fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitExpr(Expr *E) { 7810e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 782f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 7831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 784b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 785f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 7864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 787131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7884c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7894c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 790131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7914c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7924c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { 793ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // Per gcc docs "this built-in function ignores top level 794ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // qualifiers". We need to use the canonical version to properly 795ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // be able to strip CRV qualifiers from the type. 796ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1()); 797ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2()); 7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(), 799131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar T1.getUnqualifiedType()), 800131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 8014c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 802043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 803043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool CheckReferencedDecl(const Expr *E, const Decl *D); 804043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitDeclRefExpr(const DeclRefExpr *E) { 805043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman return CheckReferencedDecl(E, E->getDecl()); 806043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 807043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman bool VisitMemberExpr(const MemberExpr *E) { 808043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman if (CheckReferencedDecl(E, E->getMemberDecl())) { 809043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman // Conservatively assume a MemberExpr will have side-effects 810043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman Info.EvalResult.HasSideEffects = true; 811043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman return true; 812043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 813043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman return false; 814043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman } 815043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman 8164c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCallExpr(const CallExpr *E); 817b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 818b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 819ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes bool VisitConditionalOperator(const ConditionalOperator *E); 820f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 821a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool VisitCastExpr(CastExpr* E); 8220518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E); 8230518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 8243068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 825131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 8263068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 8271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8283f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 829131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 8303f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson } 8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { 833131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 8343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 8353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 836664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 837664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 838664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 839664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 84064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 8415e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor return Success(E->EvaluateTrait(Info.Ctx), E); 84264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 84364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 844ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) { 845ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman return Visit(E->getChosenSubExpr(Info.Ctx)); 846ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman } 847ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 848722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 849664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 850664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 851fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 8528b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfExpr(const Expr *E); 8538b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck CharUnits GetAlignOfType(QualType T); 854664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 855f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 856f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 857f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 85869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) { 8593f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!E->getType()->isIntegralType()) 8603f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return false; 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 86369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 86469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 86569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 86630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue Val; 86769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt()) 86830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 86930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 87030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 871f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 872f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 873043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedmanbool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) { 8744c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 87529a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) 87629a7f3342c3c6dd15d914c61ae22246c36d51ce7Eli Friedman return Success(ECD->getInitVal(), E); 877b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 878b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl // In C++, const, non-volatile integers initialized with ICEs are ICEs. 879e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman // In C, they can also be folded, although they are not ICEs. 880cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor if (Info.Ctx.getCanonicalType(E->getType()).getCVRQualifiers() 881cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor == Qualifiers::Const) { 882043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 883cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor const VarDecl *Def = 0; 884043097507f99b1156bfd8bad41e7d5166ae4b9b6Eli Friedman if (const Expr *Init = VD->getDefinition(Def)) { 885c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman if (APValue *V = VD->getEvaluatedValue()) { 886c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman if (V->isInt()) 887c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman return Success(V->getInt(), E); 888c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 889c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman } 890c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman 891c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman if (VD->isEvaluatingValue()) 892c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 893c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman 894c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman VD->setEvaluatingValue(); 895c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman 89678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Visit(const_cast<Expr*>(Init))) { 89778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // Cache the evaluated value in the variable declaration. 898c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman VD->setEvaluatedValue(Result); 89978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return true; 90078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 90178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 902c013118155077cf8bdaef743c5dbce760114eed3Eli Friedman VD->setEvaluatedValue(APValue()); 90378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return false; 90478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 905b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 906b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 907b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 9084c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 9090e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 9104c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 9114c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 912a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 913a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 914a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 915a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 9167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 917a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 918a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 919a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 920a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 921a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 922a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 923a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 924a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 925a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 926a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 927a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If no argument was supplied, default to "no_type_class". This isn't 930a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 931a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 932a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 934a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 935a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 936a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 937a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 938a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 939a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 940a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 941a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 942a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 943a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 944a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 945a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 946a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 947a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 948a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 949a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 950a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 951a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 952a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 953a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 954a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 955a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 956a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 957a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 958a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 959a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 960a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 961a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 962a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 963a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 964a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 965a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 966a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 967a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 9684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 9693c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 970019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 9710e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 97264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 97364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump case Builtin::BI__builtin_object_size: { 97464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump const Expr *Arg = E->getArg(0)->IgnoreParens(); 97564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump Expr::EvalResult Base; 976b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher 977b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // TODO: Perhaps we should let LLVM lower this? 978660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (Arg->EvaluateAsAny(Base, Info.Ctx) 97964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump && Base.Val.getKind() == APValue::LValue 98064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump && !Base.HasSideEffects) 98164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump if (const Expr *LVBase = Base.Val.getLValueBase()) 98264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVBase)) { 98364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) { 984460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump if (!VD->getType()->isIncompleteType() 985460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump && VD->getType()->isObjectType() 986460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump && !VD->getType()->isVariablyModifiedType() 987460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump && !VD->getType()->isDependentType()) { 988199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck CharUnits Size = Info.Ctx.getTypeSizeInChars(VD->getType()); 989a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits Offset = Base.Val.getLValueOffset(); 990199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck if (!Offset.isNegative() && Offset <= Size) 991199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck Size -= Offset; 992460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump else 993199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck Size = CharUnits::Zero(); 994199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck return Success(Size.getQuantity(), E); 995460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump } 99664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 99764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 99864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 999b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // If evaluating the argument has side-effects we can't determine 1000b2aaf51ed73a4774322a39a0dd59d0fe7e3258c0Eric Christopher // the size of the object and lower it to unknown now. 1001393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian if (E->getArg(0)->HasSideEffects(Info.Ctx)) { 10023f27b384801de26ce7efaa395699b42719372f24Benjamin Kramer if (E->getArg(1)->EvaluateAsInt(Info.Ctx).getZExtValue() <= 1) 1003cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner return Success(-1ULL, E); 100464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Success(0, E); 100564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 1006c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 100764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 100864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 100964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 1010019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 1011131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 10121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10134bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 1014019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 1015019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 1016131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E); 101721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 101821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case Builtin::BI__builtin_eh_return_data_regno: { 101921fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner int Operand = E->getArg(0)->EvaluateAsInt(Info.Ctx).getZExtValue(); 102021fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand); 102121fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner return Success(Operand, E); 102221fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 1023019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 10244c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 1025f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 1026b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1027a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 1028027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson if (!Visit(E->getRHS())) 1029027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return false; 10304fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 103133ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // If we can't evaluate the LHS, it might have side effects; 103233ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // conservatively mark it. 103333ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (!E->getLHS()->isEvaluatable(Info.Ctx)) 103433ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman Info.EvalResult.HasSideEffects = true; 1035c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 1036027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return true; 1037a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1038a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1039a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 1040a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 1041a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 1042fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 10431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1044fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) { 104551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 104651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 104733ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (lhsResult == (E->getOpcode() == BinaryOperator::LOr)) 10483f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 1049a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1050fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 10514bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if (E->getOpcode() == BinaryOperator::LOr) 1052131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 10534bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 1054131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 10554bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 10564bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 1057fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 10584bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 10594bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) || 1061fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 1062131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 1063fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 1064fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Info.EvalResult.HasSideEffects = true; 1065131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 1066131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 10674bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 10684bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 1069a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1070a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1071a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1072c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 107354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 1074286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 1075286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 10764087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10774087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 10784087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 10794087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APValue LHS, RHS; 10804087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10814087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 10824087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 10834087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10844087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 10854087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 10864087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10874087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_r = 10894087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_i = 10914087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 10924087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10934087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 1094131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 1095131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 1096131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 1097131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 1098131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(((CR_r == APFloat::cmpGreaterThan || 1100131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_r == APFloat::cmpLessThan) && 11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (CR_i == APFloat::cmpGreaterThan || 1102131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpLessThan)), E); 1103131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 11044087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 11054087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 1106131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 1107131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 1108131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 1109131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 1110131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 1111131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 1112131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 1113131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 11144087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 11154087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 11161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1117286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 1118286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 1119286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1121286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1122286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1124286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 1125286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1127286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 1128529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 1129286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 1130286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 1131286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 1132286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 1133131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 1134286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 1135131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 1136286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 1137131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 1138286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 1140131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 1141286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 1142131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 1143286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan 1145131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar || CR == APFloat::cmpLessThan, E); 1146286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 1147286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1149ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 1150ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) { 11513068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 11523068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 11533068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 1154a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 11553068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 11563068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 11573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 1158a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 11595bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // Reject any bases from the normal codepath; we special-case comparisons 11605bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // to null. 11615bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (LHSValue.getLValueBase()) { 11625bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 11635bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 1164a73058324197b7bdfd19307965954f626e26199dKen Dyck if (RHSValue.getLValueBase() || !RHSValue.getLValueOffset().isZero()) 11655bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11665bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman bool bres; 11675bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!EvalPointerValueAsBool(LHSValue, bres)) 11685bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11695bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E); 11705bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } else if (RHSValue.getLValueBase()) { 11715bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 11725bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 1173a73058324197b7bdfd19307965954f626e26199dKen Dyck if (LHSValue.getLValueBase() || !LHSValue.getLValueOffset().isZero()) 11745bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11755bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman bool bres; 11765bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!EvalPointerValueAsBool(RHSValue, bres)) 11775bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11785bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E); 11795bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } 1180a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1181ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub) { 1182ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman const QualType Type = E->getLHS()->getType(); 11836217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); 11843068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1185a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits ElementSize = CharUnits::One(); 1186ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman if (!ElementType->isVoidType() && !ElementType->isFunctionType()) 1187a73058324197b7bdfd19307965954f626e26199dKen Dyck ElementSize = Info.Ctx.getTypeSizeInChars(ElementType); 1188a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1189a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits Diff = LHSValue.getLValueOffset() - 1190a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSValue.getLValueOffset(); 1191a73058324197b7bdfd19307965954f626e26199dKen Dyck return Success(Diff / ElementSize, E); 1192ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 1193ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman bool Result; 1194ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::EQ) { 1195ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset(); 1196267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman } else { 1197ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset(); 1198ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 1199ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(Result, E); 12003068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 12013068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 1202286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 1203286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 1204a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 1205a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 1206a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1207a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1208a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1209a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 121030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Visit(E->getLHS())) 1211a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 1212d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 121342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APValue RHSVal; 121442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info)) 121530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 121642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 121742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 121842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) { 1219a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits Offset = Result.getLValueOffset(); 1220a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits AdditionalOffset = CharUnits::fromQuantity( 1221a73058324197b7bdfd19307965954f626e26199dKen Dyck RHSVal.getInt().getZExtValue()); 122242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add) 1223a73058324197b7bdfd19307965954f626e26199dKen Dyck Offset += AdditionalOffset; 122442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 1225a73058324197b7bdfd19307965954f626e26199dKen Dyck Offset -= AdditionalOffset; 1226a73058324197b7bdfd19307965954f626e26199dKen Dyck Result = APValue(Result.getLValueBase(), Offset); 122742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 122842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 122942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 123042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 123142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add && 123242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman RHSVal.isLValue() && Result.isInt()) { 1233a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits Offset = RHSVal.getLValueOffset(); 1234a73058324197b7bdfd19307965954f626e26199dKen Dyck Offset += CharUnits::fromQuantity(Result.getInt().getZExtValue()); 1235a73058324197b7bdfd19307965954f626e26199dKen Dyck Result = APValue(RHSVal.getLValueBase(), Offset); 123642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 123742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 123842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 123942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 124042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!Result.isInt() || !RHSVal.isInt()) 1241b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1242a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 124342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APSInt& RHS = RHSVal.getInt(); 124442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 1245a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 124632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 12470e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 124830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E); 124930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Add: return Success(Result.getInt() + RHS, E); 125030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E); 125130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::And: return Success(Result.getInt() & RHS, E); 125230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E); 125330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Or: return Success(Result.getInt() | RHS, E); 1254a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 125554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 12560e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 125730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() / RHS, E); 1258a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 125954176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 12600e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 126130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() % RHS, E); 12623f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shl: { 126354176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 126530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 126630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() << SA, E); 12673f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 12683f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shr: { 12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 127030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 127130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() >> SA, E); 12723f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 12731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 127430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LT: return Success(Result.getInt() < RHS, E); 127530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GT: return Success(Result.getInt() > RHS, E); 127630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E); 127730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E); 127830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E); 127930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::NE: return Success(Result.getInt() != RHS, E); 1280b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 1281a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 1282a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 1283ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 1284a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 1285a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 1286ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 1287ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1288a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 1289ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 1290ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 12918b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfType(QualType T) { 12925d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 12935d484e8cf710207010720589d89602233de61d01Sebastian Redl // the result is the size of the referenced type." 12945d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 12955d484e8cf710207010720589d89602233de61d01Sebastian Redl // result shall be the alignment of the referenced type." 12965d484e8cf710207010720589d89602233de61d01Sebastian Redl if (const ReferenceType *Ref = T->getAs<ReferenceType>()) 12975d484e8cf710207010720589d89602233de61d01Sebastian Redl T = Ref->getPointeeType(); 12985d484e8cf710207010720589d89602233de61d01Sebastian Redl 1299e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the alignment. 1300e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 130118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 13022be586108bb401019647791feca19ea03fd477ceEli Friedman // __alignof is defined to return the preferred alignment. 13038b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return CharUnits::fromQuantity( 13048b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize); 1305e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1306e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 13078b752f10c394b140f9ef89e049cbad1a7676fc25Ken DyckCharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 1308af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 1309af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1310af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to 1 in those cases. 1312af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 13138b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(DRE->getDecl(), 13148b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 1315a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1316af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 13178b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Info.Ctx.getDeclAlign(ME->getMemberDecl(), 13188b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck /*RefAsPointee*/true); 1319af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1320e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 1321e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1322e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1323e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 13240518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 13250518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 13260518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 1327e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Handle alignof separately. 1328e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!E->isSizeOf()) { 1329e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 13308b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Success(GetAlignOfType(E->getArgumentType()).getQuantity(), E); 1331e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 13328b752f10c394b140f9ef89e049cbad1a7676fc25Ken Dyck return Success(GetAlignOfExpr(E->getArgumentExpr()).getQuantity(), E); 1333e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 1334a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 13350518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 13365d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.sizeof]p2: "When applied to a reference or a reference type, 13375d484e8cf710207010720589d89602233de61d01Sebastian Redl // the result is the size of the referenced type." 13385d484e8cf710207010720589d89602233de61d01Sebastian Redl // C++ [expr.alignof]p3: "When alignof is applied to a reference type, the 13395d484e8cf710207010720589d89602233de61d01Sebastian Redl // result shall be the alignment of the referenced type." 13405d484e8cf710207010720589d89602233de61d01Sebastian Redl if (const ReferenceType *Ref = SrcTy->getAs<ReferenceType>()) 13415d484e8cf710207010720589d89602233de61d01Sebastian Redl SrcTy = Ref->getPointeeType(); 13420518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 1343131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 1344131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // extension. 1345131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar if (SrcTy->isVoidType() || SrcTy->isFunctionType()) 1346131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(1, E); 1347a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1348fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 1349e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!SrcTy->isConstantSizeType()) 1350fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 1351f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 1352e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the size. 1353199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck return Success(Info.Ctx.getTypeSizeInChars(SrcTy).getQuantity(), E); 1354fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 1355fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1356b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 13574c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 13584c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 135935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (E->isOffsetOfOp()) { 136035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // The AST for offsetof is defined in such a way that we can just 136135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // directly Evaluate it as an l-value. 136235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman APValue LV; 136335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (!EvaluateLValue(E->getSubExpr(), LV, Info)) 136435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 136535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (LV.getLValueBase()) 136635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 1367a73058324197b7bdfd19307965954f626e26199dKen Dyck return Success(LV.getLValueOffset().getQuantity(), E); 136835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman } 1369a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1370a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 1371a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 1372a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 1373a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 1374a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1375131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(!bres, E); 1376a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1377a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 13784fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar // Only handle integral operations... 13794fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar if (!E->getSubExpr()->getType()->isIntegralType()) 13804fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar return false; 13814fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar 138287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 138387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 138475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 1385a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 138675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 13874c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 138875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 138975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 13900e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 139175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 13924c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 13934c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 13943f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 139575a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // The result is always just the subexpr. 13973f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 139875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 139930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 140030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(-Result.getInt(), E); 140175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 140230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 140330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(~Result.getInt(), E); 140406a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 1405a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 14061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1407732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 1408732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 1409a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) { 141082206e267ce6cc709797127616f64672d255b310Anders Carlsson Expr *SubExpr = E->getSubExpr(); 141182206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 1412b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 141382206e267ce6cc709797127616f64672d255b310Anders Carlsson 14144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 14154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 14164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 14174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1418131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 14194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 14204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1421a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 1422b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isIntegralType()) { 1423732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 1424b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1425a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1426be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 1427be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 1428be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 1429be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 143030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 1431dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 143230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 1433732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 14341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1435732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 1436b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isPointerType()) { 1437a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 143887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 1439b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 14404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1441dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 1442dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 1443dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 1444dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return false; 1445dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 1446dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar Result = LV; 1447dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 1448dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 14494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1450a73058324197b7bdfd19307965954f626e26199dKen Dyck APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset().getQuantity(), 1451a73058324197b7bdfd19307965954f626e26199dKen Dyck SrcType); 1452dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 14532bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 14544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1455be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (SrcType->isArrayType() || SrcType->isFunctionType()) { 1456be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // This handles double-conversion cases, where there's both 1457be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // an l-value promotion and an implicit conversion to int. 1458be26570e3faa009bdcefedfaf04473e518940520Eli Friedman APValue LV; 1459be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!EvaluateLValue(SubExpr, LV, Info)) 1460be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1461be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1462be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy)) 1463be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1464be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1465be26570e3faa009bdcefedfaf04473e518940520Eli Friedman Result = LV; 1466be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return true; 1467be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 1468be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 14691725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (SrcType->isAnyComplexType()) { 14701725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APValue C; 14711725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 14721725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 14731725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (C.isComplexFloat()) 14741725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleFloatToIntCast(DestType, SrcType, 14751725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexFloatReal(), Info.Ctx), 14761725f683432715e5afe34d476024bd6f16eac3fcEli Friedman E); 14771725f683432715e5afe34d476024bd6f16eac3fcEli Friedman else 14781725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleIntToIntCast(DestType, SrcType, 14791725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexIntReal(), Info.Ctx), E); 14801725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 14812217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle vectors 14822217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1483b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (!SrcType->isRealFloatingType()) 14840e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1485732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1486d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 1487d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 14880e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 14891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1490b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); 1491a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 14922bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1493722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 1494722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 1495722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1496722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1497722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1498722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 1499722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1500722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1501722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 1502722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 1503722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1504664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 1505722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 1506722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1507722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1508722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1509722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 1510722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1511722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1512664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 1513664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman Info.EvalResult.HasSideEffects = true; 1514664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 1515664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 1516664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 1517f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1518d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 1519d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1520d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1521d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 1522770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass FloatExprEvaluator 1523d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 1524d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 1525d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 1526d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 1527d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 1528d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 1529d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1530d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 1531d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1532d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1533d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1534d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 1535019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 1536d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 15375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 1538d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 1539d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 15404efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 15414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 154267f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman bool VisitConditionalOperator(ConditionalOperator *E); 15432217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1544ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) 1545ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1546ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitUnaryExtension(const UnaryOperator *E) 1547ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1548ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 1549ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__/__imag__, array subscript of vector, 155067f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman // member of vector, ImplicitValueInitExpr 1551d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 1552d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 1553d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1554d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 1555d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 1556d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1557d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1558019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 15593c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 156034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 1561019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 1562019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 1563019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 1564019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 1565019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 15667cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 15677cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 15687cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 156934a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 157034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 15717cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15739e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 15749e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 15759e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 15764572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump // If this is __builtin_nan() turn this into a nan, otherwise we 15779e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const StringLiteral *S = 15799e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 15804572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump if (!S->isWide()) { 15817cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 15827cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 1583330358056acf05445273f4f4004dfd283a2ecc4dBenjamin Kramer unsigned Type = 0; 1584330358056acf05445273f4f4004dfd283a2ecc4dBenjamin Kramer if (!S->getString().empty() && S->getString().getAsInteger(0, Type)) 15854572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump return false; 1586330358056acf05445273f4f4004dfd283a2ecc4dBenjamin Kramer Result = llvm::APFloat::getNaN(Sem, false, Type); 15879e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 15889e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 15899e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 15909e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 15915db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 15925db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 15935db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 15945db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 15955db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 15965db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 15971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15985db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 15995db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 16005db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 16015db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysign: 16031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysignf: 16045db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 16055db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 16065db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 16075db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 16085db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 16095db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 16105db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 16115db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 1612019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 1613019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 1614019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 16155db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 1616a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 1617a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 1618a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 16195db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 16205db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 16215db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 16225db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 16235db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case UnaryOperator::Plus: 16255db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 16265db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 16275db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 16285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 16295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 16305db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 1631019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1632d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 16337f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 16347f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman if (!EvaluateFloat(E->getRHS(), Result, Info)) 16357f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman return false; 16367f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman 16377f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman // If we can't evaluate the LHS, it might have side effects; 16387f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman // conservatively mark it. 16397f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman if (!E->getLHS()->isEvaluatable(Info.Ctx)) 16407f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman Info.EvalResult.HasSideEffects = true; 16417f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman 16427f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman return true; 16437f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman } 16447f92f0362ef2cf218bc19bb83e1a97dd254b5527Eli Friedman 1645d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1646d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 16475db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1648d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1649d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1650d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1651d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1652d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1653d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1654d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1655d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1656d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1657d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1658d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1659d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1660d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1661d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1662d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1663d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1664d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1665d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1666d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1667d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1668d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1669d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1670d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1671d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1672d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1673d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1674d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 16754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 16764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 16794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 16803f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!EvaluateInteger(SubExpr, IntResult, Info)) 16814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 1683a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 16844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 16854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 16864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 16874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 16884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1689a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 1690a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 16914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 16924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 16932217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle complex types 16944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 16964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 16974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 16994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 17004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 17014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 17024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 170367f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedmanbool FloatExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 170467f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman bool Cond; 170567f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman if (!HandleConversionToBool(E->getCond(), Cond, Info)) 170667f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman return false; 170767f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman 170867f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 170967f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman} 171067f85fcdab64f36233a7211f963ed1cccffcbfb8Eli Friedman 1711d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1712a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 17139ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 17149ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 17159ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 1716770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramerclass ComplexExprEvaluator 1717a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar : public StmtVisitor<ComplexExprEvaluator, APValue> { 17189ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17209ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 1721a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar ComplexExprEvaluator(EvalInfo &info) : Info(info) {} 17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17239ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 17249ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 17259ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 17269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 17279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 17289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 17299ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 17301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 17329ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 17339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 1734a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Expr* SubExpr = E->getSubExpr(); 1735a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1736a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (SubExpr->getType()->isRealFloatingType()) { 1737a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat Result(0.0); 1738a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1739a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateFloat(SubExpr, Result, Info)) 1740a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false), 1743a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result); 1744a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(SubExpr->getType()->isIntegerType() && 1746a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Unexpected imaginary literal."); 1747a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1748a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Result; 1749a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1750a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1752a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 1753a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Zero = 0; 1754a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(Zero, Result); 1755a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 17569ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 17579ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1758ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1759ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1760183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall QualType EltType = E->getType()->getAs<ComplexType>()->getElementType(); 1761a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SubType = SubExpr->getType(); 1762ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1763a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (SubType->isRealFloatingType()) { 1764ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 17651725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1766ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1767ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 17681725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 17691725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 17701725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx); 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(Result, 17721725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(Result.getSemantics(), APFloat::fcZero, false)); 17731725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 17741725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt IResult; 17751725f683432715e5afe34d476024bd6f16eac3fcEli Friedman IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx); 17761725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned()); 17771725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 17781725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(IResult, Zero); 17791725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1780a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (SubType->isIntegerType()) { 1781a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APSInt Result; 17821725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1783a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1784a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1785a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 17861725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 17871725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat FResult = 17881725f683432715e5afe34d476024bd6f16eac3fcEli Friedman HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx); 17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(FResult, 17901725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(FResult.getSemantics(), APFloat::fcZero, false)); 17911725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 17921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx); 17931725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 17941725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 17951725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(Result, Zero); 17961725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1797183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const ComplexType *CT = SubType->getAs<ComplexType>()) { 1798a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APValue Src; 17991725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1800a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (!EvaluateComplex(SubExpr, Src, Info)) 1801a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(); 1802a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1803a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SrcType = CT->getElementType(); 1804a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1805a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (Src.isComplexFloat()) { 1806a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 18071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(HandleFloatToFloatCast(EltType, SrcType, 1808a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1809a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleFloatToFloatCast(EltType, SrcType, 1811a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1812a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1813a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1814a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToIntCast(EltType, SrcType, 1815a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1816a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleFloatToIntCast(EltType, SrcType, 1818a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Info.Ctx)); 1820a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1821a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1822a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar assert(Src.isComplexInt() && "Invalid evaluate result."); 1823a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(HandleIntToFloatCast(EltType, SrcType, 1825a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1826a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleIntToFloatCast(EltType, SrcType, 1828a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1829a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1830a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1831a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToIntCast(EltType, SrcType, 1832a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1833a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 18341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleIntToIntCast(EltType, SrcType, 1835a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 18361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Info.Ctx)); 1837a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1838a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1839ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1840ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1841ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1842ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1843ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 18441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1845ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1846ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 1847ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1848ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 1849ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1850ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr, 18512217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 18529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 18539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 18549ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) { 1856a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1857a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert((!Result.isComplexFloat() || 18581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (&Result.getComplexFloatReal().getSemantics() == 18591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump &Result.getComplexFloatImag().getSemantics())) && 1860a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Invalid complex evaluation."); 1861a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return Result.isComplexFloat() || Result.isComplexInt(); 18629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 18639ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 18641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1865ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1867a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getLHS(), Result, Info)) 1868ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 18691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1870a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 1871ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1872a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 18733f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 18743f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 1875ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1876ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1877ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1878a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1879a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1880a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1881a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1882a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1883a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1884a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 1885a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 1886a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 18873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1888ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1889a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1890a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1891a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1892a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1893a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1894a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1895a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 1896a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 1897a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 18983f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 18993f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar case BinaryOperator::Mul: 19003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 19013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 19023f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 19033f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 19043f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 19053f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 19061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19073f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 19083f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 19093f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 19103f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 19113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 19123f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 19133f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 19143f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 19153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 19163f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 19173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 19183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 19193f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 19203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 19213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 19221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntReal() = 19233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 19243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 19251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntImag() = 19263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 19273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 19283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 19293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1930ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1931ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1932ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1933ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1934ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 19359ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 19366ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1937f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1938f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 19396ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1940019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1941019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1942019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 19435b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { 19445b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson EvalInfo Info(Ctx, Result); 194554da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 194659b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (getType()->isVectorType()) { 194759b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateVector(this, Result.Val, Info)) 194859b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 194959b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else if (getType()->isIntegerType()) { 195030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this))) 19516dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 19528958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar } else if (getType()->hasPointerRepresentation()) { 19535b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluatePointer(this, Result.Val, Info)) 19546dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1955d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1956d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 19576dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateFloat(this, f, Info)) 19586dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 19591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19605b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(f); 1961a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else if (getType()->isAnyComplexType()) { 1962a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(this, Result.Val, Info)) 1963660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1964660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else 1965660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1966660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1967660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return true; 1968660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump} 1969660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1970660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stumpbool Expr::EvaluateAsAny(EvalResult &Result, ASTContext &Ctx) const { 1971660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump EvalInfo Info(Ctx, Result, true); 1972660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1973660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (getType()->isVectorType()) { 1974660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluateVector(this, Result.Val, Info)) 1975660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1976660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->isIntegerType()) { 1977660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this))) 1978660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1979660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->hasPointerRepresentation()) { 1980660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluatePointer(this, Result.Val, Info)) 1981660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1982660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->isRealFloatingType()) { 1983660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump llvm::APFloat f(0.0); 1984660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluateFloat(this, f, Info)) 1985660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1986660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1987660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump Result.Val = APValue(f); 1988660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->isAnyComplexType()) { 1989660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluateComplex(this, Result.Val, Info)) 19906dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1991a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else 19929d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson return false; 19936dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 19945b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson return true; 19955b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson} 19965b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 1997cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCallbool Expr::EvaluateAsBooleanCondition(bool &Result, ASTContext &Ctx) const { 1998cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall EvalResult Scratch; 1999cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall EvalInfo Info(Ctx, Scratch); 2000cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 2001cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall return HandleConversionToBool(this, Result, Info); 2002cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall} 2003cd7a445c6b46c5585580dfb652300c8483c0cb6bJohn McCall 20041b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const { 20051b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 20061b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 20071b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 20081b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson} 20091b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 2010b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedmanbool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const { 2011b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman EvalInfo Info(Ctx, Result, true); 2012b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 2013b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 2014b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman} 2015b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 20166ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 201745b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 201845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 20194fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 20204fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson return Evaluate(Result, Ctx) && !Result.HasSideEffects; 202145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 202251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 2023393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanianbool Expr::HasSideEffects(ASTContext &Ctx) const { 2024393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian Expr::EvalResult Result; 2025393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian EvalInfo Info(Ctx, Result); 2026393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian return HasSideEffect(Info).Visit(const_cast<Expr*>(this)); 2027393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian} 2028393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian 202951fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 20301c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 20311c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson bool Result = Evaluate(EvalResult, Ctx); 2032f185319f25efd6094870f287030270fad26085baDaniel Dunbar Result = Result; 203351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 20341c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 203551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 20361c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 203751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 2038