Restructure mod symbols to make replacements global instead of per-section

This commit is contained in:
Mr-Wiseguy 2024-07-12 22:27:20 -04:00
parent a88bc6e16a
commit ff7aae11df
2 changed files with 20 additions and 27 deletions

View file

@ -133,19 +133,14 @@ namespace N64Recomp {
struct FunctionReplacement { struct FunctionReplacement {
uint32_t func_index; uint32_t func_index;
uint32_t original_section_vrom;
uint32_t original_vram; uint32_t original_vram;
ReplacementFlags flags; ReplacementFlags flags;
}; };
struct ModSectionInfo {
uint32_t original_rom_addr;
std::vector<FunctionReplacement> replacements;
};
struct ModContext { struct ModContext {
Context base_context; Context base_context;
std::vector<ModSectionInfo> section_info; std::vector<FunctionReplacement> replacements;
}; };
enum class ModSymbolsError { enum class ModSymbolsError {
Good, Good,

View file

@ -7,17 +7,16 @@ struct FileHeader {
struct FileSubHeaderV1 { struct FileSubHeaderV1 {
uint32_t num_sections; uint32_t num_sections;
uint32_t num_replacements;
}; };
struct SectionHeaderV1 { struct SectionHeaderV1 {
uint32_t file_offset; uint32_t file_offset;
uint32_t vram; uint32_t vram;
uint32_t original_vrom; // 0 if this is a new section
uint32_t rom_size; uint32_t rom_size;
uint32_t bss_size; uint32_t bss_size;
uint32_t num_funcs; uint32_t num_funcs;
uint32_t num_relocs; uint32_t num_relocs;
uint32_t num_replacements;
}; };
struct FuncV1 { struct FuncV1 {
@ -34,6 +33,7 @@ struct RelocV1 {
struct ReplacementV1 { struct ReplacementV1 {
uint32_t func_index; uint32_t func_index;
uint32_t original_section_vrom;
uint32_t original_vram; uint32_t original_vram;
uint32_t flags; // force uint32_t flags; // force
}; };
@ -64,9 +64,10 @@ bool parse_v1(std::span<const char> data, const std::unordered_map<uint32_t, uin
} }
size_t num_sections = subheader->num_sections; size_t num_sections = subheader->num_sections;
size_t num_replacements = subheader->num_replacements;
ret.sections.resize(num_sections); 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++) { for (size_t section_index = 0; section_index < num_sections; section_index++) {
const SectionHeaderV1* section_header = reinterpret_data<SectionHeaderV1>(data, offset); const SectionHeaderV1* section_header = reinterpret_data<SectionHeaderV1>(data, offset);
if (section_header == nullptr) { if (section_header == nullptr) {
@ -74,17 +75,14 @@ bool parse_v1(std::span<const char> data, const std::unordered_map<uint32_t, uin
} }
N64Recomp::Section& cur_section = ret.sections[section_index]; N64Recomp::Section& cur_section = ret.sections[section_index];
N64Recomp::ModSectionInfo& cur_mod_section = mod_context.section_info[section_index];
cur_section.rom_addr = section_header->file_offset; cur_section.rom_addr = section_header->file_offset;
cur_section.ram_addr = section_header->vram; cur_section.ram_addr = section_header->vram;
cur_section.size = section_header->rom_size; cur_section.size = section_header->rom_size;
cur_section.bss_size = section_header->bss_size; cur_section.bss_size = section_header->bss_size;
cur_section.name = "mod_section_" + std::to_string(section_index); 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_funcs = section_header->num_funcs;
uint32_t num_relocs = section_header->num_relocs; uint32_t num_relocs = section_header->num_relocs;
uint32_t num_replacements = section_header->num_replacements;
const FuncV1* funcs = reinterpret_data<FuncV1>(data, offset, num_funcs); const FuncV1* funcs = reinterpret_data<FuncV1>(data, offset, num_funcs);
@ -99,16 +97,9 @@ bool parse_v1(std::span<const char> data, const std::unordered_map<uint32_t, uin
return false; return false;
} }
const ReplacementV1* replacements = reinterpret_data<ReplacementV1>(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(); size_t start_func_index = ret.functions.size();
ret.functions.resize(ret.functions.size() + num_funcs); ret.functions.resize(ret.functions.size() + num_funcs);
cur_section.relocs.resize(num_relocs); 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++) { 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; uint32_t func_rom_addr = cur_section.rom_addr + funcs[func_index].section_offset;
@ -149,14 +140,21 @@ bool parse_v1(std::span<const char> data, const std::unordered_map<uint32_t, uin
cur_reloc.target_section = find_section_it->second; cur_reloc.target_section = find_section_it->second;
} }
} }
}
for (size_t replacement_index = 0; replacement_index < num_replacements; replacement_index++) { const ReplacementV1* replacements = reinterpret_data<ReplacementV1>(data, offset, num_replacements);
N64Recomp::FunctionReplacement& cur_replacement = cur_mod_section.replacements[replacement_index]; if (replacements == nullptr) {
printf("Failed to read replacements (count: %d)\n", num_replacements);
cur_replacement.func_index = replacements[replacement_index].func_index; return false;
cur_replacement.original_vram = replacements[replacement_index].original_vram; }
cur_replacement.flags = static_cast<N64Recomp::ReplacementFlags>(replacements[replacement_index].flags);
} 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<N64Recomp::ReplacementFlags>(replacements[replacement_index].flags);
} }
return offset == data.size(); return offset == data.size();