diff options
author | Jérôme Vouillon <jerome.vouillon@gmail.com> | 2023-07-17 18:22:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-17 09:22:49 -0700 |
commit | a715c5f344d170c469dddd1c4d7852fa79dc2f06 (patch) | |
tree | c50f41b17f59fd99dbce0ee64a076437bfd57f45 /src/tools/wasm-merge.cpp | |
parent | 2fe4e6a7ac0f8aafe80555b91f3dec9190ad917f (diff) | |
download | binaryen-a715c5f344d170c469dddd1c4d7852fa79dc2f06.tar.gz binaryen-a715c5f344d170c469dddd1c4d7852fa79dc2f06.tar.bz2 binaryen-a715c5f344d170c469dddd1c4d7852fa79dc2f06.zip |
[wasm-merge] Handle chains of import/export (#5813)
When a module item is imported and directly reexported by an
intermediate module, we need to perform several name lookups and use its
name in the initial module rather than the intermediate name when fusing
imports and exports.
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); |