kcfi: only reify trait methods when dyn-compatible fixes https://github.com/rust-lang/rust/issues/146853 Only generate a `ReifyShim` for trait method calls if the trait is dyn-compatible. Until now kcfi would generate a `ReifyShim` whenever a trait method was cast to a function pointer. But technically the shim is only needed for dyn-compatible traits (where the method might end up in a vtable). Up to this point that was only slightly inefficient, but in combination with c-variadic trait methods it is wrong. For c-variadic trait methods the generated shim is incorrect, and that is why c-variadic methods make a trait no longer dyn-compatible: we should simply never generate a `ReifyShim` that is c-variadic. With this change the documentation on `ReifyReason` is now actually correct: > If KCFI is enabled, creating a function pointer from a method on a dyn-compatible trait. This includes the case of converting `::call`-like methods on closure-likes to function pointers. cc ```@maurer``` ```@workingjubilee``` r? ```@rcvalle```
For more information about how rustc works, see the rustc dev guide.