public SpecialVtable createSpecialVtable(Address vtableAddress, GccTypeinfo specialTypeinfo)
			throws Exception {

		boolean isExternal = false;
		Address typeinfoRefAddress = null;
		// if vtable is in external block don't try to create it because the full table
		// isn't there
		// but is partially in placeholder external memory block
		if (program.getMemory().getBlock(vtableAddress).getName().equals("EXTERNAL")) {
			isExternal = true;
		}

		// if vtable address points to external memory don't try to create because table
		// is
		// in external library
		Address externalReference = getExternalReference(vtableAddress);
		if (externalReference != null) {
			isExternal = true;
		}

		// if external then there is no typeinfo ref in the vtable - it is in an
		// external program
		// if internal then the typeinfo ref for special vtable is the second item in
		// the vtable
		if (!isExternal) {
			typeinfoRefAddress = vtableAddress.add(defaultPointerSize);
		}

		GccTypeinfoRef typeinfoRef = new GccTypeinfoRef(typeinfoRefAddress, specialTypeinfo, true);

		Symbol vtableSymbol = symbolTable.getPrimarySymbol(vtableAddress);

		api.clearListing(vtableAddress);

		SpecialVtable specialVtable = new SpecialVtable(program, vtableAddress, typeinfoRef,
			isExternal, vtableSymbol.getParentNamespace(), monitor);

		if (specialTypeinfo != null) {
			specialTypeinfo.setVtableAddress(vtableAddress);
		}

		if (!specialVtable.isExternal()) {
			specialVtable.applyVtableData();
			vtableToSizeMap.put(specialVtable.getAddress(), specialVtable.getLength());
			createVtableLabel(specialVtable);
			createVtableComment(specialVtable);
			createVfunctionSymbol(specialVtable);
		}

		return specialVtable;
	}
Method to create an appropriate type of vtable (primary, internal, or
construction) and an associated VTT, if applicable

@param vtableAddress the given vtable address
@throws CancelledException if cancelled
Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java