@Override
	public CodeBlock[] getCodeBlocksContaining(Address addr, TaskMonitor monitor) throws CancelledException {

        // First check out the Block cache
        CodeBlock[] blocks = foundOSubs.getBlocksContaining(addr);
        if (blocks != null && blocks[0] != null) {
            return blocks;
        }

        CodeBlock modelMSub = modelM.getFirstCodeBlockContaining(addr, monitor);
        if (modelMSub == null) {
			return emptyBlockArray;
		}
        Address[] entPts = modelMSub.getStartAddresses();

        // Single-entry MSub same as OSub
        int cnt = entPts.length;
        if (cnt == 1){
            blocks = new CodeBlock[1];
            blocks[0] = createSub(modelMSub, entPts[0]);
            return blocks;
        }

        // Return all OSubs - one per entry point
        ArrayList<CodeBlock> blockList = new ArrayList<CodeBlock>();
        for (int i = 0; i < cnt; i++) {
            CodeBlock block = getSubroutine(entPts[i], monitor);
            if (block.contains(addr)) {
				blockList.add(block);
			}
        }
        return blockList.toArray(new CodeBlock[blockList.size()]);
    }
Get all the Code Blocks containing the address.
Model-O is the only of the MOP models that allows for there to be more than one

@param addr   Address to find a containing block.
@param monitor task monitor which allows user to cancel operation.
@return A CodeBlock array with one entry containing the subroutine that
             contains the address empty array otherwise.
@throws CancelledException if the monitor cancels the operation.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/block/OverlapCodeSubModel.java