static void markupClassHeaderData(Program program, Symbol oatDataSymbol, Address address,
			OatHeader oatHeader, OatClass oatClassHeader, MessageLog log, TaskMonitor monitor)
			throws Exception {

		SymbolTable symbolTable = program.getSymbolTable();
		ReferenceManager referenceManager = program.getReferenceManager();
		Listing listing = program.getListing();

		listing.clearCodeUnits(address, address, false, monitor);
		Data oatClassHeaderData = listing.createData(address, oatClassHeader.toDataType());

		for (int j = 0; j < oatClassHeaderData.getNumComponents(); ++j) {
			monitor.checkCancelled();
			Data component = oatClassHeaderData.getComponent(j);
			if (component.getFieldName().startsWith("methods_pointer_")) {
				Data methodOffsetData = component.getComponent(0);
				Scalar scalar = methodOffsetData.getScalar(0);
				if (scalar.getUnsignedValue() == 0) {
					continue;//undefined address
				}
				Address toAddr = oatDataSymbol.getAddress().add(scalar.getUnsignedValue());
				toAddr = OatUtilities.adjustForThumbAsNeeded(oatHeader, program, toAddr, log);
				referenceManager.addMemoryReference(component.getMinAddress(), toAddr, RefType.READ,
					SourceType.ANALYSIS, 0);
				symbolTable.addExternalEntryPoint(toAddr);

				// Lays down quick header in listing right before the method
				Address quickHeaderAddress = toAddr.subtract(OatQuickMethodHeaderFactory
						.getOatQuickMethodHeaderSize(oatHeader.getVersion()));
				if (listing.isUndefined(quickHeaderAddress, quickHeaderAddress)) {
					ByteProvider oqmhProvider =
						new MemoryByteProvider(program.getMemory(), quickHeaderAddress);
					BinaryReader oqmhReader =
						new BinaryReader(oqmhProvider, !program.getLanguage().isBigEndian());
					OatQuickMethodHeader quickHeader = OatQuickMethodHeaderFactory
							.getOatQuickMethodHeader(oqmhReader, oatHeader.getVersion());
					DataType dataType = quickHeader.toDataType();
					try {
						listing.createData(quickHeaderAddress, dataType);
					}
					catch (CodeUnitInsertionException e) {
						log.appendMsg(e.getMessage());
					}
				}
			}
		}
	}
Table size is determined by the DexHeader's "classDefsIdsSize" field.
@param caller the caller class
@param address the address to perform markup
@param dexHeader the dex header
@param oatHeader the oat header
@param program the program to markup
@param monitor the task monitor for canceling
@param log the message log for logging messages
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/oat/oatdexfile/OatDexFileUtilities.java