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