/// <summary> /// Computes intraprocedural liveness of the program <paramref name="p"/>, /// storing the results in <paramref name="procFlow"/>. /// </summary> /// <param name="p"></param> /// <param name="procFlow"></param> /// <returns></returns> public static RegisterLiveness Compute( Program p, ProgramDataFlow procFlow, DecompilerEventListener eventListener) { var live = new RegisterLiveness(p, procFlow, eventListener); Debug.WriteLineIf(trace.TraceError, "** Computing ByPass ****"); live.CurrentState = new ByPassState(p.Architecture); live.ProcessWorklist(); if (eventListener.IsCanceled()) { return(live); } Debug.WriteLineIf(trace.TraceError, "** Computing MayUse ****"); live.CurrentState = new MayUseState(); if (trace.TraceInfo) { live.Dump(); } live.ProcessWorklist(); if (eventListener.IsCanceled()) { return(live); } //$REVIEW: since we never use the liveinstate, can we get rid of the following // four statements? Debug.WriteLineIf(trace.TraceError, "** Computing LiveIn ****"); live.CurrentState = new LiveInState(); if (trace.TraceInfo) { live.Dump(); } live.ProcessWorklist(); if (eventListener.IsCanceled()) { return(live); } live.CompleteWork(); if (trace.TraceInfo) { live.Dump(); } return(live); }
/// <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); }