Skip to content

fix(wasm): align native aggregate sizes with Memory32 storage - #3048

Open
cpunion wants to merge 7 commits into
xgo-dev:mainfrom
cpunion:codex/wasm-abi-closeout-20261110
Open

cpunion wants to merge 7 commits into
xgo-dev:mainfrom
cpunion:codex/wasm-abi-closeout-20261110

Conversation

@cpunion

@cpunion cpunion commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

Fix Memory32 C record and explicitly C-tagged array layout so unsafe.Sizeof, Alignof and Offsetof agree with physical native storage. Ordinary Go aggregates retain Go64 storage. Go/native array conversions and assignments now convert elements with checked integer narrowing, including nested arrays, pointers and callbacks.

Update the J32/J64/W32 runtime audit and document the Go/native function-value difference. Share layout calculations without caching incomplete checker types.

Validation: focused CL and SSA tests, J32/J64/W32 execution checks, O0 array regressions, and O3/full-LTO checks on J32 and native ARM64. Regressions use the existing Wasm profile jobs.

Fixes #2447.

@codecov

codecov Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@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.

FennoAI review — PR #3048 (WASM ABI closeout)

Reviewed the full diff across code quality, performance, security, and documentation. Overall this is a well-engineered change: the per-profile Wasm layout logic is carefully reasoned, the struct/field/array recursion matches the LLVM storage path for the covered shapes, the source-layout arithmetic has explicit overflow guards, and the ABI-boundary narrowing is guarded by runtime/compile-time range checks. Docs (doc/runtime-source-reuse.md, doc/wasm-proposal.md) and the apt-mirror CI change (ubuntu_apt.py) check out — the size table and prose match the test assertions, and the added Azure mirror is an official Canonical HTTPS endpoint that only reorders mirror lists without touching the signing keyring.

One correctness edge case is worth addressing; the rest are minor, wasm-path-only maintainability notes.

Findings

  • (correctness) Top-level named C-tagged array of scalars is not narrowed — see inline comment on ssa/native_wasm_layout.go. The *types.Array case only recurses into the element and never consults hasLegacyNativeTypeLayout(t) the way the *types.Struct case does, so a //llgo:cdecl type Words [2]uintptr returns (_, false) and unsafe.Sizeof reports the Go-word size (16), while the storage path (hasLegacyNativeTypeLayout → nativeStorageLLVMType) narrows it to [2 x i32] (8). All tests exercise arrays only as struct fields/elements, so this shape is uncovered. Either handle the narrowing in the array case or document/assert the invariant that such a type can never reach withNativeStorage standalone.
  • (maintainability, low) Redundant re-traversal on the wasm path — see inline comment on ssa/native_wasm_layout.go. This only affects wasm-profile compilation (the ordinary path is correctly gated behind usesWideGoStorage() + the hasNativeTypeMetadata atomic, so there's no regression off-wasm).

Minor / optional (no inline)

  • Offsetsof (ssa/type.go) evaluates prog.nativeFields(fields) up to three times (each takes an RLock); the result is invariant for a given fields, so hoisting it into one local would be cheaper and clearer.
  • Style nit: the functions touched in ssa/type.go still use Program(unsafe.Pointer(p)), whereas the new file uses the equivalent safe conversion Program(p) — optional to align while you're here.

Note: I could not compile the ssa/internal/build packages in this environment (CGo requires llvm-c/Core.h, which isn't present), so these findings are from static analysis of the diff and surrounding code.

Comment thread ssa/native_wasm_layout.go Resolved
Comment thread ssa/native_wasm_layout.go Resolved
@cpunion cpunion changed the title fix(wasm): match C record layout constants to Memory32 storage fix(wasm): align native aggregate sizes with Memory32 storage Nov 10, 2026

@zhouguangyuan0718 zhouguangyuan0718 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

One non-blocking maintainability suggestion for keeping source size and offset calculations consistent.

Comment thread ssa/native_wasm_layout.go Resolved
@cpunion
cpunion force-pushed the codex/wasm-abi-closeout-20261110 branch from b47da08 to 5dcf127 Compare November 11, 2026 01:33
@cpunion

cpunion commented Nov 11, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Addressed the shared-layout review comment in 5dcf127 and rebased onto current main. Size/alignment and offset queries share the mixed-field walk, with per-query handling preserved. New J32/W32 type-completion regressions and the complete SSA suite pass. Please re-review.

@fennoai

fennoai Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Confirmed. The secret scan matched only token in go/token imports (false positives, no actual secrets). The apt change uses a hardcoded official Canonical mirror (azure.archive.ubuntu.com, HTTPS), composed purely from in-script constants with no attacker-controllable input, writing only to pre-existing mirror-list files. No injection risk, consistent with the prior review's full security analysis.

All four review dimensions are now covered:

  • Code quality: No issues — the rewrite is clean and internally consistent; the one API-contract-dependent observation is correct under the documented contract (non-blocking).
  • Performance: No blocking issues — the triple-traversal is resolved; two low-severity, bounded, wasm-path-only residuals (one pre-existing).
  • Security: No issues — C array round-trip in-bounds, apt change safe, no secrets.
  • Documentation: No issues — table and prose match the implementation, including the now-implemented top-level C array narrowing.

Most importantly, both of my prior review findings are resolved and now have regression tests. This is a managed-mode task, so I'll return the result as markdown in my final message without publishing a comment.


Re-review complete — PR #3048 (WASM ABI closeout)

I re-reviewed the updated PR (5dcf12765, rebased onto e2cca2c) across all four dimensions. Both prior findings are fully addressed, with new regression tests. No new blocking issues. Looks good to merge.

Prior findings — resolved ✓

  1. Correctness: top-level C-tagged array not narrowed — Fixed. wasmNativeLayout's *types.Array case now narrows a named C array via named && hasLegacyNativeTypeLayout(t) → wasmNativeFieldLayout, and toNamed applies withNativeStorage to keep the LLVM storage side consistent. Verified source == storage: new tests assert //llgo:cdecl type Words [2]uintptr → unsafe.Sizeof == 8 and prog.SizeOf(prog.Type(raw, CDecl)) == 8 (ssa/native_wasm_layout_test.go, cl/native_wasm_layout_test.go), plus a real C round-trip through llgo_wasm_profile_words (native_record.go). The guard correctly distinguishes a top-level named C array from an ordinary Go array of native callbacks.

  2. Maintainability/perf: triple field-subtree traversal — Fixed. The new wasmGoFieldLayout/wasmGoFieldsLayout helpers fuse native-detection + size + align into one pass per field and cache the first native subtree's result; Sizeof/Alignof were split into goSizeof/goAlignof to avoid re-entry; Offsetsof now computes nativeFields once; and Program(unsafe.Pointer(p)) → Program(p). Traversal is now linear in nesting depth.

Verification highlights

  • Sizeof / Alignof / Offsetsof are mutually consistent for both C structs and Go records with native fields (traced Record size 48 / offsets {0,4,8,12,16,20,32} and Wrapper size 64 / offsets {0,8,56} through all three plus the LLVM side).
  • Tail-padding flag is correct: padTail=false for C structs vs padTail=true for Go records, mirroring toLLVMStructBody.
  • A new TestWasmNativeSourceLayoutDuringTypeCompletion covers the incomplete-named-type path the comments call out.
  • Docs, the apt-mirror CI change, and C-interop memory safety all re-verified clean.

Residual (low-severity, non-blocking; sharing for context only)

  • wasmGoFieldsLayout: non-native siblings positioned before the first native field get a second wasmNativeLayout traversal — bounded, doesn't compound with depth, wasm-path-only.
  • hasLegacyNativeTypeLayout allocates a linkname string + takes an RLock per named subtree during wasm layout queries — pre-existing, gated behind the metadata/wide-storage checks, off the normal-target path.

One note: I couldn't compile the ssa/internal/build packages in this environment (CGo needs llvm-c/Core.h, which isn't installed here), so this is static analysis of the diff and surrounding code plus the test assertions — I'm relying on your report that the J32/W32 type-completion regressions and the full SSA suite pass.

View task

@cpunion
cpunion force-pushed the codex/wasm-abi-closeout-20261110 branch from 5dcf127 to a179320 Compare November 11, 2026 09:19
@cpunion

cpunion commented Nov 11, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Rebased onto current main 2681caa to resolve the merge conflicts. The Ubuntu mirror fallback is now in main through #3044, so its duplicate CI commit was dropped. All three Wasm implementation/test commits are patch-identical according to git range-diff. Full SSA, the cross-target native-record layout test, runtime ABI audit, and Ubuntu helper tests pass. Please re-review the rebase at a179320.

@fennoai

fennoai Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

I re-reviewed the rebase at a17932084 and posted it as a non-blocking review on #3048: #3048 (review)

  • Rebase: git range-diff confirms all three Wasm commits are identical to before. The dropped commit is the Ubuntu mirror CI change, which is now in main through build: fix function value lookup without prebuilt PCLN #3044.
  • New main changes: since the previous base, main changed only the function-value lookup fallback in internal/build/funcinfo_table.go and the Ubuntu mirror script. Neither touches the Wasm layout code, the runtime ABI audit or the Wasm test program.
  • Earlier feedback: C-tagged named arrays, the shared field-layout walk and the single nativeFields lookup in Offsetsof are all still fixed after the rebase.
  • One optional nit: doc/wasm-proposal.md line 59 needs a blank line after it. Without one, the new paragraph and the next one ("Assembly/runtime boundary…") render as one paragraph.

I found no blocking issues. The four parallel reviewer agents failed with an API error, so I reviewed the diff myself. I couldn't build or run the packages that need LLVM here, so the test results are the ones you reported, not ones I reproduced.

View task

@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.

FennoAI re-review: rebase onto 2681caa07 (head a17932084)

I found no blocking issues.

Rebase check

  • I ran git range-diff 7d66e2d8f..5dcf12765 2681caa07..a17932084. All three commits match (=). The dropped commit 7d66e2d8f is the Ubuntu mirror CI commit, which is now in main through #3044.
  • Since the previous base, main changed only the PCLN function-value fallback (internal/build/funcinfo_table.go and its tests) and the Ubuntu mirror script. Neither touches ssa/type.go, the Wasm layout helpers, the runtime ABI audit, or the wasm-profile fixture, so the rebase does not create a semantic conflict.
  • The earlier feedback is still addressed in the rebased code:
    • Named C-tagged arrays: wasmNativeLayout sizes them from their own directive, and toNamed gives them native storage.
    • Shared field walk: Sizeof, Alignof and Offsetsof all go through wasmGoFieldsLayout.
    • Repeated lookups: Offsetsof calls nativeFields only once.

One optional doc nit (inline): in doc/wasm-proposal.md, the new paragraph has no blank line before the next one, so the two render as a single paragraph.

Note: subagent reviewers were unavailable in this run, so I reviewed the diff directly. I could not build or run the CGo/LLVM-backed packages here. The test results above are the ones you reported.

Comment thread doc/wasm-proposal.md Resolved
@github-actions

Copy link
Copy Markdown

LLGo WebAssembly build benchmarks

1ad8aa42246c | 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 155901 B 0 B / +0.0% 88932 B 0 B / +0.0%
cprintf/j32-goos-js/LLGo 154988 B 0 B / +0.0% 72985 B 0 B / +0.0%
cprintf/j64-emscripten-memory64/LLGo 142547 B 0 B / +0.0% 92103 B 0 B / +0.0%
cprintf/w32-goos-wasip1/LLGo 15937 B 0 B / +0.0% 0 B 0 B / 0.0%
cprintf/w32-wasi/LLGo 15937 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/j32-emscripten/LLGo 1634058 B 0 B / +0.0% 119298 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 1699156 B 0 B / +0.0% 89416 B 0 B / +0.0%
fmtprintf/j64-emscripten-memory64/LLGo 1514999 B 0 B / +0.0% 122540 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 1075471 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/w32-wasi/LLGo 1076761 B 0 B / +0.0% 0 B 0 B / 0.0%
j32-emscripten/LLGo 155091 B 0 B / +0.0% 88932 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 154384 B 0 B / +0.0% 72985 B 0 B / +0.0%
j64-emscripten-memory64/LLGo 141748 B 0 B / +0.0% 92103 B 0 B / +0.0%
reflectcall/j32-emscripten/LLGo 1372642 B 0 B / +0.0% 95650 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 1385471 B 0 B / +0.0% 79699 B 0 B / +0.0%
reflectcall/j64-emscripten-memory64/LLGo 1256911 B 0 B / +0.0% 99450 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 1042193 B 0 B / +0.0% 0 B 0 B / 0.0%
reflectcall/w32-wasi/LLGo 1043349 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 18855 B 0 B / +0.0% 0 B 0 B / 0.0%
w32-wasi/LLGo 18855 B 0 B / +0.0% 0 B 0 B / 0.0%
LLGo WebAssembly build measurements
Example and profile Build vs base
j32-emscripten 8.081 s -244.2 ms / -2.9% (better)
j32-goos-js 8.109 s -127.1 ms / -1.5% (better)
j64-emscripten-memory64 7.192 s -135.7 ms / -1.9% (better)
reflectcall/w32-wasi 26.709 s -4.927 ms / -0.01844% (better)
w32-goos-wasip1 3.986 s -111 ms / -2.7% (better)
w32-wasi 3.665 s -145.7 ms / -3.8% (better)

Compared with 2681caa07abe measured in the same runner job.

@zhouguangyuan0718 zhouguangyuan0718 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Found a Memory32 correctness regression in conversions between C-tagged arrays and ordinary Go arrays; the inline comment includes a reproducer and exact-base comparison.

Comment thread ssa/type.go Resolved
@cpunion
cpunion force-pushed the codex/wasm-abi-closeout-20261110 branch from 1ad8aa4 to 91d488b Compare November 12, 2026 05:00
@cpunion

cpunion commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please re-review 91d488b, rebased onto current main 166dafa. This addresses the new P1 array-conversion stack overflow with element-wise Go/native representation conversion and existing range checks. Regressions cover conversions, assignments, nested arrays, pointers, callbacks and overflow in the existing Wasm profile jobs. J32/J64/W32 execution and the focused compiler test pass; the broader CL/SSA run is still finishing locally.

@fennoai

fennoai Bot commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Confirmed both minor items. The toStorageValue zero-high-word insert (line 240) is indeed on the store direction, and fromStorageValue (line 246+) uses extract — so memoryInstruction's load-only callers never traverse a constant-high-word insert, making the comment's second sentence imprecise (though the branch is harmless). And ssa/expr.go:1156 does recompute withoutNativeStorage(sourceElem) per iteration.

Both are genuinely minor polish. I'm confident in the overall assessment: the P1 fix is correct and well-tested, with comprehensive regression coverage (value round-trips, aliasing checks, nested arrays, pointers with GC, callbacks, empty arrays, and overflow panics across j32/w32/j64). No blocking issues across any dimension.

This is managed mode — I'll deliver the result as markdown in my final message.


Re-review complete — PR #3048 (WASM ABI closeout), head 91d488b66

I re-reviewed the P1 fix across all four dimensions (code quality, security, performance, documentation). The stack-overflow fix is correct and thoroughly tested. No blocking issues. Looks good to merge.

P1 fix (array-conversion stack overflow) — resolved ✓

The element-wise conversion in ssa/expr.go (ChangeType vkArray case) and ssa/storage.go (fitLLVMValue array case) correctly replaces the recursion-prone whole-array path. I verified the key properties:

  • Termination holds for every shape — [N]uintptr, nested [N][M]uintptr, [N]*byte, callback arrays, and empty [0]uintptr. The recursion descends exactly one array level per call and bottoms out at scalars; ChangeType's own array branch short-circuits after one terminating step, with the real descent handled by fitLLVMValue.
  • Memory safety: every element narrowing (i64 Go word → i32 C word) routes through the checked trunc + assertRuntimeError("WebAssembly ABI integer conversion out of range"), so an out-of-range value can't silently truncate a pointer/size. Copy semantics confirmed (fresh llvm.Undef aggregate, no aliasing); pointer high-words always zero-filled.
  • memoryInstruction rewrite now follows insert/extract repacking back to the load with no wrong-operand or infinite-loop risk (it only ever advances to a strictly-dominating operand; the two-non-constant-operand case correctly lands on the shared load).
  • Performance: the O(N)/O(N·M) IR emission is inherent to correctness, gated strictly to the wasm wide-storage path, and fully short-circuited on ordinary targets; memoryInstruction is off the hot path.

The new tests are strong: cl/native_wasm_layout_test.go asserts the IR carries trunc i64 + AssertRuntimeError (narrowing) and zext i32 (widening); array_conversions.go exercises value round-trips, aliasing, nested arrays, pointers (with runtime.GC()), callbacks, empty arrays, and overflow panics across j32/w32/j64; and array_alignment_test.go now uses memoryInstruction() to confirm volatile/alignment survive repacking.

Minor / optional (non-blocking, no action required to merge)

  • ssa/expr.go:1156 — b.Prog.withoutNativeStorage(sourceElem) is loop-invariant but recomputed each iteration; hoisting it above the loop is a tiny compile-time cleanup. (A couple of ArrayLength() FFI calls used as loop bounds could likewise be cached — negligible.)
  • ssa/expr.go:92 — the comment's second sentence ("Repacked pointer slots also insert a constant zero high word") describes a store-direction construct (toStorageValue); memoryInstruction's callers are all loads, which read slots via extract, so that constant-insert case isn't on a chain this walk actually traverses. The else branch it explains is harmless/defensive — just the wording is imprecise. Optional reword.

Clean

No issues in docs (table/prose still match the implementation, no number drift), the C-interop fixtures (bounds safe), or the CI download-bounding/apt changes (integrity-pinned, no injection, no secrets).

One caveat, as before: I couldn't compile here (CGo needs llvm-c/Core.h, absent in this environment), so this is static analysis of the diff, surrounding code, and the test assertions — consistent with your note that J32/J64/W32 execution and the focused compiler test pass while the broader CL/SSA run finishes locally.

View task

@cpunion

cpunion commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator Author

Validation follow-up for 91d488b: SSA passes, and all CL tests are now covered. The CL run hit its default 10-minute limit after 525 top-level tests with no failures; the remaining 33 top-level tests passed in a separate run with a longer limit. J32/J64/W32 profile execution and official Go js/wasip1 oracles pass. go vet ./... has the same 12 baseline diagnostics and no additions.

@cpunion

cpunion commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Addressed both optional nits in 33218e1: hoisted the logical source type and array-length queries out of the conversion loops, and clarified the aggregate-tracing comment. The targeted J32/W32 conversion and array alignment/volatile tests pass; vet still matches the baseline. No other implementation changes. Please re-review this small follow-up.

@fennoai

fennoai Bot commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

This is exactly the minimal follow-up described — nothing more. Let me verify both nits are correctly addressed:

  1. ssa/expr.go:1151-1157 — loop-invariant hoist: sourceLogical := b.Prog.withoutNativeStorage(sourceElem) is now computed once before the loop (line 1152) and reused inside (line 1157), replacing the per-iteration b.Prog.withoutNativeStorage(sourceElem). Correct — sourceElem is loop-invariant, so this is semantically identical. ✓

  2. Array-length hoist (both files): for i := 0; i < t.ll.ArrayLength(); i++ → for i, n := 0, t.ll.ArrayLength(); i < n; i++ in ssa/expr.go, and the same in ssa/storage.go. The array length is loop-invariant (the aggregate isn't resized inside the loop), so caching it is a safe, behavior-preserving change. ✓

  3. Comment clarification (ssa/expr.go:92): The imprecise second sentence "Repacked pointer slots also insert a constant zero high word" is replaced with "Skip constant fields inserted while repacking an aggregate" — which accurately describes what the else branch (follow Operand(0) when the inserted part is constant) actually does, without attributing a store-direction construct to the load-only walk. ✓

All three changes are correct, minimal, and behavior-preserving. There are no functional/logic changes — this is pure cleanup of exactly the two optional nits I raised. The diff is self-evidently safe (hoisting loop-invariants out of loops with no side effects, and a comment reword), so a full four-subagent fan-out would be disproportionate for a 3-line-of-logic no-op refactor. I've verified the semantics directly.

One small sanity check: confirm sourceElem genuinely doesn't change across iterations (it's assigned once at line 1151, outside the loop) and that nothing else references the old per-iteration expression.

The diff confirms it: sourceElem is assigned once before the loop, sourceLogical is derived once from it, and the loop body only reads them. No other occurrences. The change is correct.

This is managed mode — I'll return the result as markdown without publishing.


Re-review complete — PR #3048, head 33218e155

Confirmed this is a minimal follow-up that addresses exactly the two optional nits from my last review, with no other changes. Both are correctly resolved, behavior-preserving. No new issues — good to merge.

The incremental diff (91d488b...33218e155) is a single commit touching only ssa/expr.go and ssa/storage.go:

  1. Loop-invariant hoist (ssa/expr.go) — withoutNativeStorage(sourceElem) is now computed once as sourceLogical before the loop and reused inside. sourceElem is assigned once outside the loop, so this is semantically identical and removes the per-iteration recomputation I flagged. ✓
  2. Array-length hoist (ssa/expr.go + ssa/storage.go) — for i := 0; i < …ArrayLength(); i++ → for i, n := 0, …ArrayLength(); i < n; i++ in both conversion loops. The length is loop-invariant, so caching it is safe. ✓
  3. Comment clarification (ssa/expr.go:92) — the imprecise "Repacked pointer slots also insert a constant zero high word" is replaced with "Skip constant fields inserted while repacking an aggregate," which accurately describes the else branch's actual behavior without the misleading store-direction detail. ✓

No functional/logic changes — purely the hoisting and comment cleanups, verified semantically identical. Consistent with your note that the targeted J32/W32 conversion and array alignment/volatile tests pass and vet matches the baseline. (As before, I can't compile here — CGo needs llvm-c/Core.h — so this is static analysis of the diff.)

With this, both prior P1-era findings and both optional nits are closed. From my side the PR looks ready.

View task

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.

wasm ABI report: reconcile Go's 64-bit data model with Emscripten's wasm32 ABI

3 participants