@Override
	public void restoreXml(XmlPullParser parser) throws XmlParseException {
		retCode = HIDDENRET_SPECIALREG;
		XmlElement elem = parser.start(ELEM_HIDDEN_RETURN.name());
		String strategyString = elem.getAttribute(ATTRIB_STRATEGY.name());
		if (strategyString != null) {
			if (strategyString.equals(STRATEGY_NORMAL)) {
				retCode = HIDDENRET_PTRPARAM;
			}
			else if (strategyString.equals(STRATEGY_SPECIAL)) {
				retCode = HIDDENRET_SPECIALREG;
			}
			else {
				throw new XmlParseException("Bad <hidden_return> strategy: " + strategyString);
			}
		}
		String voidLockString = elem.getAttribute(ATTRIB_VOIDLOCK.name());
		if (SpecXmlUtils.decodeBoolean(voidLockString)) {
			retCode = HIDDENRET_SPECIALREG_VOID;
		}
		parser.end(elem);
	}
Allocate the return value as an input parameter

A pointer to where the return value is to be stored is passed in as an input parameter.
This action signals this by returning one of
  - HIDDENRET_PTRPARAM         - indicating the pointer is allocated as a normal input parameter
  - HIDDENRET_SPECIALREG       - indicating the pointer is passed in a dedicated register
  - HIDDENRET_SPECIALREG_VOID

Usually, if a hidden return input is present, the normal register used for return
will also hold the pointer at the point(s) where the function returns.  A signal of
HIDDENRET_SPECIALREG_VOID indicates the normal return register is not used to pass back
the pointer.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/protorules/HiddenReturnAssign.java