@Override
	public void deleteAddressRange(Address start, Address end, TaskMonitor monitor)
			throws CancelledException {

		AddressRange.checkValidRange(start, end);
		AddressRange rangeToDelete = new AddressRangeImpl(start, end);
		lock.acquire();
		try {

			RecordIterator recIter = sourceMapTableAdapter.getSourceMapRecordIterator(end, false);
			boolean sourceMapChanged = false;

			// Note: we iterate backwards since records are stored based on the start address.
			// We need to delete records stored before the beginning of the delete range that 
			// overlap the delete range, but we will never need to delete records that start after  
			// the delete range.
			List<SourceMapEntryData> entriesToCreate = new ArrayList<>();
			while (recIter.hasPrevious()) {
				monitor.checkCancelled();
				DBRecord rec = recIter.previous();
				Address recStart = getStartAddress(rec);
				long recLength = getLength(rec);

				if (recLength == 0) {
					// if length 0 entry is in range to delete, delete entry
					// otherwise ignore
					if (rangeToDelete.contains(recStart)) {
						recIter.delete();
					}
					continue;
				}

				Address recEnd = getEndAddress(recStart,recLength);

				if (!rangeToDelete.intersects(recStart, recEnd)) {
					// we've found an entry that does not touch the range to delete
					// this means we've handled all relevant entries and can stop
					break;
				}

				long fileAndLine = getFileAndLine(rec);
				long fileId = fileAndLine >> 32;
				int lineNum = (int) (fileAndLine & 0xffffffff);
				if (isLessInSameSpace(recStart, start)) {
					// rangeToDelete intersects (recStart,recEnd), so 
					// the entry must overlap the left endpoint of rangeToDelete
					long length = start.subtract(recStart);
					SourceMapEntryData data =
						new SourceMapEntryData(fileId, lineNum, recStart, length);
					entriesToCreate.add(data);
				}

				if (isLessInSameSpace(end, recEnd)) {
					// rangeToDelete intersects (recStart,recEnd)
					// entry must overlap right endpoint of rangeToDelete
					long length = recEnd.subtract(end);
					SourceMapEntryData data =
						new SourceMapEntryData(fileId, lineNum, end.add(1), length);
					entriesToCreate.add(data);
				}
				recIter.delete();
			}
			// add the new entries
			for (SourceMapEntryData data : entriesToCreate) {
				sourceMapTableAdapter.addMapEntry(data.sourceFileId, data.lineNumber,
					data.baseAddress, data.length);
			}
			if (sourceMapChanged) {
				program.setChanged(ProgramEvent.SOURCE_MAP_CHANGED, null, null);
			}
		}
		catch (IOException e) {
			dbError(e);
		}
		finally {
			lock.release();
		}
	}
{@inheritDoc}<br>
Note: this method will split any source map entries that <b>intersect</b> the address 
range but are not entirely contained within it. Parts within the range to delete will
be deleted.
@param start first address in range
@param end last address in range
@param monitor task monitor
@throws CancelledException if {@code monitor} is cancelled
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/sourcemap/SourceFileManagerDB.java