@Override
	public JitVal getVar(AddressSpace space, JitVal offset, int size, boolean quantize,
			Reason reason) {
		if (space.isConstantSpace()) {
			if (!(offset instanceof JitConstVal c)) {
				throw new AssertionError("Non-constant constant?");
			}
			if (c.size() == size) {
				return offset;
			}
			return new JitConstVal(size, c.value());
		}
		if (space.isMemorySpace()) {
			if (offset instanceof JitConstVal c) {
				Varnode vn = new Varnode(space.getAddress(c.value().longValue()), size);
				return dfm.generateDirectMemoryVar(vn);
			}
			return dfm.generateIndirectMemoryVar(space, offset, size, quantize);
		}
		if (!(offset instanceof JitConstVal c)) {
			throw new AssertionError("Indirect non-memory access?");
		}

		Varnode varnode = new Varnode(space.getAddress(c.value().longValue()), size);
		varnodesRead.add(varnode);

		return mini.getVar(varnode);
	}
{@inheritDoc}

<p>
This and {@link #setVar(AddressSpace, JitVal, int, boolean, JitVal)} are where we connect the
interpretation to the maps of definitions we keep in this state. We examine the varnode's
type first. If it's a constant or memory variable, it just returns the appropriate
{@link JitConstVal}, {@link JitDirectMemoryVar}, or {@link JitIndirectMemoryVar}. If it's a
register or unique, then we retrieve the latest definition(s) as in
{@link MiniDFState#getDefinitions(AddressSpace, long, int)}. In the simple case of an exact
definition, we return it. Otherwise, this synthesizes the appropriate op(s), enters them into
the use-def graph, and returns the final output.
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/analysis/JitDataFlowState.java