public static void Rewrite( Program program, ProgramDataFlow summaries, DecompilerEventListener eventListener) { GlobalCallRewriter crw = new GlobalCallRewriter(program, summaries, eventListener); foreach (Procedure proc in program.Procedures.Values) { if (eventListener.IsCanceled()) { return; } ProcedureFlow flow = crw.mpprocflow[proc]; flow.Dump(proc.Architecture); crw.AdjustLiveOut(flow); crw.EnsureSignature(proc, flow); crw.AddUseInstructionsForOutArguments(proc); } foreach (Procedure proc in program.Procedures.Values) { if (eventListener.IsCanceled()) { return; } crw.RewriteCalls(proc); crw.RewriteReturns(proc); } }
public void Setup() { program = new Program(); program.Architecture = new IntelArchitecture(ProcessorMode.Protected32); program.Platform = new DefaultPlatform(null, program.Architecture); gcr = new GlobalCallRewriter(program, null); proc = new Procedure("foo", program.Architecture.CreateFrame()); flow = new ProcedureFlow(proc, program.Architecture); }
public void Setup() { program = new Program(); program.Architecture = new X86ArchitectureFlat32(); program.Platform = new DefaultPlatform(null, program.Architecture); gcr = new GlobalCallRewriter(program, null, new FakeDecompilerEventListener()); proc = new Procedure("foo", program.Architecture.CreateFrame()); flow = new ProcedureFlow(proc, program.Architecture); }
public static void Rewrite(Program program, ProgramDataFlow summaries) { GlobalCallRewriter crw = new GlobalCallRewriter(program, summaries); foreach (Procedure proc in program.Procedures.Values) { ProcedureFlow flow = (ProcedureFlow)crw.mpprocflow[proc]; flow.Dump(program.Architecture); crw.AdjustLiveOut(flow); crw.EnsureSignature(proc, flow); crw.AddUseInstructionsForOutArguments(proc); } foreach (Procedure proc in program.Procedures.Values) { crw.RewriteCalls(proc); crw.RewriteReturns(proc); } }
/// <summary> /// Finds all interprocedural register dependencies (in- and out-parameters) and /// abstracts them away by rewriting as calls. /// </summary> /// <returns>A RegisterLiveness object that summarizes the interprocedural register /// liveness analysis. This information can be used to generate SSA form. /// </returns> public void UntangleProcedures() { eventListener.ShowStatus("Eliminating intra-block dead registers."); IntraBlockDeadRegisters.Apply(program); eventListener.ShowStatus("Finding terminating procedures."); var term = new TerminationAnalysis(flow); term.Analyze(program); eventListener.ShowStatus("Finding trashed registers."); var trf = new TrashedRegisterFinder(program, program.Procedures.Values, flow, eventListener); trf.Compute(); eventListener.ShowStatus("Rewriting affine expressions."); trf.RewriteBasicBlocks(); eventListener.ShowStatus("Computing register liveness."); var rl = RegisterLiveness.Compute(program, flow, eventListener); eventListener.ShowStatus("Rewriting calls."); GlobalCallRewriter.Rewrite(program, flow); }
/// <summary> /// Finds all interprocedural register dependencies (in- and out-parameters) and /// abstracts them away by rewriting as calls. /// </summary> /// <returns>A RegisterLiveness object that summarizes the interprocedural register /// liveness analysis. This information can be used to generate SSA form. /// </returns> public void UntangleProcedures() { eventListener.ShowStatus("Eliminating intra-block dead registers."); var usb = new UserSignatureBuilder(program); usb.BuildSignatures(eventListener); CallRewriter.Rewrite(program, eventListener); IntraBlockDeadRegisters.Apply(program, eventListener); AdjacentBranchCollector.Transform(program, eventListener); eventListener.ShowStatus("Finding terminating procedures."); var term = new TerminationAnalysis(flow, eventListener); term.Analyze(program); eventListener.ShowStatus("Finding trashed registers."); var trf = new TrashedRegisterFinder(program, program.Procedures.Values, flow, eventListener); trf.Compute(); eventListener.ShowStatus("Rewriting affine expressions."); trf.RewriteBasicBlocks(); eventListener.ShowStatus("Computing register liveness."); RegisterLiveness.Compute(program, flow, eventListener); eventListener.ShowStatus("Rewriting calls."); GlobalCallRewriter.Rewrite(program, flow, eventListener); }
public static void Rewrite( Program program, ProgramDataFlow summaries, DecompilerEventListener eventListener) { GlobalCallRewriter crw = new GlobalCallRewriter(program, summaries, eventListener); foreach (Procedure proc in program.Procedures.Values) { if (eventListener.IsCanceled()) return; ProcedureFlow flow = crw.mpprocflow[proc]; flow.Dump(program.Architecture); crw.AdjustLiveOut(flow); crw.EnsureSignature(proc, flow); crw.AddUseInstructionsForOutArguments(proc); } foreach (Procedure proc in program.Procedures.Values) { if (eventListener.IsCanceled()) return; crw.RewriteCalls(proc); crw.RewriteReturns(proc); } }
public static void Rewrite(Program prog, ProgramDataFlow summaries) { GlobalCallRewriter crw = new GlobalCallRewriter(prog, summaries); foreach (Procedure proc in prog.Procedures.Values) { ProcedureFlow flow = (ProcedureFlow) crw.mpprocflow[proc]; flow.Dump(prog.Architecture); crw.AdjustLiveOut(flow); crw.EnsureSignature(proc, flow); crw.AddUseInstructionsForOutArguments(proc); } foreach (Procedure proc in prog.Procedures.Values) { crw.RewriteCalls(proc, prog.Architecture); crw.RewriteReturns(proc); } }
public void GcrStackArguments() { Frame f = program.Architecture.CreateFrame(); f.ReturnAddressKnown = true; f.ReturnAddressSize = PrimitiveType.Word16.Size; f.EnsureStackVariable(Constant.Word16( 8), 2, PrimitiveType.Word16); f.EnsureStackVariable(Constant.Word16( 6), 2, PrimitiveType.Word16); f.EnsureStackVariable(Constant.Word16( 0x0E), 2, PrimitiveType.Word32); GlobalCallRewriter gcr = new GlobalCallRewriter(null, null); using (FileUnitTester fut = new FileUnitTester("Analysis/GcrStackParameters.txt")) { foreach (KeyValuePair<int,Identifier> de in gcr.GetSortedStackArguments(f)) { fut.TextWriter.Write("{0:X4} ", de.Key); de.Value.Write(true, fut.TextWriter); fut.TextWriter.WriteLine(); } fut.AssertFilesEqual(); } }