Change function call name in a CallInst only in certain functions


In my module I have functions:

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?


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.

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

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);


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