Skip to content

Require RefFunc to have the proper type #7376

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 21, 2025
Merged

Require RefFunc to have the proper type #7376

merged 4 commits into from
Mar 21, 2025

Conversation

tlively
Copy link
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
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?

CHANGELOG.md Outdated
@@ -18,6 +18,8 @@ Current Trunk
- Add an option to preserve imports and exports in the fuzzer (for fuzzer
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
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
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
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
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