2004-09-01 22:55:40 +00:00
|
|
|
//===-- llvm/Support/LeakDetector.h - Provide leak detection ----*- C++ -*-===//
|
2005-04-21 20:48:15 +00:00
|
|
|
//
|
2003-10-20 19:46:57 +00:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 19:59:42 +00:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-04-21 20:48:15 +00:00
|
|
|
//
|
2003-10-20 19:46:57 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
2002-09-08 18:51:12 +00:00
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2004-09-01 22:55:40 +00:00
|
|
|
#ifndef LLVM_SUPPORT_LEAKDETECTOR_H
|
|
|
|
#define LLVM_SUPPORT_LEAKDETECTOR_H
|
2002-09-08 18:51:12 +00:00
|
|
|
|
|
|
|
#include <string>
|
2003-11-11 22:41:34 +00:00
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
2002-09-08 18:51:12 +00:00
|
|
|
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
|
|
|
|
}
|
2005-04-21 20:48:15 +00:00
|
|
|
|
2002-09-08 18:51:12 +00:00
|
|
|
/// 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);
|
|
|
|
};
|
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
} // End llvm namespace
|
|
|
|
|
2002-09-08 18:51:12 +00:00
|
|
|
#endif
|