Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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));
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
        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);
            }
        }