diff options
| author | bors <bors@rust-lang.org> | 2024-03-29 09:04:05 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-03-29 09:04:05 +0000 |
| commit | 58dcd1fdb9a605bd2f0126d1b06ae6511bbc1dab (patch) | |
| tree | ef2f278c7734ec930daf95340b69771d31ffaa01 /compiler/rustc_symbol_mangling/src | |
| parent | 1c19595575968ea77c7f85e97c67d44d8c0f9a68 (diff) | |
| parent | 8e6b4e91b68a0921c534aa1174d27f3c6418b1e6 (diff) | |
| download | rust-58dcd1fdb9a605bd2f0126d1b06ae6511bbc1dab.tar.gz rust-58dcd1fdb9a605bd2f0126d1b06ae6511bbc1dab.zip | |
Auto merge of #123071 - rcvalle:rust-cfi-fix-method-fn-ptr-cast, r=compiler-errors
CFI: Fix methods as function pointer cast Fix casting between methods and function pointers by assigning a secondary type id to methods with their concrete self so they can be used as function pointers. This was split off from #116404. cc `@compiler-errors` `@workingjubilee`
Diffstat (limited to 'compiler/rustc_symbol_mangling/src')
| -rw-r--r-- | compiler/rustc_symbol_mangling/src/typeid.rs | 11 | ||||
| -rw-r--r-- | compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs | 3 |
2 files changed, 13 insertions, 1 deletions
diff --git a/compiler/rustc_symbol_mangling/src/typeid.rs b/compiler/rustc_symbol_mangling/src/typeid.rs index 1d28d2b732f..fc1e8e46e8d 100644 --- a/compiler/rustc_symbol_mangling/src/typeid.rs +++ b/compiler/rustc_symbol_mangling/src/typeid.rs @@ -13,9 +13,20 @@ bitflags! { /// Options for typeid_for_fnabi. #[derive(Clone, Copy, Debug)] pub struct TypeIdOptions: u32 { + /// Generalizes pointers for compatibility with Clang + /// `-fsanitize-cfi-icall-generalize-pointers` option for cross-language LLVM CFI and KCFI + /// support. const GENERALIZE_POINTERS = 1; + /// Generalizes repr(C) user-defined type for extern function types with the "C" calling + /// convention (or extern types) for cross-language LLVM CFI and KCFI support. const GENERALIZE_REPR_C = 2; + /// Normalizes integers for compatibility with Clang + /// `-fsanitize-cfi-icall-experimental-normalize-integers` option for cross-language LLVM + /// CFI and KCFI support. const NORMALIZE_INTEGERS = 4; + /// Do not perform self type erasure for attaching a secondary type id to methods with their + /// concrete self so they can be used as function pointers. + const NO_SELF_TYPE_ERASURE = 8; } } diff --git a/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs b/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs index 04b92fbd33b..7fd5cfeb48b 100644 --- a/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs +++ b/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs @@ -1144,7 +1144,8 @@ pub fn typeid_for_instance<'tcx>( instance.args = strip_receiver_auto(tcx, instance.args); } - if let Some(impl_id) = tcx.impl_of_method(instance.def_id()) + if !options.contains(EncodeTyOptions::NO_SELF_TYPE_ERASURE) + && let Some(impl_id) = tcx.impl_of_method(instance.def_id()) && let Some(trait_ref) = tcx.impl_trait_ref(impl_id) { let impl_method = tcx.associated_item(instance.def_id()); |
