Binary reader rebuilds tag types from Signature, dropping rec group and supertype (follow-up to #7219)

Abierto
#9,365 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
68/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
cpp, wasm
Área
compilers

Línea de trabajo

Read readTagImport at src/wasm/wasm-binary.cpp:3303 and readTags at src/wasm/wasm-binary.cpp:5522, where the issue says tag types are obtained through getSignatureByTypeIndex(...) instead of getTypeByIndex(...). Use the supplied WAT examples and wasm-opt commands to reproduce and compare text and binary round trips. Done when binary reading preserves the declared recursive group type and the reproduced tag import links successfully.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

When a tag's type is part of a rec group, reading the module from a binary gives the tag a fresh canonical (func) type. The text reader keeps the declared type. After a binary round trip through wasm-opt, the tag no longer links against importers that use the original type. #7220 fixed Tag::type and the writer, but the reader still goes through Signature.

;; exp.wat
(module
  (rec (type $t1 (func)) (type $t2 (func)))
  (tag (export "x") (type $t1)))
wasm-opt --all-features exp.wat -o exp.wasm
wasm-opt --all-features --emit-text exp.wat -o -
wasm-opt --all-features --emit-text exp.wasm -o -

From the .wat:

(module
 (rec
  (type $t1 (func))
  (type $t2 (func))
 )
 (tag $tag$0 (type $t1))
 (export "x" (tag $tag$0))
)

From the .wasm:

(module
 (type $0 (func))
 (tag $tag$0 (type $0))
 (export "x" (tag $tag$0))
)

Linking: with imp.wat = (module (rec (type $t1 (func)) (type $t2 (func))) (tag (import "m" "x") (type $t1))), instantiating imp.wasm with the tag exported by exp.wasm works in Node v26.13.0, but with the tag from wasm-opt --all-features exp.wasm -o out.wasm it fails:

WebAssembly.Instance(): Import #0 "m" "x": imported tag does not match the expected type

Tested with wasm-opt version 133 (version_133). On main (95a214d) the reader code is the same: readTagImport (src/wasm/wasm-binary.cpp:3303) and readTags (:5522) pass getSignatureByTypeIndex(...) to makeTag instead of the HeapType from getTypeByIndex(...).

Credit: https://ucsbplse.github.io/

Lenguaje dominante
WebAssembly
Estrellas
8.7k
Forks
905
Merge medio
1 d 23 h
PR fusionados (30 d)
86

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de WebAssembly/binaryen

Todos los issues de WebAssembly/binaryen

Issues similares

Más issues de Compilers

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.