@Override
	public boolean added(Program program, AddressSetView addrSet, TaskMonitor monitor,
			MessageLog log) throws CancelledException {
		AutoAnalysisManager mgr = AutoAnalysisManager.getAnalysisManager(program);

		// remove memory blocks that should not be searched
		addrSet = removeNonSearchableMemory(program, addrSet);

		// remove defined locations that can't be part of an address table
		// only do this the first time entering
		long id = mgr.getProgram().getCurrentTransactionInfo().getID();
		if (id != lastID) {
			lastID = id;
			addrSet = removeDefined(program, addrSet);
		}
		
		if (addrSet.isEmpty()) {
			return true;
		}

		long addrCount = program.getMemory().getNumAddresses();
		monitor.initialize(addrCount);
		monitor.setMessage("Analyze Address Tables");

		// iterate over addresses in the selectedmodule
		addrCount -= addrSet.getNumAddresses();

		Address minAddr = addrSet.getMinAddress();
		Address maxAddr = minAddr;

		// Iterate over all references within the new address set
		//   Evaluate each reference
		//

		AddressIterator addrIter = addrSet.getAddresses(true);

		boolean didTable = false;
		while (!didTable && addrIter.hasNext()) {
			monitor.checkCancelled();
			
			addrCount++;
			monitor.setProgress(addrCount);
			Address start = addrIter.next();
			maxAddr = start;

			if (start.getOffset() % tableAlignment != 0) {
				continue;
			}

			if ((addrCount % 2048) == 1) {
				monitor.setMessage("Analyze Tables " + start);
			}

			AddressTable addressTable =
				AddressTable.getEntry(program, start, monitor, true, minimumTableSize, ptrAlignment,
					0, AddressTable.MINIMUM_SAFE_ADDRESS, relocationGuideEnabled);
			
			if (addressTable == null) {
				continue;
			}
			
			didTable = processAddressTable(addressTable, program, mgr, monitor);
			
			// Assumes that the entire table found was processed
			long tableByteLen = addressTable.getByteLength();
			addrCount += tableByteLen;
			
			// update maximum addresses consumed by table
			try {
				maxAddr = start.addNoWrap(tableByteLen-1);
				addrIter = addrSet.getAddresses(maxAddr.addNoWrap(1), true);
			}
			catch (AddressOverflowException e) {
				// ignore, just keep using current iterator
			}
		} // end of while (addrIt.hasNext())

		// Set up a one time analysis to get us back into here if
		//   there are still addresses on the set
		//
		AddressSet set =
			addrSet.subtract(program.getAddressFactory().getAddressSet(minAddr, maxAddr));
		if (!set.isEmpty()) {
			mgr.scheduleOneTimeAnalysis(this, set);
		}
		return true;
	}
Check operand references to memory locations looking for Data
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableAnalyzer.java