aboutsummaryrefslogtreecommitdiff
path: root/Analysis/ExplodedGraph.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-01-13 04:56:13 +0000
committerTed Kremenek <kremenek@apple.com>2008-01-13 04:56:13 +0000
commit9eb49a40df510313132eef147419c5abefff23eb (patch)
treeb1ecd786e63dcb9726d39b2321a930e5df82e123 /Analysis/ExplodedGraph.cpp
parent4c4cb527a44037d076da82ad9d12b4e655e64dbb (diff)
Created ExplodedGraph.cpp and moved most method implementations of
ExplodedNodeImpl::NodeGroup from being defined inline to being defined "out-of-line" in ExplodedGraph.cpp. This removes a dependence on including <vector> in ExplodedGraph.h, and will hopefully result in smaller generated code with negligible performance impact. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45928 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Analysis/ExplodedGraph.cpp')
-rw-r--r--Analysis/ExplodedGraph.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/Analysis/ExplodedGraph.cpp b/Analysis/ExplodedGraph.cpp
new file mode 100644
index 0000000000..4c9f026532
--- /dev/null
+++ b/Analysis/ExplodedGraph.cpp
@@ -0,0 +1,70 @@
+//=-- ExplodedGraph.cpp - Local, Path-Sens. "Exploded Graph" -*- 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 classes ExplodedNode and ExplodedGraph,
+// which represent a path-sensitive, intra-procedural "exploded graph."
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Analysis/PathSensitive/ExplodedGraph.h"
+#include <vector>
+
+using namespace clang;
+
+
+static inline std::vector<ExplodedNodeImpl*>& getVector(void* P) {
+ return *reinterpret_cast<std::vector<ExplodedNodeImpl*>*>(P);
+}
+
+void ExplodedNodeImpl::NodeGroup::addNode(ExplodedNodeImpl* N) {
+ if (getKind() == Size1) {
+ if (ExplodedNodeImpl* NOld = getNode()) {
+ std::vector<ExplodedNodeImpl*>* V = new std::vector<ExplodedNodeImpl*>();
+ V->push_back(NOld);
+ V->push_back(N);
+ P = reinterpret_cast<uintptr_t>(V) & SizeOther;
+ }
+ else
+ P = reinterpret_cast<uintptr_t>(N);
+ }
+ else
+ getVector(getPtr()).push_back(N);
+}
+
+bool ExplodedNodeImpl::NodeGroup::empty() const {
+ if (getKind() == Size1)
+ return getNode() ? false : true;
+ else
+ return getVector(getPtr()).empty();
+}
+
+unsigned ExplodedNodeImpl::NodeGroup::size() const {
+ if (getKind() == Size1)
+ return getNode() ? 1 : 0;
+ else
+ return getVector(getPtr()).size();
+}
+
+ExplodedNodeImpl** ExplodedNodeImpl::NodeGroup::begin() const {
+ if (getKind() == Size1)
+ return (ExplodedNodeImpl**) &P;
+ else
+ return const_cast<ExplodedNodeImpl**>(&*(getVector(getPtr()).begin()));
+}
+
+ExplodedNodeImpl** ExplodedNodeImpl::NodeGroup::end() const {
+ if (getKind() == Size1)
+ return ((ExplodedNodeImpl**) &P)+1;
+ else
+ return const_cast<ExplodedNodeImpl**>(&*(getVector(getPtr()).rbegin())+1);
+}
+
+ExplodedNodeImpl::NodeGroup::~NodeGroup() {
+ if (getKind() == SizeOther) delete &getVector(getPtr());
+}