/// <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); }