[cfe-commits] r59420 - /cfe/trunk/lib/AST/ExprConstant.cpp
Anders Carlsson
andersca at mac.com
Sun Nov 16 11:01:23 PST 2008
Author: andersca
Date: Sun Nov 16 13:01:22 2008
New Revision: 59420
URL: http://llvm.org/viewvc/llvm-project?rev=59420&view=rev
Log:
More work on the constant evaluator. Eli, it would be great if you could have a look at this.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=59420&r1=59419&r2=59420&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Sun Nov 16 13:01:22 2008
@@ -124,6 +124,7 @@
APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
APValue VisitMemberExpr(MemberExpr *E);
APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); }
+ APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
};
} // end anonymous namespace
@@ -169,6 +170,24 @@
return result;
}
+APValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E)
+{
+ APValue Result;
+
+ if (!EvaluatePointer(E->getBase(), Result, Info))
+ return APValue();
+
+ APSInt Index;
+ if (!EvaluateInteger(E->getIdx(), Index, Info))
+ return APValue();
+
+ uint64_t ElementSize = Info.Ctx.getTypeSize(E->getType()) / 8;
+
+ uint64_t Offset = Index.getSExtValue() * ElementSize;
+ Result.setLValue(Result.getLValueBase(),
+ Result.getLValueOffset() + Offset);
+ return Result;
+}
//===----------------------------------------------------------------------===//
// Pointer Evaluation
@@ -384,6 +403,18 @@
}
bool VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E);
+ bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) {
+ Result = E->getValue();
+ Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
+ return true;
+ }
+
+ bool VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
+ Result = APSInt::getNullValue(getIntTypeSizeInBits(E->getType()));
+ Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
+ return true;
+ }
+
private:
bool HandleCast(SourceLocation CastLoc, Expr *SubExpr, QualType DestType);
};
@@ -572,6 +603,40 @@
return true;
}
+ if (E->getOpcode() == BinaryOperator::Sub) {
+ if (LHSTy->isPointerType()) {
+ if (RHSTy->isIntegralType()) {
+ // pointer - int.
+ // FIXME: Implement.
+ }
+
+ assert(RHSTy->isPointerType() && "RHS not pointer!");
+
+ APValue LHSValue;
+ if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
+ return false;
+
+ APValue RHSValue;
+ if (!EvaluatePointer(E->getRHS(), RHSValue, Info))
+ return false;
+
+ // FIXME: Is this correct? What if only one of the operands has a base?
+ if (LHSValue.getLValueBase() || RHSValue.getLValueBase())
+ return false;
+
+ const QualType Type = E->getLHS()->getType();
+ const QualType ElementType = Type->getAsPointerType()->getPointeeType();
+
+ uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
+ D /= Info.Ctx.getTypeSize(ElementType) / 8;
+
+ Result = D;
+ Result.zextOrTrunc(getIntTypeSizeInBits(E->getType()));
+ Result.setIsUnsigned(E->getType()->isUnsignedIntegerType());
+
+ return true;
+ }
+ }
if (!LHSTy->isIntegralType() ||
!RHSTy->isIntegralType()) {
// We can't continue from here for non-integral types, and they
@@ -586,7 +651,6 @@
return false; // error in subexpression.
}
- // FIXME: Handle pointer subtraction
// FIXME Maybe we want to succeed even where we can't evaluate the
// right side of LAnd/LOr?
More information about the cfe-commits
mailing list