Commit beginnings of int evaluator. Currently not used.

llvm-svn: 53219
This commit is contained in:
Anders Carlsson 2008-07-08 05:13:58 +00:00
parent fc12d2e5f3
commit 0a1707c6ba
1 changed files with 40 additions and 0 deletions

View File

@ -14,9 +14,12 @@
#include "clang/AST/APValue.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Expr.h"
#include "clang/AST/STmtVisitor.h"
#include "llvm/Support/Compiler.h"
using namespace clang;
#define USE_NEW_EVALUATOR 0
static bool CalcFakeICEVal(const Expr* Expr,
llvm::APSInt& Result,
@ -47,14 +50,51 @@ static bool CalcFakeICEVal(const Expr* Expr,
return false;
}
namespace {
class VISIBILITY_HIDDEN IntExprEvaluator
: public StmtVisitor<IntExprEvaluator, APValue> {
ASTContext &Ctx;
IntExprEvaluator(ASTContext &ctx)
: Ctx(ctx) {}
public:
static bool Evaluate(const Expr* E, APValue& Result, ASTContext &Ctx) {
Result = IntExprEvaluator(Ctx).Visit(const_cast<Expr*>(E));
return Result.isSInt();
}
//===--------------------------------------------------------------------===//
// Visitor Methods
//===--------------------------------------------------------------------===//
APValue VisitStmt(Stmt *S) {
// FIXME: Remove this when we support more expressions.
printf("Unhandled statement\n");
S->dump();
return APValue();
}
APValue VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr()); }
};
}
bool Expr::tryEvaluate(APValue& Result, ASTContext &Ctx) const
{
llvm::APSInt sInt(1);
#if USE_NEW_EVALUATOR
if (getType()->isIntegerType())
return IntExprEvaluator::Evaluate(this, Result, Ctx);
else
return false;
#else
if (CalcFakeICEVal(this, sInt, Ctx)) {
Result = APValue(sInt);
return true;
}
#endif
return false;
}