summaryrefslogtreecommitdiff
path: root/support/lib/Support/LeakDetector.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-09-19 19:22:11 +0000
committerChris Lattner <sabre@nondot.org>2002-09-19 19:22:11 +0000
commit3f6962e0886140c2f5889f752d21ae49b76b0e78 (patch)
tree638ef4356632cba8686ed6703c5153f0e632ad2a /support/lib/Support/LeakDetector.cpp
parent5542b9f8807bb3ee25bbfa855f680035c64981da (diff)
downloadllvm-3f6962e0886140c2f5889f752d21ae49b76b0e78.tar.gz
llvm-3f6962e0886140c2f5889f752d21ae49b76b0e78.tar.bz2
llvm-3f6962e0886140c2f5889f752d21ae49b76b0e78.tar.xz
Add an optimization to support the most common access pattern for the
library. This speeds debug builds up significantly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3826 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support/lib/Support/LeakDetector.cpp')
-rw-r--r--support/lib/Support/LeakDetector.cpp27
1 files changed, 22 insertions, 5 deletions
diff --git a/support/lib/Support/LeakDetector.cpp b/support/lib/Support/LeakDetector.cpp
index 3dbd2e6e8d..ecc4868d2e 100644
--- a/support/lib/Support/LeakDetector.cpp
+++ b/support/lib/Support/LeakDetector.cpp
@@ -12,6 +12,13 @@
static std::set<const void*> *Objects = 0;
static std::set<const Value*> *LLVMObjects = 0;
+// Because the most common usage pattern, by far, is to add a garbage object,
+// then remove it immediately, we optimize this case. When an object is added,
+// it is not added to the set immediately, it is added to the CachedValue Value.
+// If it is immediately removed, no set search need be performed.
+//
+static const Value *CachedValue;
+
void LeakDetector::addGarbageObjectImpl(void *Object) {
if (Objects == 0)
Objects = new std::set<const void*>();
@@ -25,18 +32,28 @@ void LeakDetector::removeGarbageObjectImpl(void *Object) {
}
void LeakDetector::addGarbageObjectImpl(const Value *Object) {
- if (LLVMObjects == 0)
- LLVMObjects = new std::set<const Value*>();
- assert(LLVMObjects->count(Object) == 0 && "Object already in set!");
- LLVMObjects->insert(Object);
+ if (CachedValue) {
+ if (LLVMObjects == 0)
+ LLVMObjects = new std::set<const Value*>();
+ assert(LLVMObjects->count(CachedValue) == 0 && "Object already in set!");
+ LLVMObjects->insert(CachedValue);
+ }
+ CachedValue = Object;
}
void LeakDetector::removeGarbageObjectImpl(const Value *Object) {
- if (LLVMObjects)
+ if (Object == CachedValue)
+ CachedValue = 0; // Cache hit!
+ else if (LLVMObjects)
LLVMObjects->erase(Object);
}
void LeakDetector::checkForGarbageImpl(const std::string &Message) {
+ if (CachedValue) // Flush the cache to the set...
+ addGarbageObjectImpl((Value*)0);
+
+ assert(CachedValue == 0 && "No value should be cached anymore!");
+
if ((Objects && !Objects->empty()) || (LLVMObjects && !LLVMObjects->empty())){
std::cerr << "Leaked objects found: " << Message << "\n";