@Test public void testSimpleThunks() throws Exception { node(1, 2); node(1, 4); node(1, 6); node(1, 9); node(1, 12); node(1, 13); thunkNode(2, 3, true); thunkNode(4, 5, false); thunkNode(6, 7, true); thunkNode(7, 8, true); thunkNode(9, 10, false); thunkNode(10, 11, false); thunkNode(12, 14, false); thunkNode(13, 14, false); thunkNode(15, 16, true); thunkNode(17, 18, false); AcyclicCallGraphBuilder builder = new AcyclicCallGraphBuilder(program, functions, false); DependencyGraph<Address> graph = builder.getDependencyGraph(DUMMY_MONITOR); Assert.assertEquals(18, graph.size()); assertDependents(graph, 2, 1); assertDependents(graph, 4, 1); assertDependents(graph, 6, 1); assertDependents(graph, 9, 1); assertDependents(graph, 12, 1); assertDependents(graph, 13, 1); assertDependents(graph, 3, 2); assertDependents(graph, 5, 4); assertDependents(graph, 7, 6); assertDependents(graph, 8, 7); assertDependents(graph, 10, 9); assertDependents(graph, 11, 10); assertDependents(graph, 14, 12, 13); assertDependents(graph, 1); assertDependents(graph, 16, 15); assertDependents(graph, 15); assertDependents(graph, 18, 17); assertDependents(graph, 17); }
public DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor) throws CancelledException { DependencyGraph<Address> graph = new DependencyGraph<>(); Deque<Address> startPoints = findStartPoints(); Set<Address> unprocessed = new TreeSet<>(functionSet); while (!unprocessed.isEmpty()) { monitor.checkCanceled(); Address functionEntry = getNextStartFunction(startPoints, unprocessed); processForward(graph, unprocessed, functionEntry, monitor); } return graph; }
AcyclicCallGraphBuilder { public DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor) throws CancelledException { DependencyGraph<Address> graph = new DependencyGraph<>(); Deque<Address> startPoints = findStartPoints(); Set<Address> unprocessed = new TreeSet<>(functionSet); while (!unprocessed.isEmpty()) { monitor.checkCanceled(); Address functionEntry = getNextStartFunction(startPoints, unprocessed); processForward(graph, unprocessed, functionEntry, monitor); } return graph; } }
AcyclicCallGraphBuilder { public DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor) throws CancelledException { DependencyGraph<Address> graph = new DependencyGraph<>(); Deque<Address> startPoints = findStartPoints(); Set<Address> unprocessed = new TreeSet<>(functionSet); while (!unprocessed.isEmpty()) { monitor.checkCanceled(); Address functionEntry = getNextStartFunction(startPoints, unprocessed); processForward(graph, unprocessed, functionEntry, monitor); } return graph; } AcyclicCallGraphBuilder(Program program, boolean killThunks);  AcyclicCallGraphBuilder(Program program, AddressSetView set, boolean killThunks);  AcyclicCallGraphBuilder(Program program, Collection<Function> functions,
			boolean killThunks); }
AcyclicCallGraphBuilder { public DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor) throws CancelledException { DependencyGraph<Address> graph = new DependencyGraph<>(); Deque<Address> startPoints = findStartPoints(); Set<Address> unprocessed = new TreeSet<>(functionSet); while (!unprocessed.isEmpty()) { monitor.checkCanceled(); Address functionEntry = getNextStartFunction(startPoints, unprocessed); processForward(graph, unprocessed, functionEntry, monitor); } return graph; } AcyclicCallGraphBuilder(Program program, boolean killThunks);  AcyclicCallGraphBuilder(Program program, AddressSetView set, boolean killThunks);  AcyclicCallGraphBuilder(Program program, Collection<Function> functions,
			boolean killThunks); DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor); }
AcyclicCallGraphBuilder { public DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor) throws CancelledException { DependencyGraph<Address> graph = new DependencyGraph<>(); Deque<Address> startPoints = findStartPoints(); Set<Address> unprocessed = new TreeSet<>(functionSet); while (!unprocessed.isEmpty()) { monitor.checkCanceled(); Address functionEntry = getNextStartFunction(startPoints, unprocessed); processForward(graph, unprocessed, functionEntry, monitor); } return graph; } AcyclicCallGraphBuilder(Program program, boolean killThunks);  AcyclicCallGraphBuilder(Program program, AddressSetView set, boolean killThunks);  AcyclicCallGraphBuilder(Program program, Collection<Function> functions,
			boolean killThunks); DependencyGraph<Address> getDependencyGraph(TaskMonitor monitor);  }