The JIT compilers that we generate are linked with one of our backends, which are written by hand in RPython. We currently have a backend for producing IA32/i386 machine code in memory, PowerPC machine code in memory, or (for testing) further low-level control flow graphs. There were some experiments with a backend using the LLVM JIT. Current work includes a backend that produces CLI bytecode.
The interface (which is not yet completely stable) is documented in pypy/jit/codegen/model.py.