@Override
	public AssemblyResolution solve(AbstractAssemblyResolutionFactory<?, ?> factory,
			OperandValue ov, MaskedLong goal, Map<String, Long> vals, AssemblyResolvedPatterns cur,
			Set<SolverHint> hints, String description) throws NeedsBackfillException {
		Constructor cons = ov.getConstructor();
		OperandSymbol sym = cons.getOperand(ov.getIndex());
		PatternExpression patexp = getDefiningExpression(sym);
		if (patexp == null) {
			if (goal.equals(MaskedLong.ZERO)) {
				return factory.nop(description);
			}
			return factory.newErrorBuilder()
					.error("Operand " + sym.getName() +
						" is undefined and does not agree with child requirements")
					.description(description)
					.build();
		}
		AssemblyResolution result =
			solver.solve(factory, patexp, goal, vals, cur, hints, description);
		if (result.isError()) {
			AssemblyResolvedError err = (AssemblyResolvedError) result;
			return factory.newErrorBuilder()
					.error(err.getError())
					.description("Solution to " + sym.getName() + " := " + goal + " = " + patexp)
					.children(List.of(result))
					.build();
		}
		// TODO: Shifting here seems like a hack to me.
		// I assume this only comes at the top of an expression
		AssemblyResolvedPatterns con = (AssemblyResolvedPatterns) result;
		int shamt = AssemblyTreeResolver.computeOffset(sym, cons);
		return con.shift(shamt);
	}
Obtains the "defining expression"

<p>
This is either the symbol's assigned defining expression, or the expression associated with
its defining symbol.

@return the defining expression, or null if neither is available
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/OperandValueSolver.java