Chris Lattner wrote:> On Feb 15, 2008, at 1:57 PM, John Criswell wrote: > > >> Dear All, >> >> I'm getting the following assertion from a program I've written: >> >> /home/vadve/criswell/src/llvm22/lib/VMCore/Value.cpp:57: virtual >> llvm::Value::~Value(): Assertion `use_empty() && "Uses remain when a >> value is destroyed!"' failed. >> >> This occurs when I free a Module (the program uses an auto_ptr() to >> the >> Module, and the auto_ptr() moves out of scope). >> >> It looks like the code that frees a BasicBlock frees all of its >> instructions in order without regards to the def-use chains. However, >> the Value class's destructor has the assertion that the Value has no >> uses. >> >> Is the assertion an error, or should BasicBlock's deallocate >> instructions so that there are no dangling def-use chains? >> > > You probably have an instruction that you removed from the module but > didn't delete. The module dtor works fine: it uses > 'dropAllReferences' to clear the operands of instructions before > deleting the instructions themselves. >Okay. I wasn't aware I had to delete unneeded values as well as remove them. I'll try that. Thanks. -- John T.> -Chris > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
>> You probably have an instruction that you removed from the module but >> didn't delete. The module dtor works fine: it uses >> 'dropAllReferences' to clear the operands of instructions before >> deleting the instructions themselves. >> > Okay. I wasn't aware I had to delete unneeded values as well as > remove > them. I'll try that.The convention is that 'remove' unlinks the object from the IR, and 'erase' does remove and deletes the result. If someone wants to clarify this behavior in http://llvm.org/docs/ProgrammersManual.html#common , it would be nice :) -Chris
Chris Lattner wrote:>>> You probably have an instruction that you removed from the module but >>> didn't delete. The module dtor works fine: it uses >>> 'dropAllReferences' to clear the operands of instructions before >>> deleting the instructions themselves. >>> >>> >> Okay. I wasn't aware I had to delete unneeded values as well as >> remove >> them. I'll try that. >> > > The convention is that 'remove' unlinks the object from the IR, and > 'erase' does remove and deletes the result. > > If someone wants to clarify this behavior in http://llvm.org/docs/ProgrammersManual.html#common > , it would be nice :) >No, I understood that part (granted, I read DoxyGen). The part I didn't understand is that I'm required to erase an instruction that should have no more uses before deleting the Module. If I get time, I can try to add some text about it. -- John T.> -Chris > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >