diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-08-16 19:04:36 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-08-16 19:04:36 +0000 |
commit | cdc4b86e35e8f091ec3f24c9205f6d645b4d03d6 (patch) | |
tree | 6d6c54b9ebd369d1e9ebcb871063b906b6982724 /lib/Support/LeakDetector.cpp | |
parent | 52b77edbbd8df167910927091fa9882adf394721 (diff) |
Move these files (which are dependent on VMCore) into VMCore
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15825 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/LeakDetector.cpp')
-rw-r--r-- | lib/Support/LeakDetector.cpp | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/lib/Support/LeakDetector.cpp b/lib/Support/LeakDetector.cpp deleted file mode 100644 index dbdb7dd70f..0000000000 --- a/lib/Support/LeakDetector.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//===-- LeakDetector.cpp - Implement LeakDetector interface ---------------===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the LeakDetector class. -// -//===----------------------------------------------------------------------===// - -#include "Support/LeakDetector.h" -#include "llvm/Value.h" -#include <iostream> -#include <set> -using namespace llvm; - -namespace { - template <class T> - struct PrinterTrait { - static void print(const T* P) { std::cerr << P; } - }; - - template<> - struct PrinterTrait<Value> { - static void print(const Value* P) { std::cerr << *P; } - }; - - template <typename T> - struct LeakDetectorImpl { - LeakDetectorImpl(const char* const name) : Cache(0), Name(name) { } - - // 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. - void addGarbage(const T* o) { - if (Cache) { - assert(Ts.count(Cache) == 0 && "Object already in set!"); - Ts.insert(Cache); - } - Cache = o; - } - - void removeGarbage(const T* o) { - if (o == Cache) - Cache = 0; // Cache hit - else - Ts.erase(o); - } - - bool hasGarbage(const std::string& Message) { - addGarbage(0); // Flush the Cache - - assert(Cache == 0 && "No value should be cached anymore!"); - - if (!Ts.empty()) { - std::cerr - << "Leaked " << Name << " objects found: " << Message << ":\n"; - for (typename std::set<const T*>::iterator I = Ts.begin(), - E = Ts.end(); I != E; ++I) { - std::cerr << "\t"; - PrinterTrait<T>::print(*I); - std::cerr << "\n"; - } - std::cerr << '\n'; - - // Clear out results so we don't get duplicate warnings on - // next call... - Ts.clear(); - return true; - } - return false; - } - - private: - std::set<const T*> Ts; - const T* Cache; - const char* const Name; - }; - - typedef LeakDetectorImpl<void> Objects; - typedef LeakDetectorImpl<Value> LLVMObjects; - - Objects& getObjects() { - static Objects *o = 0; - if (o == 0) - o = new Objects("GENERIC"); - return *o; - } - - LLVMObjects& getLLVMObjects() { - static LLVMObjects *o = 0; - if (o == 0) - o = new LLVMObjects("LLVM"); - return *o; - } -} - -void LeakDetector::addGarbageObjectImpl(void *Object) { - getObjects().addGarbage(Object); -} - -void LeakDetector::addGarbageObjectImpl(const Value *Object) { - getLLVMObjects().addGarbage(Object); -} - -void LeakDetector::removeGarbageObjectImpl(void *Object) { - getObjects().removeGarbage(Object); -} - -void LeakDetector::removeGarbageObjectImpl(const Value *Object) { - getLLVMObjects().removeGarbage(Object); -} - -void LeakDetector::checkForGarbageImpl(const std::string &Message) { - // use non-short-circuit version so that both checks are performed - if (getObjects().hasGarbage(Message) | - getLLVMObjects().hasGarbage(Message)) - std::cerr << "\nThis is probably because you removed an object, but didn't " - "delete it. Please check your code for memory leaks.\n"; -} |