diff --git a/src/link/section.cpp b/src/link/section.cpp index cec3533f..0173bd11 100644 --- a/src/link/section.cpp +++ b/src/link/section.cpp @@ -3,18 +3,20 @@ #include "link/section.hpp" #include +#include #include -#include #include #include +#include #include "error.hpp" -std::map> sections; +std::vector> sectionList; +std::unordered_map sectionMap; // Indexes into `sectionList` void sect_ForEach(void (*callback)(Section &)) { - for (auto &it : sections) - callback(*it.second); + for (auto it = sectionList.rbegin(); it != sectionList.rend(); it++) + callback(*it->get()); } static void checkSectUnionCompat(Section &target, Section &other) { @@ -215,13 +217,14 @@ void sect_AddSection(std::unique_ptr
&§ion) { ); } else { // If not, add it - sections.emplace(section->name, std::move(section)); + sectionMap.emplace(section->name, sectionList.size()); + sectionList.push_back(std::move(section)); } } Section *sect_GetSection(std::string const &name) { - auto search = sections.find(name); - return search != sections.end() ? search->second.get() : nullptr; + auto search = sectionMap.find(name); + return search != sectionMap.end() ? sectionList[search->second].get() : nullptr; } static void doSanityChecks(Section §ion) { diff --git a/test/asm/charmap-inheritance.asm b/test/asm/charmap-inheritance.asm index 2c6b61f7..7ad6826f 100644 --- a/test/asm/charmap-inheritance.asm +++ b/test/asm/charmap-inheritance.asm @@ -13,7 +13,7 @@ SECTION "test", ROM0 charmap "", $08 ; At this point, enough nodes were allocated for 'foo' to be reallocated. - ; Its value in the charmaps' std::map should have been updated too, + ; Its value in the charmaps' `std::unordered_map` should have been updated too, ; so that usages of 'foo' will not segfault. ; This uses 'foo; by switching to it. diff --git a/test/asm/sym-collision.asm b/test/asm/sym-collision.asm index ed7695fb..b9ddd7d5 100644 --- a/test/asm/sym-collision.asm +++ b/test/asm/sym-collision.asm @@ -2,7 +2,7 @@ SECTION "Collision course", OAM[$FE00] ; All the following symbols used to collide with our custom hashmap, ; which at some point caused `PURGE` to malfunction with them. -; We now use C++ `std::map` which reliably handles collisions. +; We now use C++ `std::unordered_map` which reliably handles collisions. aqfj: ds 1 ; Give them different addresses cxje: ds 1 dgsd: ds 1