@Override
	public void markup(OatHeader oatHeader, Program program, TaskMonitor monitor, MessageLog log)
			throws Exception {

		Symbol oatDataSymbol = OatUtilities.getOatDataSymbol(program);
		Address address = oatDataSymbol.getAddress();

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

		Data oatHeaderData = listing.getDefinedDataAt(address);
		if (oatHeaderData == null ||
			!oatHeaderData.getDataType().getName().startsWith("OatHeader")) {
			return;
		}

		List<Data> oatDexFileHeaderDataList = getOatDexFileHeaderData(oatHeaderData, monitor);
		monitor.setProgress(0);
		monitor.setMaximum(oatDexFileHeaderDataList.size());
		for (Data data : oatDexFileHeaderDataList) {
			monitor.checkCancelled();
			monitor.incrementProgress(1);

			for (int i = 0; i < data.getNumComponents(); ++i) {
				monitor.checkCancelled();
				monitor.setMaximum(data.getNumComponents());
				monitor.setProgress(i);

				Data componentI = data.getComponent(i);

				if (componentI.getFieldName().startsWith("dex_file_pointer_")) {
					Scalar scalar = componentI.getScalar(0);
					Address toAddr = oatDataSymbol.getAddress().add(scalar.getUnsignedValue());
					referenceManager.addMemoryReference(componentI.getMinAddress(), toAddr,
						RefType.DATA, SourceType.ANALYSIS, 0);
				}
				if (componentI.getFieldName().startsWith("dexClassOffsets")) {
					Data dexClassOffsetsData = getDexClassOffsetsData(data, monitor);
					markupDexClassOffset(oatHeader, program, oatDataSymbol, dexClassOffsetsData,
						monitor, log);
				}
			}
		}

		for (int i = 0; i < oat_class_offsets_pointer_.length; ++i) {
			monitor.checkCancelled();
			monitor.setMaximum(oat_class_offsets_pointer_.length);
			monitor.setProgress(i);

			ClassDefItem classDefItem = dexHeader.getClassDefs().get(i);

			String className =
				DexUtil.convertTypeIndexToString(dexHeader, classDefItem.getClassIndex());
			Namespace classNameSpace =
				DexUtil.createNameSpaceFromMangledClassName(program, className);

			Address offsetAddress = oatDataSymbol.getAddress().add(oat_class_offsets_pointer_[i]);

			symbolTable.createLabel(offsetAddress, className, SourceType.ANALYSIS);

			ByteProvider oatClassHeaderProvider = new MemoryByteProvider(memory, offsetAddress);
			BinaryReader oatClassHeaderReader =
				new BinaryReader(oatClassHeaderProvider, !program.getLanguage().isBigEndian());

			OatClass oatClassHeader = OatClassFactory.getOatClass(oatClassHeaderReader,
				classDefItem.getClassDataItem(), oatHeader.getVersion());

			OatDexFileUtilities.markupMethod(oatHeader, oatClassHeader, dexHeader, classDefItem,
				program, oatDataSymbol, classNameSpace, log, monitor);

			OatDexFileUtilities.markupClassHeaderData(program, oatDataSymbol, offsetAddress,
				oatHeader, oatClassHeader,
				log, monitor);
		}
	}
<a href="https://android.googlesource.com/platform/art/+/refs/heads/kitkat-release/runtime/oat_file.h#191">kitkat-release/runtime/oat_file.h</a>
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/oat/oatdexfile/OatDexFile_KitKat.java