[LLVMdev] Remove function from module

Nick Lewycky nicholas at mxc.ca
Sun Apr 22 12:30:45 PDT 2012


Михаил wrote:
> It is ModulePass with AnalysisUsage of CallGraph

Ah, then you'll need to update the CallGraph first. Use 
"CG.removeFunctionFromModule(F);" before deleting it.

Nick

> Yours sincerely,
> Kadysev Mikhail
>
> 22.04.2012, в 5:20, Nick Lewycky написал(а):
>
>> Михаил 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 <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>
>
>
> _______________________________________________
> 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