-void LeakDetector::checkForGarbageImpl(const std::string &Message) {
- if (CachedValue) // Flush the cache to the set...
- addGarbageObjectImpl((Value*)0);
-
- assert(CachedValue == 0 && "No value should be cached anymore!");
-
- if ((Objects && !Objects->empty()) || (LLVMObjects && !LLVMObjects->empty())){
- std::cerr << "Leaked objects found: " << Message << "\n";
-
- if (Objects && !Objects->empty()) {
- std::cerr << " Non-Value objects leaked:";
- for (std::set<const void*>::iterator I = Objects->begin(),
- E = Objects->end(); I != E; ++I)
- std::cerr << " " << *I;
- }
-
- if (LLVMObjects && !LLVMObjects->empty()) {
- std::cerr << " LLVM Value subclasses leaked:";
- for (std::set<const Value*>::iterator I = LLVMObjects->begin(),
- E = LLVMObjects->end(); I != E; ++I)
- std::cerr << **I << "\n";
- }
-
- std::cerr << "This is probably because you removed an LLVM value "
- << "(Instruction, BasicBlock, \netc), but didn't delete it. "
- << "Please check your code for memory leaks.\n";
+void LeakDetector::checkForGarbageImpl(LLVMContext &Context,
+ const std::string &Message) {
+ LLVMContextImpl *pImpl = Context.pImpl;
+ sys::SmartScopedLock<true> Lock(*ObjectsLock);
+
+ Objects->setName("GENERIC");
+ pImpl->LLVMObjects.setName("LLVM");
+
+ // use non-short-circuit version so that both checks are performed
+ if (Objects->hasGarbage(Message) |
+ pImpl->LLVMObjects.hasGarbage(Message))
+ errs() << "\nThis is probably because you removed an object, but didn't "
+ << "delete it. Please check your code for memory leaks.\n";