ExprConstant.cpp revision 1eb4433ac451dc16f4133a88af2d002ac26c58ef
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
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult) : Ctx(ctx),
5033ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman           EvalResult(evalresult) {}
5187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner};
5287eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
5387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner
544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr *E, APValue &Result, EvalInfo &Info);
5587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr *E, APValue &Result, EvalInfo &Info);
5687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluateInteger(const Expr *E, APSInt  &Result, EvalInfo &Info);
5769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr *E, APValue  &Result, EvalInfo &Info);
58d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr *E, APFloat &Result, EvalInfo &Info);
59a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info);
60f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
61f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// Misc utilities
634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
655bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedmanstatic bool EvalPointerValueAsBool(APValue& Value, bool& Result) {
665bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  // FIXME: Is this accurate for all kinds of bases?  If not, what would
675bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  // the check look like?
685bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  Result = Value.getLValueBase() || Value.getLValueOffset();
695bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman  return true;
705bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman}
715bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman
724efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool HandleConversionToBool(Expr* E, bool& Result, EvalInfo &Info) {
734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->getType()->isIntegralType()) {
744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
754efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateInteger(E, IntResult, Info))
764efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = IntResult != 0;
784efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
794efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else if (E->getType()->isRealFloatingType()) {
804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APFloat FloatResult(0.0);
814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluateFloat(E, FloatResult, Info))
824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Result = !FloatResult.isZero();
844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
85a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman  } else if (E->getType()->hasPointerRepresentation()) {
864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue PointerResult;
874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E, PointerResult, Info))
884efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
895bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman    return EvalPointerValueAsBool(PointerResult, Result);
90a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman  } else if (E->getType()->isAnyComplexType()) {
91a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    APValue ComplexResult;
92a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    if (!EvaluateComplex(E, ComplexResult, Info))
93a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      return false;
94a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    if (ComplexResult.isComplexFloat()) {
95a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      Result = !ComplexResult.getComplexFloatReal().isZero() ||
96a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman               !ComplexResult.getComplexFloatImag().isZero();
97a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    } else {
98a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman      Result = ComplexResult.getComplexIntReal().getBoolValue() ||
99a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman               ComplexResult.getComplexIntImag().getBoolValue();
100a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    }
101a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman    return true;
1024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
1054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
108a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                   APFloat &Value, ASTContext &Ctx) {
109a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
110a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Determine whether we are converting to unsigned or signed.
111a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool DestSigned = DestType->isSignedIntegerType();
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // FIXME: Warning for overflow.
114a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  uint64_t Space[4];
115a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
116a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  (void)Value.convertToInteger(Space, DestWidth, DestSigned,
117a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                               llvm::APFloat::rmTowardZero, &ignored);
118a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return APSInt(llvm::APInt(DestWidth, 4, Space), !DestSigned);
119a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
120a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
122a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                      APFloat &Value, ASTContext &Ctx) {
123a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool ignored;
124a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result = Value;
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Result.convert(Ctx.getFloatTypeSemantics(DestType),
126a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                 APFloat::rmNearestTiesToEven, &ignored);
127a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
128a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
129a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
131a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                 APSInt &Value, ASTContext &Ctx) {
132a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  unsigned DestWidth = Ctx.getIntWidth(DestType);
133a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APSInt Result = Value;
134a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // Figure out if this is a truncate, extend or noop cast.
135a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  // If the input is signed, do a sign extend, noop, or truncate.
136a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.extOrTrunc(DestWidth);
137a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.setIsUnsigned(DestType->isUnsignedIntegerType());
138a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
139a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
140a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
142a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    APSInt &Value, ASTContext &Ctx) {
143a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
144a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
145a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  Result.convertFromAPInt(Value, Value.isSigned(),
146a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                          APFloat::rmNearestTiesToEven);
147a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  return Result;
148a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar}
149a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman// LValue Evaluation
1524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
1534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmannamespace {
1544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanclass VISIBILITY_HIDDEN LValueExprEvaluator
1554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  : public StmtVisitor<LValueExprEvaluator, APValue> {
1564efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  EvalInfo &Info;
1574efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanpublic:
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1594efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  LValueExprEvaluator(EvalInfo &info) : Info(info) {}
1604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1614efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStmt(Stmt *S) {
1624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
1634efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
1644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
16635873c49adad211ff466e34342a52665742794f5Anders Carlsson  APValue VisitDeclRefExpr(DeclRefExpr *E);
1673aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff  APValue VisitBlockExpr(BlockExpr *E);
1684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); }
1694efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
1704efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitMemberExpr(MemberExpr *E);
1714efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); }
172eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner  APValue VisitObjCEncodeExpr(ObjCEncodeExpr *E) { return APValue(E, 0); }
1733068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
174e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  APValue VisitUnaryDeref(UnaryOperator *E);
175ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
176ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
177ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(const ChooseExpr *E)
178ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
179ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__, __imag__
1804efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman};
1814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman} // end anonymous namespace
1824efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1834efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanstatic bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
1844efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = LValueExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1854efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return Result.isLValue();
1864efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
1874efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) {
18950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  if (isa<FunctionDecl>(E->getDecl())) {
19050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    return APValue(E, 0);
19150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
192d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman    if (!VD->hasGlobalStorage())
193d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman      return APValue();
19450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    if (!VD->getType()->isReferenceType())
19550c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman      return APValue(E, 0);
196d933a0198f3ccce9c73bf2951625315b911d37bfEli Friedman    // FIXME: Check whether VD might be overridden!
19750c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    if (VD->getInit())
19850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman      return Visit(VD->getInit());
19950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  }
20050c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman
20150c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  return APValue();
20235873c49adad211ff466e34342a52665742794f5Anders Carlsson}
20335873c49adad211ff466e34342a52665742794f5Anders Carlsson
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E) {
2053aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff  if (E->hasBlockDeclRefExprs())
2063aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff    return APValue();
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2083aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff  return APValue(E, 0);
2093aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff}
2103aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff
2114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
2124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isFileScope())
2134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue(E, 0);
2144efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
2154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) {
2184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue result;
2194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  QualType Ty;
2204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (E->isArrow()) {
2214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!EvaluatePointer(E->getBase(), result, Info))
2224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
2236217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    Ty = E->getBase()->getType()->getAs<PointerType>()->getPointeeType();
2244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  } else {
2254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    result = Visit(E->getBase());
2264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (result.isUninit())
2274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return APValue();
2284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Ty = E->getBase()->getType();
2294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2316217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
2324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  const ASTRecordLayout &RL = Info.Ctx.getASTRecordLayout(RD);
23386f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor
23486f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
23586f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor  if (!FD) // FIXME: deal with other kinds of member expressions
23686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    return APValue();
2372be586108bb401019647791feca19ea03fd477ceEli Friedman
2382be586108bb401019647791feca19ea03fd477ceEli Friedman  if (FD->getType()->isReferenceType())
2392be586108bb401019647791feca19ea03fd477ceEli Friedman    return APValue();
2402be586108bb401019647791feca19ea03fd477ceEli Friedman
2414efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  // FIXME: This is linear time.
24244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  unsigned i = 0;
24317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis  for (RecordDecl::field_iterator Field = RD->field_begin(),
24417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis                               FieldEnd = RD->field_end();
24544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor       Field != FieldEnd; (void)++Field, ++i) {
24644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    if (*Field == FD)
2474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      break;
2484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
2494efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2504efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  result.setLValue(result.getLValueBase(),
2514efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman                   result.getLValueOffset() + RL.getFieldOffset(i) / 8);
2524efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2534efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return result;
2544efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
2554efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
2573068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APValue Result;
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2593068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluatePointer(E->getBase(), Result, Info))
2603068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2623068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  APSInt Index;
2633068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  if (!EvaluateInteger(E->getIdx(), Index, Info))
2643068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    return APValue();
2653068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2663068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8;
2673068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
2683068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  uint64_t Offset = Index.getSExtValue() * ElementSize;
2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Result.setLValue(Result.getLValueBase(),
2703068d117951a8df54bae9db039b56201ab10962bAnders Carlsson                   Result.getLValueOffset() + Offset);
2713068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  return Result;
2723068d117951a8df54bae9db039b56201ab10962bAnders Carlsson}
2734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
2741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E) {
275e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  APValue Result;
276e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  if (!EvaluatePointer(E->getSubExpr(), Result, Info))
277e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman    return APValue();
278e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman  return Result;
279e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman}
280e8761c8fe2ee6b628104a0885f49fd3c21c08a4fEli Friedman
2814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman//===----------------------------------------------------------------------===//
282f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Pointer Evaluation
283f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
284f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
285c754aa62643e66ab967ca32ae8b0b3fc419bba25Anders Carlssonnamespace {
2862bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonclass VISIBILITY_HIDDEN PointerExprEvaluator
2872bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  : public StmtVisitor<PointerExprEvaluator, APValue> {
28887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
2892bad1687fe6f00e10767a691a33b070b151902b6Anders Carlssonpublic:
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  PointerExprEvaluator(EvalInfo &info) : Info(info) {}
292f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
2932bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitStmt(Stmt *S) {
2942bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson    return APValue();
2952bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
2962bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
2972bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
2982bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
299650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
300650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue VisitCastExpr(const CastExpr* E);
3012217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
3022217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman      { return Visit(E->getSubExpr()); }
3032217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue VisitUnaryAddrOf(const UnaryOperator *E);
3044efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitObjCStringLiteral(ObjCStringLiteral *E)
3054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      { return APValue(E, 0); }
306f01158941ba4560c63150032073bb231ce38999eEli Friedman  APValue VisitAddrLabelExpr(AddrLabelExpr *E)
307f01158941ba4560c63150032073bb231ce38999eEli Friedman      { return APValue(E, 0); }
3083941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  APValue VisitCallExpr(CallExpr *E);
309b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  APValue VisitBlockExpr(BlockExpr *E) {
310b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    if (!E->hasBlockDeclRefExprs())
311b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump      return APValue(E, 0);
312b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump    return APValue();
313b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump  }
31491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue VisitImplicitValueInitExpr(ImplicitValueInitExpr *E)
31591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return APValue((Expr*)0, 0); }
3164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue VisitConditionalOperator(ConditionalOperator *E);
317ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(ChooseExpr *E)
3186e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
3196e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E)
3206e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl      { return APValue((Expr*)0, 0); }
321ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: @protocol, @selector
3222bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson};
323f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
3242bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
32587eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattnerstatic bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) {
3268958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  if (!E->getType()->hasPointerRepresentation())
327f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return false;
32887eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  Result = PointerExprEvaluator(Info).Visit(const_cast<Expr*>(E));
329f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  return Result.isLValue();
330f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
331650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
332f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris LattnerAPValue PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
333650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() != BinaryOperator::Add &&
334650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      E->getOpcode() != BinaryOperator::Sub)
335650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *PExp = E->getLHS();
338650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr *IExp = E->getRHS();
339650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (IExp->getType()->isPointerType())
340f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    std::swap(PExp, IExp);
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  APValue ResultLValue;
34387eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluatePointer(PExp, ResultLValue, Info))
344650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  llvm::APSInt AdditionalOffset(32);
34787eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!EvaluateInteger(IExp, AdditionalOffset, Info))
348650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    return APValue();
349650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
3506217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  QualType PointeeType = PExp->getType()->getAs<PointerType>()->getPointeeType();
3514d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  uint64_t SizeOfPointee;
3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3534d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  // Explicitly handle GNU void* and function pointer arithmetic extensions.
3544d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  if (PointeeType->isVoidType() || PointeeType->isFunctionType())
3554d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson    SizeOfPointee = 1;
3564d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson  else
3574d4c50dd8b4db191c38782414665fb7608315a36Anders Carlsson    SizeOfPointee = Info.Ctx.getTypeSize(PointeeType) / 8;
3584efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
359650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  uint64_t Offset = ResultLValue.getLValueOffset();
3604efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
361650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  if (E->getOpcode() == BinaryOperator::Add)
3624efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset += AdditionalOffset.getLimitedValue() * SizeOfPointee;
363650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  else
3644efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    Offset -= AdditionalOffset.getLimitedValue() * SizeOfPointee;
3654efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
366650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue(ResultLValue.getLValueBase(), Offset);
367650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson}
3684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
3692217c87bdc5ab357046a5453bdb06f469c41024eEli FriedmanAPValue PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) {
3702217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  APValue result;
3712217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  if (EvaluateLValue(E->getSubExpr(), result, Info))
3722217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    return result;
3734efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
3744efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
376650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
377b542afe02d317411d53b3541946f9f2a8f509a11Chris LattnerAPValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
378650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  const Expr* SubExpr = E->getSubExpr();
379650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
380650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson   // Check for pointer->pointer cast
38114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (SubExpr->getType()->isPointerType() ||
38214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      SubExpr->getType()->isObjCObjectPointerType()) {
383650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    APValue Result;
38487eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (EvaluatePointer(SubExpr, Result, Info))
385650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson      return Result;
386f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner    return APValue();
387650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
389d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
39069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    APValue Result;
39169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    if (!EvaluateIntegerOrLValue(SubExpr, Result, Info))
39269ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      return APValue();
39369ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
39469ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    if (Result.isInt()) {
39569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      Result.getInt().extOrTrunc((unsigned)Info.Ctx.getTypeSize(E->getType()));
39669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar      return APValue(0, Result.getInt().getZExtValue());
397650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson    }
3981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39969ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    // Cast is of an lvalue, no need to change value.
40069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar    return Result;
401650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  }
4024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4034efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isFunctionType() ||
4043aaa482ea5b8d20b705f6ac8573b539be88d273aSteve Naroff      SubExpr->getType()->isBlockPointerType() ||
4054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      SubExpr->getType()->isArrayType()) {
4064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APValue Result;
4074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (EvaluateLValue(SubExpr, Result, Info))
4084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return Result;
4094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
4104efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
4114efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
412650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson  return APValue();
4131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
414650c92fdcc27a950a8a848ecab6a74e6f5e80788Anders Carlsson
4153941b18b8e441c8c466efecd557de60b9a32d10bEli FriedmanAPValue PointerExprEvaluator::VisitCallExpr(CallExpr *E) {
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (E->isBuiltinCall(Info.Ctx) ==
4173c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor        Builtin::BI__builtin___CFStringMakeConstantString)
4183941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman    return APValue(E, 0);
4193941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman  return APValue();
4203941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman}
4213941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman
4224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli FriedmanAPValue PointerExprEvaluator::VisitConditionalOperator(ConditionalOperator *E) {
4234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool BoolResult;
4244efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
4254efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return APValue();
4264efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4274efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
4284efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
4294efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  APValue Result;
4304efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (EvaluatePointer(EvalExpr, Result, Info))
4314efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return Result;
4324efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return APValue();
4334efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
434f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
435f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
43659b5da6d853b4368b984700315adf7b37de05764Nate Begeman// Vector Evaluation
43759b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
43859b5da6d853b4368b984700315adf7b37de05764Nate Begeman
43959b5da6d853b4368b984700315adf7b37de05764Nate Begemannamespace {
44059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  class VISIBILITY_HIDDEN VectorExprEvaluator
44159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  : public StmtVisitor<VectorExprEvaluator, APValue> {
44259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    EvalInfo &Info;
44391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue GetZeroVector(QualType VecType);
44459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  public:
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    VectorExprEvaluator(EvalInfo &info) : Info(info) {}
4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44859b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitStmt(Stmt *S) {
44959b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return APValue();
45059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
4511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitParenExpr(ParenExpr *E)
45391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        { return Visit(E->getSubExpr()); }
45491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryExtension(const UnaryOperator *E)
45591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
45691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryPlus(const UnaryOperator *E)
45791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
45891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryReal(const UnaryOperator *E)
45991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return Visit(E->getSubExpr()); }
46091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
46191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      { return GetZeroVector(E->getType()); }
46259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCastExpr(const CastExpr* E);
46359b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
46459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    APValue VisitInitListExpr(const InitListExpr *E);
46591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitConditionalOperator(const ConditionalOperator *E);
466ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    APValue VisitChooseExpr(const ChooseExpr *E)
467ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman      { return Visit(E->getChosenSubExpr(Info.Ctx)); }
46891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    APValue VisitUnaryImag(const UnaryOperator *E);
46991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    // FIXME: Missing: unary -, unary ~, binary add/sub/mul/div,
4702217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman    //                 binary comparisons, binary and/or/xor,
47191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //                 shufflevector, ExtVectorElementExpr
47291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //        (Note that these require implementing conversions
47391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    //         between vector types.)
47459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  };
47559b5da6d853b4368b984700315adf7b37de05764Nate Begeman} // end anonymous namespace
47659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
47759b5da6d853b4368b984700315adf7b37de05764Nate Begemanstatic bool EvaluateVector(const Expr* E, APValue& Result, EvalInfo &Info) {
47859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (!E->getType()->isVectorType())
47959b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return false;
48059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  Result = VectorExprEvaluator(Info).Visit(const_cast<Expr*>(E));
48159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return !Result.isUninit();
48259b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
48359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
48459b5da6d853b4368b984700315adf7b37de05764Nate BegemanAPValue VectorExprEvaluator::VisitCastExpr(const CastExpr* E) {
485c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  const VectorType *VTy = E->getType()->getAsVectorType();
486c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  QualType EltTy = VTy->getElementType();
487c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned NElts = VTy->getNumElements();
488c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  unsigned EltWidth = Info.Ctx.getTypeSize(EltTy);
4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const Expr* SE = E->getSubExpr();
491e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  QualType SETy = SE->getType();
492e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  APValue Result = APValue();
49359b5da6d853b4368b984700315adf7b37de05764Nate Begeman
494e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  // Check for vector->vector bitcast and scalar->vector splat.
495e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  if (SETy->isVectorType()) {
49659b5da6d853b4368b984700315adf7b37de05764Nate Begeman    return this->Visit(const_cast<Expr*>(SE));
497e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  } else if (SETy->isIntegerType()) {
498e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman    APSInt IntResult;
499d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    if (!EvaluateInteger(SE, IntResult, Info))
500d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar      return APValue();
501d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    Result = APValue(IntResult);
502e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  } else if (SETy->isRealFloatingType()) {
503e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman    APFloat F(0.0);
504d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    if (!EvaluateFloat(SE, F, Info))
505d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar      return APValue();
506d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar    Result = APValue(F);
507d906dc7605b2d6352e16c27a5d3fb5f1a1b44ac8Daniel Dunbar  } else
508c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    return APValue();
50959b5da6d853b4368b984700315adf7b37de05764Nate Begeman
510c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // For casts of a scalar to ExtVector, convert the scalar to the element type
511c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // and splat it to all elements.
512c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  if (E->getType()->isExtVectorType()) {
513c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    if (EltTy->isIntegerType() && Result.isInt())
514c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleIntToIntCast(EltTy, SETy, Result.getInt(),
515c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                          Info.Ctx));
516c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isIntegerType())
517c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleFloatToIntCast(EltTy, SETy, Result.getFloat(),
518c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                            Info.Ctx));
519c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isRealFloatingType() && Result.isInt())
520c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleIntToFloatCast(EltTy, SETy, Result.getInt(),
521c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                            Info.Ctx));
522c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isRealFloatingType())
523c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Result = APValue(HandleFloatToFloatCast(EltTy, SETy, Result.getFloat(),
524c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman                                              Info.Ctx));
525c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else
526c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      return APValue();
527c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
528c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    // Splat and create vector APValue.
529c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    llvm::SmallVector<APValue, 4> Elts(NElts, Result);
530c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    return APValue(&Elts[0], Elts.size());
531e8c9e9218f215ec6089f12b076c7b9d310fd5194Nate Begeman  }
532c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
533c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // For casts of a scalar to regular gcc-style vector type, bitcast the scalar
534c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // to the vector. To construct the APValue vector initializer, bitcast the
535c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // initializing value to an APInt, and shift out the bits pertaining to each
536c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  // element.
537c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  APSInt Init;
538c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  Init = Result.isInt() ? Result.getInt() : Result.getFloat().bitcastToAPInt();
5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
540c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  llvm::SmallVector<APValue, 4> Elts;
541c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  for (unsigned i = 0; i != NElts; ++i) {
542c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    APSInt Tmp = Init;
543c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    Tmp.extOrTrunc(EltWidth);
5441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
545c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    if (EltTy->isIntegerType())
546c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Elts.push_back(APValue(Tmp));
547c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else if (EltTy->isRealFloatingType())
548c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      Elts.push_back(APValue(APFloat(Tmp)));
549c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    else
550c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman      return APValue();
551c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman
552c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman    Init >>= EltWidth;
553c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  }
554c0b8b19bd8056d6b5d831623a0825cce150f4507Nate Begeman  return APValue(&Elts[0], Elts.size());
55559b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
55659b5da6d853b4368b984700315adf7b37de05764Nate Begeman
5571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue
55859b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
55959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return this->Visit(const_cast<Expr*>(E->getInitializer()));
56059b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
56159b5da6d853b4368b984700315adf7b37de05764Nate Begeman
5621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue
56359b5da6d853b4368b984700315adf7b37de05764Nate BegemanVectorExprEvaluator::VisitInitListExpr(const InitListExpr *E) {
56459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  const VectorType *VT = E->getType()->getAsVectorType();
56559b5da6d853b4368b984700315adf7b37de05764Nate Begeman  unsigned NumInits = E->getNumInits();
56691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  unsigned NumElements = VT->getNumElements();
5671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  QualType EltTy = VT->getElementType();
56959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  llvm::SmallVector<APValue, 4> Elements;
57059b5da6d853b4368b984700315adf7b37de05764Nate Begeman
57191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  for (unsigned i = 0; i < NumElements; i++) {
57259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (EltTy->isIntegerType()) {
57359b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APSInt sInt(32);
57491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      if (i < NumInits) {
57591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        if (!EvaluateInteger(E->getInit(i), sInt, Info))
57691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman          return APValue();
57791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
57891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        sInt = Info.Ctx.MakeIntValue(0, EltTy);
57991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
58059b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(sInt));
58159b5da6d853b4368b984700315adf7b37de05764Nate Begeman    } else {
58259b5da6d853b4368b984700315adf7b37de05764Nate Begeman      llvm::APFloat f(0.0);
58391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      if (i < NumInits) {
58491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        if (!EvaluateFloat(E->getInit(i), f, Info))
58591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman          return APValue();
58691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      } else {
58791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        f = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy));
58891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman      }
58959b5da6d853b4368b984700315adf7b37de05764Nate Begeman      Elements.push_back(APValue(f));
59059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    }
59159b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
59259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  return APValue(&Elements[0], Elements.size());
59359b5da6d853b4368b984700315adf7b37de05764Nate Begeman}
59459b5da6d853b4368b984700315adf7b37de05764Nate Begeman
5951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue
59691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanVectorExprEvaluator::GetZeroVector(QualType T) {
59791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  const VectorType *VT = T->getAsVectorType();
59891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  QualType EltTy = VT->getElementType();
59991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue ZeroElement;
60091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EltTy->isIntegerType())
60191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement = APValue(Info.Ctx.MakeIntValue(0, EltTy));
60291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  else
60391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    ZeroElement =
60491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman        APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(EltTy)));
60591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
60691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  llvm::SmallVector<APValue, 4> Elements(VT->getNumElements(), ZeroElement);
60791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return APValue(&Elements[0], Elements.size());
60891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
60991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
61091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
61191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  bool BoolResult;
61291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (!HandleConversionToBool(E->getCond(), BoolResult, Info))
61391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    return APValue();
61491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
61591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  Expr* EvalExpr = BoolResult ? E->getTrueExpr() : E->getFalseExpr();
61691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
61791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  APValue Result;
61891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (EvaluateVector(EvalExpr, Result, Info))
61991110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    return Result;
62091110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return APValue();
62191110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
62291110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
62391110ee24e3475e0a3a38938c7b98439b5cf0b0eEli FriedmanAPValue VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
62491110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
62591110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman    Info.EvalResult.HasSideEffects = true;
62691110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman  return GetZeroVector(E->getType());
62791110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman}
62891110ee24e3475e0a3a38938c7b98439b5cf0b0eEli Friedman
62959b5da6d853b4368b984700315adf7b37de05764Nate Begeman//===----------------------------------------------------------------------===//
630f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner// Integer Evaluation
631f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
632f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
633f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnernamespace {
634f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerclass VISIBILITY_HIDDEN IntExprEvaluator
635b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  : public StmtVisitor<IntExprEvaluator, bool> {
63687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  EvalInfo &Info;
63730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue &Result;
638f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattnerpublic:
63930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  IntExprEvaluator(EvalInfo &info, APValue &result)
64087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    : Info(info), Result(result) {}
641f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
6423f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  bool Success(const llvm::APSInt &SI, const Expr *E) {
6434fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
64430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.isSigned() == E->getType()->isSignedIntegerType() &&
6453f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
64630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
6473f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
64830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(SI);
6493f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
6503f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
6513f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar
652131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(const llvm::APInt &I, const Expr *E) {
6534fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
65430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    assert(I.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
6553f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar           "Invalid evaluation result.");
65630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(APSInt(I));
65730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result.getInt().setIsUnsigned(E->getType()->isUnsignedIntegerType());
658131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
659131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
660131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
661131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  bool Success(uint64_t Value, const Expr *E) {
6624fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    assert(E->getType()->isIntegralType() && "Invalid evaluation result.");
66330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    Result = APValue(Info.Ctx.MakeIntValue(Value, E->getType()));
664131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return true;
665131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  }
666131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
66782206e267ce6cc709797127616f64672d255b310Anders Carlsson  bool Error(SourceLocation L, diag::kind D, const Expr *E) {
66832fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    // Take the first error.
66954da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson    if (Info.EvalResult.Diag == 0) {
67054da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.DiagLoc = L;
67154da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson      Info.EvalResult.Diag = D;
67282206e267ce6cc709797127616f64672d255b310Anders Carlsson      Info.EvalResult.DiagExpr = E;
67332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    }
67454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    return false;
6757a76778e218da57a3b10c80066a0a938f28987b6Chris Lattner  }
6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
677f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
678f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //                            Visitor Methods
679f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  //===--------------------------------------------------------------------===//
6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68132fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitStmt(Stmt *) {
68232fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    assert(0 && "This should be called on integers, stmts are not integers");
68332fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner    return false;
68432fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  }
6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68632fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  bool VisitExpr(Expr *E) {
6870e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
688f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner  }
6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
690b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
691f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
6924c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitIntegerLiteral(const IntegerLiteral *E) {
693131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
6944c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
6954c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCharacterLiteral(const CharacterLiteral *E) {
696131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
6974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
6984c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
699ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // Per gcc docs "this built-in function ignores top level
700ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // qualifiers".  We need to use the canonical version to properly
701ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    // be able to strip CRV qualifiers from the type.
702ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T0 = Info.Ctx.getCanonicalType(E->getArgType1());
703ac620decb68aad1a2cf6c0c191b56d78981d9aaaDaniel Dunbar    QualType T1 = Info.Ctx.getCanonicalType(E->getArgType2());
7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return Success(Info.Ctx.typesAreCompatible(T0.getUnqualifiedType(),
705131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                                               T1.getUnqualifiedType()),
706131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                   E);
7074c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
7084c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitDeclRefExpr(const DeclRefExpr *E);
7094c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  bool VisitCallExpr(const CallExpr *E);
710b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitBinaryOperator(const BinaryOperator *E);
711b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner  bool VisitUnaryOperator(const UnaryOperator *E);
712ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes  bool VisitConditionalOperator(const ConditionalOperator *E);
713f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
714a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar  bool VisitCastExpr(CastExpr* E);
7150518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
7160518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
7173068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
718131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getValue(), E);
7193068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7213f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  bool VisitGNUNullExpr(const GNUNullExpr *E) {
722131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
7233f70456b8adb0405ef2a47d51f9fc2d5937ae8aeAnders Carlsson  }
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7253068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
726131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(0, E);
7273068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
7283068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
729664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
730664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman    return Success(0, E);
731664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  }
732664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
73364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) {
7345e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor    return Success(E->EvaluateTrait(Info.Ctx), E);
73564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
73664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
737ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitChooseExpr(const ChooseExpr *E) {
738ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    return Visit(E->getChosenSubExpr(Info.Ctx));
739ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  }
740ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
741722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  bool VisitUnaryReal(const UnaryOperator *E);
742664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  bool VisitUnaryImag(const UnaryOperator *E);
743664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
744fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattnerprivate:
745af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfExpr(const Expr *E);
746af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  unsigned GetAlignOfType(QualType T);
747664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  // FIXME: Missing: array subscript of vector, member of vector
748f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner};
749f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner} // end anonymous namespace
750f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
75169ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateIntegerOrLValue(const Expr* E, APValue &Result, EvalInfo &Info) {
7523f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  if (!E->getType()->isIntegralType())
7533f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return false;
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75569ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  return IntExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
75669ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar}
75769ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar
75869ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbarstatic bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
75930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  APValue Val;
76069ab26a8623141f35e86817cfc6e0fbe7639a40fDaniel Dunbar  if (!EvaluateIntegerOrLValue(E, Val, Info) || !Val.isInt())
76130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
76230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  Result = Val.getInt();
76330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  return true;
764f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner}
765f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
7664c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitDeclRefExpr(const DeclRefExpr *E) {
7674c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Enums are integer constant exprs.
7684c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  if (const EnumConstantDecl *D = dyn_cast<EnumConstantDecl>(E->getDecl())) {
769e9a0f43927041e2bcc89140c338dfae207ad3c3bEli Friedman    // FIXME: This is an ugly hack around the fact that enums don't set their
7703f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // signedness consistently; see PR3173.
7713f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    APSInt SI = D->getInitVal();
7723f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    SI.setIsUnsigned(!E->getType()->isSignedIntegerType());
7733f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // FIXME: This is an ugly hack around the fact that enums don't
7743f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    // set their width (!?!) consistently; see PR3173.
7753f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    SI.extOrTrunc(Info.Ctx.getIntWidth(E->getType()));
7763f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return Success(SI, E);
7774c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  }
778b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
779b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  // In C++, const, non-volatile integers initialized with ICEs are ICEs.
780e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman  // In C, they can also be folded, although they are not ICEs.
781e1646da3bb0fe97b372e5fe8cefc537b22048fc4Eli Friedman  if (E->getType().getCVRQualifiers() == QualType::Const) {
782b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    if (const VarDecl *D = dyn_cast<VarDecl>(E->getDecl())) {
78378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      if (APValue *V = D->getEvaluatedValue())
78478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        return Success(V->getInt(), E);
78578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      if (const Expr *Init = D->getInit()) {
78678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        if (Visit(const_cast<Expr*>(Init))) {
78778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          // Cache the evaluated value in the variable declaration.
78878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          D->setEvaluatedValue(Info.Ctx, Result);
78978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor          return true;
79078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        }
79178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor
79278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor        return false;
79378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor      }
794b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl    }
795b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl  }
796b2bc62bd35129f09d0746ef6a5ef4dc392b6d6e1Sebastian Redl
7974c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Otherwise, random variable references are not constants.
7980e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson  return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
7994c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
8004c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner
801a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
802a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner/// as GCC.
803a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattnerstatic int EvaluateBuiltinClassifyType(const CallExpr *E) {
804a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // The following enum mimics the values returned by GCC.
8057c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // FIXME: Does GCC differ between lvalue and rvalue references here?
806a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  enum gcc_type_class {
807a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    no_type_class = -1,
808a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    void_type_class, integer_type_class, char_type_class,
809a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    enumeral_type_class, boolean_type_class,
810a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    pointer_type_class, reference_type_class, offset_type_class,
811a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    real_type_class, complex_type_class,
812a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    function_type_class, method_type_class,
813a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    record_type_class, union_type_class,
814a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    array_type_class, string_type_class,
815a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    lang_type_class
816a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  };
8171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // If no argument was supplied, default to "no_type_class". This isn't
819a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  // ideal, however it is what gcc does.
820a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (E->getNumArgs() == 0)
821a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return no_type_class;
8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
823a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  QualType ArgTy = E->getArg(0)->getType();
824a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  if (ArgTy->isVoidType())
825a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return void_type_class;
826a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isEnumeralType())
827a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return enumeral_type_class;
828a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isBooleanType())
829a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return boolean_type_class;
830a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isCharType())
831a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return string_type_class; // gcc doesn't appear to use char_type_class
832a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isIntegerType())
833a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return integer_type_class;
834a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isPointerType())
835a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return pointer_type_class;
836a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isReferenceType())
837a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return reference_type_class;
838a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isRealType())
839a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return real_type_class;
840a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isComplexType())
841a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return complex_type_class;
842a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isFunctionType())
843a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return function_type_class;
844a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isStructureType())
845a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return record_type_class;
846a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
847a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
848a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isArrayType())
849a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return array_type_class;
850a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else if (ArgTy->isUnionType())
851a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    return union_type_class;
852a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
853a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner    assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
854a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner  return -1;
855a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner}
856a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner
8574c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattnerbool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
8583c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
859019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  default:
8600e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
861019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_classify_type:
862131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(EvaluateBuiltinClassifyType(E), E);
8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8644bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson  case Builtin::BI__builtin_constant_p:
865019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // __builtin_constant_p always has one operand: it returns true if that
866019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner    // operand can be folded, false otherwise.
867131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(E->getArg(0)->isEvaluatable(Info.Ctx), E);
868019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
8694c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner}
870f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
871b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
872a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == BinaryOperator::Comma) {
873027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    if (!Visit(E->getRHS()))
874027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson      return false;
8754fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson
87633ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    // If we can't evaluate the LHS, it might have side effects;
87733ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    // conservatively mark it.
87833ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman    if (!E->getLHS()->isEvaluatable(Info.Ctx))
87933ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman      Info.EvalResult.HasSideEffects = true;
880c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner
881027f62ec1860f4ab0c91bd863b238938880b8102Anders Carlsson    return true;
882a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
883a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
884a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->isLogicalOp()) {
885a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // These need to be handled specially because the operands aren't
886a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // necessarily integral
887fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    bool lhsResult, rhsResult;
8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
889fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson    if (HandleConversionToBool(E->getLHS(), lhsResult, Info)) {
89051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // We were able to evaluate the LHS, see if we can get away with not
89151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson      // evaluating the RHS: 0 && X -> 0, 1 || X -> 1
89233ef1456a19779fb15c51aea362bd9c7cb4087f3Eli Friedman      if (lhsResult == (E->getOpcode() == BinaryOperator::LOr))
8933f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar        return Success(lhsResult, E);
894a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
895fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
8964bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        if (E->getOpcode() == BinaryOperator::LOr)
897131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult || rhsResult, E);
8984bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        else
899131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(lhsResult && rhsResult, E);
9004bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
9014bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson    } else {
902fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson      if (HandleConversionToBool(E->getRHS(), rhsResult, Info)) {
9034bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // We can't evaluate the LHS; however, sometimes the result
9044bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        // is determined by the RHS: X && 0 -> 0, X || 1 -> 1.
9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (rhsResult == (E->getOpcode() == BinaryOperator::LOr) ||
906fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson            !rhsResult == (E->getOpcode() == BinaryOperator::LAnd)) {
907131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          // Since we weren't able to evaluate the left hand side, it
908fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          // must have had side effects.
909fcb4d09531abbf2a5cf398c2f946fb3bc2875f64Anders Carlsson          Info.EvalResult.HasSideEffects = true;
910131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar
911131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar          return Success(rhsResult, E);
9124bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson        }
9134bbc0e05a714d4ee4918a92a4a7049dd6ef33ad0Anders Carlsson      }
914a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    }
915a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
916a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
917c8cc9ccc7b87a7ed1749b074f6b670bcec49abc1Chris Lattner  }
91854176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner
919286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType LHSTy = E->getLHS()->getType();
920286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  QualType RHSTy = E->getRHS()->getType();
9214087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
9224087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  if (LHSTy->isAnyComplexType()) {
9234087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    assert(RHSTy->isAnyComplexType() && "Invalid comparison");
9244087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    APValue LHS, RHS;
9254087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
9264087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getLHS(), LHS, Info))
9274087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
9284087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
9294087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (!EvaluateComplex(E->getRHS(), RHS, Info))
9304087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      return false;
9314087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
9324087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    if (LHS.isComplexFloat()) {
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_r =
9344087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatReal().compare(RHS.getComplexFloatReal());
9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      APFloat::cmpResult CR_i =
9364087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar        LHS.getComplexFloatImag().compare(RHS.getComplexFloatImag());
9374087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar
9384087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
939131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((CR_r == APFloat::cmpEqual &&
940131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        CR_i == APFloat::cmpEqual), E);
941131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
942131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
943131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid complex comparison.");
9441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return Success(((CR_r == APFloat::cmpGreaterThan ||
945131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_r == APFloat::cmpLessThan) &&
9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                        (CR_i == APFloat::cmpGreaterThan ||
947131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                         CR_i == APFloat::cmpLessThan)), E);
948131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
9494087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    } else {
9504087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar      if (E->getOpcode() == BinaryOperator::EQ)
951131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() == RHS.getComplexIntReal() &&
952131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() == RHS.getComplexIntImag()), E);
953131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      else {
954131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        assert(E->getOpcode() == BinaryOperator::NE &&
955131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar               "Invalid compex comparison.");
956131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar        return Success((LHS.getComplexIntReal() != RHS.getComplexIntReal() ||
957131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                        LHS.getComplexIntImag() != RHS.getComplexIntImag()), E);
958131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      }
9594087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar    }
9604087e24f73d05d96ac2d259679751d054d3ddfbcDaniel Dunbar  }
9611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
962286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (LHSTy->isRealFloatingType() &&
963286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      RHSTy->isRealFloatingType()) {
964286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat RHS(0.0), LHS(0.0);
9651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
966286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getRHS(), RHS, Info))
967286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
969286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    if (!EvaluateFloat(E->getLHS(), LHS, Info))
970286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      return false;
9711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
972286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    APFloat::cmpResult CR = LHS.compare(RHS);
973529569e68d10b0fd3750fd2124faf742249b846bAnders Carlsson
974286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    switch (E->getOpcode()) {
975286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    default:
976286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      assert(0 && "Invalid binary operator!");
977286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LT:
978131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan, E);
979286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GT:
980131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpGreaterThan, E);
981286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::LE:
982131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpLessThan || CR == APFloat::cmpEqual, E);
983286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::GE:
9841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan || CR == APFloat::cmpEqual,
985131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     E);
986286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::EQ:
987131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(CR == APFloat::cmpEqual, E);
988286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    case BinaryOperator::NE:
9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return Success(CR == APFloat::cmpGreaterThan
990131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar                     || CR == APFloat::cmpLessThan, E);
991286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson    }
992286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  }
9931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
994ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
995ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman    if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) {
9963068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue LHSValue;
9973068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
9983068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
999a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
10003068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      APValue RHSValue;
10013068d117951a8df54bae9db039b56201ab10962bAnders Carlsson      if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
10023068d117951a8df54bae9db039b56201ab10962bAnders Carlsson        return false;
1003a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
10045bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      // Reject any bases from the normal codepath; we special-case comparisons
10055bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      // to null.
10065bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      if (LHSValue.getLValueBase()) {
10075bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!E->isEqualityOp())
10085bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
10095bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (RHSValue.getLValueBase() || RHSValue.getLValueOffset())
10105bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
10115bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        bool bres;
10125bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!EvalPointerValueAsBool(LHSValue, bres))
10135bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
10145bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E);
10155bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      } else if (RHSValue.getLValueBase()) {
10165bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!E->isEqualityOp())
10175bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
10185bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (LHSValue.getLValueBase() || LHSValue.getLValueOffset())
10195bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
10205bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        bool bres;
10215bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        if (!EvalPointerValueAsBool(RHSValue, bres))
10225bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman          return false;
10235bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman        return Success(bres ^ (E->getOpcode() == BinaryOperator::EQ), E);
10245bc86103767c2abcbfdd6518e0ccbbbb6aa59e0fEli Friedman      }
1025a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1026ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      if (E->getOpcode() == BinaryOperator::Sub) {
1027ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        const QualType Type = E->getLHS()->getType();
10286217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek        const QualType ElementType = Type->getAs<PointerType>()->getPointeeType();
10293068d117951a8df54bae9db039b56201ab10962bAnders Carlsson
1030ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
1031ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman        if (!ElementType->isVoidType() && !ElementType->isFunctionType())
1032ce1bca73aef9bbf6359ab8420278203dda81a054Eli Friedman          D /= Info.Ctx.getTypeSize(ElementType) / 8;
1033a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1034ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        return Success(D, E);
1035ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
1036ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      bool Result;
1037ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      if (E->getOpcode() == BinaryOperator::EQ) {
1038ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset();
1039267c0ab1b9a15768f3f15abbfc40ce344751c78bEli Friedman      } else {
1040ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman        Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset();
1041ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      }
1042ad02d7debd03ff275ac8ea27891a4ecccdb78068Eli Friedman      return Success(Result, E);
10433068d117951a8df54bae9db039b56201ab10962bAnders Carlsson    }
10443068d117951a8df54bae9db039b56201ab10962bAnders Carlsson  }
1045286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson  if (!LHSTy->isIntegralType() ||
1046286f85e791dda3634fee7f6c67f0ed92296c028fAnders Carlsson      !RHSTy->isIntegralType()) {
1047a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // We can't continue from here for non-integral types, and they
1048a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // could potentially confuse the following operations.
1049a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false;
1050a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1051a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1052a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  // The LHS of a constant expr is always evaluated and needed.
105330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  if (!Visit(E->getLHS()))
1054a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    return false; // error in subexpression.
1055d9f4bcda18bfbf79341edd9d381d4b6a3cffe655Eli Friedman
105642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  APValue RHSVal;
105742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (!EvaluateIntegerOrLValue(E->getRHS(), RHSVal, Info))
105830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return false;
105942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
106042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like (unsigned long)&a + 4.
106142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (E->isAdditiveOp() && Result.isLValue() && RHSVal.isInt()) {
106242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    uint64_t offset = Result.getLValueOffset();
106342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    if (E->getOpcode() == BinaryOperator::Add)
106442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman      offset += RHSVal.getInt().getZExtValue();
106542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    else
106642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman      offset -= RHSVal.getInt().getZExtValue();
106742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    Result = APValue(Result.getLValueBase(), offset);
106842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
106942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
107042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
107142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // Handle cases like 4 + (unsigned long)&a
107242edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (E->getOpcode() == BinaryOperator::Add &&
107342edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman        RHSVal.isLValue() && Result.isInt()) {
107442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    uint64_t offset = RHSVal.getLValueOffset();
107542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    offset += Result.getInt().getZExtValue();
107642edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    Result = APValue(RHSVal.getLValueBase(), offset);
107742edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman    return true;
107842edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  }
107942edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
108042edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  // All the following cases expect both operands to be an integer
108142edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  if (!Result.isInt() || !RHSVal.isInt())
1082b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner    return false;
1083a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
108442edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman  APSInt& RHS = RHSVal.getInt();
108542edd0d32a729d2735a6fb152ba6bf349bf0a169Eli Friedman
1086a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  switch (E->getOpcode()) {
108732fea9d18cc3658a1b01df5ca6f2ac302625c61dChris Lattner  default:
10880e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
108930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Mul: return Success(Result.getInt() * RHS, E);
109030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Add: return Success(Result.getInt() + RHS, E);
109130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Sub: return Success(Result.getInt() - RHS, E);
109230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::And: return Success(Result.getInt() & RHS, E);
109330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Xor: return Success(Result.getInt() ^ RHS, E);
109430c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::Or:  return Success(Result.getInt() | RHS, E);
1095a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Div:
109654176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
10970e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
109830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() / RHS, E);
1099a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  case BinaryOperator::Rem:
110054176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    if (RHS == 0)
11010e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson      return Error(E->getOperatorLoc(), diag::note_expr_divide_by_zero, E);
110230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() % RHS, E);
11033f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shl: {
110454176fdb044312b4b77c3da6682d3575b3728d30Chris Lattner    // FIXME: Warn about out of range shift amounts!
11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned SA =
110630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
110730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() << SA, E);
11083f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
11093f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  case BinaryOperator::Shr: {
11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    unsigned SA =
111130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar      (unsigned) RHS.getLimitedValue(Result.getInt().getBitWidth()-1);
111230c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(Result.getInt() >> SA, E);
11133f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar  }
11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
111530c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LT: return Success(Result.getInt() < RHS, E);
111630c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GT: return Success(Result.getInt() > RHS, E);
111730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::LE: return Success(Result.getInt() <= RHS, E);
111830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::GE: return Success(Result.getInt() >= RHS, E);
111930c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::EQ: return Success(Result.getInt() == RHS, E);
112030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar  case BinaryOperator::NE: return Success(Result.getInt() != RHS, E);
1121b11e77836dd0867955c5abf32baf1c3e6c7f81e1Eli Friedman  }
1122a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
1123a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
1124ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopesbool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) {
1125a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  bool Cond;
1126a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  if (!HandleConversionToBool(E->getCond(), Cond, Info))
1127ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes    return false;
1128ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
1129a25bd55e63b9ab26ca69390533356aaae7f1a40eNuno Lopes  return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
1130ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes}
1131ca7c2eaca35edac066ab7cec15f7ecebbb3731d8Nuno Lopes
1132af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfType(QualType T) {
1133e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the alignment.
1134e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  unsigned CharSize = Info.Ctx.Target.getCharWidth();
113518857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor
11362be586108bb401019647791feca19ea03fd477ceEli Friedman  // __alignof is defined to return the preferred alignment.
113718857644059c45da6776f1a288eec7b4cf3a844aDouglas Gregor  return Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize;
1138e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
1139e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
1140af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattnerunsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
1141af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  E = E->IgnoreParens();
1142af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
1143af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  // alignof decl is always accepted, even if it doesn't make sense: we default
11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // to 1 in those cases.
1145af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
1146b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar    return Info.Ctx.getDeclAlignInBytes(DRE->getDecl());
1147a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1148af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
1149b7d0844c887a72064b624dc6df12cbe1441f69d0Daniel Dunbar    return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl());
1150af707ab8fbb9451e8febb8d766f6c043628125c4Chris Lattner
1151e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  return GetAlignOfType(E->getType());
1152e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner}
1153e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
1154e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner
11550518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the
11560518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl/// expression's type.
11570518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlbool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
11580518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType DstTy = E->getType();
1159fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1160e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Handle alignof separately.
1161e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!E->isSizeOf()) {
1162e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    if (E->isArgumentType())
1163131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(GetAlignOfType(E->getArgumentType()), E);
1164e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner    else
1165131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar      return Success(GetAlignOfExpr(E->getArgumentExpr()), E);
1166e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  }
1167a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
11680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  QualType SrcTy = E->getTypeOfArgument();
11690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl
1170131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // sizeof(void), __alignof__(void), sizeof(function) = 1 as a gcc
1171131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  // extension.
1172131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar  if (SrcTy->isVoidType() || SrcTy->isFunctionType())
1173131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(1, E);
1174a1f47c447a919c6a05c63801cb6a52c4c288e2ccEli Friedman
1175fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner  // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
1176e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  if (!SrcTy->isConstantSizeType())
1177fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner    return false;
1178f2da9dfef96dc11b7b5effb1d02cb427b2d71599Eli Friedman
1179e9feb475d72ba50dc29cec62a8c47cae721065ebChris Lattner  // Get information about the size.
118024cbfb96f09318f59dc73eaaf4909a79788ec5acDaniel Dunbar  unsigned BitWidth = Info.Ctx.getTypeSize(SrcTy);
1181ff89666e8d143b52f2bb5d2c3a108125d523abb7Daniel Dunbar  return Success(BitWidth / Info.Ctx.Target.getCharWidth(), E);
1182fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner}
1183fcee0019b76f9f368f2b3d6d4048a98232593f29Chris Lattner
1184b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattnerbool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
11854c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // Special case unary operators that do not need their subexpression
11864c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  // evaluated.  offsetof/sizeof/alignof are all special.
118735183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  if (E->isOffsetOfOp()) {
118835183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    // The AST for offsetof is defined in such a way that we can just
118935183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    // directly Evaluate it as an l-value.
119035183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    APValue LV;
119135183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    if (!EvaluateLValue(E->getSubExpr(), LV, Info))
119235183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman      return false;
119335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    if (LV.getLValueBase())
119435183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman      return false;
119535183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman    return Success(LV.getLValueOffset(), E);
119635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  }
1197a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
1198a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  if (E->getOpcode() == UnaryOperator::LNot) {
1199a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    // LNot's operand isn't necessarily an integer, so we handle it specially.
1200a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    bool bres;
1201a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman    if (!HandleConversionToBool(E->getSubExpr(), bres, Info))
1202a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman      return false;
1203131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(!bres, E);
1204a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman  }
1205a6afa768aa7bd3102a2807aa720917e4a1771e4eEli Friedman
12064fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  // Only handle integral operations...
12074fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar  if (!E->getSubExpr()->getType()->isIntegralType())
12084fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar    return false;
12094fff4819a913c65ae23cfd389bc47c61919e4e1fDaniel Dunbar
121087eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  // Get the operand value into 'Result'.
121187eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner  if (!Visit(E->getSubExpr()))
121275a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    return false;
1213a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson
121475a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  switch (E->getOpcode()) {
12154c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner  default:
121675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
121775a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner    // See C99 6.6p3.
12180e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getOperatorLoc(), diag::note_invalid_subexpr_in_ice, E);
121975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Extension:
12204c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // FIXME: Should extension allow i-c-e extension expressions in its scope?
12214c4867e140327fa3b56306fa03c64c8e6a7c95efChris Lattner    // If so, we could clear the diagnostic ID.
12223f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
122375a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Plus:
12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // The result is always just the subexpr.
12253f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    return true;
122675a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Minus:
122730c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
122830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(-Result.getInt(), E);
122975a4881047deeb3a300ff9293dc6ba8570048bb5Chris Lattner  case UnaryOperator::Not:
123030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!Result.isInt()) return false;
123130c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    return Success(~Result.getInt(), E);
123206a3675627e3b3c47b49c689c8e404a33144194aAnders Carlsson  }
1233a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
12341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1235732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// HandleCast - This is used to evaluate implicit or explicit casts where the
1236732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner/// result type is integer.
1237a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbarbool IntExprEvaluator::VisitCastExpr(CastExpr *E) {
123882206e267ce6cc709797127616f64672d255b310Anders Carlsson  Expr *SubExpr = E->getSubExpr();
123982206e267ce6cc709797127616f64672d255b310Anders Carlsson  QualType DestType = E->getType();
1240b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  QualType SrcType = SubExpr->getType();
124182206e267ce6cc709797127616f64672d255b310Anders Carlsson
12424efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (DestType->isBooleanType()) {
12434efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    bool BoolResult;
12444efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!HandleConversionToBool(SubExpr, BoolResult, Info))
12454efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1246131eb438d8c216b2e2a4f8fa8158ea88b787dc14Daniel Dunbar    return Success(BoolResult, E);
12474efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
12484efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1249a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson  // Handle simple integer->integer casts.
1250b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (SrcType->isIntegralType()) {
1251732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner    if (!Visit(SubExpr))
1252b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
1253a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1254be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!Result.isInt()) {
1255be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      // Only allow casts of lvalues if they are lossless.
1256be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType);
1257be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    }
125830c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar
1259dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType,
126030c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar                                      Result.getInt(), Info.Ctx), E);
1261732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  }
12621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1263732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner  // FIXME: Clean this up!
1264b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (SrcType->isPointerType()) {
1265a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson    APValue LV;
126687eae5ecf94e38baa20d9a327b8f73f8bdc72436Chris Lattner    if (!EvaluatePointer(SubExpr, LV, Info))
1267b542afe02d317411d53b3541946f9f2a8f509a11Chris Lattner      return false;
12684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1269dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    if (LV.getLValueBase()) {
1270dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      // Only allow based lvalue casts if they are lossless.
1271dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(SrcType))
1272dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar        return false;
1273dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar
1274dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      Result = LV;
1275dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar      return true;
1276dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    }
12774efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1278dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    APSInt AsInt = Info.Ctx.MakeIntValue(LV.getLValueOffset(), SrcType);
1279dd2116462ae311043986ae8b7fba27e68c1b2e66Daniel Dunbar    return Success(HandleIntToIntCast(DestType, SrcType, AsInt, Info.Ctx), E);
12802bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson  }
12814efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1282be26570e3faa009bdcefedfaf04473e518940520Eli Friedman  if (SrcType->isArrayType() || SrcType->isFunctionType()) {
1283be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    // This handles double-conversion cases, where there's both
1284be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    // an l-value promotion and an implicit conversion to int.
1285be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    APValue LV;
1286be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (!EvaluateLValue(SubExpr, LV, Info))
1287be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return false;
1288be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
1289be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    if (Info.Ctx.getTypeSize(DestType) != Info.Ctx.getTypeSize(Info.Ctx.VoidPtrTy))
1290be26570e3faa009bdcefedfaf04473e518940520Eli Friedman      return false;
1291be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
1292be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    Result = LV;
1293be26570e3faa009bdcefedfaf04473e518940520Eli Friedman    return true;
1294be26570e3faa009bdcefedfaf04473e518940520Eli Friedman  }
1295be26570e3faa009bdcefedfaf04473e518940520Eli Friedman
12961725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  if (SrcType->isAnyComplexType()) {
12971725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    APValue C;
12981725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (!EvaluateComplex(SubExpr, C, Info))
12991725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return false;
13001725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    if (C.isComplexFloat())
13011725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return Success(HandleFloatToIntCast(DestType, SrcType,
13021725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                                          C.getComplexFloatReal(), Info.Ctx),
13031725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                     E);
13041725f683432715e5afe34d476024bd6f16eac3fcEli Friedman    else
13051725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      return Success(HandleIntToIntCast(DestType, SrcType,
13061725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                                        C.getComplexIntReal(), Info.Ctx), E);
13071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman  }
13082217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  // FIXME: Handle vectors
13092217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
1310b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  if (!SrcType->isRealFloatingType())
13110e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1312732b2236ae4a4f11e7642677cebbd169c07ea877Chris Lattner
1313d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat F(0.0);
1314d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(SubExpr, F, Info))
13150e8acbbba71ec6acd5dceb4fcbce63e463e1b755Anders Carlsson    return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
13161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1317b92dac8bc2f6f73919825f9af693a8a7e89ae1d4Daniel Dunbar  return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E);
1318a25ae3d68d84d2b89907f998df6a396549589da5Anders Carlsson}
13192bad1687fe6f00e10767a691a33b070b151902b6Anders Carlsson
1320722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedmanbool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) {
1321722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isAnyComplexType()) {
1322722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    APValue LV;
1323722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1324722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1325722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntReal(), E);
1326722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
1327722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1328722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  return Visit(E->getSubExpr());
1329722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman}
1330722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1331664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedmanbool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
1332722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  if (E->getSubExpr()->getType()->isComplexIntegerType()) {
1333722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    APValue LV;
1334722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt())
1335722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman      return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E);
1336722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman    return Success(LV.getComplexIntImag(), E);
1337722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman  }
1338722c717cd833e410ca6e7976d78baea16995e0c4Eli Friedman
1339664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  if (!E->getSubExpr()->isEvaluatable(Info.Ctx))
1340664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman    Info.EvalResult.HasSideEffects = true;
1341664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman  return Success(0, E);
1342664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman}
1343664a104ba0b8f47b8908ec6af694d9646adba1fcEli Friedman
1344f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1345d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman// Float Evaluation
1346d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1347d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1348d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmannamespace {
1349d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanclass VISIBILITY_HIDDEN FloatExprEvaluator
1350d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  : public StmtVisitor<FloatExprEvaluator, bool> {
1351d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  EvalInfo &Info;
1352d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  APFloat &Result;
1353d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanpublic:
1354d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  FloatExprEvaluator(EvalInfo &info, APFloat &result)
1355d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    : Info(info), Result(result) {}
1356d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1357d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitStmt(Stmt *S) {
1358d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1359d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1360d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1361d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
1362019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  bool VisitCallExpr(const CallExpr *E);
1363d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
13645db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  bool VisitUnaryOperator(const UnaryOperator *E);
1365d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitBinaryOperator(const BinaryOperator *E);
1366d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  bool VisitFloatingLiteral(const FloatingLiteral *E);
13674efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCastExpr(CastExpr *E);
13684efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  bool VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
13692217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman
1370ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitChooseExpr(const ChooseExpr *E)
1371ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1372ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  bool VisitUnaryExtension(const UnaryOperator *E)
1373ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
1374ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman
1375ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME: Missing: __real__/__imag__, array subscript of vector,
1376ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  //                 member of vector, ImplicitValueInitExpr,
13772217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  //                 conditional ?:, comma
1378d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman};
1379d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman} // end anonymous namespace
1380d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1381d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanstatic bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
1382d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
1383d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1384d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1385019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattnerbool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
13863c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  switch (E->isBuiltinCall(Info.Ctx)) {
138734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner  default: return false;
1388019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_val:
1389019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_valf:
1390019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_huge_vall:
1391019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inf:
1392019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  case Builtin::BI__builtin_inff:
13937cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  case Builtin::BI__builtin_infl: {
13947cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar    const llvm::fltSemantics &Sem =
13957cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar      Info.Ctx.getFloatTypeSemantics(E->getType());
139634a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    Result = llvm::APFloat::getInf(Sem);
139734a74ab81600a40c6324fd76adb724b803dfaf91Chris Lattner    return true;
13987cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar  }
13991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14009e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nan:
14019e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanf:
14029e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner  case Builtin::BI__builtin_nanl:
14034572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump    // If this is __builtin_nan() turn this into a nan, otherwise we
14049e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    // can't constant fold it.
14051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (const StringLiteral *S =
14069e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        dyn_cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts())) {
14074572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump      if (!S->isWide()) {
14087cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar        const llvm::fltSemantics &Sem =
14097cbed03c00e246682e5292785d01e1c120ce54bdDaniel Dunbar          Info.Ctx.getFloatTypeSemantics(E->getType());
14107462b39a9bccaf4392687831036713f09f9c0681Mike Stump        llvm::SmallString<16> s;
14117462b39a9bccaf4392687831036713f09f9c0681Mike Stump        s.append(S->getStrData(), S->getStrData() + S->getByteLength());
14127462b39a9bccaf4392687831036713f09f9c0681Mike Stump        s += '\0';
14134572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump        long l;
14144572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump        char *endp;
14157462b39a9bccaf4392687831036713f09f9c0681Mike Stump        l = strtol(&s[0], &endp, 0);
14167462b39a9bccaf4392687831036713f09f9c0681Mike Stump        if (endp != s.end()-1)
14174572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump          return false;
14184572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump        unsigned type = (unsigned int)l;;
14194572baba9d18c275968ac113fd73b0e3c77cccb8Mike Stump        Result = llvm::APFloat::getNaN(Sem, false, type);
14209e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner        return true;
14219e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner      }
14229e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    }
14239e62171a25e3a08fb5c49fb370f83faf5ae786f5Chris Lattner    return false;
14245db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
14255db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabs:
14265db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsf:
14275db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_fabsl:
14285db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info))
14295db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
14301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14315db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (Result.isNegative())
14325db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      Result.changeSign();
14335db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
14345db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysign:
14361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case Builtin::BI__builtin_copysignf:
14375db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case Builtin::BI__builtin_copysignl: {
14385db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    APFloat RHS(0.);
14395db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    if (!EvaluateFloat(E->getArg(0), Result, Info) ||
14405db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar        !EvaluateFloat(E->getArg(1), RHS, Info))
14415db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar      return false;
14425db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.copySign(RHS);
14435db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
14445db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
1445019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner  }
1446019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner}
1447019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
14485db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbarbool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
1449a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes  if (E->getOpcode() == UnaryOperator::Deref)
1450a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes    return false;
1451a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
14525db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  if (!EvaluateFloat(E->getSubExpr(), Result, Info))
14535db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return false;
14545db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar
14555db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  switch (E->getOpcode()) {
14565db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  default: return false;
14571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  case UnaryOperator::Plus:
14585db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
14595db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  case UnaryOperator::Minus:
14605db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    Result.changeSign();
14615db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar    return true;
14625db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  }
14635db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar}
1464019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner
1465d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1466d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // FIXME: Diagnostics?  I really don't understand how the warnings
1467d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  // and errors are supposed to work.
14685db4b3f3ed9f769d5b02c1d1ccc52bfd71fb9afbDaniel Dunbar  APFloat RHS(0.0);
1469d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getLHS(), Result, Info))
1470d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1471d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  if (!EvaluateFloat(E->getRHS(), RHS, Info))
1472d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return false;
1473d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1474d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  switch (E->getOpcode()) {
1475d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  default: return false;
1476d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Mul:
1477d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.multiply(RHS, APFloat::rmNearestTiesToEven);
1478d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1479d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Add:
1480d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.add(RHS, APFloat::rmNearestTiesToEven);
1481d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1482d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Sub:
1483d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.subtract(RHS, APFloat::rmNearestTiesToEven);
1484d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1485d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  case BinaryOperator::Div:
1486d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    Result.divide(RHS, APFloat::rmNearestTiesToEven);
1487d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    return true;
1488d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  }
1489d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1490d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
1491d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedmanbool FloatExprEvaluator::VisitFloatingLiteral(const FloatingLiteral *E) {
1492d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  Result = E->getValue();
1493d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  return true;
1494d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman}
1495d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman
14964efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {
14974efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Expr* SubExpr = E->getSubExpr();
14981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14994efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isIntegralType()) {
15004efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    APSInt IntResult;
15013f7d995390009fede92b333a040da80e1ce90997Daniel Dunbar    if (!EvaluateInteger(SubExpr, IntResult, Info))
15024efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result = HandleIntToFloatCast(E->getType(), SubExpr->getType(),
1504a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                  IntResult, Info.Ctx);
15054efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
15064efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
15074efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  if (SubExpr->getType()->isRealFloatingType()) {
15084efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    if (!Visit(SubExpr))
15094efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman      return false;
1510a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    Result = HandleFloatToFloatCast(E->getType(), SubExpr->getType(),
1511a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                    Result, Info.Ctx);
15124efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman    return true;
15134efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  }
15142217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  // FIXME: Handle complex types
15154efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
15164efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return false;
15174efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
15184efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
15194efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedmanbool FloatExprEvaluator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
15204efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  Result = APFloat::getZero(Info.Ctx.getFloatTypeSemantics(E->getType()));
15214efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman  return true;
15224efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman}
15234efaa276bc0ce8f7baf6138ead11915f3e3e58d9Eli Friedman
1524d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman//===----------------------------------------------------------------------===//
1525a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar// Complex Evaluation (for float and integer)
15269ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
15279ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
15289ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonnamespace {
1529a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbarclass VISIBILITY_HIDDEN ComplexExprEvaluator
1530a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  : public StmtVisitor<ComplexExprEvaluator, APValue> {
15319ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  EvalInfo &Info;
15321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15339ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlssonpublic:
1534a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  ComplexExprEvaluator(EvalInfo &info) : Info(info) {}
15351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15369ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
15379ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //                            Visitor Methods
15389ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  //===--------------------------------------------------------------------===//
15399ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
15409ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitStmt(Stmt *S) {
15419ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson    return APValue();
15429ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
15431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15449ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
15459ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
15469ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  APValue VisitImaginaryLiteral(ImaginaryLiteral *E) {
1547a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    Expr* SubExpr = E->getSubExpr();
1548a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1549a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (SubExpr->getType()->isRealFloatingType()) {
1550a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APFloat Result(0.0);
1551a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1552a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateFloat(SubExpr, Result, Info))
1553a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
15541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return APValue(APFloat(Result.getSemantics(), APFloat::fcZero, false),
1556a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                     Result);
1557a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
15581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(SubExpr->getType()->isIntegerType() &&
1559a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar             "Unexpected imaginary literal.");
1560a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
1561a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Result;
1562a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1563a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
15641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1565a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
1566a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Zero = 0;
1567a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      return APValue(Zero, Result);
1568a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
15699ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson  }
15709ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
1571ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitCastExpr(CastExpr *E) {
1572ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    Expr* SubExpr = E->getSubExpr();
1573a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType EltType = E->getType()->getAsComplexType()->getElementType();
1574a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    QualType SubType = SubExpr->getType();
1575ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1576a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    if (SubType->isRealFloatingType()) {
1577ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      APFloat Result(0.0);
15781725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1579ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson      if (!EvaluateFloat(SubExpr, Result, Info))
1580ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson        return APValue();
15811725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
15821725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      if (EltType->isRealFloatingType()) {
15831725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Result = HandleFloatToFloatCast(EltType, SubType, Result, Info.Ctx);
15841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return APValue(Result,
15851725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                       APFloat(Result.getSemantics(), APFloat::fcZero, false));
15861725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      } else {
15871725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt IResult;
15881725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        IResult = HandleFloatToIntCast(EltType, SubType, Result, Info.Ctx);
15891725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt Zero(IResult.getBitWidth(), !IResult.isSigned());
15901725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Zero = 0;
15911725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(IResult, Zero);
15921725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      }
1593a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (SubType->isIntegerType()) {
1594a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      APSInt Result;
15951725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1596a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      if (!EvaluateInteger(SubExpr, Result, Info))
1597a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar        return APValue();
1598a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
15991725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      if (EltType->isRealFloatingType()) {
16001725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        APFloat FResult =
16011725f683432715e5afe34d476024bd6f16eac3fcEli Friedman            HandleIntToFloatCast(EltType, SubType, Result, Info.Ctx);
16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return APValue(FResult,
16031725f683432715e5afe34d476024bd6f16eac3fcEli Friedman                       APFloat(FResult.getSemantics(), APFloat::fcZero, false));
16041725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      } else {
16051725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Result = HandleIntToIntCast(EltType, SubType, Result, Info.Ctx);
16061725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        llvm::APSInt Zero(Result.getBitWidth(), !Result.isSigned());
16071725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        Zero = 0;
16081725f683432715e5afe34d476024bd6f16eac3fcEli Friedman        return APValue(Result, Zero);
16091725f683432715e5afe34d476024bd6f16eac3fcEli Friedman      }
1610a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar    } else if (const ComplexType *CT = SubType->getAsComplexType()) {
1611a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      APValue Src;
16121725f683432715e5afe34d476024bd6f16eac3fcEli Friedman
1613a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (!EvaluateComplex(SubExpr, Src, Info))
1614a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        return APValue();
1615a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1616a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      QualType SrcType = CT->getElementType();
1617a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar
1618a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      if (Src.isComplexFloat()) {
1619a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
16201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          return APValue(HandleFloatToFloatCast(EltType, SrcType,
1621a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatReal(),
1622a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx),
16231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleFloatToFloatCast(EltType, SrcType,
1624a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Src.getComplexFloatImag(),
1625a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                                Info.Ctx));
1626a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1627a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleFloatToIntCast(EltType, SrcType,
1628a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatReal(),
1629a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleFloatToIntCast(EltType, SrcType,
1631a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexFloatImag(),
16321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              Info.Ctx));
1633a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1634a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      } else {
1635a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        assert(Src.isComplexInt() && "Invalid evaluate result.");
1636a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        if (EltType->isRealFloatingType()) {
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          return APValue(HandleIntToFloatCast(EltType, SrcType,
1638a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntReal(),
1639a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx),
16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleIntToFloatCast(EltType, SrcType,
1641a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Src.getComplexIntImag(),
1642a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                              Info.Ctx));
1643a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        } else {
1644a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar          return APValue(HandleIntToIntCast(EltType, SrcType,
1645a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntReal(),
1646a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Info.Ctx),
16471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                         HandleIntToIntCast(EltType, SrcType,
1648a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar                                            Src.getComplexIntImag(),
16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                            Info.Ctx));
1650a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar        }
1651a2cfd34952204c9a160fe1a5da5ba2f231df891dDaniel Dunbar      }
1652ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    }
1653ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1654ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    // FIXME: Handle more casts.
1655ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1656ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
16571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1658ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue VisitBinaryOperator(const BinaryOperator *E);
1659ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitChooseExpr(const ChooseExpr *E)
1660ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getChosenSubExpr(Info.Ctx)); }
1661ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  APValue VisitUnaryExtension(const UnaryOperator *E)
1662ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman    { return Visit(E->getSubExpr()); }
1663ba98d6bb414861965a1f22628494ea046785ecd4Eli Friedman  // FIXME Missing: unary +/-/~, binary div, ImplicitValueInitExpr,
16642217c87bdc5ab357046a5453bdb06f469c41024eEli Friedman  //                conditional ?:, comma
16659ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson};
16669ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson} // end anonymous namespace
16679ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info) {
1669a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  Result = ComplexExprEvaluator(Info).Visit(const_cast<Expr*>(E));
1670a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  assert((!Result.isComplexFloat() ||
16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          (&Result.getComplexFloatReal().getSemantics() ==
16721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump           &Result.getComplexFloatImag().getSemantics())) &&
1673a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar         "Invalid complex evaluation.");
1674a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  return Result.isComplexFloat() || Result.isComplexInt();
16759ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson}
16769ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson
16771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpAPValue ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
1678ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  APValue Result, RHS;
16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1680a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getLHS(), Result, Info))
1681ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1683a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  if (!EvaluateComplex(E->getRHS(), RHS, Info))
1684ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson    return APValue();
1685a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
16863f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  assert(Result.isComplexFloat() == RHS.isComplexFloat() &&
16873f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         "Invalid operands to binary operator.");
1688ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  switch (E->getOpcode()) {
1689ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  default: return APValue();
1690ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Add:
1691a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1692a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().add(RHS.getComplexFloatReal(),
1693a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1694a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().add(RHS.getComplexFloatImag(),
1695a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                       APFloat::rmNearestTiesToEven);
1696a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1697a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() += RHS.getComplexIntReal();
1698a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() += RHS.getComplexIntImag();
1699a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
17003f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1701ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  case BinaryOperator::Sub:
1702a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (Result.isComplexFloat()) {
1703a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatReal().subtract(RHS.getComplexFloatReal(),
1704a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1705a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexFloatImag().subtract(RHS.getComplexFloatImag(),
1706a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar                                            APFloat::rmNearestTiesToEven);
1707a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    } else {
1708a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntReal() -= RHS.getComplexIntReal();
1709a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      Result.getComplexIntImag() -= RHS.getComplexIntImag();
1710a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
17113f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
17123f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar  case BinaryOperator::Mul:
17133f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    if (Result.isComplexFloat()) {
17143f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
17153f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_r = LHS.getComplexFloatReal();
17163f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &LHS_i = LHS.getComplexFloatImag();
17173f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_r = RHS.getComplexFloatReal();
17183f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat &RHS_i = RHS.getComplexFloatImag();
17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17203f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APFloat Tmp = LHS_r;
17213f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
17223f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal() = Tmp;
17233f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
17243f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
17253f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatReal().subtract(Tmp, APFloat::rmNearestTiesToEven);
17263f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar
17273f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_r;
17283f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_i, APFloat::rmNearestTiesToEven);
17293f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag() = Tmp;
17303f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp = LHS_i;
17313f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Tmp.multiply(RHS_r, APFloat::rmNearestTiesToEven);
17323f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      Result.getComplexFloatImag().add(Tmp, APFloat::rmNearestTiesToEven);
17333f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    } else {
17343f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar      APValue LHS = Result;
17351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntReal() =
17363f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntReal() -
17373f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntImag());
17381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Result.getComplexIntImag() =
17393f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar        (LHS.getComplexIntReal() * RHS.getComplexIntImag() +
17403f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar         LHS.getComplexIntImag() * RHS.getComplexIntReal());
17413f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    }
17423f2798757c9ee353e207e18115e2e966432a4beeDaniel Dunbar    break;
1743ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  }
1744ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
1745ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson  return Result;
1746ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson}
1747ccc3fce5697e33f005990f9795e1c7cb8b4559ecAnders Carlsson
17489ad16aebc0e840a5e7d425da72eb6cbe25e4b58cAnders Carlsson//===----------------------------------------------------------------------===//
17496ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner// Top level Expr::Evaluate method.
1750f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner//===----------------------------------------------------------------------===//
1751f5eeb055ecbadbc25c83df0867cdada2c2559dcfChris Lattner
17526ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// Evaluate - Return true if this is a constant which we can fold using
1753019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// any crazy technique (that has nothing to do with language standards) that
1754019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// we want to.  If this function returns true, it returns the folded constant
1755019f4e858e78587f2241ff1a76c747d7bcd7578cChris Lattner/// in Result.
17565b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlssonbool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
17575b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  EvalInfo Info(Ctx, Result);
175854da0496616cb898596cfd5fae1f824098bd8435Anders Carlsson
175959b5da6d853b4368b984700315adf7b37de05764Nate Begeman  if (getType()->isVectorType()) {
176059b5da6d853b4368b984700315adf7b37de05764Nate Begeman    if (!EvaluateVector(this, Result.Val, Info))
176159b5da6d853b4368b984700315adf7b37de05764Nate Begeman      return false;
176259b5da6d853b4368b984700315adf7b37de05764Nate Begeman  } else if (getType()->isIntegerType()) {
176330c37f4d2ee5811e85f692c22fb67d74ddc88079Daniel Dunbar    if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast<Expr*>(this)))
17646dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
17658958891f5fa1e593c4519a36b3df427ee019d70bDaniel Dunbar  } else if (getType()->hasPointerRepresentation()) {
17665b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    if (!EvaluatePointer(this, Result.Val, Info))
17676dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1768d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman  } else if (getType()->isRealFloatingType()) {
1769d8bfe7f25a695ca947effbccdf9ecbe3e018e221Eli Friedman    llvm::APFloat f(0.0);
17706dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    if (!EvaluateFloat(this, f, Info))
17716dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
17721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17735b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson    Result.Val = APValue(f);
1774a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else if (getType()->isAnyComplexType()) {
1775a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    if (!EvaluateComplex(this, Result.Val, Info))
17766dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson      return false;
1777a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar  } else
17789d4c157baaada8945671dc98363a40ed00cbd824Anders Carlsson    return false;
17796dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
17805b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson  return true;
17815b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson}
17825b45d4ef1ea3f04ec863daf8aa29be6c6e021750Anders Carlsson
17831b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlssonbool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const {
17841b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  EvalInfo Info(Ctx, Result);
17851b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
17861b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson  return EvaluateLValue(this, Result.Val, Info) && !Result.HasSideEffects;
17871b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson}
17881b78276a75a5a0f496a82429c1ff9604d622a76dAnders Carlsson
17896ee7aa154e8bbb21a21254293410b944f78b0bfeChris Lattner/// isEvaluatable - Call Evaluate to see if this expression can be constant
179045b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner/// folded, but discard the result.
179145b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattnerbool Expr::isEvaluatable(ASTContext &Ctx) const {
17924fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  EvalResult Result;
17934fdfb0965b396f2778091f7e6c051d17ff9791baAnders Carlsson  return Evaluate(Result, Ctx) && !Result.HasSideEffects;
179445b6b9d080ac56917337d73d8f1cd6374b27b05dChris Lattner}
179551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
179651fe996231b1d7199f76e4005ff4c943d5deeecdAnders CarlssonAPSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
17971c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  EvalResult EvalResult;
17981c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  bool Result = Evaluate(EvalResult, Ctx);
1799f185319f25efd6094870f287030270fad26085baDaniel Dunbar  Result = Result;
180051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  assert(Result && "Could not evaluate expression");
18011c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer");
180251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
18031c0cfd4599e816cfd7a8f348286bf0ad79652ffcAnders Carlsson  return EvalResult.Val.getInt();
180451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
1805