Removed "ObserverTy" from core DataflowValues types. The observer
mechanism can be implemented simply by affixing the Observer to an
analysis meta data, so it doesn't need to be a required type. This
also permits analyses not to implement an Observer if it doesn't make
sense.
Changed "DataflowValues::MetaDataTy" to
"DataflowValues::AnalysisDataTy" to reflect that the type
enscapsulated the data associated with analyzing a given CFG.
Changed CFGStmtVisitor::BlockStmt_VisitImplicitControlFlowStmt(Stmt*)
to ...VisitImplicitControlFlowExpr(Expr*). The type narrowing is more
precise and more useful to clients.
Added CFGStmtVisitor::BlockStmt_VisitExpr to reflect the visitation of
expressions at the block statement level. This captures all implicit
control-flow statements as well as other expressions that are hoisted
to the block level (such as conditions for terminators and function
calls). This is especially useful for dataflow analysis.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42034 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/UnintializedValues.cpp b/Analysis/UnintializedValues.cpp
index 58e263c..dd741c1 100644
--- a/Analysis/UnintializedValues.cpp
+++ b/Analysis/UnintializedValues.cpp
@@ -24,26 +24,30 @@
namespace {
-class RegisterDecls : public CFGVarDeclVisitor<RegisterDecls> {
- UninitializedValues::MetaDataTy& M;
+class RegisterDeclsAndExprs : public CFGVarDeclVisitor<RegisterDeclsAndExprs> {
+ UninitializedValues::AnalysisDataTy& AD;
public:
- RegisterDecls(const CFG& cfg, UninitializedValues::MetaDataTy& m) :
- CFGVarDeclVisitor<RegisterDecls>(cfg), M(m) {}
+ RegisterDeclsAndExprs(const CFG& cfg, UninitializedValues::AnalysisDataTy& ad)
+ : CFGVarDeclVisitor<RegisterDeclsAndExprs>(cfg), AD(ad)
+ {}
void VisitVarDecl(VarDecl* D) {
- if (M.Map.find(D) == M.Map.end()) {
- M.Map[D] = M.NumDecls++;
- }
- }
+ if (AD.VMap.find(D) == AD.VMap.end())
+ AD.VMap[D] = AD.Counter++;
+ }
+
+ void BlockStmt_VisitExpr(Expr* E) {
+ if (AD.EMap.find(E) == AD.EMap.end())
+ AD.EMap[E] = AD.Counter++;
+ }
};
} // end anonymous namespace
void UninitializedValues::InitializeValues(const CFG& cfg) {
- RegisterDecls R(cfg,this->getMetaData());
- R.VisitAllDecls();
-
- getBlockDataMap()[ &cfg.getEntry() ].resize( getMetaData().NumDecls );
+ RegisterDeclsAndExprs R(cfg,this->getAnalysisData());
+ R.VisitAllDecls();
+ getBlockDataMap()[ &cfg.getEntry() ].resize( getAnalysisData().Counter );
}
//===--------------------------------------------------------------------===//
@@ -53,15 +57,17 @@
namespace {
class TransferFuncs : public CFGStmtVisitor<TransferFuncs,bool> {
UninitializedValues::ValTy V;
- UninitializedValues::MetaDataTy& M;
- UninitializedValues::ObserverTy* O;
+ UninitializedValues::AnalysisDataTy& AD;
public:
- TransferFuncs(UninitializedValues::MetaDataTy& m,
- UninitializedValues::ObserverTy* o) : M(m), O(o) {
- V.resize(M.NumDecls);
+ TransferFuncs(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {
+ V.resize(AD.Counter);
}
UninitializedValues::ValTy& getVal() { return V; }
+
+// bool VisitDeclRefExpr(DeclRefExpr* DR);
+// bool VisitBinaryOperator(BinaryOperator* B);
+// bool VisitUnaryOperator(UnaryOperator* U);
};
} // end anonymous namespace