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