//===-- llvm/Support/LeakDetector.h - Provide leak detection ----*- 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 a class that can be used to provide very simple memory leak // checks for an API. Basically LLVM uses this to make sure that Instructions, // for example, are deleted when they are supposed to be, and not leaked away. // // When compiling with NDEBUG (Release build), this class does nothing, thus // adding no checking overhead to release builds. Note that this class is // implemented in a very simple way, requiring completely manual manipulation // and checking for garbage, but this is intentional: users should not be using // this API, only other APIs should. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_LEAKDETECTOR_H #define LLVM_SUPPORT_LEAKDETECTOR_H #include namespace llvm { class LLVMContext; class Value; struct LeakDetector { /// addGarbageObject - Add a pointer to the internal set of "garbage" object /// pointers. This should be called when objects are created, or if they are /// taken out of an owning collection. /// static void addGarbageObject(void *Object) { #ifndef NDEBUG addGarbageObjectImpl(Object); #endif } /// removeGarbageObject - Remove a pointer from our internal representation of /// our "garbage" objects. This should be called when an object is added to /// an "owning" collection. /// static void removeGarbageObject(void *Object) { #ifndef NDEBUG removeGarbageObjectImpl(Object); #endif } /// checkForGarbage - Traverse the internal representation of garbage /// pointers. If there are any pointers that have been add'ed, but not /// remove'd, big obnoxious warnings about memory leaks are issued. /// /// The specified message will be printed indicating when the check was /// performed. /// static void checkForGarbage(LLVMContext &C, const std::string &Message) { #ifndef NDEBUG checkForGarbageImpl(C, Message); #endif } /// Overload the normal methods to work better with Value*'s because they are /// by far the most common in LLVM. This does not affect the actual /// functioning of this class, it just makes the warning messages nicer. /// static void addGarbageObject(const Value *Object) { #ifndef NDEBUG addGarbageObjectImpl(Object); #endif } static void removeGarbageObject(const Value *Object) { #ifndef NDEBUG removeGarbageObjectImpl(Object); #endif } private: // If we are debugging, the actual implementations will be called... static void addGarbageObjectImpl(const Value *Object); static void removeGarbageObjectImpl(const Value *Object); static void addGarbageObjectImpl(void *Object); static void removeGarbageObjectImpl(void *Object); static void checkForGarbageImpl(LLVMContext &C, const std::string &Message); }; } // End llvm namespace #endif