public void Analyze() { foreach (var p in this.method.Body.Parameters) { LastDefSet(p, -1); } var sorted_nodes = cfg.ForwardOrder; for (var i = 0; i < sorted_nodes.Length; ++i) { var cfgNode = sorted_nodes[i]; var ptg = ptAnalysisResult[cfgNode.Id].Output; foreach (var instruction in cfgNode.Instructions) { var inferer = new AlternativeDependencyAnalyzer(cfgNode, ptg, this); var uses = instruction.UsedVariables; var defs = instruction.ModifiedVariables; inferer.Visit(cfgNode); } } System.Console.WriteLine("Finish Dep analysis"); System.Console.WriteLine(depGraph); var depGraphDGML = DGMLSerializer.Serialize(depGraph); var cfgGraphDGML = DGMLSerializer.Serialize(cfg); var ptgExit = ptAnalysisResult[cfg.Exit.Id].Output; this.PropagateExpressions(cfg); }
public void GeneratePTG(MethodDefinition method) { var methodInfo = programInfo.GetOrAdd(method); //GenerateIL(method); //GenerateTAC(method); //GenerateCFG(method); //GenerateWebs(method); GenerateSSA(method); if (!methodInfo.Contains("PTG_TEXT")) { var cfg = methodInfo.Get <ControlFlowGraph>("CFG"); // Points-to var pointsTo = new PointsToAnalysis(cfg, method); var result = pointsTo.Analyze(); var ptg = result[cfg.Exit.Id].Output; //ptg.RemoveVariablesExceptParameters(); //ptg.RemoveTemporalVariables(); var text = DGMLSerializer.Serialize(ptg); methodInfo.Set("PTG_TEXT", text); } }
public override IMethodDefinition Rewrite(IMethodDefinition methodDefinition) { var signature = MemberHelper.GetMethodSignature(methodDefinition, NameFormattingOptions.Signature | NameFormattingOptions.ParameterName); System.Console.WriteLine(signature); var disassembler = new Disassembler(host, methodDefinition, sourceLocationProvider); var methodBody = disassembler.Execute(); //System.Console.WriteLine(methodBody); //System.Console.WriteLine(); var cfg = ControlFlowGraph.GenerateNormalControlFlow(methodBody); ControlFlowGraph.ComputeDominators(cfg); ControlFlowGraph.IdentifyLoops(cfg); ControlFlowGraph.ComputeDominatorTree(cfg); ControlFlowGraph.ComputeDominanceFrontiers(cfg); var splitter = new WebAnalysis(cfg); splitter.Analyze(); splitter.Transform(); methodBody.UpdateVariables(); var typeAnalysis = new TypeInferenceAnalysis(cfg); typeAnalysis.Analyze(); var forwardCopyAnalysis = new ForwardCopyPropagationAnalysis(cfg); forwardCopyAnalysis.Analyze(); forwardCopyAnalysis.Transform(methodBody); var backwardCopyAnalysis = new BackwardCopyPropagationAnalysis(cfg); backwardCopyAnalysis.Analyze(); backwardCopyAnalysis.Transform(methodBody); //var pointsTo = new PointsToAnalysis(cfg); //var result = pointsTo.Analyze(); var ssa = new StaticSingleAssignmentAnalysis(methodBody, cfg); ssa.Transform(); methodBody.UpdateVariables(); ////var dot = DOTSerializer.Serialize(cfg); var dgml = DGMLSerializer.Serialize(cfg); return(base.Rewrite(methodDefinition)); }
public void GenerateCH() { if (!programInfo.Contains("CH_TEXT")) { var ch = new ClassHierarchy(); ch.Analyze(host); var text = DGMLSerializer.Serialize(ch); programInfo.Add("CH", ch); programInfo.Add("CH_TEXT", text); } }
public void GenerateCFG(MethodDefinition method) { var methodInfo = programInfo.GetOrAdd(method); //GenerateIL(method); GenerateTAC(method); if (!methodInfo.Contains("CFG")) { // Control-flow var cfAnalysis = new ControlFlowAnalysis(method.Body); var cfg = cfAnalysis.GenerateNormalControlFlow(); //var cfg = cfAnalysis.GenerateExceptionalControlFlow(); var domAnalysis = new DominanceAnalysis(cfg); domAnalysis.Analyze(); domAnalysis.GenerateDominanceTree(); //// Optional //var loopAnalysis = new NaturalLoopAnalysis(cfg); //loopAnalysis.Analyze(); var domFrontierAnalysis = new DominanceFrontierAnalysis(cfg); domFrontierAnalysis.Analyze(); var pdomAnalysis = new PostDominanceAnalysis(cfg); pdomAnalysis.Analyze(); pdomAnalysis.GeneratePostDominanceTree(); var pdomFrontierAnalysis = new PostDominanceFrontierAnalysis(cfg); pdomFrontierAnalysis.Analyze(); var controlDependenceAnalysis = new ControlDependenceAnalysis(cfg); controlDependenceAnalysis.Analyze(); var text = DGMLSerializer.Serialize(cfg); methodInfo.Add("CFG", cfg); methodInfo.Add("CFG_TEXT", text); text = DGMLSerializer.SerializeDominanceTree(cfg); methodInfo.Add("DT_TEXT", text); text = DGMLSerializer.SerializePostDominanceTree(cfg); methodInfo.Add("PDT_TEXT", text); text = DGMLSerializer.SerializeControlDependenceGraph(cfg); methodInfo.Add("CDG_TEXT", text); } }
public void GenerateWebs(MethodDefinition method) { var methodInfo = programInfo.GetOrAdd(method); //GenerateIL(method); //GenerateTAC(method); GenerateCFG(method); if (!methodInfo.Contains("WEBS_TEXT")) { var cfg = methodInfo.Get <ControlFlowGraph>("CFG"); // Webs var splitter = new WebAnalysis(cfg); splitter.Analyze(); splitter.Transform(); method.Body.UpdateVariables(); var typeAnalysis = new TypeInferenceAnalysis(cfg, method.ReturnType); typeAnalysis.Analyze(); //// Optional //var forwardCopyAnalysis = new ForwardCopyPropagationAnalysis(cfg); //forwardCopyAnalysis.Analyze(); //forwardCopyAnalysis.Transform(method.Body); //// Optional //var backwardCopyAnalysis = new BackwardCopyPropagationAnalysis(cfg); //backwardCopyAnalysis.Analyze(); //backwardCopyAnalysis.Transform(method.Body); var text = method.Body.ToString(); methodInfo.Add("WEBS_TEXT", text); text = DGMLSerializer.Serialize(cfg); methodInfo.Set("CFG_TEXT", text); text = DGMLSerializer.SerializeDominanceTree(cfg); methodInfo.Set("DT_TEXT", text); text = DGMLSerializer.SerializePostDominanceTree(cfg); methodInfo.Set("PDT_TEXT", text); text = DGMLSerializer.SerializeControlDependenceGraph(cfg); methodInfo.Set("CDG_TEXT", text); } }
public void GenerateSSA(MethodDefinition method) { var methodInfo = programInfo.GetOrAdd(method); //GenerateIL(method); //GenerateTAC(method); //GenerateCFG(method); GenerateWebs(method); if (!methodInfo.Contains("SSA_TEXT")) { var cfg = methodInfo.Get <ControlFlowGraph>("CFG"); // Live Variables var liveVariables = new LiveVariablesAnalysis(cfg); var livenessInfo = liveVariables.Analyze(); // SSA var ssa = new StaticSingleAssignment(method.Body, cfg); ssa.Transform(); ssa.Prune(livenessInfo); method.Body.UpdateVariables(); var text = method.Body.ToString(); methodInfo.Add("SSA_TEXT", text); text = DGMLSerializer.Serialize(cfg); methodInfo.Set("CFG_TEXT", text); text = DGMLSerializer.SerializeDominanceTree(cfg); methodInfo.Set("DT_TEXT", text); text = DGMLSerializer.SerializePostDominanceTree(cfg); methodInfo.Set("PDT_TEXT", text); text = DGMLSerializer.SerializeControlDependenceGraph(cfg); methodInfo.Set("CDG_TEXT", text); } }
public void GenerateCG() { GenerateCH(); if (!programInfo.Contains("CG_TEXT")) { var ch = programInfo.Get <ClassHierarchy>("CH"); var cga = new ClassHierarchyAnalysis(ch); cga.OnReachableMethodFound = method => { //GenerateIL(method); GenerateTAC(method); }; var roots = host.GetRootMethods(); var cg = cga.Analyze(host, roots); var text = DGMLSerializer.Serialize(cg); programInfo.Add("CG_TEXT", text); } }