private void EmitProgram(Program program, DataFlowAnalysis dfa, TextWriter output)
{
if (output == null)
return;
foreach (Procedure proc in program.Procedures.Values)
{
if (dfa != null)
{
ProcedureFlow flow = dfa.ProgramDataFlow[proc];
TextFormatter f = new TextFormatter(output);
if (flow.Signature != null)
flow.Signature.Emit(proc.Name, FunctionType.EmitFlags.LowLevelInfo, f);
else if (proc.Signature != null)
proc.Signature.Emit(proc.Name, FunctionType.EmitFlags.LowLevelInfo, f);
else
output.Write("Warning: no signature found for {0}", proc.Name);
output.WriteLine();
flow.Emit(program.Architecture, output);
foreach (Block block in new DfsIterator<Block>(proc.ControlGraph).PostOrder().Reverse())
{
if (block == null)
continue;
block.Write(output); output.Flush();
BlockFlow bf = dfa.ProgramDataFlow[block];
if (bf != null)
{
bf.Emit(program.Architecture, output);
output.WriteLine();
}
}
}
else
{
proc.Write(false, output);
}
output.WriteLine();
output.WriteLine();
}
output.Flush();
}