Add a mechanism to provide original section indices for jump table regeneration (#130)

This commit is contained in:
Wiseguy 2025-02-11 22:36:33 -05:00 committed by GitHub
parent be65d37760
commit 8781eb44ac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 10 additions and 1 deletions

View file

@ -1563,8 +1563,14 @@ void N64Recomp::LiveGenerator::emit_switch(const Context& recompiler_context, co
// Get the relocated address of the jump table.
uint32_t section_offset = jtbl.vram - jtbl_section.ram_addr;
// Get the section index to use for relocation at runtime.
uint16_t reloc_section_index = jtbl.section_index;
if (!inputs.original_section_indices.empty()) {
reloc_section_index = inputs.original_section_indices[reloc_section_index];
}
// Populate the necessary fields of the dummy context and load the relocated address into temp2.
dummy_context.reloc_section_index = jtbl.section_index;
dummy_context.reloc_section_index = reloc_section_index;
dummy_context.reloc_target_section_offset = section_offset;
load_relocated_address(dummy_context, Registers::arithmetic_temp2);

View file

@ -83,6 +83,9 @@ namespace N64Recomp {
std::unordered_map<size_t, size_t> entry_func_hooks;
// Maps function index in recompiler context to function's return hook slot.
std::unordered_map<size_t, size_t> return_func_hooks;
// Maps section index in the generated code to original section index. Used by regenerated
// code to relocate using the corresponding original section's address.
std::vector<size_t> original_section_indices;
};
class LiveGenerator final : public Generator {
public: