void mergeLabels(AddressSetView fromAddressSet, int setting, boolean replacePrimary,
			boolean replaceFunction, LongLongHashtable conflictSymbolIDMap, TaskMonitor monitor)
			throws CancelledException, UnsupportedOperationException {

		if (!originToResultTranslator.isOneForOneTranslator()) {
			String message = originToResultTranslator.getClass().getName() +
				" is not a one for one translator and can't merge code units.";
			throw new UnsupportedOperationException(message);
		}
		monitor.setMessage("Merging Labels...");
		if (fromAddressSet.isEmpty()) {
			return;
		}

		// Get the code units in the merge program in this address set.
		CodeUnitIterator fromCui = fromProgram.getListing().getCodeUnits(fromAddressSet, true);
		// Get each address in the address set and get the symbol for it.
		for (long count = 0; fromCui.hasNext() && !monitor.isCancelled(); count++) {
			CodeUnit fromCu = fromCui.next();
			Address fromMin = fromCu.getMinAddress();
			Address fromMax = fromCu.getMaxAddress();
			for (Address fromAddress = fromMin; fromAddress.compareTo(fromMax) <= 0;) {
				Address toAddress = originToResultTranslator.getAddress(fromAddress);
				try {
					if (fromSymbolTable.hasSymbol(fromAddress) ||
						toSymbolTable.hasSymbol(toAddress)) {
						if (setting == ProgramMergeFilter.MERGE) {
							if (count == PROGRESS_COUNTER_GRANULARITY) {
								monitor.setMessage(
									"Merging Labels...   " + fromAddress.toString(true));
								count = 0;
							}
							copySymbols(fromAddress, replacePrimary, replaceFunction,
								conflictSymbolIDMap, monitor);
						}
						else if (setting == ProgramMergeFilter.REPLACE) {
							if (count == PROGRESS_COUNTER_GRANULARITY) {
								monitor.setMessage(
									"Replacing Labels...   " + fromAddress.toString(true));
								count = 0;
							}
							replaceSymbols(fromAddress, conflictSymbolIDMap, monitor);
						}
					}
				}
				catch (DuplicateNameException e1) {
					// TODO Auto-generated catch block
					Msg.error(this, "Unexpected Exception: " + e1.getMessage(), e1);
				}
				catch (InvalidInputException e1) {
					// TODO Auto-generated catch block
					Msg.error(this, "Unexpected Exception: " + e1.getMessage(), e1);
				}
				try {
					fromAddress = fromAddress.addNoWrap(0x1L);
				}
				catch (AddressOverflowException e) {
					break;
				}
			}
		}
	}
<CODE>mergeLabels</CODE> either replaces the symbols in the "to" program with those in the
"from" program or merges the symbols from the "from" program into the "to" program at
the indicated addresses.
@param fromAddressSet the addresses where symbols should be replaced or merged.
The addresses in this set should be derived from the "from" program.
@param setting indicates whether to replace or merge the symbols.
@param replacePrimary true indicates that the primary symbol in the "to" program should be
set to the same symbol as was primary in the "from" program.
@param conflictSymbolIDMap maps the symbol IDs in the "from" program to the symbol IDs
in the "to" program for any symbols (and their associated objects) that were created
with conflict names.
(key = "from" program's symbol ID; value = "to" program's symbol ID)
@param monitor the task monitor for notifying the user of this merge's progress.
@throws CancelledException if user cancels via the monitor.
@throws UnsupportedOperationException if the ProgramMerge translator is not a
"one for one translator".
Ghidra/Features/Base/src/main/java/ghidra/program/util/SymbolMerge.java