diff options
author | Chris Lattner <sabre@nondot.org> | 2002-09-08 18:51:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-09-08 18:51:12 +0000 |
commit | 57c6a2123d09cc62e2da5a6d48ca1bb5c1d5eb03 (patch) | |
tree | 0dc34fa4d72c84f00be53ddb93d3244295151517 /llvm | |
parent | 30214c23aab06284716de08f7f983f5185d7c3dc (diff) | |
download | bcm5719-llvm-57c6a2123d09cc62e2da5a6d48ca1bb5c1d5eb03.tar.gz bcm5719-llvm-57c6a2123d09cc62e2da5a6d48ca1bb5c1d5eb03.zip |
Checkin initial support for automatic memory leak detection routines
llvm-svn: 3617
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/Support/LeakDetector.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/llvm/include/Support/LeakDetector.h b/llvm/include/Support/LeakDetector.h new file mode 100644 index 00000000000..dadbac1efa4 --- /dev/null +++ b/llvm/include/Support/LeakDetector.h @@ -0,0 +1,79 @@ +//===-- Support/LeakDetector.h - Provide simple leak detection --*- C++ -*-===// +// +// 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 SUPPORT_LEAK_DETECTOR_H +#define SUPPORT_LEAK_DETECTOR_H + +#include <string> +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(const std::string &Message) { +#ifndef NDEBUG + checkForGarbageImpl(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(const std::string &Message); +}; + +#endif |