From 190b1ed4fce661e730bfb268ca8b97d3b45f3702 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 2 Oct 2007 17:12:02 +0000 Subject: [PATCH] Moved ProgramEdge out out include/.../Analysis/PathSensitive to include/.../Analysis, as it is now used by the FlowSensitive subsystem as well. Removed "Edge" nested class by CFG, as it is now subsumed by ProgramEdge. Adjusted DataflowSolver and DataflowValues to use ProgramEdges instead of CFG::Edge. llvm-svn: 42534 --- clang/include/clang/AST/CFG.h | 20 --------- .../Analysis/FlowSensitive/DataflowSolver.h | 19 +++++---- .../Analysis/FlowSensitive/DataflowValues.h | 41 ++----------------- .../{PathSensitive => }/ProgramEdge.h | 8 ++++ 4 files changed, 22 insertions(+), 66 deletions(-) rename clang/include/clang/Analysis/{PathSensitive => }/ProgramEdge.h (95%) diff --git a/clang/include/clang/AST/CFG.h b/clang/include/clang/AST/CFG.h index e2cc27044f89..2037b872abb9 100644 --- a/clang/include/clang/AST/CFG.h +++ b/clang/include/clang/AST/CFG.h @@ -230,26 +230,6 @@ public: CFGBlock* getIndirectGotoBlock() { return IndirectGotoBlock; } const CFGBlock* getIndirectGotoBlock() const { return IndirectGotoBlock; } - //===--------------------------------------------------------------------===// - // CFG Edges (Source Block, Destination Block) - //===--------------------------------------------------------------------===// - - class Edge { - const CFGBlock* S; - const CFGBlock* D; - public: - Edge(const CFGBlock* src, const CFGBlock* dst) : S(src), D(dst) {} - Edge(const Edge& RHS) : S(RHS.S), D(RHS.D) {} - - Edge& operator=(const Edge& RHS) { S = RHS.S; D = RHS.D; return *this; } - - const CFGBlock* getSrc() const { return S; } - const CFGBlock* getDst() const { return D; } - - bool operator==(const Edge& RHS) const { return S == RHS.S && D == RHS.D; } - bool operator!=(const Edge& RHS) const { return !(*this == RHS); } - }; - //===--------------------------------------------------------------------===// // Member templates useful for various batch operations over CFGs. //===--------------------------------------------------------------------===// diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowSolver.h b/clang/include/clang/Analysis/FlowSensitive/DataflowSolver.h index 0f4b9545c320..3966395f6b26 100644 --- a/clang/include/clang/Analysis/FlowSensitive/DataflowSolver.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowSolver.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_ANALYSES_DATAFLOW_SOLVER #include "clang/AST/CFG.h" +#include "clang/Analysis/ProgramEdge.h" #include "llvm/ADT/SmallPtrSet.h" #include "functional" // STL @@ -68,12 +69,12 @@ template <> struct ItrTraits { static StmtItr StmtBegin(const CFGBlock* B) { return B->begin(); } static StmtItr StmtEnd(const CFGBlock* B) { return B->end(); } - static CFG::Edge PrevEdge(const CFGBlock* B, const CFGBlock* PrevBlk) { - return CFG::Edge(PrevBlk,B); + static BlkBlkEdge PrevEdge(const CFGBlock* B, const CFGBlock* PrevBlk) { + return BlkBlkEdge(PrevBlk,B); } - static CFG::Edge NextEdge(const CFGBlock* B, const CFGBlock* NextBlk) { - return CFG::Edge(B,NextBlk); + static BlkBlkEdge NextEdge(const CFGBlock* B, const CFGBlock* NextBlk) { + return BlkBlkEdge(B,NextBlk); } }; @@ -91,12 +92,12 @@ template <> struct ItrTraits { static StmtItr StmtBegin(const CFGBlock* B) { return B->rbegin(); } static StmtItr StmtEnd(const CFGBlock* B) { return B->rend(); } - static CFG::Edge PrevEdge(const CFGBlock* B, const CFGBlock* PrevBlk) { - return CFG::Edge(B,PrevBlk); + static BlkBlkEdge PrevEdge(const CFGBlock* B, const CFGBlock* PrevBlk) { + return BlkBlkEdge(B,PrevBlk); } - static CFG::Edge NextEdge(const CFGBlock* B, const CFGBlock* NextBlk) { - return CFG::Edge(NextBlk,B); + static BlkBlkEdge NextEdge(const CFGBlock* B, const CFGBlock* NextBlk) { + return BlkBlkEdge(NextBlk,B); } }; } // end namespace dataflow @@ -241,7 +242,7 @@ private: } /// UpdateEdgeValue - Update the value associated with a given edge. - void UpdateEdgeValue(CFG::Edge E, ValTy& V, const CFGBlock* TargetBlock) { + void UpdateEdgeValue(BlkBlkEdge E, ValTy& V, const CFGBlock* TargetBlock) { EdgeDataMapTy& M = D.getEdgeDataMap(); typename EdgeDataMapTy::iterator I = M.find(E); diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowValues.h b/clang/include/clang/Analysis/FlowSensitive/DataflowValues.h index aa061127acef..5a29ab6a83c8 100644 --- a/clang/include/clang/Analysis/FlowSensitive/DataflowValues.h +++ b/clang/include/clang/Analysis/FlowSensitive/DataflowValues.h @@ -17,42 +17,9 @@ #define LLVM_CLANG_ANALYSES_DATAFLOW_VALUES #include "clang/AST/CFG.h" +#include "clang/Analysis/ProgramEdge.h" #include "llvm/ADT/DenseMap.h" -//===----------------------------------------------------------------------===// -// DenseMapInfo for CFG::Edge for use with DenseMap -//===----------------------------------------------------------------------===// - -namespace llvm { - - template <> struct DenseMapInfo { - static inline clang::CFG::Edge getEmptyKey() { - return clang::CFG::Edge(NULL,NULL); - } - - static inline clang::CFG::Edge getTombstoneKey() { - return clang::CFG::Edge(NULL,reinterpret_cast(-1)); - } - - static unsigned getHashValue(const clang::CFG::Edge& E) { - const clang::CFGBlock* P1 = E.getSrc(); - const clang::CFGBlock* P2 = E.getDst(); - return static_cast((reinterpret_cast(P1) >> 4) ^ - (reinterpret_cast(P1) >> 9) ^ - (reinterpret_cast(P2) >> 5) ^ - (reinterpret_cast(P2) >> 10)); - } - - static bool isEqual(const clang::CFG::Edge& LHS, - const clang::CFG::Edge& RHS) { - return LHS == RHS; - } - - static bool isPod() { return true; } - }; - -} // end namespace llvm - //===----------------------------------------------------------------------===// /// Dataflow Directional Tag Classes. These are used for tag dispatching /// within the dataflow solver/transfer functions to determine what direction @@ -81,7 +48,7 @@ public: typedef typename ValueTypes::ValTy ValTy; typedef typename ValueTypes::AnalysisDataTy AnalysisDataTy; typedef _AnalysisDirTag AnalysisDirTag; - typedef llvm::DenseMap EdgeDataMapTy; + typedef llvm::DenseMap EdgeDataMapTy; typedef llvm::DenseMap BlockDataMapTy; //===--------------------------------------------------------------------===// @@ -113,13 +80,13 @@ public: /// getEdgeData - Retrieves the dataflow values associated with a /// CFG edge. - ValTy& getEdgeData(const CFG::Edge& E) { + ValTy& getEdgeData(const BlkBlkEdge& E) { typename EdgeDataMapTy::iterator I = EdgeDataMap.find(E); assert (I != EdgeDataMap.end() && "No data associated with Edge."); return I->second; } - const ValTy& getEdgeData(const CFG::Edge& E) const { + const ValTy& getEdgeData(const BlkBlkEdge& E) const { return reinterpret_cast(this)->getEdgeData(E); } diff --git a/clang/include/clang/Analysis/PathSensitive/ProgramEdge.h b/clang/include/clang/Analysis/ProgramEdge.h similarity index 95% rename from clang/include/clang/Analysis/PathSensitive/ProgramEdge.h rename to clang/include/clang/Analysis/ProgramEdge.h index f28053ace726..9772a5e1a621 100644 --- a/clang/include/clang/Analysis/PathSensitive/ProgramEdge.h +++ b/clang/include/clang/Analysis/ProgramEdge.h @@ -41,6 +41,10 @@ public: return RawSrc() == RHS.RawSrc() && RawDst() == RHS.RawDst(); } + bool operator!=(const ProgramEdge& RHS) const { + return RawSrc() != RHS.RawSrc() || RawDst() != RHS.RawDst(); + } + unsigned getHashValue() const { uintptr_t v1 = reinterpret_cast(RawSrc()); uintptr_t v2 = reinterpret_cast(RawDst()); @@ -118,6 +122,10 @@ template <> struct DenseMapInfo { reinterpret_cast(-1)); } + static unsigned getHashValue(const clang::ProgramEdge& E) { + return E.getHashValue(); + } + static bool isEqual(const clang::ProgramEdge& LHS, const clang::ProgramEdge& RHS) { return LHS == RHS;