public void putValue(Varnode out, Varnode result, boolean mustClear) {
		if (out == null) {
			return;
		}

		if (result == null) {
			putValue(out, BAD_VARNODE, false);
			return;
		}

		boolean isSymbolicAddr = isSymbolicSpace(out.getSpace());
		if (out.isAddress() || isSymbolicAddr) {
			if (!isRegister(out)) {
				if (debug) {
					Msg.info(this, "      " + print(out) + " <- " + print(result) + " at " +
						currentAddress);
				}

				// put the location on both the lastSet, and all locations set
				addSetVarnodeToLastSetLocations(out, currentAddress);

				// don't put a value into a bad address space
				// could get values pulled from a different badd address offset
				if (isSymbolicAddr &&
					out.getAddress().getAddressSpace().getSpaceID() == BAD_OFFSET_SPACEID) {
					return;
				}
				putMemoryValue(out, result);
				return;
			}
		}

		// don't ever store an unknown unique into a location
		if (result.isUnique()) {
			result = null;
		}
		if (out.isUnique()) {
			if (mustClear) {
				result = null;
			}
			putMemoryValue(tempUniqueVals, out, result);
		}
		else {
			// if storing a bad address, need to create a new register/address
			// relative symbolic space
			if (result != null) {
				if (result.getAddress() == BAD_ADDRESS) {
					String spaceName = out.getAddress().getAddressSpace().getName();
					Register register = getRegister(out);
					// if the register is worth tracking as a potential address space
					// with stores/loads of constants to it, create a fake address space for it
					if (shouldTrackRegister(register)) {
						spaceName = register.getName();
						int newRegSpaceID = getAddressSpace(spaceName + "-" + currentAddress, currentAddress.getSize());
						result = createVarnode(0, newRegSpaceID, out.getSize());
					}
				}
				addSetVarnodeToLastSetLocations(out, currentAddress);
			}
			putMemoryValue(tempVals, out, result);
		}

		if (debug) {
			Msg.info(this, "      " + print(out) + " <- " + print(result) + " at " +
				currentAddress);
		}
		if (mustClear) {
			clearVals.add(out);
		}
	}
Check if the symbol at the address is read_only.

@param addr - address of the symbol

@return true if the block is read_only, and there are no write references.
Ghidra/Features/Base/src/main/java/ghidra/program/util/VarnodeContext.java