public void restoreXml(XmlPullParser parser, CompilerSpec cspec, List<ParamEntry> curList,
			boolean grouped) throws XmlParseException {
		flags = 0;
		type = StorageClass.GENERAL;
		size = minsize = -1;		// Must be filled in
		alignment = 0;				// default
		numslots = 1;

		XmlElement el = parser.start(ELEM_PENTRY.name());
		Iterator<Entry<String, String>> iter = el.getAttributes().entrySet().iterator();
		while (iter.hasNext()) {
			Entry<String, String> entry = iter.next();
			String name = entry.getKey();
			if (name.equals(ATTRIB_MINSIZE.name())) {
				minsize = SpecXmlUtils.decodeInt(entry.getValue());
			}
			else if (name.equals(ATTRIB_SIZE.name())) {	// old style
				alignment = SpecXmlUtils.decodeInt(entry.getValue());
			}
			else if (name.equals(ATTRIB_ALIGN.name())) {
				alignment = SpecXmlUtils.decodeInt(entry.getValue());
			}
			else if (name.equals(ATTRIB_MAXSIZE.name())) {
				size = SpecXmlUtils.decodeInt(entry.getValue());
			}
			else if (name.equals(ATTRIB_STORAGE.name()) || name.equals(ATTRIB_METATYPE.name())) {
				type = StorageClass.getClass(entry.getValue());
			}
			else if (name.equals(ATTRIB_EXTENSION.name())) {
				flags &= ~(SMALLSIZE_ZEXT | SMALLSIZE_SEXT | SMALLSIZE_INTTYPE | SMALLSIZE_FLOAT);
				String value = entry.getValue();
				if (value.equals("sign")) {
					flags |= SMALLSIZE_SEXT;
				}
				else if (value.equals("zero")) {
					flags |= SMALLSIZE_ZEXT;
				}
				else if (value.equals("inttype")) {
					flags |= SMALLSIZE_INTTYPE;
				}
				else if (value.equals("float")) {
					flags |= SMALLSIZE_FLOAT;
				}
				else if (!value.equals("none")) {
					throw new XmlParseException("Bad extension attribute: " + value);
				}
			}
			else {
				throw new XmlParseException("Unknown paramentry attribute: " + name);
			}
		}
		if (minsize < 1 || size < minsize) {
			throw new XmlParseException(
				"paramentry size not specified properly: minsize=" + minsize + " maxsize=" + size);
		}
		if (alignment == size) {
			alignment = 0;
		}

		XmlElement subel = parser.start();
		AddressXML addressSized = AddressXML.restoreXml(subel, cspec);
		parser.end(subel);
		if (addressSized.getSize() != 0 && size > addressSized.getSize()) {
			throw new XmlParseException("<pentry> maxsize is bigger than memory range");
		}
		addressSized.getFirstAddress();		// Fail fast. Throws AddressOutOfBounds exception if offset is invalid
		spaceid = addressSized.getAddressSpace();
		addressbase = addressSized.getOffset();
		joinrec = addressSized.getJoinRecord();

		boolean isbigendian = cspec.getLanguage().isBigEndian();
		if (isbigendian) {
			flags |= IS_BIG_ENDIAN;
		}
		if (alignment != 0) {
//			if ((addressbase % alignment) != 0)
//				throw new XmlParseException("Stack <pentry> address must match alignment");
			numslots = size / alignment;
		}
		if (spaceid.isStackSpace() && (!cspec.isStackRightJustified()) && isbigendian) {
			flags |= FORCE_LEFT_JUSTIFY;
		}
		if (!cspec.stackGrowsNegative()) {
			flags |= REVERSE_STACK;
			if (alignment != 0) {
				if ((size % alignment) != 0) {
					throw new XmlParseException(
						"For positive stack growth, <pentry> size must match alignment");
				}
			}
		}
		if (grouped) {
			flags |= IS_GROUPED;
		}
		resolveJoin(curList);
		resolveOverlap(curList);
		parser.end(el);
	}
Search for overlap with any previous ParamEntry.  Reassign group and groupsize to
reflect this overlap.
@param curList is the list of previous ParamEntry
@throws XmlParseException if overlaps do not take the correct form
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParamEntry.java