public final void createData(Program program, Address address, int size) {
		if (size < 1 || size > 8) {
			return;
		}

		if (!program.getListing().isUndefined(address, address)) {
			Data data = program.getListing().getDataAt(address);
			if (data == null) {
				return;
			}
			if (data.getDataType() instanceof Undefined) {
				if (data.getLength() >= size) {
					return;
				}
				program.getListing().clearCodeUnits(address, address, false);
			}
			else {
				return;
			}
		}

		DataType dt = Undefined.getUndefinedDataType(size);
		try {
			program.getListing().createData(address, dt);
		}
		catch (CodeUnitInsertionException e) {
			// don't care; we tried
		}
	}
Actually use the setup evaluator to flow the constants

@param flowStart - address to start flowing at
@param flowSet - address set to restrict constant flowing to
@param symEval - symbolic propagator to be used
@param monitor - monitor to check canceled
@return the address set of instructions which were followed
@throws CancelledException
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ConstantPropagationAnalyzer.java