private void RewriteCall(Statement stm, CallInstruction call) { var e = expander.Expand(call.Callee); var pt = e.Accept(asc) as Pointer; if (pt == null) { return; } var ft = pt.Pointee as FunctionType; if (ft == null) { return; } var returnId = ft.ReturnValue.DataType is VoidType ? null : ft.ReturnValue; var sigCallee = new ProcedureSignature(returnId, ft.Parameters); var ab = new ApplicationBuilder( program.Architecture, proc.Frame, call.CallSite, call.Callee, sigCallee, true); stm.Instruction = ab.CreateInstruction(); ssaIdTransformer.Transform(stm, call); }
private void RewriteCall(Statement stm, CallInstruction call) { var e = expander.Expand(call.Callee); var pt = e.Accept(asc).ResolveAs <Pointer>(); if (pt == null) { return; } var ft = pt.Pointee as FunctionType; if (ft == null) { return; } ssam.AdjustRegisterAfterCall( stm, call, ssa.Procedure.Architecture.StackRegister, ft.StackDelta - call.CallSite.SizeOfReturnAddressOnStack); var ab = new ApplicationBuilder( ssa.Procedure.Architecture, proc.Frame, call.CallSite, call.Callee, ft, false); stm.Instruction = ab.CreateInstruction(); ssaIdTransformer.Transform(stm, call); DefineUninitializedIdentifiers(stm, call); changed = true; }
private bool TryRewriteCall(Statement stm, CallInstruction call) { var e = expander.Expand(call.Callee); var pt = e.Accept(asc).ResolveAs <Pointer>(); if (pt == null) { return(false); } if (!(pt.Pointee is FunctionType ft)) { return(false); } RewriteCall(stm, call, ft); return(true); }
private void RewriteCall(Statement stm, CallInstruction call) { var e = expander.Expand(call.Callee); var pt = e.Accept(asc).ResolveAs <Pointer>(); if (pt == null) { return; } var ft = pt.Pointee as FunctionType; if (ft == null) { return; } AdjustStackPointerAfterCall(stm, call, ft.StackDelta); var ab = new ApplicationBuilder( program.Architecture, proc.Frame, call.CallSite, call.Callee, ft, false); stm.Instruction = ab.CreateInstruction(); ssaIdTransformer.Transform(stm, call); changed = true; }