ExprConstant.cpp revision 393c247fe025ccb5f914e37e948192ea86faef8c
1b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner//===--- ExprConstant.cpp - Expression Constant Evaluator -----------------===// 2c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 3c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// The LLVM Compiler Infrastructure 4c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 5c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file is distributed under the University of Illinois Open Source 6c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// License. See LICENSE.TXT for details. 7c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 8c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 9c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 10c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// This file implements the Expr constant evaluator. 11c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson// 12c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson//===----------------------------------------------------------------------===// 13c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 14c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/APValue.h" 15c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson#include "clang/AST/ASTContext.h" 1619cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 170fe52e1bcaa69ba127f1bda036f057fec1f478deSeo Sanghyeon#include "clang/AST/StmtVisitor.h" 18500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/AST/ASTDiagnostic.h" 191b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 2006a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson#include "clang/Basic/TargetInfo.h" 217462b39a9bccaf4392687831036713f09f9c0681Mike Stump#include "llvm/ADT/SmallString.h" 22c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlsson#include "llvm/Support/Compiler.h" 234572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump#include <cstring> 244572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump 25c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssonusing namespace clang; 26f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerusing llvm::APSInt; 27d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanusing llvm::APFloat; 28c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlsson 2987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// EvalInfo - This is a private struct used by the evaluator to capture 3087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// information about a subexpression as it is folded. It retains information 3187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// about the AST context, but also maintains information about the folded 3287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// expression. 3387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// If an expression could be evaluated, it is still possible it is not a C 3587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// "integer constant expression" or constant expression. If not, this struct 3687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// captures information about how and why not. 3787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// 3887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// One bit of information passed *into* the request for constant folding 3987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// indicates whether the subexpression is "evaluated" or not according to C 4087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// rules. For example, the RHS of (0 && foo()) is not evaluated. We can 4187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// evaluate the expression regardless of what the RHS is, but C only allows 4287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner/// certain things in certain situations. 4387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstruct EvalInfo { 4487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner ASTContext &Ctx; 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4654da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson /// EvalResult - Contains information about the evaluation. 4754da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Expr::EvalResult &EvalResult; 48f0c1e4b679e15c26bffb5892e35985bf3c52f77aAnders Carlsson 49b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman /// AnyLValue - Stack based LValue results are not discarded. 50b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman bool AnyLValue; 51b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 52b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult, 53b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman bool anylvalue = false) 54b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman : Ctx(ctx), EvalResult(evalresult), AnyLValue(anylvalue) {} 5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner}; 5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 5787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner 584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info); 5987eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info); 6087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt &Result, EvalInfo &Info); 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? 735bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman Result = Value.getLValueBase() || Value.getLValueOffset(); 745bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return true; 755bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman} 765bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman 774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) { 784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->getType()->isIntegralType()) { 794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateInteger(E, IntResult, Info)) 814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = IntResult != 0; 834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else if (E->getType()->isRealFloatingType()) { 854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APFloat FloatResult(0.0); 864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluateFloat(E, FloatResult, Info)) 874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = !FloatResult.isZero(); 894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 90a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->hasPointerRepresentation()) { 914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue PointerResult; 924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E, PointerResult, Info)) 934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 945bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return EvalPointerValueAsBool(PointerResult, Result); 95a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else if (E->getType()->isAnyComplexType()) { 96a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman APValue ComplexResult; 97a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (!EvaluateComplex(E, ComplexResult, Info)) 98a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return false; 99a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman if (ComplexResult.isComplexFloat()) { 100a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = !ComplexResult.getComplexFloatReal().isZero() || 101a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman !ComplexResult.getComplexFloatImag().isZero(); 102a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } else { 103a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman Result = ComplexResult.getComplexIntReal().getBoolValue() || 104a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman ComplexResult.getComplexIntImag().getBoolValue(); 105a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman } 106a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman return true; 1074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 1084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 1114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType, 113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Determine whether we are converting to unsigned or signed. 116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool DestSigned = DestType->isSignedIntegerType(); 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // FIXME: Warning for overflow. 119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar uint64_t Space[4]; 120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 121a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar (void)Value.convertToInteger(Space, DestWidth, DestSigned, 122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar llvm::APFloat::rmTowardZero, &ignored); 123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned); 124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 125a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType, 127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat &Value, ASTContext &Ctx) { 128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool ignored; 129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result = Value; 1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.convert(Ctx.getFloatTypeSemantics(DestType), 131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven, &ignored); 132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 134a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType, 136a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar unsigned DestWidth = Ctx.getIntWidth(DestType); 138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt Result = Value; 139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // Figure out if this is a truncate, extend or noop cast. 140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar // If the input is signed, do a sign extend, noop, or truncate. 141a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.extOrTrunc(DestWidth); 142a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.setIsUnsigned(DestType->isUnsignedIntegerType()); 143a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 144a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 145a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType, 147a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APSInt &Value, ASTContext &Ctx) { 148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 149a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1); 150a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result.convertFromAPInt(Value, Value.isSigned(), 151a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APFloat::rmNearestTiesToEven); 152a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return Result; 153a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar} 154a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 155c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpnamespace { 156c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumpclass VISIBILITY_HIDDEN HasSideEffect 157c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump : public StmtVisitor<HasSideEffect, bool> { 158c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump EvalInfo &Info; 159c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stumppublic: 160c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 161c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump HasSideEffect(EvalInfo &info) : Info(info) {} 162c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 163c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // Unhandled nodes conservatively default to having side effects. 164c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitStmt(Stmt *S) { 165c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 166c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 167c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 168c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 169c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitDeclRefExpr(DeclRefExpr *E) { 170df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 171c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 172c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return false; 173c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 174c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // We don't want to evaluate BlockExprs multiple times, as they generate 175c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump // a ton of code. 176c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitBlockExpr(BlockExpr *E) { return true; } 177c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitPredefinedExpr(PredefinedExpr *E) { return false; } 178c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E) 179c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getInitializer()); } 180c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitMemberExpr(MemberExpr *E) { return Visit(E->getBase()); } 181c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitIntegerLiteral(IntegerLiteral *E) { return false; } 182c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitFloatingLiteral(FloatingLiteral *E) { return false; } 183c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitStringLiteral(StringLiteral *E) { return false; } 184c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitCharacterLiteral(CharacterLiteral *E) { return false; } 185c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { return false; } 186c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitArraySubscriptExpr(ArraySubscriptExpr *E) 187980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 188c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitChooseExpr(ChooseExpr *E) 189c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump { return Visit(E->getChosenSubExpr(Info.Ctx)); } 190c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitCastExpr(CastExpr *E) { return Visit(E->getSubExpr()); } 191c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitBinAssign(BinaryOperator *E) { return true; } 1923f0147e161df4725ff15fbb731f4f727afcc229fMike Stump bool VisitCompoundAssignOperator(BinaryOperator *E) { return true; } 193980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump bool VisitBinaryOperator(BinaryOperator *E) 194980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump { return Visit(E->getLHS()) || Visit(E->getRHS()); } 195c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPreInc(UnaryOperator *E) { return true; } 196c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPostInc(UnaryOperator *E) { return true; } 197c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPreDec(UnaryOperator *E) { return true; } 198c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryPostDec(UnaryOperator *E) { return true; } 199c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryDeref(UnaryOperator *E) { 200df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump if (Info.Ctx.getCanonicalType(E->getType()).isVolatileQualified()) 201c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump return true; 202980ca220848d27ef55ef4c2d37423461a8ed0da3Mike Stump return Visit(E->getSubExpr()); 203c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump } 204c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump bool VisitUnaryOperator(UnaryOperator *E) { return Visit(E->getSubExpr()); } 205c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump}; 206c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 207c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump} // end anonymous namespace 208c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 2094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 2104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation 2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace { 2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator 2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman : public StmtVisitor<LValueExprEvaluator, APValue> { 2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman EvalInfo &Info; 2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic: 2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman LValueExprEvaluator(EvalInfo &info) : Info(info) {} 2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStmt(Stmt *S) { 2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 2234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 22535873c49adad211ff466e34342a52665742794f5Anders Carlsson APValue VisitDeclRefExpr(DeclRefExpr *E); 2263aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff APValue VisitBlockExpr(BlockExpr *E); 2274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); } 2284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 2294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitMemberExpr(MemberExpr *E); 2304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); } 231eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E, 0); } 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())) { 25950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(E, 0); 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()) 26450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman return APValue(E, 0); 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 2741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E) { 2753aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff if (E->hasBlockDeclRefExprs()) 2763aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff return APValue(); 2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2783aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff return APValue(E, 0); 2793aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff} 2803aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff 2814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 282b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman if (!Info.AnyLValue && !E->isFileScope()) 283b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return APValue(); 284b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return APValue(E, 0); 2854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 2864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 2874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { 2884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue result; 2894efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman QualType Ty; 2904efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (E->isArrow()) { 2914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!EvaluatePointer(E->getBase(), result, Info)) 2924efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2936217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); 2944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } else { 2954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result = Visit(E->getBase()); 2964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (result.isUninit()) 2974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 2984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Ty = E->getBase()->getType(); 2994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3016217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek RecordDecl *RD = Ty->getAs<RecordType>()->getDecl(); 3024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD); 30386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor 30486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl()); 30586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor if (!FD) // FIXME: deal with other kinds of member expressions 30686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor return APValue(); 3072be586108bb401019647791feca19ea03fd477ceEli Friedman 3082be586108bb401019647791feca19ea03fd477ceEli Friedman if (FD->getType()->isReferenceType()) 3092be586108bb401019647791feca19ea03fd477ceEli Friedman return APValue(); 3102be586108bb401019647791feca19ea03fd477ceEli Friedman 3114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman // FIXME: This is linear time. 31244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned i = 0; 31317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator Field = RD->field_begin(), 31417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis FieldEnd = RD->field_end(); 31544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Field != FieldEnd; (void)++Field, ++i) { 31644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (*Field == FD) 3174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman break; 3184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 3194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.setLValue(result.getLValueBase(), 3214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman result.getLValueOffset() + RL.getFieldOffset(i) / 8); 3224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return result; 3244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 3254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 3273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue Result; 3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getBase(), Result, Info)) 3303068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3323068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APSInt Index; 3333068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluateInteger(E->getIdx(), Index, Info)) 3343068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return APValue(); 3353068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 3363068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8; 3373068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 3383068d117951a8df54bae9db039b56201ab10962bAnders Carlsson uint64_t Offset = Index.getSExtValue() * ElementSize; 3391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setLValue(Result.getLValueBase(), 3403068d117951a8df54bae9db039b56201ab10962bAnders Carlsson Result.getLValueOffset() + Offset); 3413068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return Result; 3423068d117951a8df54bae9db039b56201ab10962bAnders Carlsson} 3434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 3441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) { 345e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman APValue Result; 346e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman if (!EvaluatePointer(E->getSubExpr(), Result, Info)) 347e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return APValue(); 348e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman return Result; 349e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman} 350e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman 3514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===// 352f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation 353f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 354f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 355c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace { 3562bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator 3572bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson : public StmtVisitor<PointerExprEvaluator, APValue> { 35887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 3592bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic: 3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 36187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner PointerExprEvaluator(EvalInfo &info) : Info(info) {} 362f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 3632bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitStmt(Stmt *S) { 3642bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson return APValue(); 3652bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 3662bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 3672bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 3682bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 369650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 370650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue VisitCastExpr(const CastExpr* E); 3712217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 3722217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman { return Visit(E->getSubExpr()); } 3732217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue VisitUnaryAddrOf(const UnaryOperator *E); 3744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitObjCStringLiteral(ObjCStringLiteral *E) 3754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman { return APValue(E, 0); } 376f01158941ba4560c63150032073bb231ce38999eEli Friedman APValue VisitAddrLabelExpr(AddrLabelExpr *E) 377f01158941ba4560c63150032073bb231ce38999eEli Friedman { return APValue(E, 0); } 3783941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman APValue VisitCallExpr(CallExpr *E); 379b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump APValue VisitBlockExpr(BlockExpr *E) { 380b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump if (!E->hasBlockDeclRefExprs()) 381b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(E, 0); 382b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump return APValue(); 383b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump } 38491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) 38591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return APValue((Expr*)0, 0); } 3864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue VisitConditionalOperator(ConditionalOperator *E); 387ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(ChooseExpr *E) 3886e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return Visit(E->getChosenSubExpr(Info.Ctx)); } 3896e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) 3906e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl { return APValue((Expr*)0, 0); } 391ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: @protocol, @selector 3922bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson}; 393f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 3942bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 39587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { 3968958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar if (!E->getType()->hasPointerRepresentation()) 397f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return false; 39887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 399f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return Result.isLValue(); 400f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 401650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 402f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 403650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() != BinaryOperator::Add && 404650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson E->getOpcode() != BinaryOperator::Sub) 405650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 407650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *PExp = E->getLHS(); 408650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr *IExp = E->getRHS(); 409650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (IExp->getType()->isPointerType()) 410f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner std::swap(PExp, IExp); 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 412650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue ResultLValue; 41387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(PExp, ResultLValue, Info)) 414650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 416650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson llvm::APSInt AdditionalOffset(32); 41787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluateInteger(IExp, AdditionalOffset, Info)) 418650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 419650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 4206217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek QualType PointeeType = PExp->getType()->getAs<PointerType>()->getPointeeType(); 4214d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson uint64_t SizeOfPointee; 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4234d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson // Explicitly handle GNU void* and function pointer arithmetic extensions. 4244d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson if (PointeeType->isVoidType() || PointeeType->isFunctionType()) 4254d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson SizeOfPointee = 1; 4264d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson else 4274d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8; 4284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 429650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson uint64_t Offset = ResultLValue.getLValueOffset(); 4304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 431650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson if (E->getOpcode() == BinaryOperator::Add) 4324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee; 433650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson else 4344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee; 4354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 436650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(ResultLValue.getLValueBase(), Offset); 437650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson} 4384efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4392217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { 4402217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman APValue result; 4412217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman if (EvaluateLValue(E->getSubExpr(), result, Info)) 4422217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman return result; 4434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 447b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { 448650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson const Expr* SubExpr = E->getSubExpr(); 449650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 450650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson // Check for pointer->pointer cast 45114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (SubExpr->getType()->isPointerType() || 452c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson SubExpr->getType()->isObjCObjectPointerType() || 453c1eb14a66fdd955aff3f957a5843295f27952bddAnders Carlsson SubExpr->getType()->isNullPtrType()) { 454650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson APValue Result; 45587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (EvaluatePointer(SubExpr, Result, Info)) 456650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return Result; 457f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner return APValue(); 458650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 460d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman if (SubExpr->getType()->isIntegralType()) { 46169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar APValue Result; 46269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(SubExpr, Result, Info)) 46369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return APValue(); 46469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 46569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (Result.isInt()) { 46669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType())); 46769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return APValue(0, Result.getInt().getZExtValue()); 468650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar // Cast is of an lvalue, no need to change value. 47169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return Result; 472650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson } 4734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isFunctionType() || 4753aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff SubExpr->getType()->isBlockPointerType() || 4764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman SubExpr->getType()->isArrayType()) { 4774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 4784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluateLValue(SubExpr, Result, Info)) 4794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 4804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 4824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 483650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson return APValue(); 4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 485650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson 4863941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) { 4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (E->isBuiltinCall(Info.Ctx) == 4883c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor Builtin::BI__builtin___CFStringMakeConstantString) 4893941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(E, 0); 4903941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman return APValue(); 4913941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman} 4923941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman 4934efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) { 4944efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 4954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 4964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 4974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 4984efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 4994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 5004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APValue Result; 5014efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (EvaluatePointer(EvalExpr, Result, Info)) 5024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return Result; 5034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return APValue(); 5044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 505f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 506f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 50759b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation 50859b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 50959b5da6d853b4368b984700315adf7b37de05764Nate Begeman 51059b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace { 51159b5da6d853b4368b984700315adf7b37de05764Nate Begeman class VISIBILITY_HIDDEN VectorExprEvaluator 51259b5da6d853b4368b984700315adf7b37de05764Nate Begeman : public StmtVisitor<VectorExprEvaluator, APValue> { 51359b5da6d853b4368b984700315adf7b37de05764Nate Begeman EvalInfo &Info; 51491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue GetZeroVector(QualType VecType); 51559b5da6d853b4368b984700315adf7b37de05764Nate Begeman public: 5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51759b5da6d853b4368b984700315adf7b37de05764Nate Begeman VectorExprEvaluator(EvalInfo &info) : Info(info) {} 5181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51959b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitStmt(Stmt *S) { 52059b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(); 52159b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 5221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitParenExpr(ParenExpr *E) 52491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 52591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 52691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 52791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryPlus(const UnaryOperator *E) 52891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 52991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryReal(const UnaryOperator *E) 53091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return Visit(E->getSubExpr()); } 53191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) 53291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman { return GetZeroVector(E->getType()); } 53359b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCastExpr(const CastExpr* E); 53459b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 53559b5da6d853b4368b984700315adf7b37de05764Nate Begeman APValue VisitInitListExpr(const InitListExpr *E); 53691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitConditionalOperator(const ConditionalOperator *E); 537ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 538ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 53991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue VisitUnaryImag(const UnaryOperator *E); 54091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div, 5412217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // binary comparisons, binary and/or/xor, 54291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // shufflevector, ExtVectorElementExpr 54391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // (Note that these require implementing conversions 54491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman // between vector types.) 54559b5da6d853b4368b984700315adf7b37de05764Nate Begeman }; 54659b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace 54759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 54859b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) { 54959b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!E->getType()->isVectorType()) 55059b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 55159b5da6d853b4368b984700315adf7b37de05764Nate Begeman Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 55259b5da6d853b4368b984700315adf7b37de05764Nate Begeman return !Result.isUninit(); 55359b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 55459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 55559b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) { 556183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VTy = E->getType()->getAs<VectorType>(); 557c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman QualType EltTy = VTy->getElementType(); 558c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned NElts = VTy->getNumElements(); 559c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman unsigned EltWidth = Info.Ctx.getTypeSize(EltTy); 5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 56159b5da6d853b4368b984700315adf7b37de05764Nate Begeman const Expr* SE = E->getSubExpr(); 562e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman QualType SETy = SE->getType(); 563e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APValue Result = APValue(); 56459b5da6d853b4368b984700315adf7b37de05764Nate Begeman 565e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman // Check for vector->vector bitcast and scalar->vector splat. 566e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman if (SETy->isVectorType()) { 56759b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(SE)); 568e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } else if (SETy->isIntegerType()) { 569e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APSInt IntResult; 570d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar if (!EvaluateInteger(SE, IntResult, Info)) 571d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar return APValue(); 572d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar Result = APValue(IntResult); 573e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } else if (SETy->isRealFloatingType()) { 574e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman APFloat F(0.0); 575d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar if (!EvaluateFloat(SE, F, Info)) 576d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar return APValue(); 577d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar Result = APValue(F); 578d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar } else 579c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 58059b5da6d853b4368b984700315adf7b37de05764Nate Begeman 581c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // For casts of a scalar to ExtVector, convert the scalar to the element type 582c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // and splat it to all elements. 583c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (E->getType()->isExtVectorType()) { 584c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (EltTy->isIntegerType() && Result.isInt()) 585c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(), 586c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 587c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isIntegerType()) 588c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(), 589c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 590c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType() && Result.isInt()) 591c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(), 592c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 593c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType()) 594c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(), 595c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Info.Ctx)); 596c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else 597c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 598c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 599c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // Splat and create vector APValue. 600c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman llvm::SmallVector<APValue, 4> Elts(NElts, Result); 601c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(&Elts[0], Elts.size()); 602e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman } 603c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 604c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // For casts of a scalar to regular gcc-style vector type, bitcast the scalar 605c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // to the vector. To construct the APValue vector initializer, bitcast the 606c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // initializing value to an APInt, and shift out the bits pertaining to each 607c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman // element. 608c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman APSInt Init; 609c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt(); 6101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 611c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman llvm::SmallVector<APValue, 4> Elts; 612c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman for (unsigned i = 0; i != NElts; ++i) { 613c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman APSInt Tmp = Init; 614c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Tmp.extOrTrunc(EltWidth); 6151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 616c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman if (EltTy->isIntegerType()) 617c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Elts.push_back(APValue(Tmp)); 618c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else if (EltTy->isRealFloatingType()) 619c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Elts.push_back(APValue(APFloat(Tmp))); 620c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman else 621c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(); 622c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman 623c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman Init >>= EltWidth; 624c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman } 625c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman return APValue(&Elts[0], Elts.size()); 62659b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 62759b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 62959b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 63059b5da6d853b4368b984700315adf7b37de05764Nate Begeman return this->Visit(const_cast<Expr*>(E->getInitializer())); 63159b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 63259b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 63459b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) { 635183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = E->getType()->getAs<VectorType>(); 63659b5da6d853b4368b984700315adf7b37de05764Nate Begeman unsigned NumInits = E->getNumInits(); 63791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman unsigned NumElements = VT->getNumElements(); 6381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63959b5da6d853b4368b984700315adf7b37de05764Nate Begeman QualType EltTy = VT->getElementType(); 64059b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::SmallVector<APValue, 4> Elements; 64159b5da6d853b4368b984700315adf7b37de05764Nate Begeman 64291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman for (unsigned i = 0; i < NumElements; i++) { 64359b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (EltTy->isIntegerType()) { 64459b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APSInt sInt(32); 64591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 64691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateInteger(E->getInit(i), sInt, Info)) 64791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 64891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 64991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman sInt = Info.Ctx.MakeIntValue(0, EltTy); 65091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 65159b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(sInt)); 65259b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else { 65359b5da6d853b4368b984700315adf7b37de05764Nate Begeman llvm::APFloat f(0.0); 65491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (i < NumInits) { 65591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!EvaluateFloat(E->getInit(i), f, Info)) 65691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 65791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } else { 65891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)); 65991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman } 66059b5da6d853b4368b984700315adf7b37de05764Nate Begeman Elements.push_back(APValue(f)); 66159b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 66259b5da6d853b4368b984700315adf7b37de05764Nate Begeman } 66359b5da6d853b4368b984700315adf7b37de05764Nate Begeman return APValue(&Elements[0], Elements.size()); 66459b5da6d853b4368b984700315adf7b37de05764Nate Begeman} 66559b5da6d853b4368b984700315adf7b37de05764Nate Begeman 6661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue 66791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) { 668183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall const VectorType *VT = T->getAs<VectorType>(); 66991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman QualType EltTy = VT->getElementType(); 67091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue ZeroElement; 67191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EltTy->isIntegerType()) 67291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy)); 67391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman else 67491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman ZeroElement = 67591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy))); 67691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 67791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement); 67891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(&Elements[0], Elements.size()); 67991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 68091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 68191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 68291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman bool BoolResult; 68391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!HandleConversionToBool(E->getCond(), BoolResult, Info)) 68491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 68591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 68691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr(); 68791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 68891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman APValue Result; 68991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (EvaluateVector(EvalExpr, Result, Info)) 69091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return Result; 69191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return APValue(); 69291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 69391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 69491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 69591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 69691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman Info.EvalResult.HasSideEffects = true; 69791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman return GetZeroVector(E->getType()); 69891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman} 69991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman 70059b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===// 701f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation 702f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 703f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 704f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace { 705f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator 706b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner : public StmtVisitor<IntExprEvaluator, bool> { 70787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner EvalInfo &Info; 70830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue &Result; 709f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic: 71030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar IntExprEvaluator(EvalInfo &info, APValue &result) 71187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner : Info(info), Result(result) {} 712f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 7133f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar bool Success(const llvm::APSInt &SI, const Expr *E) { 7144fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 71530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.isSigned() == E->getType()->isSignedIntegerType() && 7163f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 71730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 7183f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 71930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(SI); 7203f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 7213f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 7223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar 723131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(const llvm::APInt &I, const Expr *E) { 7244fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 72530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) && 7263f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar "Invalid evaluation result."); 72730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(APSInt(I)); 72830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType()); 729131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 730131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 731131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 732131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar bool Success(uint64_t Value, const Expr *E) { 7334fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar assert(E->getType()->isIntegralType() && "Invalid evaluation result."); 73430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType())); 735131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return true; 736131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 737131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 73882206e267ce6cc709797127616f64672d255b310Anders Carlsson bool Error(SourceLocation L, diag::kind D, const Expr *E) { 73932fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner // Take the first error. 74054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson if (Info.EvalResult.Diag == 0) { 74154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.DiagLoc = L; 74254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson Info.EvalResult.Diag = D; 74382206e267ce6cc709797127616f64672d255b310Anders Carlsson Info.EvalResult.DiagExpr = E; 74432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 74554176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner return false; 7467a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner } 7471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 748f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 749f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner // Visitor Methods 750f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner //===--------------------------------------------------------------------===// 7511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitStmt(Stmt *) { 75332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner assert(0 && "This should be called on integers, stmts are not integers"); 75432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner return false; 75532fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner } 7561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 75732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner bool VisitExpr(Expr *E) { 7580e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 759f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner } 7601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 761b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 762f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 7634c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitIntegerLiteral(const IntegerLiteral *E) { 764131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7654c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7664c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCharacterLiteral(const CharacterLiteral *E) { 767131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7694c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { 770ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // Per gcc docs "this built-in function ignores top level 771ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // qualifiers". We need to use the canonical version to properly 772ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar // be able to strip CRV qualifiers from the type. 773ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1()); 774ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2()); 7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(), 776131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar T1.getUnqualifiedType()), 777131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 7784c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 7794c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitDeclRefExpr(const DeclRefExpr *E); 7804c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner bool VisitCallExpr(const CallExpr *E); 781b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitBinaryOperator(const BinaryOperator *E); 782b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner bool VisitUnaryOperator(const UnaryOperator *E); 783ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes bool VisitConditionalOperator(const ConditionalOperator *E); 784f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 785a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar bool VisitCastExpr(CastExpr* E); 7860518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E); 7870518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 7883068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { 789131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getValue(), E); 7903068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 7911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7923f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson bool VisitGNUNullExpr(const GNUNullExpr *E) { 793131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 7943f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson } 7951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7963068d117951a8df54bae9db039b56201ab10962bAnders Carlsson bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { 797131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(0, E); 7983068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 7993068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 800664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { 801664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 802664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman } 803664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 80464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { 8055e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor return Success(E->EvaluateTrait(Info.Ctx), E); 80664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 80764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 808ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) { 809ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman return Visit(E->getChosenSubExpr(Info.Ctx)); 810ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman } 811ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 812722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman bool VisitUnaryReal(const UnaryOperator *E); 813664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman bool VisitUnaryImag(const UnaryOperator *E); 814664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 815fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate: 816af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfExpr(const Expr *E); 817af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner unsigned GetAlignOfType(QualType T); 818664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman // FIXME: Missing: array subscript of vector, member of vector 819f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}; 820f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace 821f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 82269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) { 8233f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!E->getType()->isIntegralType()) 8243f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return false; 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 82669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 82769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar} 82869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar 82969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) { 83030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar APValue Val; 83169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt()) 83230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 83330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result = Val.getInt(); 83430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return true; 835f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} 836f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 8374c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) { 8384c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Enums are integer constant exprs. 8394c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) { 840e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman // FIXME: This is an ugly hack around the fact that enums don't set their 8413f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // signedness consistently; see PR3173. 8423f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar APSInt SI = D->getInitVal(); 8433f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar SI.setIsUnsigned(!E->getType()->isSignedIntegerType()); 8443f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // FIXME: This is an ugly hack around the fact that enums don't 8453f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar // set their width (!?!) consistently; see PR3173. 8463f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar SI.extOrTrunc(Info.Ctx.getIntWidth(E->getType())); 8473f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(SI, E); 8484c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner } 849b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 850b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl // In C++, const, non-volatile integers initialized with ICEs are ICEs. 851e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman // In C, they can also be folded, although they are not ICEs. 852cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor if (Info.Ctx.getCanonicalType(E->getType()).getCVRQualifiers() 853cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor == Qualifiers::Const) { 854b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) { 855cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor const VarDecl *Def = 0; 856cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor if (const Expr *Init = D->getDefinition(Def)) { 857cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor if (APValue *V = D->getEvaluatedValue()) 858cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor return Success(V->getInt(), E); 859cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor 86078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Visit(const_cast<Expr*>(Init))) { 86178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor // Cache the evaluated value in the variable declaration. 86278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor D->setEvaluatedValue(Info.Ctx, Result); 86378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return true; 86478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 86578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 86678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor return false; 86778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 868b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 869b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl } 870b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl 8714c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Otherwise, random variable references are not constants. 8720e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 8734c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 8744c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner 875a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way 876a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC. 877a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) { 878a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // The following enum mimics the values returned by GCC. 8797c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl // FIXME: Does GCC differ between lvalue and rvalue references here? 880a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enum gcc_type_class { 881a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner no_type_class = -1, 882a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner void_type_class, integer_type_class, char_type_class, 883a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner enumeral_type_class, boolean_type_class, 884a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner pointer_type_class, reference_type_class, offset_type_class, 885a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner real_type_class, complex_type_class, 886a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner function_type_class, method_type_class, 887a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner record_type_class, union_type_class, 888a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner array_type_class, string_type_class, 889a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner lang_type_class 890a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner }; 8911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If no argument was supplied, default to "no_type_class". This isn't 893a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner // ideal, however it is what gcc does. 894a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (E->getNumArgs() == 0) 895a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return no_type_class; 8961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 897a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner QualType ArgTy = E->getArg(0)->getType(); 898a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner if (ArgTy->isVoidType()) 899a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return void_type_class; 900a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isEnumeralType()) 901a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return enumeral_type_class; 902a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isBooleanType()) 903a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return boolean_type_class; 904a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isCharType()) 905a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return string_type_class; // gcc doesn't appear to use char_type_class 906a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isIntegerType()) 907a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return integer_type_class; 908a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isPointerType()) 909a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return pointer_type_class; 910a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isReferenceType()) 911a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return reference_type_class; 912a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isRealType()) 913a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return real_type_class; 914a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isComplexType()) 915a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return complex_type_class; 916a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isFunctionType()) 917a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return function_type_class; 918a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isStructureType()) 919a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return record_type_class; 920a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 921a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 922a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isArrayType()) 923a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return array_type_class; 924a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else if (ArgTy->isUnionType()) 925a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return union_type_class; 926a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner else // FIXME: offset_type_class, method_type_class, & lang_type_class? 927a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type"); 928a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner return -1; 929a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner} 930a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner 9314c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { 9323c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 933019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner default: 9340e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 93564eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 93664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump case Builtin::BI__builtin_object_size: { 93764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump const Expr *Arg = E->getArg(0)->IgnoreParens(); 93864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump Expr::EvalResult Base; 939660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (Arg->EvaluateAsAny(Base, Info.Ctx) 94064eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump && Base.Val.getKind() == APValue::LValue 94164eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump && !Base.HasSideEffects) 94264eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump if (const Expr *LVBase = Base.Val.getLValueBase()) 94364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVBase)) { 94464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) { 945460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump if (!VD->getType()->isIncompleteType() 946460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump && VD->getType()->isObjectType() 947460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump && !VD->getType()->isVariablyModifiedType() 948460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump && !VD->getType()->isDependentType()) { 949460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump uint64_t Size = Info.Ctx.getTypeSize(VD->getType()) / 8; 950460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump uint64_t Offset = Base.Val.getLValueOffset(); 951460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump if (Offset <= Size) 952460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump Size -= Base.Val.getLValueOffset(); 953460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump else 954460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump Size = 0; 955460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump return Success(Size, E); 956460d138c19be357414e4ab56ec880e5451f95cb4Mike Stump } 95764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 95864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 95964eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 960393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian if (E->getArg(0)->HasSideEffects(Info.Ctx)) { 9614fc8758077ced5cdc11f30a5ed07e9af71d5787aMike Stump if (E->getArg(1)->EvaluateAsInt(Info.Ctx).getZExtValue() < 2) 962cf184655319cf7a5b811067cff9d26a5741fd161Chris Lattner return Success(-1ULL, E); 96364eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Success(0, E); 96464eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 965c4c9045dabfc0f0d37dea1b3eb2992654d5b2db1Mike Stump 96664eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E); 96764eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump } 96864eda9e50b593f935c95bd1edc98c4bfda03f601Mike Stump 969019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_classify_type: 970131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(EvaluateBuiltinClassifyType(E), E); 9711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9724bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson case Builtin::BI__builtin_constant_p: 973019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // __builtin_constant_p always has one operand: it returns true if that 974019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner // operand can be folded, false otherwise. 975131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E); 97621fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 97721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner case Builtin::BI__builtin_eh_return_data_regno: { 97821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner int Operand = E->getArg(0)->EvaluateAsInt(Info.Ctx).getZExtValue(); 97921fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand); 98021fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner return Success(Operand, E); 98121fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner } 982019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 9834c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner} 984f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 985b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 986a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == BinaryOperator::Comma) { 987027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson if (!Visit(E->getRHS())) 988027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return false; 9894fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson 99033ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // If we can't evaluate the LHS, it might have side effects; 99133ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman // conservatively mark it. 99233ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (!E->getLHS()->isEvaluatable(Info.Ctx)) 99333ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman Info.EvalResult.HasSideEffects = true; 994c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner 995027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson return true; 996a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 997a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 998a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->isLogicalOp()) { 999a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // These need to be handled specially because the operands aren't 1000a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // necessarily integral 1001fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson bool lhsResult, rhsResult; 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1003fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) { 100451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // We were able to evaluate the LHS, see if we can get away with not 100551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson // evaluating the RHS: 0 && X -> 0, 1 || X -> 1 100633ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman if (lhsResult == (E->getOpcode() == BinaryOperator::LOr)) 10073f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return Success(lhsResult, E); 1008a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1009fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 10104bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson if (E->getOpcode() == BinaryOperator::LOr) 1011131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult || rhsResult, E); 10124bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson else 1013131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(lhsResult && rhsResult, E); 10144bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 10154bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } else { 1016fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) { 10174bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // We can't evaluate the LHS; however, sometimes the result 10184bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson // is determined by the RHS: X && 0 -> 0, X || 1 -> 1. 10191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) || 1020fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) { 1021131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // Since we weren't able to evaluate the left hand side, it 1022fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson // must have had side effects. 1023fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson Info.EvalResult.HasSideEffects = true; 1024131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar 1025131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(rhsResult, E); 10264bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 10274bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson } 1028a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1029a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1030a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1031c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner } 103254176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner 1033286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType LHSTy = E->getLHS()->getType(); 1034286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson QualType RHSTy = E->getRHS()->getType(); 10354087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10364087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHSTy->isAnyComplexType()) { 10374087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar assert(RHSTy->isAnyComplexType() && "Invalid comparison"); 10384087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar APValue LHS, RHS; 10394087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10404087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getLHS(), LHS, Info)) 10414087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 10424087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10434087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 10444087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar return false; 10454087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10464087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (LHS.isComplexFloat()) { 10471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_r = 10484087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal()); 10491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump APFloat::cmpResult CR_i = 10504087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag()); 10514087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar 10524087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 1053131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((CR_r == APFloat::cmpEqual && 1054131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpEqual), E); 1055131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 1056131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 1057131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid complex comparison."); 10581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(((CR_r == APFloat::cmpGreaterThan || 1059131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_r == APFloat::cmpLessThan) && 10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (CR_i == APFloat::cmpGreaterThan || 1061131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar CR_i == APFloat::cmpLessThan)), E); 1062131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 10634087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } else { 10644087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar if (E->getOpcode() == BinaryOperator::EQ) 1065131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() && 1066131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() == RHS.getComplexIntImag()), E); 1067131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar else { 1068131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar assert(E->getOpcode() == BinaryOperator::NE && 1069131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar "Invalid compex comparison."); 1070131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() || 1071131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar LHS.getComplexIntImag() != RHS.getComplexIntImag()), E); 1072131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar } 10734087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 10744087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar } 10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1076286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (LHSTy->isRealFloatingType() && 1077286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson RHSTy->isRealFloatingType()) { 1078286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat RHS(0.0), LHS(0.0); 10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1080286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1081286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1083286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!EvaluateFloat(E->getLHS(), LHS, Info)) 1084286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson return false; 10851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1086286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson APFloat::cmpResult CR = LHS.compare(RHS); 1087529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson 1088286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson switch (E->getOpcode()) { 1089286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson default: 1090286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson assert(0 && "Invalid binary operator!"); 1091286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LT: 1092131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan, E); 1093286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GT: 1094131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpGreaterThan, E); 1095286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::LE: 1096131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E); 1097286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::GE: 10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual, 1099131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar E); 1100286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::EQ: 1101131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(CR == APFloat::cmpEqual, E); 1102286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson case BinaryOperator::NE: 11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Success(CR == APFloat::cmpGreaterThan 1104131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar || CR == APFloat::cmpLessThan, E); 1105286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 1106286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson } 11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1108ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (LHSTy->isPointerType() && RHSTy->isPointerType()) { 1109ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) { 11103068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue LHSValue; 11113068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getLHS(), LHSValue, Info)) 11123068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 1113a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 11143068d117951a8df54bae9db039b56201ab10962bAnders Carlsson APValue RHSValue; 11153068d117951a8df54bae9db039b56201ab10962bAnders Carlsson if (!EvaluatePointer(E->getRHS(), RHSValue, Info)) 11163068d117951a8df54bae9db039b56201ab10962bAnders Carlsson return false; 1117a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 11185bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // Reject any bases from the normal codepath; we special-case comparisons 11195bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman // to null. 11205bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (LHSValue.getLValueBase()) { 11215bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 11225bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11235bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (RHSValue.getLValueBase() || RHSValue.getLValueOffset()) 11245bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11255bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman bool bres; 11265bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!EvalPointerValueAsBool(LHSValue, bres)) 11275bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11285bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E); 11295bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } else if (RHSValue.getLValueBase()) { 11305bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!E->isEqualityOp()) 11315bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11325bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (LHSValue.getLValueBase() || LHSValue.getLValueOffset()) 11335bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11345bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman bool bres; 11355bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman if (!EvalPointerValueAsBool(RHSValue, bres)) 11365bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return false; 11375bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E); 11385bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman } 1139a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1140ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::Sub) { 1141ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman const QualType Type = E->getLHS()->getType(); 11426217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const QualType ElementType = Type->getAs<PointerType>()->getPointeeType(); 11433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson 1144ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset(); 1145ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman if (!ElementType->isVoidType() && !ElementType->isFunctionType()) 1146ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman D /= Info.Ctx.getTypeSize(ElementType) / 8; 1147a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1148ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(D, E); 1149ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 1150ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman bool Result; 1151ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman if (E->getOpcode() == BinaryOperator::EQ) { 1152ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset(); 1153267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman } else { 1154ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset(); 1155ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman } 1156ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman return Success(Result, E); 11573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 11583068d117951a8df54bae9db039b56201ab10962bAnders Carlsson } 1159286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson if (!LHSTy->isIntegralType() || 1160286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson !RHSTy->isIntegralType()) { 1161a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // We can't continue from here for non-integral types, and they 1162a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // could potentially confuse the following operations. 1163a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1164a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1165a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1166a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // The LHS of a constant expr is always evaluated and needed. 116730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Visit(E->getLHS())) 1168a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; // error in subexpression. 1169d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman 117042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APValue RHSVal; 117142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info)) 117230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return false; 117342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 117442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like (unsigned long)&a + 4. 117542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) { 117642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman uint64_t offset = Result.getLValueOffset(); 117742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add) 117842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset += RHSVal.getInt().getZExtValue(); 117942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman else 118042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset -= RHSVal.getInt().getZExtValue(); 118142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman Result = APValue(Result.getLValueBase(), offset); 118242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 118342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 118442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 118542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // Handle cases like 4 + (unsigned long)&a 118642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (E->getOpcode() == BinaryOperator::Add && 118742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman RHSVal.isLValue() && Result.isInt()) { 118842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman uint64_t offset = RHSVal.getLValueOffset(); 118942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman offset += Result.getInt().getZExtValue(); 119042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman Result = APValue(RHSVal.getLValueBase(), offset); 119142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman return true; 119242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman } 119342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 119442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman // All the following cases expect both operands to be an integer 119542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman if (!Result.isInt() || !RHSVal.isInt()) 1196b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1197a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 119842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman APSInt& RHS = RHSVal.getInt(); 119942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman 1200a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson switch (E->getOpcode()) { 120132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner default: 12020e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 120330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E); 120430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Add: return Success(Result.getInt() + RHS, E); 120530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E); 120630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::And: return Success(Result.getInt() & RHS, E); 120730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E); 120830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::Or: return Success(Result.getInt() | RHS, E); 1209a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Div: 121054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 12110e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 121230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() / RHS, E); 1213a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson case BinaryOperator::Rem: 121454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner if (RHS == 0) 12150e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E); 121630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() % RHS, E); 12173f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shl: { 121854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner // FIXME: Warn about out of range shift amounts! 12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 122030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 122130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() << SA, E); 12223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 12233f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar case BinaryOperator::Shr: { 12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned SA = 122530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1); 122630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(Result.getInt() >> SA, E); 12273f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar } 12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 122930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LT: return Success(Result.getInt() < RHS, E); 123030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GT: return Success(Result.getInt() > RHS, E); 123130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E); 123230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E); 123330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E); 123430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar case BinaryOperator::NE: return Success(Result.getInt() != RHS, E); 1235b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman } 1236a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 1237a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 1238ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { 1239a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes bool Cond; 1240a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes if (!HandleConversionToBool(E->getCond(), Cond, Info)) 1241ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes return false; 1242ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1243a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr()); 1244ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes} 1245ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes 1246af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) { 1247e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the alignment. 1248e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner unsigned CharSize = Info.Ctx.Target.getCharWidth(); 124918857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor 12502be586108bb401019647791feca19ea03fd477ceEli Friedman // __alignof is defined to return the preferred alignment. 125118857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor return Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize; 1252e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1253e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1254af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) { 1255af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner E = E->IgnoreParens(); 1256af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1257af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner // alignof decl is always accepted, even if it doesn't make sense: we default 12581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to 1 in those cases. 1259af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 1260b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar return Info.Ctx.getDeclAlignInBytes(DRE->getDecl()); 1261a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1262af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 1263b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl()); 1264af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner 1265e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner return GetAlignOfType(E->getType()); 1266e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner} 1267e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 1268e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner 12690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the 12700518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type. 12710518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { 12720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType DstTy = E->getType(); 1273fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1274e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Handle alignof separately. 1275e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!E->isSizeOf()) { 1276e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (E->isArgumentType()) 1277131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(GetAlignOfType(E->getArgumentType()), E); 1278e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner else 1279131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(GetAlignOfExpr(E->getArgumentExpr()), E); 1280e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner } 1281a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 12820518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl QualType SrcTy = E->getTypeOfArgument(); 12830518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl 1284131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc 1285131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar // extension. 1286131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar if (SrcTy->isVoidType() || SrcTy->isFunctionType()) 1287131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(1, E); 1288a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman 1289fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2. 1290e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner if (!SrcTy->isConstantSizeType()) 1291fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner return false; 1292f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman 1293e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner // Get information about the size. 129424cbfb96f09318f59dc73eaaf4909a79788ec5acDaniel Dunbar unsigned BitWidth = Info.Ctx.getTypeSize(SrcTy); 1295ff89666e8d143b52f2bb5d2c3a108125d523abb7Daniel Dunbar return Success(BitWidth / Info.Ctx.Target.getCharWidth(), E); 1296fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner} 1297fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner 1298b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 12994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // Special case unary operators that do not need their subexpression 13004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // evaluated. offsetof/sizeof/alignof are all special. 130135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (E->isOffsetOfOp()) { 130235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // The AST for offsetof is defined in such a way that we can just 130335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman // directly Evaluate it as an l-value. 130435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman APValue LV; 130535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (!EvaluateLValue(E->getSubExpr(), LV, Info)) 130635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 130735183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (LV.getLValueBase()) 130835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return false; 130935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman return Success(LV.getLValueOffset(), E); 131035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman } 1311a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 1312a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (E->getOpcode() == UnaryOperator::LNot) { 1313a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman // LNot's operand isn't necessarily an integer, so we handle it specially. 1314a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman bool bres; 1315a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman if (!HandleConversionToBool(E->getSubExpr(), bres, Info)) 1316a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman return false; 1317131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(!bres, E); 1318a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman } 1319a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman 13204fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar // Only handle integral operations... 13214fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar if (!E->getSubExpr()->getType()->isIntegralType()) 13224fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar return false; 13234fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar 132487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner // Get the operand value into 'Result'. 132587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!Visit(E->getSubExpr())) 132675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner return false; 1327a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson 132875a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner switch (E->getOpcode()) { 13294c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner default: 133075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // Address, indirect, pre/post inc/dec, etc are not valid constant exprs. 133175a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner // See C99 6.6p3. 13320e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E); 133375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Extension: 13344c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // FIXME: Should extension allow i-c-e extension expressions in its scope? 13354c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner // If so, we could clear the diagnostic ID. 13363f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 133775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Plus: 13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // The result is always just the subexpr. 13393f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar return true; 134075a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Minus: 134130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 134230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(-Result.getInt(), E); 134375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner case UnaryOperator::Not: 134430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!Result.isInt()) return false; 134530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar return Success(~Result.getInt(), E); 134606a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson } 1347a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1349732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the 1350732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer. 1351a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) { 135282206e267ce6cc709797127616f64672d255b310Anders Carlsson Expr *SubExpr = E->getSubExpr(); 135382206e267ce6cc709797127616f64672d255b310Anders Carlsson QualType DestType = E->getType(); 1354b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar QualType SrcType = SubExpr->getType(); 135582206e267ce6cc709797127616f64672d255b310Anders Carlsson 13564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (DestType->isBooleanType()) { 13574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool BoolResult; 13584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!HandleConversionToBool(SubExpr, BoolResult, Info)) 13594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1360131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar return Success(BoolResult, E); 13614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 13624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1363a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson // Handle simple integer->integer casts. 1364b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isIntegralType()) { 1365732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner if (!Visit(SubExpr)) 1366b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 1367a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1368be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!Result.isInt()) { 1369be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // Only allow casts of lvalues if they are lossless. 1370be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); 1371be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 137230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar 1373dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, 137430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar Result.getInt(), Info.Ctx), E); 1375732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner } 13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1377732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner // FIXME: Clean this up! 1378b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (SrcType->isPointerType()) { 1379a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson APValue LV; 138087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner if (!EvaluatePointer(SubExpr, LV, Info)) 1381b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner return false; 13824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1383dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (LV.getLValueBase()) { 1384dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar // Only allow based lvalue casts if they are lossless. 1385dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType)) 1386dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return false; 1387dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar 1388dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar Result = LV; 1389dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return true; 1390dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar } 13914efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1392dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset(), SrcType); 1393dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E); 13942bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson } 13954efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1396be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (SrcType->isArrayType() || SrcType->isFunctionType()) { 1397be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // This handles double-conversion cases, where there's both 1398be26570e3faa009bdcefedfaf04473e518940520Eli Friedman // an l-value promotion and an implicit conversion to int. 1399be26570e3faa009bdcefedfaf04473e518940520Eli Friedman APValue LV; 1400be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (!EvaluateLValue(SubExpr, LV, Info)) 1401be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1402be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1403be26570e3faa009bdcefedfaf04473e518940520Eli Friedman if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy)) 1404be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return false; 1405be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 1406be26570e3faa009bdcefedfaf04473e518940520Eli Friedman Result = LV; 1407be26570e3faa009bdcefedfaf04473e518940520Eli Friedman return true; 1408be26570e3faa009bdcefedfaf04473e518940520Eli Friedman } 1409be26570e3faa009bdcefedfaf04473e518940520Eli Friedman 14101725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (SrcType->isAnyComplexType()) { 14111725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APValue C; 14121725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (!EvaluateComplex(SubExpr, C, Info)) 14131725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return false; 14141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (C.isComplexFloat()) 14151725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleFloatToIntCast(DestType, SrcType, 14161725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexFloatReal(), Info.Ctx), 14171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman E); 14181725f683432715e5afe34d476024bd6f16eac3fcEli Friedman else 14191725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return Success(HandleIntToIntCast(DestType, SrcType, 14201725f683432715e5afe34d476024bd6f16eac3fcEli Friedman C.getComplexIntReal(), Info.Ctx), E); 14211725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 14222217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle vectors 14232217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1424b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar if (!SrcType->isRealFloatingType()) 14250e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1426732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner 1427d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat F(0.0); 1428d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(SubExpr, F, Info)) 14290e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 14301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1431b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); 1432a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson} 14332bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson 1434722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { 1435722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isAnyComplexType()) { 1436722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1437722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1438722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1439722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntReal(), E); 1440722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1441722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1442722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Visit(E->getSubExpr()); 1443722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman} 1444722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1445664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { 1446722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (E->getSubExpr()->getType()->isComplexIntegerType()) { 1447722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman APValue LV; 1448722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) 1449722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); 1450722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman return Success(LV.getComplexIntImag(), E); 1451722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman } 1452722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman 1453664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) 1454664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman Info.EvalResult.HasSideEffects = true; 1455664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman return Success(0, E); 1456664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman} 1457664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman 1458f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1459d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation 1460d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1461d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1462d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace { 1463d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator 1464d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : public StmtVisitor<FloatExprEvaluator, bool> { 1465d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman EvalInfo &Info; 1466d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman APFloat &Result; 1467d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic: 1468d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman FloatExprEvaluator(EvalInfo &info, APFloat &result) 1469d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman : Info(info), Result(result) {} 1470d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1471d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitStmt(Stmt *S) { 1472d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1473d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1474d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1475d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 1476019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner bool VisitCallExpr(const CallExpr *E); 1477d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 14785db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar bool VisitUnaryOperator(const UnaryOperator *E); 1479d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitBinaryOperator(const BinaryOperator *E); 1480d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman bool VisitFloatingLiteral(const FloatingLiteral *E); 14814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCastExpr(CastExpr *E); 14824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E); 14832217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman 1484ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitChooseExpr(const ChooseExpr *E) 1485ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1486ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman bool VisitUnaryExtension(const UnaryOperator *E) 1487ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1488ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman 1489ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME: Missing: __real__/__imag__, array subscript of vector, 1490ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // member of vector, ImplicitValueInitExpr, 14912217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 1492d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}; 1493d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace 1494d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1495d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) { 1496d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E)); 1497d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1498d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1499019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { 15003c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor switch (E->isBuiltinCall(Info.Ctx)) { 150134a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner default: return false; 1502019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_val: 1503019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_valf: 1504019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_huge_vall: 1505019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inf: 1506019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner case Builtin::BI__builtin_inff: 15077cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar case Builtin::BI__builtin_infl: { 15087cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 15097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 151034a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner Result = llvm::APFloat::getInf(Sem); 151134a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner return true; 15127cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar } 15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15149e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nan: 15159e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanf: 15169e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner case Builtin::BI__builtin_nanl: 15174572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump // If this is __builtin_nan() turn this into a nan, otherwise we 15189e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner // can't constant fold it. 15191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const StringLiteral *S = 15209e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) { 15214572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump if (!S->isWide()) { 15227cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar const llvm::fltSemantics &Sem = 15237cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar Info.Ctx.getFloatTypeSemantics(E->getType()); 15247462b39a9bccaf4392687831036713f09f9c0681Mike Stump llvm::SmallString<16> s; 15257462b39a9bccaf4392687831036713f09f9c0681Mike Stump s.append(S->getStrData(), S->getStrData() + S->getByteLength()); 15267462b39a9bccaf4392687831036713f09f9c0681Mike Stump s += '\0'; 15274572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump long l; 15284572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump char *endp; 15297462b39a9bccaf4392687831036713f09f9c0681Mike Stump l = strtol(&s[0], &endp, 0); 15307462b39a9bccaf4392687831036713f09f9c0681Mike Stump if (endp != s.end()-1) 15314572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump return false; 15324572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump unsigned type = (unsigned int)l;; 15334572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump Result = llvm::APFloat::getNaN(Sem, false, type); 15349e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return true; 15359e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 15369e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner } 15379e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner return false; 15385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 15395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabs: 15405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsf: 15415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_fabsl: 15425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info)) 15435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 15441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15455db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (Result.isNegative()) 15465db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 15475db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 15485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 15491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysign: 15501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case Builtin::BI__builtin_copysignf: 15515db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case Builtin::BI__builtin_copysignl: { 15525db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.); 15535db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getArg(0), Result, Info) || 15545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar !EvaluateFloat(E->getArg(1), RHS, Info)) 15555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 15565db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.copySign(RHS); 15575db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 15585db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 1559019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner } 1560019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner} 1561019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 15625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { 1563a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes if (E->getOpcode() == UnaryOperator::Deref) 1564a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes return false; 1565a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes 15665db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar if (!EvaluateFloat(E->getSubExpr(), Result, Info)) 15675db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return false; 15685db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar 15695db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar switch (E->getOpcode()) { 15705db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar default: return false; 15711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case UnaryOperator::Plus: 15725db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 15735db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar case UnaryOperator::Minus: 15745db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar Result.changeSign(); 15755db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar return true; 15765db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar } 15775db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar} 1578019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner 1579d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1580d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // FIXME: Diagnostics? I really don't understand how the warnings 1581d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman // and errors are supposed to work. 15825db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar APFloat RHS(0.0); 1583d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getLHS(), Result, Info)) 1584d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1585d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman if (!EvaluateFloat(E->getRHS(), RHS, Info)) 1586d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return false; 1587d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1588d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman switch (E->getOpcode()) { 1589d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman default: return false; 1590d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Mul: 1591d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.multiply(RHS, APFloat::rmNearestTiesToEven); 1592d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1593d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Add: 1594d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.add(RHS, APFloat::rmNearestTiesToEven); 1595d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1596d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Sub: 1597d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.subtract(RHS, APFloat::rmNearestTiesToEven); 1598d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1599d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman case BinaryOperator::Div: 1600d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result.divide(RHS, APFloat::rmNearestTiesToEven); 1601d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1602d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } 1603d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1604d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 1605d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) { 1606d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman Result = E->getValue(); 1607d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman return true; 1608d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} 1609d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman 16104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) { 16114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Expr* SubExpr = E->getSubExpr(); 16121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isIntegralType()) { 16144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman APSInt IntResult; 16153f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar if (!EvaluateInteger(SubExpr, IntResult, Info)) 16164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 16171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(), 1618a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar IntResult, Info.Ctx); 16194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 16204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 16214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (SubExpr->getType()->isRealFloatingType()) { 16224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman if (!Visit(SubExpr)) 16234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 1624a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(), 1625a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Result, Info.Ctx); 16264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 16274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman } 16282217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // FIXME: Handle complex types 16294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return false; 16314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 16324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 16334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 16344efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType())); 16354efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman return true; 16364efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} 16374efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman 1638d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===// 1639a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer) 16409ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 16419ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 16429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace { 1643a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator 1644a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar : public StmtVisitor<ComplexExprEvaluator, APValue> { 16459ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson EvalInfo &Info; 16461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16479ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic: 1648a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar ComplexExprEvaluator(EvalInfo &info) : Info(info) {} 16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16509ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 16519ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson // Visitor Methods 16529ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson //===--------------------------------------------------------------------===// 16539ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 16549ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitStmt(Stmt *S) { 16559ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson return APValue(); 16569ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 16571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16589ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); } 16599ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 16609ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson APValue VisitImaginaryLiteral(ImaginaryLiteral *E) { 1661a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Expr* SubExpr = E->getSubExpr(); 1662a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1663a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (SubExpr->getType()->isRealFloatingType()) { 1664a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat Result(0.0); 1665a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1666a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateFloat(SubExpr, Result, Info)) 1667a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false), 1670a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result); 1671a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 16721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(SubExpr->getType()->isIntegerType() && 1673a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Unexpected imaginary literal."); 1674a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 1675a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Result; 1676a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1677a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1679a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 1680a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Zero = 0; 1681a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(Zero, Result); 1682a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 16839ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson } 16849ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 1685ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitCastExpr(CastExpr *E) { 1686ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson Expr* SubExpr = E->getSubExpr(); 1687183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall QualType EltType = E->getType()->getAs<ComplexType>()->getElementType(); 1688a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SubType = SubExpr->getType(); 1689ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1690a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (SubType->isRealFloatingType()) { 1691ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APFloat Result(0.0); 16921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1693ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson if (!EvaluateFloat(SubExpr, Result, Info)) 1694ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 16951725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 16961725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 16971725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx); 16981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(Result, 16991725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(Result.getSemantics(), APFloat::fcZero, false)); 17001725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 17011725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt IResult; 17021725f683432715e5afe34d476024bd6f16eac3fcEli Friedman IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx); 17031725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned()); 17041725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 17051725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(IResult, Zero); 17061725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1707a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else if (SubType->isIntegerType()) { 1708a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APSInt Result; 17091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1710a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateInteger(SubExpr, Result, Info)) 1711a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return APValue(); 1712a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 17131725f683432715e5afe34d476024bd6f16eac3fcEli Friedman if (EltType->isRealFloatingType()) { 17141725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat FResult = 17151725f683432715e5afe34d476024bd6f16eac3fcEli Friedman HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx); 17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(FResult, 17171725f683432715e5afe34d476024bd6f16eac3fcEli Friedman APFloat(FResult.getSemantics(), APFloat::fcZero, false)); 17181725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } else { 17191725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx); 17201725f683432715e5afe34d476024bd6f16eac3fcEli Friedman llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned()); 17211725f683432715e5afe34d476024bd6f16eac3fcEli Friedman Zero = 0; 17221725f683432715e5afe34d476024bd6f16eac3fcEli Friedman return APValue(Result, Zero); 17231725f683432715e5afe34d476024bd6f16eac3fcEli Friedman } 1724183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall } else if (const ComplexType *CT = SubType->getAs<ComplexType>()) { 1725a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar APValue Src; 17261725f683432715e5afe34d476024bd6f16eac3fcEli Friedman 1727a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (!EvaluateComplex(SubExpr, Src, Info)) 1728a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(); 1729a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1730a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar QualType SrcType = CT->getElementType(); 1731a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar 1732a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (Src.isComplexFloat()) { 1733a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(HandleFloatToFloatCast(EltType, SrcType, 1735a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1736a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleFloatToFloatCast(EltType, SrcType, 1738a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 1739a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1740a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1741a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleFloatToIntCast(EltType, SrcType, 1742a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatReal(), 1743a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleFloatToIntCast(EltType, SrcType, 1745a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexFloatImag(), 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Info.Ctx)); 1747a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1748a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1749a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar assert(Src.isComplexInt() && "Invalid evaluate result."); 1750a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar if (EltType->isRealFloatingType()) { 17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return APValue(HandleIntToFloatCast(EltType, SrcType, 1752a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1753a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 17541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleIntToFloatCast(EltType, SrcType, 1755a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 1756a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx)); 1757a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } else { 1758a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar return APValue(HandleIntToIntCast(EltType, SrcType, 1759a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntReal(), 1760a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Info.Ctx), 17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump HandleIntToIntCast(EltType, SrcType, 1762a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar Src.getComplexIntImag(), 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Info.Ctx)); 1764a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1765a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar } 1766ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1767ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1768ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson // FIXME: Handle more casts. 1769ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1770ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1772ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue VisitBinaryOperator(const BinaryOperator *E); 1773ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitChooseExpr(const ChooseExpr *E) 1774ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getChosenSubExpr(Info.Ctx)); } 1775ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman APValue VisitUnaryExtension(const UnaryOperator *E) 1776ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman { return Visit(E->getSubExpr()); } 1777ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr, 17782217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman // conditional ?:, comma 17799ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}; 17809ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace 17819ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 17821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) { 1783a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E)); 1784a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar assert((!Result.isComplexFloat() || 17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (&Result.getComplexFloatReal().getSemantics() == 17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump &Result.getComplexFloatImag().getSemantics())) && 1787a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar "Invalid complex evaluation."); 1788a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar return Result.isComplexFloat() || Result.isComplexInt(); 17899ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} 17909ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson 17911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { 1792ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson APValue Result, RHS; 17931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1794a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getLHS(), Result, Info)) 1795ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1797a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(E->getRHS(), RHS, Info)) 1798ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return APValue(); 1799a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar 18003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar assert(Result.isComplexFloat() == RHS.isComplexFloat() && 18013f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar "Invalid operands to binary operator."); 1802ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson switch (E->getOpcode()) { 1803ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson default: return APValue(); 1804ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Add: 1805a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1806a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().add(RHS.getComplexFloatReal(), 1807a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1808a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().add(RHS.getComplexFloatImag(), 1809a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1810a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1811a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() += RHS.getComplexIntReal(); 1812a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() += RHS.getComplexIntImag(); 1813a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 18143f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1815ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson case BinaryOperator::Sub: 1816a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (Result.isComplexFloat()) { 1817a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(), 1818a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1819a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(), 1820a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar APFloat::rmNearestTiesToEven); 1821a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else { 1822a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntReal() -= RHS.getComplexIntReal(); 1823a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar Result.getComplexIntImag() -= RHS.getComplexIntImag(); 1824a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } 18253f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 18263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar case BinaryOperator::Mul: 18273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar if (Result.isComplexFloat()) { 18283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 18293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_r = LHS.getComplexFloatReal(); 18303f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &LHS_i = LHS.getComplexFloatImag(); 18313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_r = RHS.getComplexFloatReal(); 18323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat &RHS_i = RHS.getComplexFloatImag(); 18331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APFloat Tmp = LHS_r; 18353f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 18363f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal() = Tmp; 18373f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 18383f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 18393f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven); 18403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar 18413f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_r; 18423f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven); 18433f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag() = Tmp; 18443f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp = LHS_i; 18453f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven); 18463f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven); 18473f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } else { 18483f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar APValue LHS = Result; 18491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntReal() = 18503f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntReal() - 18513f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntImag()); 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.getComplexIntImag() = 18533f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar (LHS.getComplexIntReal() * RHS.getComplexIntImag() + 18543f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar LHS.getComplexIntImag() * RHS.getComplexIntReal()); 18553f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar } 18563f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar break; 1857ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson } 1858ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 1859ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson return Result; 1860ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson} 1861ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson 18629ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===// 18636ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method. 1864f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===// 1865f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner 18666ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using 1867019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that 1868019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to. If this function returns true, it returns the folded constant 1869019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result. 18705b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { 18715b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson EvalInfo Info(Ctx, Result); 187254da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson 187359b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (getType()->isVectorType()) { 187459b5da6d853b4368b984700315adf7b37de05764Nate Begeman if (!EvaluateVector(this, Result.Val, Info)) 187559b5da6d853b4368b984700315adf7b37de05764Nate Begeman return false; 187659b5da6d853b4368b984700315adf7b37de05764Nate Begeman } else if (getType()->isIntegerType()) { 187730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this))) 18786dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 18798958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar } else if (getType()->hasPointerRepresentation()) { 18805b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson if (!EvaluatePointer(this, Result.Val, Info)) 18816dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1882d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman } else if (getType()->isRealFloatingType()) { 1883d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman llvm::APFloat f(0.0); 18846dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson if (!EvaluateFloat(this, f, Info)) 18856dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18875b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson Result.Val = APValue(f); 1888a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else if (getType()->isAnyComplexType()) { 1889a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar if (!EvaluateComplex(this, Result.Val, Info)) 1890660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1891660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else 1892660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1893660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1894660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return true; 1895660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump} 1896660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1897660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stumpbool Expr::EvaluateAsAny(EvalResult &Result, ASTContext &Ctx) const { 1898660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump EvalInfo Info(Ctx, Result, true); 1899660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1900660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (getType()->isVectorType()) { 1901660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluateVector(this, Result.Val, Info)) 1902660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1903660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->isIntegerType()) { 1904660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this))) 1905660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1906660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->hasPointerRepresentation()) { 1907660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluatePointer(this, Result.Val, Info)) 1908660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1909660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->isRealFloatingType()) { 1910660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump llvm::APFloat f(0.0); 1911660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluateFloat(this, f, Info)) 1912660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump return false; 1913660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump 1914660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump Result.Val = APValue(f); 1915660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump } else if (getType()->isAnyComplexType()) { 1916660e6f79a138a30a437c02142f23e7ef4eb21b2eMike Stump if (!EvaluateComplex(this, Result.Val, Info)) 19176dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson return false; 1918a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar } else 19199d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson return false; 19206dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson 19215b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson return true; 19225b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson} 19235b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson 19241b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const { 19251b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson EvalInfo Info(Ctx, Result); 19261b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 19271b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 19281b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson} 19291b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson 1930b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedmanbool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const { 1931b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman EvalInfo Info(Ctx, Result, true); 1932b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 1933b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects; 1934b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman} 1935b2f295c8050fb8c141bf2cf38eed0a56e99d0092Eli Friedman 19366ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant 193745b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result. 193845b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const { 19394fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson EvalResult Result; 19404fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson return Evaluate(Result, Ctx) && !Result.HasSideEffects; 194145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner} 194251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 1943393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanianbool Expr::HasSideEffects(ASTContext &Ctx) const { 1944393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian Expr::EvalResult Result; 1945393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian EvalInfo Info(Ctx, Result); 1946393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian return HasSideEffect(Info).Visit(const_cast<Expr*>(this)); 1947393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian} 1948393c247fe025ccb5f914e37e948192ea86faef8cFariborz Jahanian 194951fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { 19501c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson EvalResult EvalResult; 19511c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson bool Result = Evaluate(EvalResult, Ctx); 1952f185319f25efd6094870f287030270fad26085baDaniel Dunbar Result = Result; 195351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson assert(Result && "Could not evaluate expression"); 19541c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); 195551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson 19561c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson return EvalResult.Val.getInt(); 195751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson} 1958