private void restoreMemoryTags(String tagName, XmlPullParser parser, AddressSet addrSet)
			throws XmlParseException {
		parser.start(tagName);
		while (parser.peek().isStart()) {
			XmlElement subel = parser.start();
			String name = subel.getName();
			if (name.equals("range") || name.equals("register")) {
				String spcName = subel.getAttribute("space");
				if (spcName != null && spaceBases != null && spaceBases.containsKey(spcName)) {
					readExtraRange(subel, spcName, tagName);
				}
				else {
					AddressXML range = AddressXML.restoreRangeXml(subel, this);
					Address firstAddress = range.getFirstAddress();
					Address lastAddress = range.getLastAddress();
					AddressRange addrRange = new AddressRangeImpl(firstAddress, lastAddress);
					addrSet.add(addrRange);
				}
			}
			else {
				throw new XmlParseException("Unexpected <" + tagName + "> sub-tag: " + name);
			}
			parser.end(subel);
		}
		parser.end();
	}
Initialize this object from an XML stream.  A single {@code <compiler_spec>} tag is expected.
@param parser is the XML stream
@throws XmlParseException for badly formed XML
@throws DuplicateNameException if we parse more than one PrototypeModel with the same name
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java