diff options
Diffstat (limited to 'src/tools/wasm-merge.cpp')
-rw-r--r-- | src/tools/wasm-merge.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/tools/wasm-merge.cpp b/src/tools/wasm-merge.cpp index ff2ab6d46..47dd1e111 100644 --- a/src/tools/wasm-merge.cpp +++ b/src/tools/wasm-merge.cpp @@ -235,6 +235,21 @@ void updateNames(Module& wasm, KindNameUpdates& kindNameUpdates) { } private: + Name resolveName(NameUpdates& updates, const Name newName) { + // Iteratively lookup the updated name + // We detect loops to ensure termination + std::set<Name> visited; + Name name = newName; + while (1) { + auto iter = updates.find(name); + if (iter == updates.end() || visited.find(name) != visited.end()) { + return name; + } + visited.insert(name); + name = iter->second; + } + } + void mapName(ModuleItemKind kind, Name& name) { auto iter = kindNameUpdates.find(kind); if (iter == kindNameUpdates.end()) { @@ -243,7 +258,7 @@ void updateNames(Module& wasm, KindNameUpdates& kindNameUpdates) { auto& nameUpdates = iter->second; auto iter2 = nameUpdates.find(name); if (iter2 != nameUpdates.end()) { - name = iter2->second; + name = resolveName(nameUpdates, iter2->second); } } } nameMapper(kindNameUpdates); |