Skip to content

Require RefFunc to have the proper type#7376

Merged
tlively merged 4 commits intomainfrom
ref-func-signatures
Mar 21, 2025
Merged

Require RefFunc to have the proper type#7376
tlively merged 4 commits intomainfrom
ref-func-signatures

Conversation

@tlively
Copy link
Copy Markdown
Member

@tlively tlively commented Mar 14, 2025

As a holdout from before GC was implemented, we previously allowed
RefFunc expressions to have type funcref rather than a specific
signature type matching that of the referenced function. Remove this
allowance and start requiring the types to be correct and precise to
eliminate the possibility of stale types inhibiting (or invalidating!)
optimizations.

Update various older passes to update the types of RefFuncs, including
those in tables, to keep their output passing validation. Also update
the kitchen sink example test to construct RefFunc expressions with the
correct type via the C API.

As a holdout from before GC was implemented, we previously allowed
RefFunc expressions to have type `funcref` rather than a specific
signature type matching that of the referenced function. Remove this
allowance and start requiring the types to be correct and precise to
eliminate the possibility of stale types inhibiting (or invalidating!)
optimizations.

Update various older passes to update the types of RefFuncs, including
those in tables, to keep their output passing validation. Also update
the kitchen sink example test to construct RefFunc expressions with the
correct type via the C API.
@tlively tlively requested a review from kripken March 14, 2025 22:40
Copy link
Copy Markdown
Member

@kripken kripken left a comment

Choose a reason for hiding this comment

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

Do we have ref.func-using tests for FuncCastEmulation, I64ToI32Lowering, and LegalizeJSInterface?

Comment thread CHANGELOG.md Outdated
harnesses where they only want Binaryen to modify their given testcases, not
generate new things in them).
- Require the type of RefFunc expressions to match the type of the referenced
function. It is no longer valid to type them as anyref in the IR.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
function. It is no longer valid to type them as anyref in the IR.
function. It is no longer valid to type them as funcref in the IR.

@tlively
Copy link
Copy Markdown
Member Author

tlively commented Mar 17, 2025

Do we have ref.func-using tests for FuncCastEmulation, I64ToI32Lowering, and LegalizeJSInterface?

Yes, via indirect call tables.

@tlively tlively requested a review from kripken March 21, 2025 00:28
@tlively tlively merged commit cd3b26d into main Mar 21, 2025
14 checks passed
@tlively tlively deleted the ref-func-signatures branch March 21, 2025 17:03
@kripken
Copy link
Copy Markdown
Member

kripken commented Mar 21, 2025

Fuzzer found an issue here:

(module
 (type $0 (func (param f32 i64) (result i32)))
 (type $1 (func (param i32 i32)))
 (type $2 (func (result i64)))
 (type $3 (func))
 (import "fuzzing-support" "call-export" (func $fimport$0 (param i32 i32)))
 (global $global$0 i32 (i32.const 0))
 (memory $0 16 17)
 (table $0 7 7 funcref)
 (elem $0 (i32.const 0) $0 $1)
 (export "func_17_invoker" (func $2))
 (func $0 (param $0 f32) (param $1 i64) (result i32)
  (unreachable)
 )
 (func $1 (result i64)
  (unreachable)
 )
 (func $2
  (drop
   (call_indirect (type $0)
    (f32.const 0)
    (i64.const 0)
    (i32.const 0)
   )
  )
 )
)
bin/wasm2js a.wat -all
[wasm-validator error in module] unexpected false: function reference type must match referenced function type, on 
(ref.func $1)

@tlively
Copy link
Copy Markdown
Member Author

tlively commented Mar 21, 2025

Thanks, will investigate.

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