예제 #1
0
        /// <summary>
        /// Entry point method for performing constant-set propagation analysis.
        /// </summary>
        /// <param name="cfg"></param>
        /// <param name="method"></param>
        /// <param name="results"></param>
        /// <returns></returns>
        private ConstantPropagationSetAnalysis DoConstantPropagationAnalysis(ControlFlowGraph cfg, IMethodDefinition method, ScopeMethodAnalysisResult results)
        {
            Utils.WriteLine("Running constant propagation set analysis...");
            var cpsAnalysis = new ConstantPropagationSetAnalysis(cfg, method, mhost, schemaType);

            results.CPropagationSummary = cpsAnalysis.Analyze()[cfg.Exit.Id].Output;
            //Utils.WriteLine(results.CPropagationSummary.ToString());
            Utils.WriteLine("Done with constant propagation set analysis");
            return(cpsAnalysis);
        }
예제 #2
0
            public IEnumerable <Constant> GetConstants(Instruction instruction, IFieldAccess field)
            {
                if (!ConstantPropagationSetAnalysis.IsConstantType(field.Type, host))
                {
                    return(null);
                }

                var domain      = info[instruction];
                var fieldDomain = domain.Constants(field);

                if (fieldDomain.IsTop)
                {
                    return(null);
                }
                if (fieldDomain.IsBottom)
                {
                    return(new HashSet <Constant>());
                }

                return(new HashSet <Constant>(fieldDomain.Elements));
            }
예제 #3
0
            public IEnumerable <Constant> GetConstants(Instruction instruction, IVariable var)
            {
                if (!ConstantPropagationSetAnalysis.IsConstantType(var.Type, host))
                {
                    return(null);
                }

                var domain    = info[instruction];
                var varDomain = domain.Constants(var);

                if (varDomain.IsTop)
                {
                    return(null);
                }
                if (varDomain.IsBottom)
                {
                    return(new HashSet <Constant>());
                }

                return(new HashSet <Constant>(varDomain.Elements));
            }
예제 #4
0
 private bool IsConstantType(ITypeReference tref)
 {
     return(ConstantPropagationSetAnalysis.IsConstantType(tref, parent.Host));
 }
예제 #5
0
 public ConstantPropagationTransferVisitor(ConstantPropagationDomain start, ConstantPropagationSetAnalysis dad)
 {
     parent = dad;
     SetCurrent(start);
 }