Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

I64ToI32Lowering: return_call_indirect gets a (func (result unreachable)) type, binary writer hits UNREACHABLE

Aperta
#9,244 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
65/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
cpp, wasm
Ambito
compilers

Direzione di ricerca

Start with the reproducer, wasm-opt -all input.wat --i64-to-i32-lowering, then read visitGenericCall and visitCallIndirect in src/passes/I64ToI32Lowering.cpp, where the new heap type for a return call gets its results. The issue suggests the fix is to take the results from the lowered curr->heapType.getSignature() instead of the unreachable result. Done means the call keeps (type $t), and both binary and text output round-trip through wasm-opt.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

--i64-to-i32-lowering rewrites the type of a return_call_indirect to (func (result unreachable)), even in a module with no i64 at all, so writing a binary aborts and writing text produces a module that does not parse.

(module (type $t (func)) (table 1 funcref) (func $a (return_call_indirect (type $t) (i32.const 0))))
wasm-opt -all input.wat --i64-to-i32-lowering -o /dev/null
unexpected type
UNREACHABLE executed at src/wasm/wasm-binary.cpp:2104!
    #1 wasm::handle_unreachable(char const*, char const*, unsigned int) src/support/utilities.cpp:39
    #2 wasm::WasmBinaryWriter::writeType(wasm::Type) src/wasm/wasm-binary.cpp:2104
    #3 wasm::WasmBinaryWriter::writeTypes() src/wasm/wasm-binary.cpp:307
    #4 wasm::WasmBinaryWriter::write() src/wasm/wasm-binary.cpp:63
    #5 wasm::ModuleWriter::writeBinary(wasm::Module&, wasm::BufferWithRandomAccess&) src/wasm/wasm-io.cpp:164

With -S -o out.wat instead, wasm-opt exits 0 and writes this, which the same wasm-opt then rejects with out.wat:3:24: error: expected valtype:

(module
 (type $t (func))
 (type $1 (func (result unreachable)))
 (global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0))
 (table $0 1 funcref)
 (func $a (type $t)
  (return_call_indirect $0 (type $1)
   (i32.const 0)
  )
 )
)

I expected the call to keep (type $t): the input is valid (wasm-opt without the pass accepts it), there is nothing to lower, and the pass only rejects return calls with i64 results (with a clean Fatal), so other return calls look meant to be supported.

Found at commit 93d6e9de7e1d99be22a49b8952426906a65df397 and still reproduces at 207bbaec4b30. A release build aborts the same way (SIGABRT) on binary output; with text output it exits 0 and writes the invalid module above. The validator does not report anything before writing.

Looks like visitGenericCall in src/passes/I64ToI32Lowering.cpp passes curr->type as the results when the call does not return i64, and for a return call that is unreachable, so visitCallIndirect builds Signature(Type(params), unreachable) as the new heap type; using the lowered curr->heapType.getSignature().results would avoid it.

Found with an LLM-based testing tool; I used Claude to reduce it and look for the cause.

Lingua principale
WebAssembly
Stelle
8.7k
Fork
893
Merge medio
1g 18h
PR unite (30g)
95

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di WebAssembly/binaryen

Tutte le issue di WebAssembly/binaryen

Issue simili

Altre issue su Compilers

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.