Well, some attempts have been made:
Alan Cox came up with some hacks for SDCC 3.5 to add some limited banking support (see Kernel/patches/SDCC), and myself got the Game Boy banking support working in MSX as is currently used in rlengine (see https://github.com/retrodeluxe/sdcc-msx).
All this I think is now more or less supported out of the box in SDCC 4.0. But is just static banking: you need to specify in the source in which bank something is compiled to, and still need to handle manually inter bank data access.
Doing it properly means compiling in a 24bit address space, and arranging the code and the data in pages that can be relocated by the linker when loading into memory. All calls and jumps should be inter bank when needed, and data access should also be inter bank when needed. This is done by a mix of code generation and dynamic linking.
After looking at the SDCC source code for a while, I don't think is worth even trying. IMO taking a cleaner compiler as starting point will be a much more pleasant experience.
Well, which compiler you're considering as the better point to start off?