public void ApplySignatureToProcedure(Address addr, FunctionType sig, Procedure proc)
{
proc.Signature = sig;
int i = 0;
var stmts = proc.EntryBlock.Succ[0].Statements;
var linAddr = addr.ToLinear();
var m = new ExpressionEmitter();
foreach (var param in sig.Parameters)
{
var starg = param.Storage as StackArgumentStorage;
if (starg != null)
{
proc.Frame.EnsureStackArgument(
starg.StackOffset,
param.DataType,
param.Name);
var fp = proc.Frame.FramePointer;
stmts.Insert(i, linAddr, new Store(
m.Load(param.DataType, m.IAdd(fp, starg.StackOffset)),
param));
}
else
{
var paramId = proc.Frame.EnsureIdentifier(param.Storage);
paramId.DataType = param.DataType;
// Need to take an extra step with parameters being passed
// in a register. It's perfectly possible for a user to
// create a variable which they want to call 'r2' but which
// the calling convention of the machine wants to call 'r1'.
// To avoid this, we create a temporary identifier for
// the formal parameter, and inject an copy statement in the
// entry block that moves the parameter value into the
// register.
stmts.Insert(i, linAddr, NewMethod(param, paramId));
}
++i;
}
}