private void applyRecord(SourceFile sourceFile, Address address, int start, int length) {
		// Throw out values that do not make sense
		if (!address.isMemoryAddress() || start < 0 || length < 0) {
			log.appendMsg("PDB", "Invalid source map info: %s, %d, %s, %d"
					.formatted(sourceFile.getPath(), start, address.toString(), length));
			return;
		}
		// Need to use getCodeUnitContaining(address) instead of getCodeUnitAt(address) because
		//  there is a situation where the PDB associates a line number with the base part of an
		//  instructions instead of the prefix part, such as with MSFT tool-chain emits a
		//  "REP RET" (f3 c3) sequence, where the "REP" is an instruction prefix, in order to
		//  avoid a branch prediction penalty for AMD processors.  However, Microsoft associates
		//  the line number of the instruction with the address of the "RET" (c3) instead of with
		//  the address of the "REP" (f3) portion (beginning) of the instruction.
		CodeUnit cu = program.getListing().getCodeUnitContaining(address);
		if (cu == null) {
			log.appendMsg("PDB",
				"Skipping source map info (no code unit found at " + address + ")");
			return;
		}

		try {
			manager.addSourceMapEntry(sourceFile, start, address, length);
		}
		catch (LockException e) {
			throw new AssertException("LockException after exclusive access verified!");
		}
		catch (AddressOverflowException e) {
			log.appendMsg("PDB", "AddressOverflow for source map info: %s, %d, %s, %d"
					.formatted(sourceFile.getPath(), start, address.toString(), length));
		}
		catch (IllegalArgumentException e) {
			// thrown by SourceFileManager.addSourceMapEntry if the new entry conflicts
			// with an existing entry or if sourceFile is not associated with manager
			log.appendMsg("PDB", "IllegalArgumentException for source map info: %s, %d, %s, %d"
					.formatted(sourceFile.getPath(), start, address.toString(), length));
		}
		catch (AddressOutOfBoundsException e) {
			log.appendMsg("PDB", "AddressOutOfBoundsException for source map info: %s, %d, %s, %d"
					.formatted(sourceFile.getPath(), start, address.toString(), length));
		}
	}
Finds or creates a SourceFile for our checksum and file ID for C13 processing
@param fileChecksums the set of FileChecksumC13Sections for this module
@param fileId the file ID found in the source line records
@return the source file
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/PdbSourceLinesApplicator.java