Skip to content

build/wasm: retain final Go and C++ DWARF after optimization - #2662

Merged
cpunion merged 3 commits into
xgo-dev:mainfrom
cpunion:codex/wasm-final-dwarf
Sep 27, 2026
Merged

cpunion merged 3 commits into
xgo-dev:mainfrom
cpunion:codex/wasm-final-dwarf

Conversation

@cpunion

@cpunion cpunion commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator

Optimized W32 debug builds ran wasm-opt -O2 before Asyncify without -g. The program still ran, but final DWARF marked Go and C++ functions as dead and source lookup failed. Preserve debug information through that pre-Asyncify optimization when the build retains DWARF.

Add a Go-to-C++ fixture that checks the final module after all Binaryen rewrites: llvm-dwarfdump --verify, Go/C++ DIEs and variables, source-line lookup with llvm-addr2line, and Node/Wasmtime execution at O0 and O2. The pinned llgo-v132.3 release includes the Memory64 DWARF fix from xgo-dev/binaryen#4, so CI now runs J32, J64, and W32 instead of gating J64.

This PR is stacked on #2652, which pins llgo-v132.3 for Emscripten and LLGo's standalone post-link. The diff against main includes that dependency.

Validation: all six J32/J64/W32 × O0/O2 cases passed locally using the published macOS ARM64 llgo-v132.3 archive and Emscripten 6.0.8. The full dev/test_wasm_single_worker.sh test-command suite, focused internal/build post-link tests, actionlint, and git diff --check passed.

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: Final WebAssembly DWARF verification + LLGo-patched Binaryen

Overall this is a clean, well-tested change. The Go post-link code (resolveWasmOpt, wasmOptIdentity, and the new debug threading into wasmPreAsyncifyArgs) is single-purpose and covered by both success and failure-path tests. The CI action validates the checksum format on both bash and PowerShell paths, asserts the extracted binaries are executable, and downloads over HTTPS. Fixtures and the new dev/test_wasm_debug_info.py integration test line up with the asserted source lines and DWARF names.

Two things worth a look inline, plus one architectural note below. Nothing blocking.

Supply-chain note (non-blocking): The Binaryen download source moves from WebAssembly/binaryen to the xgo-dev/binaryen fork (llgo-v132.2). The pinned SHA-256s guarantee byte-integrity of the fork's published archives, but not that they were built from audited upstream source, so CI's build-tool trust now depends on the xgo-dev org's release process. Consider documenting the fork's build provenance (ideally reproducible builds or SLSA/gh attestation) and restricting who can publish releases there.

Comment thread .github/actions/setup-binaryen/checksums.txt Outdated
Comment thread dev/test_wasm_debug_info.py Outdated
@codecov

codecov Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

LLGo baseline benchmarks

1ef7918258a7 | workflow run | long-term charts

Program measurements

Platform Workload File size vs base Text size vs base Build vs base Run vs base
Linux cprintf 7160 B 0 B / +0.0% 387 B 0 B / +0.0% 492.926 ms -1.16 ms / -0.2% (better) 1.245 ms -62.77 us / -4.8% (better)
Linux cprintf-lto 6912 B 0 B / +0.0% 368 B 0 B / +0.0% 497.995 ms -744.4 us / -0.1% (better) 1.266 ms +22.6 us / +1.8% (worse)
Linux fmtprintf 1637960 B 0 B / +0.0% 484730 B 0 B / +0.0% 4.081 s -29.92 ms / -0.7% (better) 3.119 ms -37.42 us / -1.2% (better)
Linux fmtprintf-lto 1478416 B 0 B / +0.0% 422446 B 0 B / +0.0% 11.475 s -187.1 ms / -1.6% (better) 2.916 ms -157 us / -5.1% (better)
Linux println 61344 B 0 B / +0.0% 14171 B 0 B / +0.0% 512.947 ms -5.567 ms / -1.1% (better) 1.717 ms +55.2 us / +3.3% (worse)
Linux println-lto 54152 B 0 B / +0.0% 12073 B 0 B / +0.0% 708.130 ms -29.47 ms / -4.0% (better) 1.773 ms +218.5 us / +14.1% (worse)
macOS cprintf 68064 B 0 B / +0.0% 4429 B 0 B / +0.0% 747.372 ms +151.8 ms / +25.5% (worse) 3.745 ms +726 us / +24.0% (worse)
macOS cprintf-lto 84288 B 0 B / +0.0% 193 B 0 B / +0.0% 637.831 ms +5.773 ms / +0.9% (worse) 3.185 ms +144.7 us / +4.8% (worse)
macOS fmtprintf 1483856 B 0 B / +0.0% 860140 B 0 B / +0.0% 3.357 s -143.7 ms / -4.1% (better) 4.794 ms -1.46 ms / -23.3% (better)
macOS fmtprintf-lto 1175808 B 0 B / +0.0% 832752 B 0 B / +0.0% 8.253 s +65.4 ms / +0.8% (worse) 4.880 ms -552.7 us / -10.2% (better)
macOS println 114512 B 0 B / +0.0% 34330 B 0 B / +0.0% 602.830 ms -52.57 ms / -8.0% (better) 3.819 ms +142.9 us / +3.9% (worse)
macOS println-lto 118720 B 0 B / +0.0% 32308 B 0 B / +0.0% 748.854 ms -18.6 ms / -2.4% (better) 3.739 ms +188.3 us / +5.3% (worse)
Windows MinGW cprintf 19456 B 0 B / +0.0% 4550 B 0 B / +0.0% 1.095 s -103.3 ms / -8.6% (better) 3.436 ms -124.6 us / -3.5% (better)
Windows MinGW cprintf-lto 17920 B 0 B / +0.0% 4486 B 0 B / +0.0% 1.112 s -494.3 us / -0.04444% (better) 3.382 ms -57.2 us / -1.7% (better)
Windows MinGW fmtprintf 1910784 B 0 B / +0.0% 586502 B 0 B / +0.0% 3.983 s +24.06 ms / +0.6% (worse) 7.750 ms -299 us / -3.7% (better)
Windows MinGW fmtprintf-lto 1934848 B 0 B / +0.0% 535206 B 0 B / +0.0% 9.897 s -13.76 ms / -0.1% (better) 8.239 ms +56.3 us / +0.7% (worse)
Windows MinGW println 70656 B 0 B / +0.0% 23062 B 0 B / +0.0% 1.079 s -24.48 ms / -2.2% (better) 6.612 ms +246.7 us / +3.9% (worse)
Windows MinGW println-lto 65024 B 0 B / +0.0% 20358 B 0 B / +0.0% 1.301 s +3.909 ms / +0.3% (worse) 6.575 ms +88.9 us / +1.4% (worse)
Windows MinGW 386 cprintf 43008 B 0 B / +0.0% 5326 B 0 B / +0.0% 1.088 s -53.67 ms / -4.7% (better) 5.661 ms +248.3 us / +4.6% (worse)
Windows MinGW 386 cprintf-lto 20992 B 0 B / +0.0% 5094 B 0 B / +0.0% 1.115 s -71.39 ms / -6.0% (better) 5.125 ms -45.6 us / -0.9% (better)
Windows MinGW 386 fmtprintf 1876480 B 0 B / +0.0% 462574 B 0 B / +0.0% 4.111 s -133.6 ms / -3.1% (better) 10.024 ms -1.098 ms / -9.9% (better)
Windows MinGW 386 fmtprintf-lto 2152448 B 0 B / +0.0% 440194 B 0 B / +0.0% 9.505 s -187.4 ms / -1.9% (better) 10.106 ms -68.4 us / -0.7% (better)
Windows MinGW 386 println 91136 B 0 B / +0.0% 19814 B 0 B / +0.0% 1.110 s -61.11 ms / -5.2% (better) 8.409 ms -1.099 ms / -11.6% (better)
Windows MinGW 386 println-lto 69120 B 0 B / +0.0% 17726 B 0 B / +0.0% 1.271 s -119 ms / -8.6% (better) 8.305 ms -382.7 us / -4.4% (better)
Windows MinGW ARM64 cprintf 18944 B 0 B / +0.0% 4408 B 0 B / +0.0% 1.173 s -27.23 ms / -2.3% (better) 5.384 ms -467 us / -8.0% (better)
Windows MinGW ARM64 cprintf-lto 17920 B 0 B / +0.0% 4340 B 0 B / +0.0% 1.237 s +27.53 ms / +2.3% (worse) 5.888 ms +510 us / +9.5% (worse)
Windows MinGW ARM64 fmtprintf 1798656 B 0 B / +0.0% 499196 B 0 B / +0.0% 3.902 s +61.66 ms / +1.6% (worse) 10.948 ms -42.2 us / -0.4% (better)
Windows MinGW ARM64 fmtprintf-lto 1857536 B 0 B / +0.0% 465268 B 0 B / +0.0% 9.187 s +515.7 ms / +5.9% (worse) 12.117 ms +1.127 ms / +10.3% (worse)
Windows MinGW ARM64 println 67072 B 0 B / +0.0% 21816 B 0 B / +0.0% 1.239 s -2.349 ms / -0.2% (better) 9.798 ms +134.6 us / +1.4% (worse)
Windows MinGW ARM64 println-lto 63488 B 0 B / +0.0% 19436 B 0 B / +0.0% 1.424 s +31.9 ms / +2.3% (worse) 9.548 ms -76.7 us / -0.8% (better)
Windows MSVC cprintf 120320 B 0 B / +0.0% 65782 B 0 B / +0.0% 917.808 ms -26.33 ms / -2.8% (better) 3.564 ms -886.4 us / -19.9% (better)
Windows MSVC cprintf-lto 119808 B 0 B / +0.0% 65718 B 0 B / +0.0% 1.073 s +120.3 ms / +12.6% (worse) 4.354 ms +627.3 us / +16.8% (worse)
Windows MSVC fmtprintf 1625088 B 0 B / +0.0% 682038 B 0 B / +0.0% 3.848 s +14.2 ms / +0.4% (worse) 10.297 ms +651.2 us / +6.8% (worse)
Windows MSVC fmtprintf-lto 1616384 B 0 B / +0.0% 635206 B 0 B / +0.0% 9.294 s +84.77 ms / +0.9% (worse) 10.606 ms +267.1 us / +2.6% (worse)
Windows MSVC println 192000 B 0 B / +0.0% 118486 B 0 B / +0.0% 956.273 ms +4.754 ms / +0.5% (worse) 8.098 ms -1.243 ms / -13.3% (better)
Windows MSVC println-lto 189952 B 0 B / +0.0% 116326 B 0 B / +0.0% 1.119 s -23.42 ms / -2.1% (better) 7.795 ms +50.4 us / +0.7% (worse)
Windows MSVC 386 cprintf 9728 B 0 B / +0.0% 3931 B 0 B / +0.0% 964.456 ms -131.7 ms / -12.0% (better) 7.251 ms +398.4 us / +5.8% (worse)
Windows MSVC 386 cprintf-lto 9216 B 0 B / +0.0% 3853 B 0 B / +0.0% 1.094 s +76.47 ms / +7.5% (worse) 6.625 ms -369.2 us / -5.3% (better)
Windows MSVC 386 fmtprintf 1190400 B 0 B / +0.0% 445957 B 0 B / +0.0% 4.108 s -16.92 ms / -0.4% (better) 13.145 ms -1.054 ms / -7.4% (better)
Windows MSVC 386 fmtprintf-lto 1224192 B 0 B / +0.0% 416649 B 0 B / +0.0% 9.289 s -96.61 ms / -1.0% (better) 13.855 ms +365.7 us / +2.7% (worse)
Windows MSVC 386 println 34304 B 0 B / +0.0% 18641 B 0 B / +0.0% 996.649 ms -20.49 ms / -2.0% (better) 11.527 ms +491.7 us / +4.5% (worse)
Windows MSVC 386 println-lto 32256 B 0 B / +0.0% 16839 B 0 B / +0.0% 1.174 s -26.87 ms / -2.2% (better) 11.440 ms -320.7 us / -2.7% (better)
Windows MSVC ARM64 cprintf 11776 B 0 B / +0.0% 4192 B 0 B / +0.0% 1.125 s +71.81 ms / +6.8% (worse) 7.524 ms +976.2 us / +14.9% (worse)
Windows MSVC ARM64 cprintf-lto 10752 B 0 B / +0.0% 4084 B 0 B / +0.0% 1.098 s +24.7 ms / +2.3% (worse) 7.094 ms +287.3 us / +4.2% (worse)
Windows MSVC ARM64 fmtprintf 1370624 B 0 B / +0.0% 499068 B 0 B / +0.0% 3.819 s +35.75 ms / +0.9% (worse) 14.578 ms +560.8 us / +4.0% (worse)
Windows MSVC ARM64 fmtprintf-lto 1387008 B 0 B / +0.0% 465900 B 0 B / +0.0% 8.567 s -168.6 ms / -1.9% (better) 13.730 ms -1.247 ms / -8.3% (better)
Windows MSVC ARM64 println 41984 B 0 B / +0.0% 21824 B 0 B / +0.0% 1.100 s +35.4 ms / +3.3% (worse) 12.666 ms +1.607 ms / +14.5% (worse)
Windows MSVC ARM64 println-lto 40448 B 0 B / +0.0% 19556 B 0 B / +0.0% 1.266 s +63.46 ms / +5.3% (worse) 12.198 ms +834.4 us / +7.3% (worse)
Core language and compiler benchmarks
Platform Benchmark ns/op vs base
Linux BenchmarkLookupPCRandom 14.580 ns/op -0.36 ns/op / -2.4% (better)
Linux BenchmarkMergeCompilerFlags 215.600 ns/op +12.6 ns/op / +6.2% (worse)
Linux BenchmarkMergeLinkerFlags 135.800 ns/op +0.8 ns/op / +0.6% (worse)
Linux BenchmarkChannelBuffered 55.170 ns/op -0.24 ns/op / -0.4% (better)
Linux BenchmarkChannelHandoff 13774 ns/op +188 ns/op / +1.4% (worse)
Linux BenchmarkDefer 52.790 ns/op +1.86 ns/op / +3.7% (worse)
Linux BenchmarkDirectCall 1.596 ns/op +0.023 ns/op / +1.5% (worse)
Linux BenchmarkGlobalRead 1.559 ns/op -0.003 ns/op / -0.2% (better)
Linux BenchmarkGlobalWrite 7.801 ns/op -0.339 ns/op / -4.2% (better)
Linux BenchmarkGoroutine 31164 ns/op +9641 ns/op / +44.8% (worse)
Linux BenchmarkInterfaceCall 6.442 ns/op +0.007 ns/op / +0.1% (worse)
Linux BenchmarkRuntimeGetG 2.440 ns/op 0 ns/op / +0.0%
macOS BenchmarkLookupPCRandom 14.690 ns/op +0.63 ns/op / +4.5% (worse)
macOS BenchmarkMergeCompilerFlags 148.600 ns/op +10.8 ns/op / +7.8% (worse)
macOS BenchmarkMergeLinkerFlags 98.420 ns/op +24.67 ns/op / +33.5% (worse)
macOS BenchmarkChannelBuffered 30.770 ns/op -0.89 ns/op / -2.8% (better)
macOS BenchmarkChannelHandoff 10200 ns/op +3855 ns/op / +60.8% (worse)
macOS BenchmarkDefer 40.870 ns/op +0.65 ns/op / +1.6% (worse)
macOS BenchmarkDirectCall 1.196 ns/op -0.022 ns/op / -1.8% (better)
macOS BenchmarkGlobalRead 1.296 ns/op -0.109 ns/op / -7.8% (better)
macOS BenchmarkGlobalWrite 1.274 ns/op +0.009 ns/op / +0.7% (worse)
macOS BenchmarkGoroutine 53475 ns/op +15458 ns/op / +40.7% (worse)
macOS BenchmarkInterfaceCall 4.821 ns/op +0.048 ns/op / +1.0% (worse)
macOS BenchmarkRuntimeGetG 2.584 ns/op +0.001 ns/op / +0.03871% (worse)
Windows MinGW BenchmarkLookupPCRandom 12.400 ns/op +0.01 ns/op / +0.1% (worse)
Windows MinGW BenchmarkMergeCompilerFlags 527.700 ns/op -13.3 ns/op / -2.5% (better)
Windows MinGW BenchmarkMergeLinkerFlags 476.200 ns/op +1.2 ns/op / +0.3% (worse)
Windows MinGW BenchmarkChannelBuffered 30.650 ns/op -0.25 ns/op / -0.8% (better)
Windows MinGW BenchmarkChannelHandoff 1343 ns/op +28 ns/op / +2.1% (worse)
Windows MinGW BenchmarkDefer 52.740 ns/op +0.07 ns/op / +0.1% (worse)
Windows MinGW BenchmarkDirectCall 1.746 ns/op 0 ns/op / +0.0%
Windows MinGW BenchmarkGlobalRead 1.777 ns/op -0.154 ns/op / -8.0% (better)
Windows MinGW BenchmarkGlobalWrite 2.790 ns/op -0.001 ns/op / -0.03583% (better)
Windows MinGW BenchmarkGoroutine 73662 ns/op +852 ns/op / +1.2% (worse)
Windows MinGW BenchmarkInterfaceCall 8.749 ns/op +0.009 ns/op / +0.1% (worse)
Windows MinGW BenchmarkRuntimeGetG 1.811 ns/op +0.001 ns/op / +0.1% (worse)
Windows MinGW 386 BenchmarkLookupPCRandom 26.650 ns/op +0.02 ns/op / +0.1% (worse)
Windows MinGW 386 BenchmarkMergeCompilerFlags 763.500 ns/op -27.9 ns/op / -3.5% (better)
Windows MinGW 386 BenchmarkMergeLinkerFlags 719.800 ns/op +13.6 ns/op / +1.9% (worse)
Windows MinGW 386 BenchmarkChannelBuffered 38.840 ns/op -0.38 ns/op / -1.0% (better)
Windows MinGW 386 BenchmarkChannelHandoff 932.800 ns/op +22.5 ns/op / +2.5% (worse)
Windows MinGW 386 BenchmarkDefer 42.630 ns/op -1.41 ns/op / -3.2% (better)
Windows MinGW 386 BenchmarkDirectCall 1.551 ns/op +0.004 ns/op / +0.3% (worse)
Windows MinGW 386 BenchmarkGlobalRead 1.552 ns/op +0.002 ns/op / +0.1% (worse)
Windows MinGW 386 BenchmarkGlobalWrite 7.789 ns/op +0.016 ns/op / +0.2% (worse)
Windows MinGW 386 BenchmarkGoroutine 88355 ns/op +6047 ns/op / +7.3% (worse)
Windows MinGW 386 BenchmarkInterfaceCall 8.389 ns/op +0.018 ns/op / +0.2% (worse)
Windows MinGW 386 BenchmarkRuntimeGetG 2.170 ns/op +0.002 ns/op / +0.1% (worse)
Windows MinGW ARM64 BenchmarkLookupPCRandom 12.070 ns/op -0.01 ns/op / -0.1% (better)
Windows MinGW ARM64 BenchmarkMergeCompilerFlags 567.400 ns/op -1 ns/op / -0.2% (better)
Windows MinGW ARM64 BenchmarkMergeLinkerFlags 533 ns/op +14.8 ns/op / +2.9% (worse)
Windows MinGW ARM64 BenchmarkChannelBuffered 37.790 ns/op -0.05 ns/op / -0.1% (better)
Windows MinGW ARM64 BenchmarkChannelHandoff 1701 ns/op -52 ns/op / -3.0% (better)
Windows MinGW ARM64 BenchmarkDefer 53.270 ns/op +2.06 ns/op / +4.0% (worse)
Windows MinGW ARM64 BenchmarkDirectCall 0.589 ns/op -0.0006 ns/op / -0.1% (better)
Windows MinGW ARM64 BenchmarkGlobalRead 0.664 ns/op +0.0006 ns/op / +0.1% (worse)
Windows MinGW ARM64 BenchmarkGlobalWrite 0.663 ns/op -0.0009 ns/op / -0.1% (better)
Windows MinGW ARM64 BenchmarkGoroutine 52535 ns/op +570 ns/op / +1.1% (worse)
Windows MinGW ARM64 BenchmarkInterfaceCall 4.156 ns/op -0.003 ns/op / -0.1% (better)
Windows MinGW ARM64 BenchmarkRuntimeGetG 1.802 ns/op +0.01 ns/op / +0.6% (worse)
Windows MSVC BenchmarkLookupPCRandom 11.690 ns/op -0.07 ns/op / -0.6% (better)
Windows MSVC BenchmarkMergeCompilerFlags 573.400 ns/op +0.2 ns/op / +0.03489% (worse)
Windows MSVC BenchmarkMergeLinkerFlags 527.800 ns/op +20.3 ns/op / +4.0% (worse)
Windows MSVC BenchmarkChannelBuffered 44.630 ns/op +0.46 ns/op / +1.0% (worse)
Windows MSVC BenchmarkChannelHandoff 3225 ns/op +1463 ns/op / +83.0% (worse)
Windows MSVC BenchmarkDefer 67.600 ns/op -0.83 ns/op / -1.2% (better)
Windows MSVC BenchmarkDirectCall 1.213 ns/op +0.036 ns/op / +3.1% (worse)
Windows MSVC BenchmarkGlobalRead 1.066 ns/op +0.006 ns/op / +0.6% (worse)
Windows MSVC BenchmarkGlobalWrite 8.713 ns/op +0.071 ns/op / +0.8% (worse)
Windows MSVC BenchmarkGoroutine 66705 ns/op +203 ns/op / +0.3% (worse)
Windows MSVC BenchmarkInterfaceCall 6.558 ns/op -0.109 ns/op / -1.6% (better)
Windows MSVC BenchmarkRuntimeGetG 1.656 ns/op +0.102 ns/op / +6.6% (worse)
Windows MSVC 386 BenchmarkLookupPCRandom 72.250 ns/op +0.28 ns/op / +0.4% (worse)
Windows MSVC 386 BenchmarkMergeCompilerFlags 807.600 ns/op +17 ns/op / +2.2% (worse)
Windows MSVC 386 BenchmarkMergeLinkerFlags 759.100 ns/op +3.9 ns/op / +0.5% (worse)
Windows MSVC 386 BenchmarkChannelBuffered 55.900 ns/op +0.02 ns/op / +0.03579% (worse)
Windows MSVC 386 BenchmarkChannelHandoff 3838 ns/op +177 ns/op / +4.8% (worse)
Windows MSVC 386 BenchmarkDefer 52.460 ns/op -1.19 ns/op / -2.2% (better)
Windows MSVC 386 BenchmarkDirectCall 1.169 ns/op +0.084 ns/op / +7.7% (worse)
Windows MSVC 386 BenchmarkGlobalRead 1.383 ns/op +0.01 ns/op / +0.7% (worse)
Windows MSVC 386 BenchmarkGlobalWrite 17.750 ns/op -0.02 ns/op / -0.1% (better)
Windows MSVC 386 BenchmarkGoroutine 85200 ns/op +669 ns/op / +0.8% (worse)
Windows MSVC 386 BenchmarkInterfaceCall 5.866 ns/op +0.141 ns/op / +2.5% (worse)
Windows MSVC 386 BenchmarkRuntimeGetG 1.378 ns/op +0.001 ns/op / +0.1% (worse)
Windows MSVC ARM64 BenchmarkLookupPCRandom 12.080 ns/op -0.03 ns/op / -0.2% (better)
Windows MSVC ARM64 BenchmarkMergeCompilerFlags 571.500 ns/op +1 ns/op / +0.2% (worse)
Windows MSVC ARM64 BenchmarkMergeLinkerFlags 535.500 ns/op +2.4 ns/op / +0.5% (worse)
Windows MSVC ARM64 BenchmarkChannelBuffered 37.780 ns/op -1.83 ns/op / -4.6% (better)
Windows MSVC ARM64 BenchmarkChannelHandoff 2328 ns/op -80 ns/op / -3.3% (better)
Windows MSVC ARM64 BenchmarkDefer 61.660 ns/op -1.26 ns/op / -2.0% (better)
Windows MSVC ARM64 BenchmarkDirectCall 0.590 ns/op 0 ns/op / +0.0%
Windows MSVC ARM64 BenchmarkGlobalRead 0.664 ns/op +0.0002 ns/op / +0.03014% (worse)
Windows MSVC ARM64 BenchmarkGlobalWrite 3.753 ns/op -0.006 ns/op / -0.2% (better)
Windows MSVC ARM64 BenchmarkGoroutine 55285 ns/op +1030 ns/op / +1.9% (worse)
Windows MSVC ARM64 BenchmarkInterfaceCall 4.144 ns/op -0.001 ns/op / -0.02413% (better)
Windows MSVC ARM64 BenchmarkRuntimeGetG 2.243 ns/op 0 ns/op / +0.0%
Timer runtime benchmarks
Platform Operation and runtime ns/op vs base
Linux AfterFuncZeroDelivery/Go 898.500 ns/op -17.4 ns/op / -1.9% (better)
Linux AfterFuncZeroDelivery/LLGo 40611 ns/op -1601 ns/op / -3.8% (better)
Linux CreateStop/Go 296.200 ns/op -6 ns/op / -2.0% (better)
Linux CreateStop/LLGo 1453 ns/op -282 ns/op / -16.3% (better)
Linux RearmStopped/Go 114.700 ns/op -4 ns/op / -3.4% (better)
Linux RearmStopped/LLGo 1314 ns/op +66 ns/op / +5.3% (worse)
Linux ResetActive/Go 67.540 ns/op -2.08 ns/op / -3.0% (better)
Linux ResetActive/LLGo 783.900 ns/op +110.6 ns/op / +16.4% (worse)
Linux ResetHeap1024/Go 67.210 ns/op -0.15 ns/op / -0.2% (better)
Linux ResetHeap1024/LLGo 184.700 ns/op +1.7 ns/op / +0.9% (worse)
macOS AfterFuncZeroDelivery/Go 522.500 ns/op +18.9 ns/op / +3.8% (worse)
macOS AfterFuncZeroDelivery/LLGo 90654 ns/op +11432 ns/op / +14.4% (worse)
macOS CreateStop/Go 150.900 ns/op +0.3 ns/op / +0.2% (worse)
macOS CreateStop/LLGo 456.300 ns/op -16.8 ns/op / -3.6% (better)
macOS RearmStopped/Go 70.280 ns/op +2.61 ns/op / +3.9% (worse)
macOS RearmStopped/LLGo 511.700 ns/op +34.6 ns/op / +7.3% (worse)
macOS ResetActive/Go 49.990 ns/op -1.07 ns/op / -2.1% (better)
macOS ResetActive/LLGo 169.300 ns/op +2.9 ns/op / +1.7% (worse)
macOS ResetHeap1024/Go 48.910 ns/op +1.43 ns/op / +3.0% (worse)
macOS ResetHeap1024/LLGo 96.100 ns/op -6.2 ns/op / -6.1% (better)
Windows MinGW AfterFuncZeroDelivery/Go 474.100 ns/op -13.7 ns/op / -2.8% (better)
Windows MinGW AfterFuncZeroDelivery/LLGo 132302 ns/op -2539 ns/op / -1.9% (better)
Windows MinGW CreateStop/Go 115.200 ns/op -1.8 ns/op / -1.5% (better)
Windows MinGW CreateStop/LLGo 477.800 ns/op +30.5 ns/op / +6.8% (worse)
Windows MinGW RearmStopped/Go 31.500 ns/op -0.06 ns/op / -0.2% (better)
Windows MinGW RearmStopped/LLGo 283.500 ns/op -4.7 ns/op / -1.6% (better)
Windows MinGW ResetActive/Go 19.020 ns/op -0.04 ns/op / -0.2% (better)
Windows MinGW ResetActive/LLGo 165.500 ns/op -10.5 ns/op / -6.0% (better)
Windows MinGW ResetHeap1024/Go 19.110 ns/op -0.53 ns/op / -2.7% (better)
Windows MinGW ResetHeap1024/LLGo 139 ns/op +1.7 ns/op / +1.2% (worse)
Windows MinGW 386 AfterFuncZeroDelivery/Go 952.100 ns/op -12.3 ns/op / -1.3% (better)
Windows MinGW 386 AfterFuncZeroDelivery/LLGo 184941 ns/op +1775 ns/op / +1.0% (worse)
Windows MinGW 386 CreateStop/Go 196.900 ns/op +3.3 ns/op / +1.7% (worse)
Windows MinGW 386 CreateStop/LLGo 498 ns/op +1.9 ns/op / +0.4% (worse)
Windows MinGW 386 RearmStopped/Go 63.360 ns/op -0.74 ns/op / -1.2% (better)
Windows MinGW 386 RearmStopped/LLGo 353.900 ns/op +21.7 ns/op / +6.5% (worse)
Windows MinGW 386 ResetActive/Go 39.100 ns/op +0.01 ns/op / +0.02558% (worse)
Windows MinGW 386 ResetActive/LLGo 1000 ns/op -14 ns/op / -1.4% (better)
Windows MinGW 386 ResetHeap1024/Go 39.410 ns/op -0.13 ns/op / -0.3% (better)
Windows MinGW 386 ResetHeap1024/LLGo 186.600 ns/op +1 ns/op / +0.5% (worse)
Windows MinGW ARM64 AfterFuncZeroDelivery/Go 661.100 ns/op -7.6 ns/op / -1.1% (better)
Windows MinGW ARM64 AfterFuncZeroDelivery/LLGo 136359 ns/op +7755 ns/op / +6.0% (worse)
Windows MinGW ARM64 CreateStop/Go 195.500 ns/op -3.2 ns/op / -1.6% (better)
Windows MinGW ARM64 CreateStop/LLGo 371.800 ns/op +10.6 ns/op / +2.9% (worse)
Windows MinGW ARM64 RearmStopped/Go 70.520 ns/op -0.08 ns/op / -0.1% (better)
Windows MinGW ARM64 RearmStopped/LLGo 251.300 ns/op +4.3 ns/op / +1.7% (worse)
Windows MinGW ARM64 ResetActive/Go 31.020 ns/op +0.17 ns/op / +0.6% (worse)
Windows MinGW ARM64 ResetActive/LLGo 125.800 ns/op -0.6 ns/op / -0.5% (better)
Windows MinGW ARM64 ResetHeap1024/Go 31.090 ns/op +0.02 ns/op / +0.1% (worse)
Windows MinGW ARM64 ResetHeap1024/LLGo 127.200 ns/op +1.2 ns/op / +1.0% (worse)
Windows MSVC AfterFuncZeroDelivery/Go 710.200 ns/op +0.8 ns/op / +0.1% (worse)
Windows MSVC AfterFuncZeroDelivery/LLGo 141499 ns/op +3537 ns/op / +2.6% (worse)
Windows MSVC CreateStop/Go 190.600 ns/op -1.6 ns/op / -0.8% (better)
Windows MSVC CreateStop/LLGo 909.700 ns/op +159.1 ns/op / +21.2% (worse)
Windows MSVC RearmStopped/Go 71.500 ns/op +0.06 ns/op / +0.1% (worse)
Windows MSVC RearmStopped/LLGo 368.600 ns/op -28.2 ns/op / -7.1% (better)
Windows MSVC ResetActive/Go 31.790 ns/op +0.05 ns/op / +0.2% (worse)
Windows MSVC ResetActive/LLGo 208.500 ns/op +9.4 ns/op / +4.7% (worse)
Windows MSVC ResetHeap1024/Go 32.080 ns/op +0.02 ns/op / +0.1% (worse)
Windows MSVC ResetHeap1024/LLGo 135.500 ns/op +3.5 ns/op / +2.7% (worse)
Windows MSVC 386 AfterFuncZeroDelivery/Go 1052 ns/op +8 ns/op / +0.8% (worse)
Windows MSVC 386 AfterFuncZeroDelivery/LLGo 175867 ns/op -1344 ns/op / -0.8% (better)
Windows MSVC 386 CreateStop/Go 266.700 ns/op +0.7 ns/op / +0.3% (worse)
Windows MSVC 386 CreateStop/LLGo 776.800 ns/op +42.3 ns/op / +5.8% (worse)
Windows MSVC 386 RearmStopped/Go 96.520 ns/op +0.09 ns/op / +0.1% (worse)
Windows MSVC 386 RearmStopped/LLGo 427.900 ns/op +1.8 ns/op / +0.4% (worse)
Windows MSVC 386 ResetActive/Go 46.580 ns/op 0 ns/op / +0.0%
Windows MSVC 386 ResetActive/LLGo 314.900 ns/op -5.8 ns/op / -1.8% (better)
Windows MSVC 386 ResetHeap1024/Go 47 ns/op +0.06 ns/op / +0.1% (worse)
Windows MSVC 386 ResetHeap1024/LLGo 171.900 ns/op -1 ns/op / -0.6% (better)
Windows MSVC ARM64 AfterFuncZeroDelivery/Go 662.500 ns/op -0.5 ns/op / -0.1% (better)
Windows MSVC ARM64 AfterFuncZeroDelivery/LLGo 122460 ns/op -13921 ns/op / -10.2% (better)
Windows MSVC ARM64 CreateStop/Go 201.700 ns/op +3.4 ns/op / +1.7% (worse)
Windows MSVC ARM64 CreateStop/LLGo 385.400 ns/op -1.4 ns/op / -0.4% (better)
Windows MSVC ARM64 RearmStopped/Go 70.560 ns/op +0.01 ns/op / +0.01417% (worse)
Windows MSVC ARM64 RearmStopped/LLGo 269.200 ns/op -0.8 ns/op / -0.3% (better)
Windows MSVC ARM64 ResetActive/Go 30.980 ns/op -0.07 ns/op / -0.2% (better)
Windows MSVC ARM64 ResetActive/LLGo 134.700 ns/op +1.5 ns/op / +1.1% (worse)
Windows MSVC ARM64 ResetHeap1024/Go 31.110 ns/op -0.01 ns/op / -0.03213% (better)
Windows MSVC ARM64 ResetHeap1024/LLGo 137.300 ns/op +0.7 ns/op / +0.5% (worse)

Compared with a34388d0a9ab measured in the same runner job.

@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

LLGo WebAssembly build benchmarks

afa8a6c5ea8b | workflow run | long-term charts

WebAssembly output sizes
Example, profile and compiler Wasm module vs base Generated JS glue vs base
cprintf/j32-emscripten/LLGo 135610 B 0 B / +0.0% 70901 B 0 B / +0.0%
cprintf/j32-goos-js/LLGo 134108 B 0 B / +0.0% 69235 B 0 B / +0.0%
cprintf/j64-emscripten-memory64/LLGo 124046 B 0 B / +0.0% 74134 B 0 B / +0.0%
cprintf/w32-goos-wasip1/LLGo 138444 B 0 B / +0.0% 0 B 0 B / 0.0%
cprintf/w32-wasi/LLGo 138170 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/j32-emscripten/LLGo 3087288 B 0 B / +0.0% 115325 B 0 B / +0.0%
fmtprintf/j32-goos-js/Go 2526852 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/j32-goos-js/LLGo 3082171 B 0 B / +0.0% 98999 B 0 B / +0.0%
fmtprintf/j64-emscripten-memory64/LLGo 2826659 B 0 B / +0.0% 122264 B 0 B / +0.0%
fmtprintf/w32-goos-wasip1/Go 2500019 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/w32-goos-wasip1/LLGo 2827999 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/w32-wasi/LLGo 2694467 B 0 B / +0.0% 0 B 0 B / 0.0%
j32-emscripten/LLGo 134897 B 0 B / +0.0% 70901 B 0 B / +0.0%
j32-goos-js/Go 1895533 B 0 B / +0.0% 0 B 0 B / 0.0%
j32-goos-js/LLGo 133563 B 0 B / +0.0% 69235 B 0 B / +0.0%
j64-emscripten-memory64/LLGo 123371 B 0 B / +0.0% 74134 B 0 B / +0.0%
reflectcall/j32-emscripten/LLGo 1479250 B 0 B / +0.0% 89361 B 0 B / +0.0%
reflectcall/j32-goos-js/Go 2191221 B 0 B / +0.0% 0 B 0 B / 0.0%
reflectcall/j32-goos-js/LLGo 1482639 B 0 B / +0.0% 87695 B 0 B / +0.0%
reflectcall/j64-emscripten-memory64/LLGo 1366522 B 0 B / +0.0% 94654 B 0 B / +0.0%
reflectcall/w32-goos-wasip1/Go 2205707 B 0 B / +0.0% 0 B 0 B / 0.0%
reflectcall/w32-goos-wasip1/LLGo 1533364 B 0 B / +0.0% 0 B 0 B / 0.0%
reflectcall/w32-wasi/LLGo 1458829 B 0 B / +0.0% 0 B 0 B / 0.0%
w32-goos-wasip1/Go 1909947 B 0 B / +0.0% 0 B 0 B / 0.0%
w32-goos-wasip1/LLGo 137725 B 0 B / +0.0% 0 B 0 B / 0.0%
w32-wasi/LLGo 137518 B 0 B / +0.0% 0 B 0 B / 0.0%
LLGo WebAssembly build measurements
Example and profile Build vs base
j32-emscripten 5.687 s -118.7 ms / -2.0% (better)
j32-goos-js 5.874 s -305 ms / -4.9% (better)
j64-emscripten-memory64 4.757 s -394.5 ms / -7.7% (better)
reflectcall/w32-wasi 26.476 s -369.3 ms / -1.4% (better)
w32-goos-wasip1 4.706 s -468.3 ms / -9.0% (better)
w32-wasi 4.637 s +134.4 ms / +3.0% (worse)

Compared with be496b2cc5c3 measured in the same runner job.

@cpunion
cpunion force-pushed the codex/wasm-final-dwarf branch from 7f23f53 to 1ef7918 Compare September 26, 2026 14:39
@cpunion
cpunion merged commit 5c80bcf into xgo-dev:main Sep 27, 2026
88 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants