コード例 #1
0
        /// <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);
        }