private void followDataBack(Stack<CodeUnit> instructionStack, AddressSet flowAddressSet,
			Data data, Address addr) {

		if (flowAddressSet.contains(addr))
			return; // Already processed this address.

		// If there is a pointer at the address, then add the addresses where the pointer is.
		// Otherwise, the address will need to be added by the caller of this function.
		addPointerToFlow(flowAddressSet, data, addr);

		// If the Data code unit is flowed to by INDIRECTION from any instructions then put
		// those instructions on the stack for further processing as part of the flow to the 
		// Data address.
		ReferenceManager referenceManager = program.getReferenceManager();
		ReferenceIterator referenceIteratorTo = referenceManager.getReferencesTo(addr);
		for (Reference reference : referenceIteratorTo) {
			RefType refType = reference.getReferenceType();
			Address fromAddress = reference.getFromAddress();
			CodeUnit fromCodeUnit = program.getListing().getCodeUnitContaining(fromAddress);
			if (refType.equals(RefType.INDIRECTION) && (fromCodeUnit instanceof Instruction)) {
				// Put the instruction that flows to this data on the stack so we can 
				// continue flow back from it.
				instructionStack.add(fromCodeUnit);
			}
		}
	}
followDataBack follows the program's code flow backwards and adds addresses to the
address set for the flow to the current data item.

@param instructionStack the instruction stack of instructions that flow to addr.
@param flowAddressSet the address set to add our addresses to.
@param data the Data object to flow to.
    Appropriate flows into this data code unit will be traversed.
@param addr the flow to reference address which is contained within the data code unit.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/block/FollowFlow.java