• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- LeakDetector.cpp - Implement LeakDetector interface ---------------===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  // This file implements the LeakDetector class.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "LLVMContextImpl.h"
15  #include "llvm/Support/LeakDetector.h"
16  #include "llvm/ADT/SmallPtrSet.h"
17  #include "llvm/Support/Compiler.h"
18  #include "llvm/Support/ManagedStatic.h"
19  #include "llvm/Support/Mutex.h"
20  #include "llvm/Support/Threading.h"
21  #include "llvm/Value.h"
22  using namespace llvm;
23  
24  static ManagedStatic<sys::SmartMutex<true> > ObjectsLock;
25  static ManagedStatic<LeakDetectorImpl<void> > Objects;
26  
clearGarbage(LLVMContext & Context)27  static void clearGarbage(LLVMContext &Context) {
28    Objects->clear();
29    Context.pImpl->LLVMObjects.clear();
30  }
31  
addGarbageObjectImpl(void * Object)32  void LeakDetector::addGarbageObjectImpl(void *Object) {
33    sys::SmartScopedLock<true> Lock(*ObjectsLock);
34    Objects->addGarbage(Object);
35  }
36  
addGarbageObjectImpl(const Value * Object)37  void LeakDetector::addGarbageObjectImpl(const Value *Object) {
38    LLVMContextImpl *pImpl = Object->getContext().pImpl;
39    pImpl->LLVMObjects.addGarbage(Object);
40  }
41  
removeGarbageObjectImpl(void * Object)42  void LeakDetector::removeGarbageObjectImpl(void *Object) {
43    sys::SmartScopedLock<true> Lock(*ObjectsLock);
44    Objects->removeGarbage(Object);
45  }
46  
removeGarbageObjectImpl(const Value * Object)47  void LeakDetector::removeGarbageObjectImpl(const Value *Object) {
48    LLVMContextImpl *pImpl = Object->getContext().pImpl;
49    pImpl->LLVMObjects.removeGarbage(Object);
50  }
51  
checkForGarbageImpl(LLVMContext & Context,const std::string & Message)52  void LeakDetector::checkForGarbageImpl(LLVMContext &Context,
53                                         const std::string &Message) {
54    LLVMContextImpl *pImpl = Context.pImpl;
55    sys::SmartScopedLock<true> Lock(*ObjectsLock);
56  
57    Objects->setName("GENERIC");
58    pImpl->LLVMObjects.setName("LLVM");
59  
60    // use non-short-circuit version so that both checks are performed
61    if (Objects->hasGarbage(Message) |
62        pImpl->LLVMObjects.hasGarbage(Message))
63      errs() << "\nThis is probably because you removed an object, but didn't "
64             << "delete it.  Please check your code for memory leaks.\n";
65  
66    // Clear out results so we don't get duplicate warnings on
67    // next call...
68    clearGarbage(Context);
69  }
70