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