public void Prune(LiveVariablesAnalysis liveVariables) { foreach (var node in cfg.Nodes) { var result = liveVariables.Result[node.Id]; var input = result.Input.ToSet(); var phiInstructions = node.Instructions.OfType <PhiInstruction>().ToArray(); foreach (var phi in phiInstructions) { var isLive = input.Contains(phi.Result); if (!isLive && phi.Result is DerivedVariable) { var derived = phi.Result as DerivedVariable; isLive = input.Contains(derived.Original); } if (!isLive) { // TODO: Also remove phi instructions from method's body instructions collection. node.Instructions.Remove(phi); } } } }
//string _code = String.Empty; /// <summary> /// For a given methodDefinition, create a CFG and run basic analyses such as /// stack removal, SSA transformation, live-variables analysis, and copy-propagation. /// </summary> /// <param name="methodDefinition"></param> /// <returns></returns> private ControlFlowGraph PrepareMethod(IMethodDefinition methodDefinition) { var disassembler = new Disassembler(mhost, methodDefinition, sourceLocationProvider); var methodBody = disassembler.Execute(); var cfg = ControlFlowGraph.GenerateNormalControlFlow(methodBody); ControlFlowGraph.ComputeDominators(cfg); ControlFlowGraph.IdentifyLoops(cfg); ControlFlowGraph.ComputeDominatorTree(cfg); ControlFlowGraph.ComputeDominanceFrontiers(cfg); // Uniquely rename stack variables. var splitter = new WebAnalysis(cfg); splitter.Analyze(); splitter.Transform(); methodBody.UpdateVariables(); // Infer types for stack variables. var typeAnalysis = new TypeInferenceAnalysis(cfg); typeAnalysis.Analyze(); var backwardCopyAnalysis = new BackwardCopyPropagationAnalysis(cfg); backwardCopyAnalysis.Analyze(); backwardCopyAnalysis.Transform(methodBody); var lva = new LiveVariablesAnalysis(cfg); lva.Analyze(); var ssa = new StaticSingleAssignmentAnalysis(methodBody, cfg); ssa.Transform(); ssa.Prune(lva); methodBody.UpdateVariables(); //_code = methodBody.ToString(); return(cfg); }
public static void RunLiveVariableAnalysisExample() { string liveVariableExample = CompileLiveVariableAnalysisExample(); using (var host = new PeReader.DefaultHost()) using (var assembly = new Assembly(host)) { // load binaries that are gonna be analyzed Types.Initialize(host); assembly.Load(liveVariableExample); // search for the method definition in the assembly // if you inspect this method definitions they are defined using the .NET IL instructions (aka bytecode) var allDefinedMethodsInAssembly = assembly.Module.GetAllTypes() // get all defined types in the assembly (these are cci objects) .SelectMany(typeDefinition => typeDefinition.Methods); /// get all defined methods (these are cci objects) var targetMethod = allDefinedMethodsInAssembly.Where(m => m.Name.Value.Contains("Example")).First(); // transform it into a typed stackless three addres code representation // this is a result of analysis-net framework ControlFlowGraph cfg = null; MethodBody methodBody = Transformations.ThreeAddressCode(targetMethod, host, out cfg); // on top of the three address representation we apply a live variable analysis // it is far easier to implement such analysis on this representation // if you intent to apply it on top of the IL bytecode, you will have to guess what you have in the stack for each instruction LiveVariablesAnalysis liveVariables = new LiveVariablesAnalysis(cfg); liveVariables.Analyze(); // the result is the subset of live variables for each basic block in the cfg DataFlowAnalysisResult <Backend.Utils.Subset <IVariable> >[] result = liveVariables.Result; // export results // it generates two files in the same directory as the executable: // 1) cfg.dot contains a .dot representation of the control flow graph // 2) live_variable_analysis.txt plain text representation of the live variable analysis Export.ExportExample(cfg, result); } }
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); } }
//string _code = String.Empty; /// <summary> /// For a given methodDefinition, create a CFG and run basic analyses such as /// stack removal, SSA transformation, live-variables analysis, and copy-propagation. /// </summary> /// <param name="methodDefinition"></param> /// <returns></returns> private ControlFlowGraph PrepareMethod(IMethodDefinition methodDefinition) { var sw2 = new Stopwatch(); sw2.Start(); var disassembler = new Disassembler(mhost, methodDefinition, sourceLocationProvider); var methodBody = disassembler.Execute(); var cfAnalysis = new ControlFlowAnalysis(methodBody); var cfg = cfAnalysis.GenerateNormalControlFlow(); var domAnalysis = new DominanceAnalysis(cfg); domAnalysis.Analyze(); domAnalysis.GenerateDominanceTree(); var loopAnalysis = new NaturalLoopAnalysis(cfg); loopAnalysis.Analyze(); var domFrontierAnalysis = new DominanceFrontierAnalysis(cfg); domFrontierAnalysis.Analyze(); var splitter = new WebAnalysis(cfg, methodDefinition); splitter.Analyze(); splitter.Transform(); methodBody.UpdateVariables(); var analysis = new TypeInferenceAnalysis(cfg, methodBody.MethodDefinition.Type); analysis.Analyze(); var copyProgapagtion = new ForwardCopyPropagationAnalysis(cfg); copyProgapagtion.Analyze(); copyProgapagtion.Transform(methodBody); var backwardCopyProgapagtion = new BackwardCopyPropagationAnalysis(cfg); backwardCopyProgapagtion.Analyze(); backwardCopyProgapagtion.Transform(methodBody); var liveVariables = new LiveVariablesAnalysis(cfg); var resultLiveVar = liveVariables.Analyze(); var ssa = new StaticSingleAssignment(methodBody, cfg); ssa.Transform(); ssa.Prune(liveVariables); methodBody.UpdateVariables(); sw2.Stop(); this.nonAnalysisOverhead = sw2.Elapsed; return(cfg); //var cfg = ControlFlowGraph.GenerateNormalControlFlow(methodBody); //ControlFlowGraph.ComputeDominators(cfg); //ControlFlowGraph.IdentifyLoops(cfg); //ControlFlowGraph.ComputeDominatorTree(cfg); //ControlFlowGraph.ComputeDominanceFrontiers(cfg); //// Uniquely rename stack variables. //var splitter = new WebAnalysis(cfg); //splitter.Analyze(); //splitter.Transform(); //methodBody.UpdateVariables(); //// Infer types for stack variables. //var typeAnalysis = new TypeInferenceAnalysis(cfg); //typeAnalysis.Analyze(); //var backwardCopyAnalysis = new BackwardCopyPropagationAnalysis(cfg); //backwardCopyAnalysis.Analyze(); //backwardCopyAnalysis.Transform(methodBody); //var lva = new LiveVariablesAnalysis(cfg); //lva.Analyze(); //var ssa = new StaticSingleAssignmentAnalysis(methodBody, cfg); //ssa.Transform(); //ssa.Prune(lva); //methodBody.UpdateVariables(); ////_code = methodBody.ToString(); //return cfg; }
public MethodCfgAndTac AnalyzeIntraProcedural(IMethodDefinition methodDefinition) { // System.Console.WriteLine("Traversing: {0}", methodDefinition.GetName()); if (Stubber.SuppressM(methodDefinition)) { return(null); } if (methodDefinition.IsExternal) { return(null); } if (methodDefinition.IsAbstract) { return(null); } ITypeDefinition containingDefn = methodDefinition.ContainingTypeDefinition; ISourceLocationProvider sourceLocationProvider = null; if (containingDefn != null) { IModule mod = TypeHelper.GetDefiningUnit(containingDefn) as IModule; if (moduleToPdbMap.ContainsKey(mod)) { sourceLocationProvider = moduleToPdbMap[mod]; } else { if (!(mod == null || mod == Dummy.Module || mod == Dummy.Assembly)) { sourceLocationProvider = GetPdbReader(mod.Location); moduleToPdbMap[mod] = sourceLocationProvider; } } } var disassembler = new Disassembler(host, methodDefinition, sourceLocationProvider); var methodBody = disassembler.Execute(); var cfAnalysis = new ControlFlowAnalysis(methodBody); // var cfg = cfAnalysis.GenerateNormalControlFlow(); var cfg = cfAnalysis.GenerateExceptionalControlFlow(); var domAnalysis = new DominanceAnalysis(cfg); domAnalysis.Analyze(); domAnalysis.GenerateDominanceTree(); var loopAnalysis = new NaturalLoopAnalysis(cfg); loopAnalysis.Analyze(); var domFrontierAnalysis = new DominanceFrontierAnalysis(cfg); domFrontierAnalysis.Analyze(); var splitter = new WebAnalysis(cfg, methodDefinition); splitter.Analyze(); splitter.Transform(); methodBody.UpdateVariables(); var typeAnalysis = new TypeInferenceAnalysis(cfg, methodDefinition.Type); typeAnalysis.Analyze(); var forwardCopyAnalysis = new ForwardCopyPropagationAnalysis(cfg); forwardCopyAnalysis.Analyze(); forwardCopyAnalysis.Transform(methodBody); // backwardCopyAnalysis is buggy - it says so in the source file - see notes in src/test // var backwardCopyAnalysis = new BackwardCopyPropagationAnalysis(cfg); // backwardCopyAnalysis.Analyze(); // backwardCopyAnalysis.Transform(methodBody); var liveVariables = new LiveVariablesAnalysis(cfg); liveVariables.Analyze(); var ssa = new StaticSingleAssignment(methodBody, cfg); ssa.Transform(); ssa.Prune(liveVariables); methodBody.UpdateVariables(); MethodCfgAndTac mct = new MethodCfgAndTac(cfg, methodBody); foreach (IExceptionHandlerBlock ehInfo in disassembler.GetExceptionHandlers()) { if (ehInfo is CatchExceptionHandler) { mct.ehInfoList.Add(ehInfo as CatchExceptionHandler); } } return(mct); }
public static ControlFlowGraph DoAnalysisPhases(this IMethodDefinition method, IMetadataHost host, ISourceLocationProvider locationProvider, IEnumerable <IMethodReference> methodsToTryToInline = null) { AnalysisStats.extraAnalysisOverHead.Start(); var disassembler = new Disassembler(host, method, locationProvider); var methodBody = disassembler.Execute(); MethodBodyProvider.Instance.AddBody(method, methodBody); if (methodsToTryToInline != null) { DoInlining(method, host, methodBody, locationProvider, methodsToTryToInline); } var cfAnalysis = new ControlFlowAnalysis(methodBody); //var cfg = cfAnalysis.GenerateExceptionalControlFlow(); var cfg = cfAnalysis.GenerateNormalControlFlow(); var domAnalysis = new DominanceAnalysis(cfg); domAnalysis.Analyze(); domAnalysis.GenerateDominanceTree(); var loopAnalysis = new NaturalLoopAnalysis(cfg); loopAnalysis.Analyze(); var domFrontierAnalysis = new DominanceFrontierAnalysis(cfg); domFrontierAnalysis.Analyze(); var splitter = new WebAnalysis(cfg, method); splitter.Analyze(); splitter.Transform(); methodBody.UpdateVariables(); var analysis = new TypeInferenceAnalysis(cfg, methodBody.MethodDefinition.Type); analysis.Analyze(); var copyProgapagtion = new ForwardCopyPropagationAnalysis(cfg); copyProgapagtion.Analyze(); copyProgapagtion.Transform(methodBody); //var backwardCopyProgapagtion = new BackwardCopyPropagationAnalysis(cfg); //backwardCopyProgapagtion.Analyze(); //backwardCopyProgapagtion.Transform(methodBody); var liveVariables = new LiveVariablesAnalysis(cfg); var resultLiveVar = liveVariables.Analyze(); var ssa = new StaticSingleAssignment(methodBody, cfg); ssa.Transform(); ssa.Prune(liveVariables); methodBody.UpdateVariables(); AnalysisStats.extraAnalysisOverHead.Stop(); return(cfg); }