Auto merge of #120675 - oli-obk:intrinsics3.0, r=pnkfelix
Add a scheme for moving away from `extern "rust-intrinsic"` entirely All `rust-intrinsic`s can become free functions now, either with a fallback body, or with a dummy body and an attribute, requiring backends to actually implement the intrinsic. This PR demonstrates the dummy-body scheme with the `vtable_size` intrinsic. cc https://github.com/rust-lang/rust/issues/63585 follow-up to #120500 MCP at https://github.com/rust-lang/compiler-team/issues/720
This commit is contained in:
commit
2eeff462b7
31 changed files with 207 additions and 51 deletions
|
@ -1749,7 +1749,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
self.root.tables.attr_flags.get(self, index)
|
||||
}
|
||||
|
||||
fn get_intrinsic(self, index: DefIndex) -> Option<Symbol> {
|
||||
fn get_intrinsic(self, index: DefIndex) -> Option<ty::IntrinsicDef> {
|
||||
self.root.tables.intrinsic.get(self, index).map(|d| d.decode(self))
|
||||
}
|
||||
|
||||
|
|
|
@ -1053,11 +1053,14 @@ fn should_encode_mir(
|
|||
// Full-fledged functions + closures
|
||||
DefKind::AssocFn | DefKind::Fn | DefKind::Closure => {
|
||||
let generics = tcx.generics_of(def_id);
|
||||
let opt = tcx.sess.opts.unstable_opts.always_encode_mir
|
||||
let mut opt = tcx.sess.opts.unstable_opts.always_encode_mir
|
||||
|| (tcx.sess.opts.output_types.should_codegen()
|
||||
&& reachable_set.contains(&def_id)
|
||||
&& (generics.requires_monomorphization(tcx)
|
||||
|| tcx.cross_crate_inlinable(def_id)));
|
||||
if let Some(intrinsic) = tcx.intrinsic(def_id) {
|
||||
opt &= !intrinsic.must_be_overridden;
|
||||
}
|
||||
// The function has a `const` modifier or is in a `#[const_trait]`.
|
||||
let is_const_fn = tcx.is_const_fn_raw(def_id.to_def_id())
|
||||
|| tcx.is_const_default_method(def_id.to_def_id());
|
||||
|
@ -1409,9 +1412,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
if let DefKind::Fn | DefKind::AssocFn = def_kind {
|
||||
self.tables.asyncness.set_some(def_id.index, tcx.asyncness(def_id));
|
||||
record_array!(self.tables.fn_arg_names[def_id] <- tcx.fn_arg_names(def_id));
|
||||
if let Some(name) = tcx.intrinsic(def_id) {
|
||||
record!(self.tables.intrinsic[def_id] <- name);
|
||||
}
|
||||
}
|
||||
if let Some(name) = tcx.intrinsic(def_id) {
|
||||
record!(self.tables.intrinsic[def_id] <- name);
|
||||
}
|
||||
if let DefKind::TyParam = def_kind {
|
||||
let default = self.tcx.object_lifetime_default(def_id);
|
||||
|
|
|
@ -375,7 +375,7 @@ macro_rules! define_tables {
|
|||
|
||||
define_tables! {
|
||||
- defaulted:
|
||||
intrinsic: Table<DefIndex, Option<LazyValue<Symbol>>>,
|
||||
intrinsic: Table<DefIndex, Option<LazyValue<ty::IntrinsicDef>>>,
|
||||
is_macro_rules: Table<DefIndex, bool>,
|
||||
is_type_alias_impl_trait: Table<DefIndex, bool>,
|
||||
type_alias_is_lazy: Table<DefIndex, bool>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue