public static void RemoveCircularRanges(ControlFlowGraph graph)
        {
            GenericDominatorEngine engine = new GenericDominatorEngine(new _IIGraph_215(graph
                                                                                        ));

            engine.Initialize();
            List <ExceptionRangeCFG> lstRanges = graph.GetExceptions();

            for (int i = lstRanges.Count - 1; i >= 0; i--)
            {
                ExceptionRangeCFG range     = lstRanges[i];
                BasicBlock        handler   = range.GetHandler();
                List <BasicBlock> rangeList = range.GetProtectedRange();
                if (rangeList.Contains(handler))
                {
                    // TODO: better removing strategy
                    List <BasicBlock> lstRemBlocks = GetReachableBlocksRestricted(range.GetHandler(),
                                                                                  range, engine);
                    if (lstRemBlocks.Count < rangeList.Count || rangeList.Count == 1)
                    {
                        foreach (BasicBlock block in lstRemBlocks)
                        {
                            block.RemoveSuccessorException(handler);
                            rangeList.Remove(block);
                        }
                    }
                    if ((rangeList.Count == 0))
                    {
                        lstRanges.RemoveAtReturningValue(i);
                    }
                }
            }
        }
        public static bool HandleMultipleEntryExceptionRanges(ControlFlowGraph graph)
        {
            GenericDominatorEngine engine = new GenericDominatorEngine(new _IIGraph_314(graph
                                                                                        ));

            engine.Initialize();
            bool found;

            while (true)
            {
                found = false;
                bool splitted = false;
                foreach (ExceptionRangeCFG range in graph.GetExceptions())
                {
                    HashSet <BasicBlock> setEntries = GetRangeEntries(range);
                    if (setEntries.Count > 1)
                    {
                        // multiple-entry protected range
                        found = true;
                        if (SplitExceptionRange(range, setEntries, graph, engine))
                        {
                            splitted = true;
                            break;
                        }
                    }
                }
                if (!splitted)
                {
                    break;
                }
            }
            return(!found);
        }
Example #3
0
        public virtual void InitDominators()
        {
            HashSet <VarVersionNode> roots = new HashSet <VarVersionNode>();

            foreach (VarVersionNode node in nodes)
            {
                if ((node.preds.Count == 0))
                {
                    roots.Add(node);
                }
            }
            engine = new GenericDominatorEngine(new _IIGraph_74(roots));
            engine.Initialize();
        }