[LLVMdev] Remove function from module

Nick Lewycky nicholas at mxc.ca
Sat Apr 21 18:20:25 PDT 2012


Михаил wrote:
> Thanks, but I replaceAllUsesWith() - works well, but I still get bug in
> eraseFromParent():
>
> While deleting: i32 (%class.B*, i32)* %_ZN1B1xEi
> An asserting value handle still pointed to this value!
> UNREACHABLE executed at /Users/neonomaly/LLVM/LLVM/lib/VMCore/Value.cpp:561!

The replaceAllUsesWith + eraseFromParent pattern remains correct, but 
there's more to the story than the parts we've focused on. This error 
means that there's some other code that is holding a pointer to the 
function you tried to delete, but is using AssertingVH to do so, so as 
to catch errors exactly like this producing a dangling pointer.

The error message doesn't tell us who owns the AssertingVH (indeed, the 
asserting-vh doesn't know, much like a pointer doesn't know who owns it).

So, under what circumstance are you doing this deletion? Is it inside a 
FunctionPass, or another kind of Pass? Are you using AssertingVH's or 
calling other code that is? Such as ValueMap's, or some llvm analysis 
pass which stores an AssertingVH?

Nick

>
>
> Yours sincerely,
> Kadysev Mikhail
>
> 21.04.2012, в 23:45, Nick Lewycky написал(а):
>
>> Михаил wrote:
>>> How correctly remove function from module?
>>> For example:
>>>
>>> int f1(int x) {
>>> ...
>>> a = f2(smth);
>>> ...
>>> }
>>> int f2 (int y) {
>>> ...
>>> b = f1(smth);
>>> ...
>>> }
>>>
>>> I need delete from module both f1 and f2. They haven't uses in other
>>> part of module, but I can't delete them with eraseFromParent, because
>>> they are use each other.
>>
>> Call X->replaceAllUsesWith(UndefValue::get(X->getType)) before calling
>> X->eraseFromParent().
>>
>> Nick
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list