public static AddressSet getPrecedingAddresses(Program program, AddressSetView addresses,
			TaskMonitor monitor) throws CancelledException {
		AddressSet preceding = new AddressSet();
		for (Address addr : addresses.getAddresses(true)) {
			monitor.checkCancelled();
			CodeUnit cu = program.getListing().getCodeUnitBefore(addr);
			if (cu == null) {
				continue;
			}
			if (program.getFunctionManager().getFunctionAt(cu.getAddress()) != null) {
				Msg.warn(ModelTrainingUtils.class,
					"Function start preceding " + addr.toString() + ", skipping...");
				continue;
			}
			if (addr.getOffset() - cu.getAddress().getOffset() > MAX_PRECEDING_CODE_UNIT_SIZE) {
				continue;
			}
			preceding.add(cu.getAddress());
		}
		return preceding;
	}
Returns an {@link AddressSet} constructed as follows: for each {@link Address} {@code addr} 
in {@code addresses}, add the {@link Address} of the {@link CodeUnit} returned by 
{@link Listing#getCodeUnitBefore(Address)}
<p> Addresses which correspond to function starts are not added to the returned set. 
Addresses of {@link CodeUnit}s which are more than 
{@link ModelTrainingUtils#MAX_PRECEDING_CODE_UNIT_SIZE} bytes away from the addresses they
precede are also not added to the returned set.
@param program source program
@param addresses addresses to precede
@param monitor monitor
@return preceding addresses
@throws CancelledException if the monitor is canceled
Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/ModelTrainingUtils.java