[cfe-commits] r45923 - /cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedNode.h
Ted Kremenek
kremenek at apple.com
Sat Jan 12 20:00:44 PST 2008
Author: kremenek
Date: Sat Jan 12 22:00:44 2008
New Revision: 45923
URL: http://llvm.org/viewvc/llvm-project?rev=45923&view=rev
Log:
Removed ExplodedNode.h, since its contents are now in ExplodedGraph.h
Removed:
cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedNode.h
Removed: cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedNode.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedNode.h?rev=45922&view=auto
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedNode.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/ExplodedNode.h (removed)
@@ -1,261 +0,0 @@
-//=-- ExplodedNode.h - Local, Path-Sensitive Supergraph Vertices -*- C++ -*--=//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the template class ExplodedNode which is used to
-// represent a node in the location*state "exploded graph" of an
-// intra-procedural, path-sensitive dataflow analysis.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_ANALYSIS_EXPLODEDNODE
-#define LLVM_CLANG_ANALYSIS_EXPLODEDNODE
-
-#include "clang/Analysis/ProgramPoint.h"
-#include "llvm/ADT/FoldingSet.h"
-#include "llvm/ADT/GraphTraits.h"
-#include "llvm/ADT/DepthFirstIterator.h"
-#include <vector>
-
-namespace clang {
-
-class ExplodedGraphImpl;
-class ExplodedNodeImpl;
-
-/// ExplodeNodeGroup - A utility class used to represent the set of successor
-/// and predecessor nodes of a node. Most nodes will have only 1 successor
-/// and 1 predecessor, so class allows us to store such unit sets of nodes
-/// using a single pointer without allocating an entire vector. For
-/// larger sets of nodes, we dynamically allocate a vector. This class
-/// will likely be revised in the future to further improve performance and
-/// to reduce memory footprint.
-class ExplodedNodeGroup {
- enum { Size1 = 0x0, SizeOther = 0x1, Flags = 0x1 };
- uintptr_t P;
-
- unsigned getKind() const { return P & Flags; }
-
- std::vector<ExplodeNodeImpl*>& getVector() {
- assert (getKind() == SizeOther);
- return *reinterpret_cast<std::vector<ExplodeNodeImpl*>*>(P & ~Flags);
- }
-
- ExplodeNodeImpl* getNode() {
- assert (getKind() == Size1);
- return reinterpret_cast<ExplodeNodeImpl*>(P);
- }
-
-public:
- ExplodedNodeGroup() : P(0) {}
-
- ~ExplodedNodeGroup() { if (getKind() == SizeOther) delete &getVector(); }
-
- inline ExplodedNodeImpl** begin() const {
- if (getKind() == Size1)
- return (ExplodedNodeImpl**) &P;
- else
- return getVector().begin();
- }
-
- inline ExplodedNodeImpl** end() const {
- if (getKind() == Size1)
- return ((ExplodedNodeImpl**) &P)+1;
- else
- return getVector().end();
- }
-
- inline unsigned size() const {
- if (getKind() == Size1)
- return getNode() ? 1 : 0;
- else
- return getVector().size();
- }
-
- inline bool empty() const {
- if (getKind() == Size1)
- return getNode() ? false : true;
- else
- return getVector().empty();
- }
-
- inline void addNode(ExplodedNodeImpl* N) {
- if (getKind() == Size1) {
- if (ExplodedNodeImpl* NOld = getNode()) {
- std::vector<ExplodeNodeImpl*>* V = new std::vector<ExplodeNodeImpl*>();
- V->push_back(NOld);
- V->push_back(N);
- P = reinterpret_cast<uintptr_t>(V) & SizeOther;
- }
- else
- P = reinterpret_cast<uintptr_t>(N);
- }
- else
- getVector().push_back(N);
- }
-};
-
-/// ExplodeNodeImpl -
-class ExplodedNodeImpl : public llvm::FoldingSetNode {
-protected:
- friend class ExplodedGraphImpl;
-
- /// Location - The program location (within a function body) associated
- /// with this node.
- const ProgramPoint Location;
-
- /// State - The state associated with this node. Normally this value
- /// is immutable, but we anticipate there will be times when algorithms
- /// that directly manipulate the analysis graph will need to change it.
- void* State;
-
- /// Preds - The predecessors of this node.
- ExplodedNodeGroup Preds;
-
- /// Succs - The successors of this node.
- ExplodedNodeGroup Succs;
-
- /// Construct a ExplodedNodeImpl with the provided location and state.
- explicit ExplodedNodeImpl(const ProgramLocation& loc, void* state)
- : Location(loc), State(state) {}
-
- /// addPredeccessor - Adds a predecessor to the current node, and
- /// in tandem add this node as a successor of the other node. This
- /// method is intended to be used only by ExplodedGraphImpl.
- void addPredecessor(ExplodedNodeImpl* V) {
- Preds.addNode(V);
- V->Succs.addNode(this);
- }
-
-public:
- /// getLocation - Returns the edge associated with the given node.
- const ProgramPoint& getLocation() const { return Location; }
-
- unsigned succ_size() const { return Succs.size(); }
- unsigned pred_size() const { return Preds.size(); }
- bool succ_empty() const { return Succs.empty(); }
- bool pred_empty() const { return Preds.size(); }
-};
-
-
-template <typename StateTy>
-struct GRTrait {
- static inline void* toPtr(StateTy S) {
- return reinterpret_cast<void*>(S);
- }
- static inline StateTy toState(void* P) {
- return reinterpret_cast<StateTy>(P);
- }
-};
-
-
-template <typename StateTy>
-class ExplodedNode : public ExplodedNodeImpl {
-public:
- /// Construct a ExplodedNodeImpl with the given node ID, program edge,
- /// and state.
- explicit ExplodedNode(unsigned ID, const ProgramEdge& loc, StateTy state)
- : ExplodedNodeImpl(ID, loc, GRTrait<StateTy>::toPtr(state)) {}
-
- /// getState - Returns the state associated with the node.
- inline StateTy getState() const {
- return GRTrait<StateTy>::toState(State);
- }
-
- // Profiling (for FoldingSet).
- inline void Profile(llvm::FoldingSetNodeID& ID) const {
- StateTy::Profile(ID, getState());
- }
-
- // Iterators over successor and predecessor vertices.
- typedef ExplodedNode** succ_iterator;
- typedef const ExplodedNode** const_succ_iterator;
- typedef ExplodedNode** pred_iterator;
- typedef const ExplodedNode** const_pred_pred_iterator;
-
- pred_iterator pred_begin() { return (ExplodedNode**) Pred.begin(); }
- pred_iterator pred_end() { return (ExplodedNode**) Pred.end(); }
-
- const_pred_iterator pred_begin() const {
- return const_cast<ExplodedNode*>(this)->pred_begin();
- }
- const_pred_iterator pred_end() const {
- return const_cast<ExplodedNode*>(this)->pred_end();
- }
-
- succ_iterator succ_begin() { return (ExplodedNode**) Succ.begin(); }
- succ_iterator succ_end() { return (ExplodedNode**) Succ.end(); }
-
- const_succ_iterator succ_begin() const {
- return const_cast<ExplodedNode*>(this)->succ_begin();
- }
- const_succ_iterator succ_end() const {
- return const_cast<ExplodedNode*>(this)->succ_end();
- }
-};
-
-} // end clang namespace
-
-// GraphTraits for ExplodedNodes.
-
-namespace llvm {
-template<typename StateTy>
-struct GraphTraits<clang::ExplodedNode<StateTy>*> {
- typedef clang::ExplodedNode<StateTy> NodeType;
- typedef typename NodeType::succ_iterator ChildIteratorType;
- typedef llvm::df_iterator<NodeType*> nodes_iterator;
-
- static inline NodeType* getEntryNode(NodeType* N) {
- return N;
- }
-
- static inline ChildIteratorType child_begin(NodeType* N) {
- return N->succ_begin();
- }
-
- static inline ChildIteratorType child_end(NodeType* N) {
- return N->succ_end();
- }
-
- static inline nodes_iterator nodes_begin(NodeType* N) {
- return df_begin(N);
- }
-
- static inline nodes_iterator nodes_end(NodeType* N) {
- return df_end(N);
- }
-};
-
-template<typename StateTy>
-struct GraphTraits<const clang::ExplodedNode<StateTy>*> {
- typedef const clang::ExplodedNode<StateTy> NodeType;
- typedef typename NodeType::succ_iterator ChildIteratorType;
- typedef llvm::df_iterator<NodeType*> nodes_iterator;
-
- static inline NodeType* getEntryNode(NodeType* N) {
- return N;
- }
-
- static inline ChildIteratorType child_begin(NodeType* N) {
- return N->succ_begin();
- }
-
- static inline ChildIteratorType child_end(NodeType* N) {
- return N->succ_end();
- }
-
- static inline nodes_iterator nodes_begin(NodeType* N) {
- return df_begin(N);
- }
-
- static inline nodes_iterator nodes_end(NodeType* N) {
- return df_end(N);
- }
-};
-
-} // end llvm namespace
-#endif
More information about the cfe-commits
mailing list