summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2023-08-31 14:04:06 -0700
committerGitHub <noreply@github.com>2023-08-31 14:04:06 -0700
commit0d3c2eeb634913643f2cade4b5d738962b2308c2 (patch)
treebeccb8c6ac99b892b25d38c5d48e93f658b1999a /src
parent90d8185ba2be34fa6b6a8f8ce0cbb87e0a9ed0da (diff)
downloadbinaryen-0d3c2eeb634913643f2cade4b5d738962b2308c2.tar.gz
binaryen-0d3c2eeb634913643f2cade4b5d738962b2308c2.tar.bz2
binaryen-0d3c2eeb634913643f2cade4b5d738962b2308c2.zip
DebugInfo: Fix loss of debug info in replaceCurrent() (#5914)
The logic there assumed that we are removing the current node and replacing it with the given one, so it copied debug info to the new one and deleted it for the old. But the old one might now be a child of the new one, if we reordered, so we were dropping debug info, in particular in MergeBlocks which reorders like this: (call (block .. => (block (call (it moves blocks outwards so it can merge them).
Diffstat (limited to 'src')
-rw-r--r--src/wasm-traversal.h21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h
index 32225fd3f..80378242a 100644
--- a/src/wasm-traversal.h
+++ b/src/wasm-traversal.h
@@ -128,9 +128,24 @@ struct Walker : public VisitorType {
auto* curr = getCurrent();
auto iter = debugLocations.find(curr);
if (iter != debugLocations.end()) {
- auto location = iter->second;
- debugLocations.erase(iter);
- debugLocations[expression] = location;
+ debugLocations[expression] = iter->second;
+ // Note that we do *not* erase the debug info of the expression being
+ // replaced, because it may still exist: we might replace
+ //
+ // (call
+ // (block ..
+ //
+ // with
+ //
+ // (block
+ // (call ..
+ //
+ // We still want the call here to have its old debug info.
+ //
+ // (In most cases, of course, we do remove the replaced expression,
+ // which means we accumulate unused garbage in debugLocations, but
+ // that's not that bad; we use arena allocation for Expressions, after
+ // all.)
}
}
}