private void moveSuspectSymbolsToDoLaterSet(Program program, TaskMonitor monitor,
			Set<Address> doNowSet, Set<Address> doLaterSet) throws CancelledException {
		PseudoDisassembler pdis = new PseudoDisassembler(program);

		int count = 0;
		monitor.initialize(doNowSet.size());

		Listing listing = program.getListing();
		SymbolTable symbolTable = program.getSymbolTable();

		Set<Address> indirectSet = new HashSet<>();

		Iterator<Address> iter = doNowSet.iterator();
		while (iter.hasNext()) {
			Address entry = iter.next();

			monitor.setProgress(count++);

			monitor.checkCancelled();

			// already disassembled
			if (!listing.isUndefined(entry, entry)) {
				iter.remove();
				continue;
			}

			//  It isn't smart enough to pick up
			//    valid weird code.  Need to look at things that are marked as an entry point
			//    to see if we should disassemble...
			//  Save the bad ones to do last.
			Symbol symbol = symbolTable.getPrimarySymbol(entry);
			if (!symbol.isExternalEntryPoint()) {
				iter.remove();
				doLaterSet.add(entry);
			}
			else if (isLanguageDefinedEntry(program, entry)) {
				// check for an address
				if (isLanguageDefinedEntryPointer(program, entry)) {
					// put down an address if it is
					Address newLoc = layDownCodePointer(program, entry);
					if (newLoc != null) {
						indirectSet.add(newLoc);
					}
					iter.remove();
				}
			}
			else if (!isLanguageDefinedEntry(program, entry) && !pdis.isValidSubroutine(entry)) {
				doLaterSet.add(entry);
				iter.remove();
			}
		}

		// add any language defined pointers back into the do now set
		doNowSet.addAll(indirectSet);
	}
Check for a single external entry point.

@param program - program to check
@param externalCount - count of external entry points found
@param doNowSet - set of functions that are to be done now

@return true if this program has only one external entry point
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/EntryPointAnalyzer.java