public VariableStorage getVariableStorage(Program program) {
		if (type == null) {
			type = DataType.DEFAULT;
		}
		if (VoidDataType.isVoidDataType(type)) {
			if (isIndirect) {
				return DynamicVariableStorage.INDIRECT_VOID_STORAGE;
			}
			return VariableStorage.VOID_STORAGE;
		}
		int sz = type.getLength();
		if (sz == 0) {
			return VariableStorage.UNASSIGNED_STORAGE;
		}
		if (isThisPointer) {
			try {
				if (address != null) {
					return new DynamicVariableStorage(program, AutoParameterType.THIS, address, sz);
				}
			}
			catch (InvalidInputException e) {
				// Fall thru to getUnaassignedDynamicStorage
			}
			return DynamicVariableStorage.getUnassignedDynamicStorage(AutoParameterType.THIS);
		}
		if ((address == null || address == Address.NO_ADDRESS) && joinPieces == null) {
			return DynamicVariableStorage.getUnassignedDynamicStorage(isIndirect);
		}
		VariableStorage store;
		try {
			if (joinPieces != null) {
				store = new DynamicVariableStorage(program, isIndirect, joinPieces);
			}
			else {
				if (hiddenReturnPtr) {
					store = new DynamicVariableStorage(program,
						AutoParameterType.RETURN_STORAGE_PTR, address, sz);
				}
				else {
					store = new DynamicVariableStorage(program, isIndirect, address, sz);
				}
			}
		}
		catch (InvalidInputException e) {
			store = DynamicVariableStorage.getUnassignedDynamicStorage(isIndirect);
		}
		return store;
	}
Swap data-type markup between this and another parameter

Swap any data-type and flags, but leave the storage address intact.
This assumes the two parameters are the same size.
@param op is the other parameter to swap with this.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParameterPieces.java