public ArrayList<Address> getFunctionEntries(Program program, int offset) {
		PseudoDisassembler pdis = new PseudoDisassembler(program);
		ArrayList<Address> disassembleList = new ArrayList<>();

		// get the set of addresses that are marked executable
		AddressSet execSet = getExecuteSet(program.getMemory());

		Listing listing = program.getListing();

		//  check all addresses for valid pointers
		//
		for (int j = offset; j < tableElements.length; j++) {
			Address testAddr = tableElements[j];
			if (testAddr == null) {
				return disassembleList;
			}
			if (execSet != null && !execSet.contains(testAddr)) {
				continue;
			}
			// if it is already an instruction, assume it is valid.

			Instruction instr = listing.getInstructionContaining(testAddr);
			if (instr != null) {
				// doesn't start the instruction, not valid
				if (instr.getMinAddress().equals(testAddr)) {
					disassembleList.add(testAddr);
				}
				continue;
			}
			if (listing.getDefinedDataContaining(testAddr) != null) {
				continue;
			}
			if (pdis.isValidCode(testAddr)) {
				disassembleList.add(testAddr);
				continue;
			}
		}
		return disassembleList;
	}
Create the index array for this table if it has an index
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTable.java