GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||
GeezerVison is showing github.com — Fix DWARF line attribution after deleted instructions and Asyncify by cpunion · Pull Request #9194 · WebAssembly/binaryen Conversation
|
|
@kripken, do you have more context for this? |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
No, I have no more context here. @cpunion it would be good to clarify what is fixed here with a small example. Also the overview could be more specific: "Preserve instruction origins in rewritten DWARF line tables" is something we were already doing, or at least trying to. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
Why is this? |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
@kripken @tlively I've clarified the title and narrowed the claim. There are two concrete problems. 1. Deleting a row's first instruction loses a surviving instruction's location. Consider these instructions with the indicated input DWARF rows: nop ;; line 10 starts here call $g ;; still covered by line 10 i32.const 42 ;; line 20 starts here i32.add Removing the nop with either command below must leave the call attributed to line 10. On #9196 it loses that attribution; this PR preserves it by treating each input row as an address interval. DCE alone does not remove this nop. wasm-opt input.wasm --vacuum -g -o output.wasm wasm-opt input.wasm -O1 -g -o output.wasm 2. Asyncify's unwind machinery can stop on source statements that were not executed. The debugger fixture contains: __attribute__((noinline)) int f(void) { int value = suspend_once(); // line 28 observed = value; // line 29 return value + 42; // line 30 } The first call starts unwinding: neither line 29 nor line 30 executes, and Asyncify returns a placeholder. The second call rewinds/resumes, executes both statements, and returns 49. The driver checks those side effects.
The GDB control inherits neighboring source rows and differs only in the line table; every other section is byte-identical. The LLDB baseline is the previous PR head, which still mapped Asyncify's synthetic terminal end to the original return. The current column uses actual rebuilt output. Ordinary function ends retain their locations. This demonstrates why line 0 helps for these separate unwind/rewind paths, not a rule that all generated instructions must lack source locations. Generated instructions implementing a source operation can legitimately retain its location. Each trace was repeated three times. The final checks ran with Wasmtime's compilation cache disabled: 6 bounded LLDB runs (three before/after pairs) and 21 complete GDB runs passed, including breakpoints, caller frames and finish. The regression tests cover instruction origins and void/value/early-return function ends with optimization, Stack IR and roundtripping; all 12 new end cases fail before the fix and pass after it. For the representative TinyGo module, updated module sizes with DWARF are:
The terminal-end fix removes 1,125 bytes from the previous Asyncify output. Stripped outputs remain byte-identical; Asyncify executable code remains 671,942 bytes. The extra size is debug information, not executable code. Full timing/cost details and validation limits are in the PR body. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
At least 1 approving review is required to merge this pull request.
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
compiler: WASM DWARF misses ~40% of code bytes with opts=1
There was an error while loading. Please reload this page.