Currently, we use the old JIT, because we gradually insert new functions, and need partial compilation. MCJIT has replaced the old JIT some time ago now, and it has less limitations: for instance, we currently have to resort to an ugly hardcoded inline assembly function for external call context switches, in the .cpp files, because the old JIT doesn't support IR inline assembly.
The recommanded way to do partial compilation using the MCJIT is to have separate smaller Modules. This would make a lot of sense to implement at the DCTranslator level, where we would create a new Module at each translation call (static, as much as possible). The DCTranslator could also keep track of which function was in which module.
In situations where we don't need to JIT (static translation), we could keep everything in a single Module. This would also enable interprocedural optimizations like for instance one we're working on, function signature recovery through register liveness analysis.