Commit beginnings of int evaluator. Currently not used.
llvm-svn: 53219
This commit is contained in:
parent
fc12d2e5f3
commit
0a1707c6ba
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue