Example #1
0
 private void TraceOutsideFunctionBoundsRec(InstructionNode currentNode, Dictionary <InstructionNode, MergeNodeTraceData> mergingNodesData, InstructionNode lastNode = null, StateProviderCollection stateProviders = null, List <InstructionNode> visited = null)
 {
     if (visited == null)
     {
         visited        = new List <InstructionNode>();
         lastNode       = currentNode;
         stateProviders = new StateProviderCollection();
         GlobalVisited.Clear();
     }
     while (true)
     {
         if (visited.Contains(currentNode))
         {
             if (!currentNode.BranchProperties.MergingNodeProperties.IsMergingNode)
             {
                 return;
             }
         }
         visited.Add(currentNode);
         GlobalVisited.Add(currentNode);
         bool reachedMergeNodeNotLast;
         int  stateProviderCount = stateProviders.Count;
         ActOnCurrentNode(currentNode, mergingNodesData, lastNode, stateProviders, out reachedMergeNodeNotLast);
         if (reachedMergeNodeNotLast)
         {
             return;
         }
         lastNode = currentNode;
         if (currentNode.ProgramFlowForwardRoutes.Count == 1)
         {
             currentNode = currentNode.ProgramFlowForwardRoutes[0];
         }
         else
         {
             break;
         }
     }
     if (currentNode.ProgramFlowForwardRoutes.Count == 0)
     {
         return;
     }
     if (!(currentNode is ConditionalJumpNode))
     {
         Console.WriteLine("Splitting without a conditional");
     }
     foreach (var node in currentNode.ProgramFlowForwardRoutes)
     {
         TraceOutsideFunctionBoundsRec(node, mergingNodesData, currentNode, stateProviders, visited);
     }
 }
Example #2
0
        private static void ActOnCurrentNode(InstructionNode currentNode, Dictionary <InstructionNode, MergeNodeTraceData> mergingNodesData, InstructionNode lastNode, StateProviderCollection stateProviders, out bool reachedMergeNodeNotLast)
        {
            if (currentNode.BranchProperties.MergingNodeProperties.IsMergingNode)
            {
                lock (mergingNodesData)
                {
                    mergingNodesData[currentNode].ReachedNodes.Add(lastNode);
                    mergingNodesData[currentNode].AccumelatedStateProviders.AddNewProviders(stateProviders);
                    bool allBranchesReached = !currentNode.ProgramFlowBackRoutes.Except(mergingNodesData[currentNode].ReachedNodes).Any();
                    if (allBranchesReached)
                    {
                        mergingNodesData[currentNode].AllBranchesReached = true;
                        mergingNodesData[currentNode].AccumelatedStateProviders.MergeBranches(currentNode);
                        stateProviders.AddNewProviders(mergingNodesData[currentNode].AccumelatedStateProviders);
                    }
                    else
                    {
                        reachedMergeNodeNotLast = true;
                        return;
                    }
                }
            }
            var newStoreState = StoreDynamicDataStateProvider.GetMatchingStateProvider(currentNode);

            if (newStoreState != null)
            {
                stateProviders.AddNewProvider(newStoreState);
            }
            IDynamicDataLoadNode loadNode = currentNode as IDynamicDataLoadNode;

            if (loadNode != null)
            {
                foreach (var storeNode in stateProviders.MatchLoadToStore(currentNode))
                {
                    currentNode.DataFlowBackRelated.AddTwoWay(storeNode, loadNode.DataFlowDataProdivderIndex);
                }
            }
            reachedMergeNodeNotLast = false;
        }