[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