Exemplo n.º 1
0
        /// <summary>
        /// Parses the given <see cref="ControlFlowGraph{TInstruction}"/>
        /// </summary>
        /// <returns>A <see cref="ControlFlowGraph{TInstruction}"/> representing the Ast</returns>
        public ControlFlowGraph <Statement <TInstruction> > Parse()
        {
            var newGraph  = new ControlFlowGraph <Statement <TInstruction> >(_architecture);
            var rootScope = _controlFlowGraph.ConstructBlocks();

            // Transform and add regions.
            foreach (var originalRegion in _controlFlowGraph.Regions)
            {
                var newRegion = TransformRegion(originalRegion);
                newGraph.Regions.Add(newRegion);
            }

            // Transform and add nodes.
            foreach (var originalBlock in rootScope.GetAllBlocks())
            {
                var originalNode     = _controlFlowGraph.Nodes[originalBlock.Offset];
                var transformedBlock = _transformer.Transform(originalBlock);
                var newNode          = new ControlFlowNode <Statement <TInstruction> >(originalBlock.Offset, transformedBlock);
                newGraph.Nodes.Add(newNode);

                // Move node to newly created region.
                if (originalNode.ParentRegion is BasicControlFlowRegion <TInstruction> basicRegion)
                {
                    newNode.MoveToRegion(_regionsMapping[basicRegion]);
                }
            }

            // Clone edges.
            foreach (var originalEdge in _controlFlowGraph.GetEdges())
            {
                var newOrigin = newGraph.Nodes[originalEdge.Origin.Offset];
                var newTarget = newGraph.Nodes[originalEdge.Target.Offset];
                newOrigin.ConnectWith(newTarget, originalEdge.Type);
            }

            // Fix entry point.
            newGraph.Entrypoint = newGraph.Nodes[_controlFlowGraph.Entrypoint.Offset];

            return(newGraph);
        }