[cfe-commits] r53219 - /cfe/trunk/lib/AST/ExprConstant.cpp

Anders Carlsson andersca at mac.com
Mon Jul 7 22:13:59 PDT 2008


Author: andersca
Date: Tue Jul  8 00:13:58 2008
New Revision: 53219

URL: http://llvm.org/viewvc/llvm-project?rev=53219&view=rev
Log:
Commit beginnings of int evaluator. Currently not used.

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=53219&r1=53218&r2=53219&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Tue Jul  8 00:13:58 2008
@@ -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 @@
   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;
 }





More information about the cfe-commits mailing list