-
Notifications
You must be signed in to change notification settings - Fork 790
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
Conversation
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.
There was a problem hiding this 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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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. |
Yes, via indirect call tables. |
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)
)
)
)
)
|
Thanks, will investigate. |
As a holdout from before GC was implemented, we previously allowed
RefFunc expressions to have type
funcref
rather than a specificsignature 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.