It was implemented this way before to avoid borrow-checking issues, where self would be both mutably borrowed (because of the solver) and immutably borrowed (because of the ABI parameters list). This is worked around by adding a local AbiParams struct which contains a summary of the information that's needed by program_input_abi, allowing to retrieve the ABI params within the method's body itself.
This crate contains the core Cranelift code generator. It translates code from an intermediate representation into executable machine code.