mirror of
https://github.com/N64Recomp/N64Recomp.git
synced 2026-05-08 01:41:46 +00:00
Prevent emitting duplicate reference symbol defines in offline mod recompilation
This commit is contained in:
parent
305cc76448
commit
5f16261c91
1 changed files with 8 additions and 1 deletions
|
|
@ -147,12 +147,19 @@ int main(int argc, const char** argv) {
|
||||||
|
|
||||||
// Use reloc list to write reference symbol function pointer array and defines (i.e. `#define func_80102468 reference_symbol_funcs[0]`)
|
// Use reloc list to write reference symbol function pointer array and defines (i.e. `#define func_80102468 reference_symbol_funcs[0]`)
|
||||||
output_file << "// Array of pointers to functions from the original ROM with defines to alias their names.\n";
|
output_file << "// Array of pointers to functions from the original ROM with defines to alias their names.\n";
|
||||||
|
std::unordered_set<std::string> written_reference_symbols{};
|
||||||
size_t num_reference_symbols = 0;
|
size_t num_reference_symbols = 0;
|
||||||
for (const auto& section : mod_context.sections) {
|
for (const auto& section : mod_context.sections) {
|
||||||
for (const auto& reloc : section.relocs) {
|
for (const auto& reloc : section.relocs) {
|
||||||
if (reloc.type == N64Recomp::RelocType::R_MIPS_26 && reloc.reference_symbol && mod_context.is_regular_reference_section(reloc.target_section)) {
|
if (reloc.type == N64Recomp::RelocType::R_MIPS_26 && reloc.reference_symbol && mod_context.is_regular_reference_section(reloc.target_section)) {
|
||||||
const auto& sym = mod_context.get_reference_symbol(reloc.target_section, reloc.symbol_index);
|
const auto& sym = mod_context.get_reference_symbol(reloc.target_section, reloc.symbol_index);
|
||||||
|
|
||||||
|
// Prevent writing multiple of the same define. This means there are duplicate symbols in the array if a function is called more than once,
|
||||||
|
// but only the first of each set of duplicates is referenced. This is acceptable, since offline mod recompilation is mainly meant for debug purposes.
|
||||||
|
if (!written_reference_symbols.contains(sym.name)) {
|
||||||
output_file << "#define " << sym.name << " reference_symbol_funcs[" << num_reference_symbols << "]\n";
|
output_file << "#define " << sym.name << " reference_symbol_funcs[" << num_reference_symbols << "]\n";
|
||||||
|
written_reference_symbols.emplace(sym.name);
|
||||||
|
}
|
||||||
num_reference_symbols++;
|
num_reference_symbols++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue