diff options
author | Alon Zakai <azakai@google.com> | 2023-08-31 14:04:06 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-31 14:04:06 -0700 |
commit | 0d3c2eeb634913643f2cade4b5d738962b2308c2 (patch) | |
tree | beccb8c6ac99b892b25d38c5d48e93f658b1999a /src | |
parent | 90d8185ba2be34fa6b6a8f8ce0cbb87e0a9ed0da (diff) | |
download | binaryen-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.h | 21 |
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.) } } } |