Change function call name in a CallInst only in certain functions

Hello,

In my module I have functions:

a
b
c
f3 calls “a”
f2 calls “a”
f1 calls “b”

I would like to modify a CallInst in the f2. Now it calls “a”, but I want changed it to “c”.

When loop over the instructions of the f2, I can get a CallInst to be modified, then I use “setName” to changed it to “c”.

Problem is, since references are updated, “a” is changed to “c” even in f1.

Any solution?

Thanks

Not sure why you are using setName here. I personally use CallSite() to wrap InvokeInst and CallInst, then use CallSite::setCalledFunction for this kind of stuff.
Zhang

You are probably calling setName() on the called Function, which in-turned renamed the called Function instead of replacing the called function.
Depending on your use-case, if you are certain that you only need to modify CallInsts, then you could simply call CallInst::setCalledFunction , otherwise it’s probably wiser to use CallSite as a wrapper for both CallInst and InvokeInst. Do note, however, that no matter which solution you end up using, you’ll need to update the FunctionType as well
Zhang

Okey, setCalledFunction is useful. But I have a problem since my “a”, “b”, “c” are functions from libc, not my defined ones in the module.

if (CallInst *call_inst = dyn_cast(&I)) {

Function *fn = call_inst->getCalledFunction();
if (fn->getName() == “a”) {
ValueToValueMapTy map;

FN = CloneFunction(fn, map, nullptr);
FN->setName(“c”);
call_inst->setCalledFunction(FN);
}

}

I get “Assertion `!NodePtr->isKnownSentinel()’ failed.”