private void makeVariableStorageReference(VariableStorage storage, Instruction instruction, VarnodeContext varnodeContext,
			TaskMonitor monitor, long callOffset, DataType dataType, Address lastSetAddr, BigInteger bval) {
		
		if (lastSetAddr == null) {
			lastSetAddr = instruction.getMaxAddress();
		}
		if (bval == null) {
			return;
		}
		long val = bval.longValue();

		if (val == callOffset) {
			return;
		}

		if (lastSetAddr == null) {
			return;
		}
		
		// if the dataType is known, try to interpret it to an address given the
		// bytes in the storage location
		int knownSpaceID = -1;
		boolean knownReference = false;
		if (dataType != null) {
			if ((dataType instanceof TypeDef typedef && typedef.isPointer())) {
				// pointer type defs need to be handled specially they could be re-mapping to another space
				// or interpretting the value
				Object value = getPointerDataTypeValue(dataType, lastSetAddr, bval);
				if (value instanceof Address) {
					Address addrVal = (Address) value;
					val = addrVal.getAddressableWordOffset();
					knownSpaceID = addrVal.getAddressSpace().getSpaceID();
					knownReference = true;
				}
			}
		}

		// last setAddr could be in the base instruction
		Instruction instr = instruction;
		if (!instr.contains(lastSetAddr)) {
			instr = getInstructionContaining(lastSetAddr);
		}
		Reference[] refs = instr.getReferencesFrom();
		boolean found = false;
		for (Reference ref : refs) {
			Address refAddr = ref.getToAddress();
			Address addr = refAddr.getAddressSpace().getTruncatedAddress(val, true);
			if (ref.getReferenceType() == RefType.PARAM  && !visitedBody.contains(ref.getFromAddress())) {
				// if reference address is not in body yet, this is the first time at this location
				// get rid of the reference, reference could be changed to new AddressSpace or value
				instr.removeOperandReference(ref.getOperandIndex(), refAddr);
			} else if (refAddr.getOffset() == addr.getOffset()) {
				found = true;
			}
		}
		
		RefType refType = (callOffset == 0 ? RefType.DATA : RefType.PARAM);
		makeReference(varnodeContext, instr, Reference.MNEMONIC, knownSpaceID, val, 0, dataType, refType,
				PcodeOp.UNIMPLEMENTED, knownReference, found, monitor);
	}
check if the offset is large enough to possibly be an address
    It shouldn't be smaller than +- MIN_BOUNDS
@param offset assumed relative to another register
@return true if it could be an address
Ghidra/Features/Base/src/main/java/ghidra/program/util/SymbolicPropogator.java