private AddressSet getSourceMapDifferences(AddressSetView addressSet, TaskMonitor monitor)
			throws CancelledException {
		SourceFileManager p1Manager = program1.getSourceFileManager();
		SourceFileManager p2Manager = program2.getSourceFileManager();

		List<SourceFile> p1Sources = program1.getSourceFileManager().getMappedSourceFiles();
		List<SourceFile> p2Sources = program2.getSourceFileManager().getMappedSourceFiles();

		Collection<SourceFile> differingPaths = CollectionUtils.disjunction(p1Sources, p2Sources);

		Collection<SourceFile> p1Only = CollectionUtils.intersection(p1Sources, differingPaths);
		Collection<SourceFile> p2Only = CollectionUtils.intersection(p2Sources, differingPaths);

		AddressSet differences =
			processDifferingSourceFiles(addressSet, p1Only, p2Only, p1Manager, p2Manager, monitor);

		// now consider the mapping info for the source files the programs have in common
		Collection<SourceFile> commonSources = CollectionUtils.intersection(p1Sources, p2Sources);

		// first check the entries in program1
		// only need to check an address once, even if there are multiple entries based at it
		AddressSet p1CheckedAddresses = new AddressSet();
		AddressSet p2CheckedAddresses = new AddressSet();

		for (SourceFile common : commonSources) {
			for (SourceMapEntry p1Entry : p1Manager.getSourceMapEntries(common)) {
				monitor.checkCancelled();
				Address p1Base = p1Entry.getBaseAddress();
				if (p1CheckedAddresses.contains(p1Base)) {
					continue;
				}

				Address p2Base = SimpleDiffUtility.getCompatibleAddress(program1, p1Base, program2);
				if (p2Base == null) {
					p1CheckedAddresses.add(p1Base);
					continue;
				}

				long p1Length = p1Entry.getLength();
				if (p1Length != 0) {
					Address p1End = p1Base.add(p1Length - 1);
					if (!addressSet.contains(p1Base, p1End)) {
						if (addressSet.intersects(p1Base, p1End)) {
							logSkippedEntry(p1Entry, program1);
						}
						continue;
					}
				}
				p1CheckedAddresses.add(p1Base);
				p2CheckedAddresses.add(p2Base);
				List<SourceMapEntry> p1Entries = p1Manager.getSourceMapEntries(p1Base);
				List<SourceMapEntry> p2Entries = p2Manager.getSourceMapEntries(p2Base);
				if (p1Entries.size() != p2Entries.size()) {
					differences.add(p1Base);
					continue;
				}
				for (SourceMapEntry e1 : p1Entries) {
					if (Collections.binarySearch(p2Entries, e1) < 0) {
						differences.add(p1Base);
						break;
					}
				}
			}
		}

		AddressSet unmatchedP2Addrs =
			findUnmatchedP2Addrs(addressSet, p2CheckedAddresses, commonSources, monitor);
		differences.add(unmatchedP2Addrs);

		return differences;

	}
Determines the source map differences for the addresses in {@code addressSet}.  Source map
entries which intersect but are not contained within {@code addressSet} are ignored.
The returned {@link AddressSet} consists of the minimum addresses of all of the differing
source map entries.  This method does not check for differences between non-mapped 
{@link SourceFile}s. 

@param addressSet addresses to check for differences (from program1)
@param monitor task monitor
@return minimum addresses of differing ranges
@throws CancelledException if user cancels
Ghidra/Features/Base/src/main/java/ghidra/program/util/ProgramDiff.java