Esempio n. 1
0
        public void Transform()
        {
            SetInitialValues();
            var wl = new WorkList <SsaIdentifier>();

            wl.AddRange(ssa.Identifiers);
            while (wl.TryGetWorkItem(out var sid) && !listener.IsCanceled())
            {
                var oldValue = ctx.GetValue(sid.Identifier);
                if (oldValue is InvalidConstant)
                {
                    continue;
                }

                var newValue = Evaluate(sid);
                if (!cmp.Equals(oldValue, newValue))
                {
                    ctx.SetValue(sid.Identifier, newValue);
                    foreach (var use in sid.Uses)
                    {
                        var uc   = new InstructionUseCollector();
                        var uses = uc.CollectUses(use);
                        wl.AddRange(uses.Keys.Select(id => ssa.Identifiers[id]));
                    }
                }
            }
        }
Esempio n. 2
0
        public List <Statement> GetDefiningStatementClosure(Identifier id)
        {
            var visited = new HashSet <SsaIdentifier>();
            var wl      = new WorkList <SsaIdentifier>();
            var stms    = new List <Statement>();

            wl.Add(ssaIds[id]);
            while (wl.GetWorkItem(out var sid))
            {
                if (visited.Contains(sid))
                {
                    continue;
                }
                visited.Add(sid);
                if (sid.DefStatement == null)
                {
                    continue;
                }
                switch (sid.DefStatement.Instruction)
                {
                case AliasAssignment alias:
                    if (alias.Src is Identifier idAlias)
                    {
                        wl.Add(ssaIds[idAlias]);
                    }
                    else
                    {
                        stms.Add(sid.DefStatement);
                    }
                    break;

                case Assignment ass:
                    if (ass.Src is Identifier idSrc)
                    {
                        wl.Add(ssaIds[idSrc]);
                    }
                    else
                    {
                        stms.Add(sid.DefStatement);
                    }
                    break;

                case PhiAssignment phi:
                    wl.AddRange(phi.Src.Arguments.Select(a => ssaIds[(Identifier)a.Value]));
                    break;

                default:
                    stms.Add(sid.DefStatement);
                    break;
                }
            }
            return(stms);
        }
Esempio n. 3
0
        public void Transform()
        {
            var wl = new WorkList <Statement>(ssa.Procedure.Statements);

            while (wl.GetWorkItem(out var stm))
            {
                var prjf  = new ProjectionFilter(ssa, stm, sac);
                var instr = stm.Instruction.Accept(prjf);
                stm.Instruction = instr;
                wl.AddRange(prjf.NewStatements);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// For each procedure/SSA state, compute the variables that are live-out
        /// (and which bit ranges are live-out) and store them in the procedure flow.
        /// </summary>
        private void CollectLiveOutStorages()
        {
            var wl = new WorkList <SsaState>(ssaStates);

            while (wl.GetWorkItem(out SsaState ssa))
            {
                var liveOut = CollectLiveOutStorages(ssa.Procedure);
                var flow    = dataFlow.ProcedureFlows[ssa.Procedure];
                var changed = MergeLiveOut(flow, liveOut);
                if (changed)
                {
                    wl.AddRange(program.CallGraph.Callees(ssa.Procedure).Select(p => procToSsa[p]));
                }
            }
        }