1 //===- LeakDetector.h - Provide leak detection ------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines a class that can be used to provide very simple memory leak
11 // checks for an API. Basically LLVM uses this to make sure that Instructions,
12 // for example, are deleted when they are supposed to be, and not leaked away.
14 // When compiling with NDEBUG (Release build), this class does nothing, thus
15 // adding no checking overhead to release builds. Note that this class is
16 // implemented in a very simple way, requiring completely manual manipulation
17 // and checking for garbage, but this is intentional: users should not be using
18 // this API, only other APIs should.
20 //===----------------------------------------------------------------------===//
22 #ifndef LLVM_IR_LEAKDETECTOR_H
23 #define LLVM_IR_LEAKDETECTOR_H
34 /// addGarbageObject - Add a pointer to the internal set of "garbage" object
35 /// pointers. This should be called when objects are created, or if they are
36 /// taken out of an owning collection.
38 template <class T> static void addGarbageObject(T *Object) {
40 addGarbageObjectImpl(Object);
44 /// removeGarbageObject - Remove a pointer from our internal representation of
45 /// our "garbage" objects. This should be called when an object is added to
46 /// an "owning" collection.
48 template <class T> static void removeGarbageObject(T *Object) {
50 removeGarbageObjectImpl(Object);
54 /// checkForGarbage - Traverse the internal representation of garbage
55 /// pointers. If there are any pointers that have been add'ed, but not
56 /// remove'd, big obnoxious warnings about memory leaks are issued.
58 /// The specified message will be printed indicating when the check was
61 static void checkForGarbage(LLVMContext &C, const std::string &Message) {
63 checkForGarbageImpl(C, Message);
68 /// Overload the normal methods to work better with Value* because they are
69 /// by far the most common in LLVM.
71 /// Besides making the warning messages nicer, this hides errors by storing
72 /// Value* in a different leak-detection container than other classes.
73 static void addGarbageObjectImpl(const Value *Object);
74 static void removeGarbageObjectImpl(const Value *Object);
76 /// Overload the normal methods to work better with MDNode* to improve error
79 /// For better or worse, this hides errors when other types are added as
80 /// garbage, deleted without being removed, and an MDNode is allocated in the
83 /// \note Only handle \a MDNode for now, since we can't always get access to
84 /// an \a LLVMContext for other \a Metadata types.
85 static void addGarbageObjectImpl(const MDNode *Object);
86 static void removeGarbageObjectImpl(const MDNode *Object);
88 static void addGarbageObjectImpl(void *Object);
89 static void removeGarbageObjectImpl(void *Object);
90 static void checkForGarbageImpl(LLVMContext &C, const std::string &Message);
93 } // End llvm namespace