private void processPrimaryChanges(TaskMonitor monitor) throws CancelledException {
		updateProgressMessage("Processing change of primary symbols...");
		monitor.setMessage("Symbol Merge: Processing change of primary symbols...");
		monitor.initialize(mySetPrimary.getNumAddresses());

		AddressIterator iter = mySetPrimary.getAddresses(true);
		while (iter.hasNext()) {
			monitor.incrementProgress(1);
			monitor.checkCancelled();
			incrementProgress(1);
			Address addr = iter.next();
			Symbol myPrimary = mySymTab.getPrimarySymbol(addr);
			if (myPrimary == null) {
				continue;
			}
			long myID = myPrimary.getID();
			int removeIndex = Arrays.binarySearch(latestRemoveIDs, myID);
			if (removeIndex >= 0) {
				Symbol originalSymbol = originalSymTab.getSymbol(myID);
				if (originalSymbol != null) {
					saveRemoveConflict(originalSymbol);
				}
			}
			if (latestSetPrimary.contains(addr)) {
				// Both changed primary so check for conflict.
				Symbol latestPrimary = latestSymTab.getPrimarySymbol(addr);
				Symbol latestSameAsMy = SimpleDiffUtility.getSymbol(myPrimary, latestPgm);
				if (!Objects.equals(latestPrimary, latestSameAsMy)) {
					savePrimaryConflict(addr);
				}
			}
			else {
				// Only MY changed primary so try to set it.
				// THe symbol may not have been added yet and will get set later on add.
				Symbol resultSym = getResultSymbolFromMySymbol(myPrimary);
				if (resultSym != null) {
					resultSym.setPrimary();
				}
			}
		}
	}
Determine the type of changes to the symbols in the LATEST and MY (CheckedOut) program.
Changes can be symbol removed, added, changed, renamed, and set to primary.
@param monitor task monitor for displaying progress to the user
@throws CancelledException if the user cancels the merge.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/SymbolMerger.java