private void processForward(AbstractDependencyGraph<Address> graph, Set<Address> unprocessed,
			Address startFunction, TaskMonitor monitor) throws CancelledException {
		VisitStack stack = new VisitStack(startFunction);
		StackNode curnode = stack.peek();
		initializeNode(curnode);
		graph.addValue(curnode.address);
		while (!stack.isEmpty()) {
			monitor.checkCancelled();

			curnode = stack.peek();
			if (curnode.nextchild >= curnode.children.length) {		// Node more to children to traverse for this node
				unprocessed.remove(curnode.address);
				monitor.incrementProgress(1);
				stack.pop();
			}
			else {
				Address childAddr = curnode.children[curnode.nextchild++];
				if (!stack.contains(childAddr)) {
					if (unprocessed.contains(childAddr)) {
						stack.push(childAddr);
						StackNode nextnode = stack.peek();
						initializeNode(nextnode);
						childAddr = nextnode.address;
						graph.addValue(nextnode.address);
					}
					graph.addDependency(curnode.address, childAddr);
				}
			}
		}
	}
Builds the DependencyGraph for the acyclic call graph represented by this object.
@param monitor the taskMonitor to use for reporting progress or cancelling.
@return the DependencyGraph for the acyclic call graph represented by this object.
@throws CancelledException if the monitor was cancelled.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/util/AcyclicCallGraphBuilder.java