Ejemplo n.º 1
0
        private ScopeMethodAnalysisResult AnalyzeMethod(IMethodDefinition methodDefinition)
        {
            var methodResult = new ScopeMethodAnalysisResult(methodDefinition, mhost);

            try
            {
                var cfg = PrepareMethod(methodDefinition);
                Utils.WriteLine("CFG size " + cfg.Nodes.Count);

                // Run escape analysis.
                var escAnalysis = DoEscapeAnalysis(cfg, methodDefinition, methodResult);
                methodResult.Unsupported = escAnalysis.Unsupported;

                // If some row has escaped or the method has unsupported features,
                // there is no need to analyze the method any further.
                if (escAnalysis.InterestingRowEscaped || escAnalysis.Unsupported)
                {
                    if (escAnalysis.InterestingRowEscaped && !escAnalysis.Unsupported)
                    {
                        Utils.WriteLine("A rowish data structure has escaped, no dependency information available.");
                    }
                    methodResult.UsedColumnsSummary = ColumnsDomain.Top;
                }
                else
                {
                    // Otherwise, do constant-set propagation (CSP) analysis.
                    var cspAnalysis = DoConstantPropagationAnalysis(cfg, methodDefinition, methodResult);
                    var cspInfo     = new NaiveScopeConstantsProvider(cspAnalysis.PreResults, mhost);

                    //Finally, do the actual used-columns analysis using results of the previous CSP analysis.
                    var clsAnalysis = DoUsedColumnsAnalysis(cfg, cspInfo, methodResult);
                    methodResult.Unsupported = cspAnalysis.Unsupported | clsAnalysis.Unsupported;
                }
            }
            catch (Exception e)
            {
                Utils.WriteLine(String.Format("{0} METHOD FAILURE: {1}", methodDefinition.FullName(), e.Message));
                Utils.WriteLine(e.StackTrace);
                methodResult.Failed = true;
            }
            return(methodResult);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Main method for performing Scope analysis on a method.
        /// </summary>
        /// <param name="methodDefinition"></param>
        public override void TraverseChildren(IMethodDefinition methodDefinition)
        {
            //if (!methodDefinition.FullName().Contains("MMRV2.IndexSelection.DPGenDomainKeyProcessor"))
            //    return;

            //if (!methodDefinition.FullName().Contains("ScopeML.Prediction.CompactModelBuilderReducer") || !methodDefinition.FullName().Contains("MoveNext"))
            //    return;

            var methodResult = new ScopeMethodAnalysisResult(methodDefinition, mhost);

            try
            {
                // We analyze only (interesting) processor methods.
                if (IsInterestingProcessor(methodDefinition))
                {
                    Utils.WriteLine("\n--------------------------------------------------\n");
                    Utils.WriteLine("Found interesting method " + methodDefinition.FullName());

                    // Create CFG and run basic analyses, such as copy-propagation.
                    var cfg = PrepareMethod(methodDefinition);
                    Utils.WriteLine("CFG size " + cfg.Nodes.Count);
                    //System.IO.File.WriteAllText(@"mbody-zvonimir.txt", _code);

                    // Run escape analysis.
                    var escAnalysis = DoEscapeAnalysis(cfg, methodDefinition, methodResult);
                    methodResult.Unsupported = escAnalysis.Unsupported;

                    // If some row has escaped or the method has unsupported features,
                    // there is no need to analyze the method any further.
                    if (escAnalysis.InterestingRowEscaped || escAnalysis.Unsupported)
                    {
                        if (escAnalysis.InterestingRowEscaped && !escAnalysis.Unsupported)
                        {
                            Utils.WriteLine("A rowish data structure has escaped, no dependency information available.");
                        }
                        methodResult.UsedColumnsSummary = ColumnsDomain.Top;
                    }
                    else
                    {
                        // Otherwise, do constant-set propagation (CSP) analysis.
                        var cspAnalysis = DoConstantPropagationAnalysis(cfg, methodDefinition, methodResult);
                        var cspInfo     = new NaiveScopeConstantsProvider(cspAnalysis.PreResults, mhost);

                        //Finally, do the actual used-columns analysis using results of the previous CSP analysis.
                        var clsAnalysis = DoUsedColumnsAnalysis(cfg, cspInfo, methodResult);
                        methodResult.Unsupported = cspAnalysis.Unsupported | clsAnalysis.Unsupported;
                    }

                    Utils.WriteLine("Method has useful result: " + (!methodResult.UsedColumnsSummary.IsBottom && !methodResult.UsedColumnsSummary.IsTop));
                    Utils.WriteLine("Method has unsupported features: " + methodResult.Unsupported);
                    Utils.WriteLine("\n--------------------------------------------------\n");
                }
                else
                {
                    methodResult.Interesting = false;
                }
            }
            catch (Exception e)
            {
                Utils.WriteLine(String.Format("{0} METHOD FAILURE: {1}", methodDefinition.FullName(), e.Message));
                Utils.WriteLine(e.StackTrace);
                methodResult.Failed = true;
            }

            results.Add(methodResult);
            return;
        }