Example #1
0
        public static List <Node> Blocks(string Code, int LineNumber)
        {
            List <Node> nodesCDG = new List <Node>();
            Node        block    = new Node();

            nodesCDG = MControlDependencyGraph(Code);      //Create Dependency Graph
            List <Dom> doms = new List <Dom>();

            doms = MDomBasicBlock(Code);                   //Create Doms Collection
            Dictionary <int, Reach> reachs = MReach(Code); //Create reachs

            //Find Basic block
            foreach (var node in nodesCDG)
            {
                if (node.statements != null && node.statements.Exists(x => x.NumberLine == LineNumber))
                {
                    block = node;
                    break;
                }
            }

            //Create Blocks Collection
            List <Node> Blocks = new List <Node>();

            foreach (var node in nodesCDG)
            {
                if (node.basicBlock.Kind == BasicBlockKind.Entry || node.basicBlock.Kind == BasicBlockKind.Exit)
                {
                    continue;
                }
                Dom   dom   = doms.Where(x => x.Id == node.id).Single();
                Reach reach = reachs.Values.Where(x => x.id == node.id).Single();
                if (dom.Doms.Exists(x => x.id == block.id) && reach.ReachsId.Exists(x => x == block.id))
                {
                    Blocks.Add(node);
                }
            }

            return(Blocks);
        }
Example #2
0
        public static List <Dom> MDomBasicBlock(string Code)
        {
            List <Node> nodesCDG = new List <Node>();
            Node        block    = new Node();

            nodesCDG = MControlDependencyGraph(Code);    //Create Dependency Graph


            //Create List Dom For basic block
            List <Dom> doms  = new List <Dom>();
            Queue      queue = new Queue();

            foreach (var basicblock in nodesCDG)
            {
                if (basicblock.basicBlock.Kind == BasicBlockKind.Entry || basicblock.basicBlock.Kind == BasicBlockKind.Exit)
                {
                    continue;
                }
                basicblock.parentList.ForEach(x => queue.Enqueue(x));     // 1:Add parents node to queqe
                List <Node> nodes = new List <Node>();
                while (queue.Count > 0)
                {
                    int  id   = int.Parse(queue.Dequeue().ToString());
                    Node node = nodesCDG.Where(x => x.id == id).First();
                    nodes.Add(node);                                      // 2:Add dominant block
                    if (node.childList != null)
                    {
                        node.childList.ForEach(x => queue.Enqueue(x));    // 3:Add childs node to queue
                    }
                }
                Dom dom = new Dom(basicblock.id, basicblock, nodes);
                doms.Add(dom);
            }

            return(doms);
        }