From ff7aae11df54dac829f3c07512c4af5bf2c7943b Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Fri, 12 Jul 2024 22:27:20 -0400 Subject: [PATCH] Restructure mod symbols to make replacements global instead of per-section --- include/n64recomp.h | 9 ++------- src/mod_symbols.cpp | 38 ++++++++++++++++++-------------------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/include/n64recomp.h b/include/n64recomp.h index f9d8467..7f4f147 100644 --- a/include/n64recomp.h +++ b/include/n64recomp.h @@ -133,19 +133,14 @@ namespace N64Recomp { struct FunctionReplacement { uint32_t func_index; + uint32_t original_section_vrom; uint32_t original_vram; ReplacementFlags flags; }; - struct ModSectionInfo { - uint32_t original_rom_addr; - std::vector replacements; - - }; - struct ModContext { Context base_context; - std::vector section_info; + std::vector replacements; }; enum class ModSymbolsError { Good, diff --git a/src/mod_symbols.cpp b/src/mod_symbols.cpp index 8cfa3a0..dec60f0 100644 --- a/src/mod_symbols.cpp +++ b/src/mod_symbols.cpp @@ -7,17 +7,16 @@ struct FileHeader { struct FileSubHeaderV1 { uint32_t num_sections; + uint32_t num_replacements; }; struct SectionHeaderV1 { uint32_t file_offset; uint32_t vram; - uint32_t original_vrom; // 0 if this is a new section uint32_t rom_size; uint32_t bss_size; uint32_t num_funcs; uint32_t num_relocs; - uint32_t num_replacements; }; struct FuncV1 { @@ -34,6 +33,7 @@ struct RelocV1 { struct ReplacementV1 { uint32_t func_index; + uint32_t original_section_vrom; uint32_t original_vram; uint32_t flags; // force }; @@ -64,9 +64,10 @@ bool parse_v1(std::span data, const std::unordered_mapnum_sections; + size_t num_replacements = subheader->num_replacements; ret.sections.resize(num_sections); - mod_context.section_info.resize(num_sections); + mod_context.replacements.resize(num_replacements); for (size_t section_index = 0; section_index < num_sections; section_index++) { const SectionHeaderV1* section_header = reinterpret_data(data, offset); if (section_header == nullptr) { @@ -74,17 +75,14 @@ bool parse_v1(std::span data, const std::unordered_mapfile_offset; cur_section.ram_addr = section_header->vram; cur_section.size = section_header->rom_size; cur_section.bss_size = section_header->bss_size; cur_section.name = "mod_section_" + std::to_string(section_index); - cur_mod_section.original_rom_addr = section_header->original_vrom; uint32_t num_funcs = section_header->num_funcs; uint32_t num_relocs = section_header->num_relocs; - uint32_t num_replacements = section_header->num_replacements; const FuncV1* funcs = reinterpret_data(data, offset, num_funcs); @@ -99,16 +97,9 @@ bool parse_v1(std::span data, const std::unordered_map(data, offset, num_replacements); - if (replacements == nullptr) { - printf("Failed to read replacements (count: %d)\n", num_replacements); - return false; - } - size_t start_func_index = ret.functions.size(); ret.functions.resize(ret.functions.size() + num_funcs); cur_section.relocs.resize(num_relocs); - cur_mod_section.replacements.resize(num_replacements); for (size_t func_index = 0; func_index < num_funcs; func_index++) { uint32_t func_rom_addr = cur_section.rom_addr + funcs[func_index].section_offset; @@ -149,14 +140,21 @@ bool parse_v1(std::span data, const std::unordered_mapsecond; } } + } - for (size_t replacement_index = 0; replacement_index < num_replacements; replacement_index++) { - N64Recomp::FunctionReplacement& cur_replacement = cur_mod_section.replacements[replacement_index]; - - cur_replacement.func_index = replacements[replacement_index].func_index; - cur_replacement.original_vram = replacements[replacement_index].original_vram; - cur_replacement.flags = static_cast(replacements[replacement_index].flags); - } + const ReplacementV1* replacements = reinterpret_data(data, offset, num_replacements); + if (replacements == nullptr) { + printf("Failed to read replacements (count: %d)\n", num_replacements); + return false; + } + + for (size_t replacement_index = 0; replacement_index < num_replacements; replacement_index++) { + N64Recomp::FunctionReplacement& cur_replacement = mod_context.replacements[replacement_index]; + + cur_replacement.func_index = replacements[replacement_index].func_index; + cur_replacement.original_section_vrom = replacements[replacement_index].original_section_vrom; + cur_replacement.original_vram = replacements[replacement_index].original_vram; + cur_replacement.flags = static_cast(replacements[replacement_index].flags); } return offset == data.size();