X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FLeakDetector.cpp;h=1bf9171553837c7fc0e8d0aaa78d9908c2fa9f08;hb=30794269d5ba15613d4e013d9fe1eb9e892fa6da;hp=7cf8e0d99aecebd7570f9e68877d077436e3bde5;hpb=fd93908ae8b9684fe71c239e3c6cfe13ff6a2663;p=oota-llvm.git diff --git a/lib/VMCore/LeakDetector.cpp b/lib/VMCore/LeakDetector.cpp index 7cf8e0d99ae..1bf91715538 100644 --- a/lib/VMCore/LeakDetector.cpp +++ b/lib/VMCore/LeakDetector.cpp @@ -2,8 +2,8 @@ // // 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 is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -12,25 +12,26 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/LeakDetector.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Streams.h" #include "llvm/Value.h" -#include -#include using namespace llvm; namespace { template - struct PrinterTrait { - static void print(const T* P) { std::cerr << P; } + struct VISIBILITY_HIDDEN PrinterTrait { + static void print(const T* P) { cerr << P; } }; template<> - struct PrinterTrait { - static void print(const Value* P) { std::cerr << *P; } + struct VISIBILITY_HIDDEN PrinterTrait { + static void print(const Value* P) { cerr << *P; } }; template - struct LeakDetectorImpl { - LeakDetectorImpl(const char* const name) : Cache(0), Name(name) { } + struct VISIBILITY_HIDDEN LeakDetectorImpl { + explicit 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 @@ -58,15 +59,14 @@ namespace { assert(Cache == 0 && "No value should be cached anymore!"); if (!Ts.empty()) { - std::cerr - << "Leaked " << Name << " objects found: " << Message << ":\n"; - for (typename std::set::iterator I = Ts.begin(), + cerr << "Leaked " << Name << " objects found: " << Message << ":\n"; + for (typename SmallPtrSet::iterator I = Ts.begin(), E = Ts.end(); I != E; ++I) { - std::cerr << "\t"; + cerr << "\t"; PrinterTrait::print(*I); - std::cerr << "\n"; + cerr << "\n"; } - std::cerr << '\n'; + cerr << '\n'; return true; } @@ -74,27 +74,27 @@ namespace { } private: - std::set Ts; + SmallPtrSet Ts; const T* Cache; const char* const Name; }; - LeakDetectorImpl *Objects; - LeakDetectorImpl *LLVMObjects; + static LeakDetectorImpl *Objects; + static LeakDetectorImpl *LLVMObjects; - LeakDetectorImpl &getObjects() { + static LeakDetectorImpl &getObjects() { if (Objects == 0) Objects = new LeakDetectorImpl("GENERIC"); return *Objects; } - LeakDetectorImpl &getLLVMObjects() { + static LeakDetectorImpl &getLLVMObjects() { if (LLVMObjects == 0) LLVMObjects = new LeakDetectorImpl("LLVM"); return *LLVMObjects; } - void clearGarbage() { + static void clearGarbage() { delete Objects; delete LLVMObjects; Objects = 0; @@ -122,8 +122,8 @@ 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"; + cerr << "\nThis is probably because you removed an object, but didn't " + << "delete it. Please check your code for memory leaks.\n"; // Clear out results so we don't get duplicate warnings on // next call...