Please see the code below and the comments. I am guessing I need to find a way to set the arguments and function type for the f_resolved_addr (CallInst). Assuming I am right, how to do it correctly?
(or if not how I can call a function based on it's function address that is dynamically provided by a different external function?)
std::vector<Value *> args2;
args2.push_back(object);
args2.push_back(function_name);
// calling f_ResolveFunction(object, function_name) will return dynamic function address of function_name
// i want to later call this function using the dynamic function address
CallInst *f_resolved_addr = Builder->CreateCall( f_ResolveFunction, args2, "resolve_call");
// f_resolved_addr (now "contains" the resolved function address?)
// target function (resolved function) takes one 32-bit integer as argument
// and returns one 32-bit integer
std::vector<Value *> args;
args.push_back(ConstantInt::get(ctx, APInt(32, 0x123)));
Value *call_ret = Builder.CreateCall(f_resolved_addr, args, "call");
// however CreateCall causes assert condition here
// Assertion failed: (Args.size() == FTy->getNumParams() || (FTy->isVarArg() && Args.size() > FTy->getNumParams())) && "Calling a function with bad signature!",
Builder.CreateCall(f_resolved_addr(CallInst) ... is causing assert condition.