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

Aberta
#9,365 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
68/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
cpp, wasm
Domínio
compilers

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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/

Linguagem predominante
WebAssembly
Estrelas
8.7k
Forks
905
Merge médio
1d 23h
PRs com merge (30d)
86

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de WebAssembly/binaryen

Todas as issues de WebAssembly/binaryen

Issues semelhantes

Mais issues de Compilers

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.