private static Function checkInsideThunkFunction(Program program, Address address,
			TaskMonitor monitor) throws CancelledException {
		Listing listing = program.getListing();
		Function thunkFunction = listing.getFunctionContaining(address);
		if (thunkFunction == null) {
			return null;
		}
		if (thunkFunction.getEntryPoint().equals(address)) {
			return null;
		}
		AddressSet thunkBody = new AddressSet(thunkFunction.getBody());
		boolean hasRangeMatch = false;
		AddressRangeIterator ari = thunkBody.getAddressRanges(true);
		while (ari.hasNext()) {
			if (monitor.isCancelled()) {
				throw new CancelledException();
			}
			AddressRange range = ari.next();
			if (range.getMinAddress().equals(address)) {
				hasRangeMatch = true;
				thunkBody.delete(range);
				break;
			}
		}
		if (!hasRangeMatch) {
			return null;
		}
		try {
			thunkFunction.setBody(thunkBody);
		}
		catch (OverlappingFunctionException e) {
			//should never happen...
		}
		Function newFunction = createFunction(program, address);
		thunkFunction.setThunkedFunction(newFunction);
		return newFunction;
	}
Perform parsing and applying of functions 
@param pdbParser PDB parser object
@param xmlParser XML parser position immediately after the functions start element
@param monitor task monitor
@param log message log
@throws CancelledException if task cancelled
Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb/ApplyFunctions.java