Skip to content

Commit f0cb386

Browse files
committed
Add intrinsic definition and retrieval APIs
1 parent 94be5ab commit f0cb386

File tree

4 files changed

+68
-16
lines changed

4 files changed

+68
-16
lines changed

Diff for: compiler/rustc_smir/src/rustc_smir/context.rs

+24-12
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ use stable_mir::mir::{BinOp, Body, Place};
2323
use stable_mir::target::{MachineInfo, MachineSize};
2424
use stable_mir::ty::{
2525
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, ForeignDef,
26-
ForeignItemKind, GenericArgs, LineInfo, PolyFnSig, RigidTy, Span, Ty, TyKind, UintTy,
27-
VariantDef,
26+
ForeignItemKind, GenericArgs, IntrinsicDef, LineInfo, PolyFnSig, RigidTy, Span, Ty, TyKind,
27+
UintTy, VariantDef,
2828
};
2929
use stable_mir::{Crate, CrateDef, CrateItem, CrateNum, DefId, Error, Filename, ItemKind, Symbol};
3030
use std::cell::RefCell;
@@ -307,6 +307,28 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
307307
sig.stable(&mut *tables)
308308
}
309309

310+
fn intrinsic(&self, def: DefId) -> Option<IntrinsicDef> {
311+
let mut tables = self.0.borrow_mut();
312+
let tcx = tables.tcx;
313+
let def_id = def.internal(&mut *tables, tcx);
314+
let intrinsic = tcx.intrinsic_raw(def_id);
315+
intrinsic.map(|_| IntrinsicDef(def))
316+
}
317+
318+
fn intrinsic_name(&self, def: IntrinsicDef) -> Symbol {
319+
let mut tables = self.0.borrow_mut();
320+
let tcx = tables.tcx;
321+
let def_id = def.0.internal(&mut *tables, tcx);
322+
tcx.intrinsic(def_id).unwrap().name.to_string()
323+
}
324+
325+
fn intrinsic_must_be_overridden(&self, def: IntrinsicDef) -> bool {
326+
let mut tables = self.0.borrow_mut();
327+
let tcx = tables.tcx;
328+
let def_id = def.0.internal(&mut *tables, tcx);
329+
tcx.intrinsic_raw(def_id).unwrap().must_be_overridden
330+
}
331+
310332
fn closure_sig(&self, args: &GenericArgs) -> PolyFnSig {
311333
let mut tables = self.0.borrow_mut();
312334
let tcx = tables.tcx;
@@ -645,16 +667,6 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
645667
}
646668
}
647669

648-
/// Retrieve the plain intrinsic name of an instance.
649-
///
650-
/// This assumes that the instance is an intrinsic.
651-
fn intrinsic_name(&self, def: InstanceDef) -> Symbol {
652-
let tables = self.0.borrow_mut();
653-
let instance = tables.instances[def];
654-
let intrinsic = tables.tcx.intrinsic(instance.def_id()).unwrap();
655-
intrinsic.name.to_string()
656-
}
657-
658670
fn ty_layout(&self, ty: Ty) -> Result<Layout, Error> {
659671
let mut tables = self.0.borrow_mut();
660672
let tcx = tables.tcx;

Diff for: compiler/stable_mir/src/compiler_interface.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use crate::target::MachineInfo;
1313
use crate::ty::{
1414
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, ForeignDef,
1515
ForeignItemKind, ForeignModule, ForeignModuleDef, GenericArgs, GenericPredicates, Generics,
16-
ImplDef, ImplTrait, LineInfo, PolyFnSig, RigidTy, Span, TraitDecl, TraitDef, Ty, TyKind,
17-
UintTy, VariantDef,
16+
ImplDef, ImplTrait, IntrinsicDef, LineInfo, PolyFnSig, RigidTy, Span, TraitDecl, TraitDef, Ty,
17+
TyKind, UintTy, VariantDef,
1818
};
1919
use crate::{
2020
mir, Crate, CrateItem, CrateItems, CrateNum, DefId, Error, Filename, ImplTraitDecls, ItemKind,
@@ -88,6 +88,16 @@ pub trait Context {
8888
/// Retrieve the function signature for the given generic arguments.
8989
fn fn_sig(&self, def: FnDef, args: &GenericArgs) -> PolyFnSig;
9090

91+
/// Retrieve the intrinsic definition if the item corresponds one.
92+
fn intrinsic(&self, item: DefId) -> Option<IntrinsicDef>;
93+
94+
/// Retrieve the plain function name of an intrinsic.
95+
fn intrinsic_name(&self, def: IntrinsicDef) -> Symbol;
96+
97+
/// Returns whether the intrinsic has no meaningful body and all backends
98+
/// need to shim all calls to it.
99+
fn intrinsic_must_be_overridden(&self, def: IntrinsicDef) -> bool;
100+
91101
/// Retrieve the closure signature for the given generic arguments.
92102
fn closure_sig(&self, args: &GenericArgs) -> PolyFnSig;
93103

@@ -198,7 +208,6 @@ pub trait Context {
198208
fn vtable_allocation(&self, global_alloc: &GlobalAlloc) -> Option<AllocId>;
199209
fn krate(&self, def_id: DefId) -> Crate;
200210
fn instance_name(&self, def: InstanceDef, trimmed: bool) -> Symbol;
201-
fn intrinsic_name(&self, def: InstanceDef) -> Symbol;
202211

203212
/// Return information about the target machine.
204213
fn target_info(&self) -> MachineInfo;

Diff for: compiler/stable_mir/src/mir/mono.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ impl Instance {
106106
/// which is more convenient to match with intrinsic symbols.
107107
pub fn intrinsic_name(&self) -> Option<Symbol> {
108108
match self.kind {
109-
InstanceKind::Intrinsic => Some(with(|context| context.intrinsic_name(self.def))),
109+
InstanceKind::Intrinsic => {
110+
Some(with(|context| context.intrinsic(self.def.def_id()).unwrap().fn_name()))
111+
}
110112
InstanceKind::Item | InstanceKind::Virtual { .. } | InstanceKind::Shim => None,
111113
}
112114
}

Diff for: compiler/stable_mir/src/ty.rs

+29
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,35 @@ impl FnDef {
622622
pub fn body(&self) -> Option<Body> {
623623
with(|ctx| ctx.has_body(self.0).then(|| ctx.mir_body(self.0)))
624624
}
625+
626+
/// Get the information of the intrinsic if this function is a definition of one.
627+
pub fn as_intrinsic(&self) -> Option<IntrinsicDef> {
628+
with(|cx| cx.intrinsic(self.def_id()))
629+
}
630+
631+
/// Check if the function is an intrinsic.
632+
#[inline]
633+
pub fn is_intrinsic(&self) -> bool {
634+
self.as_intrinsic().is_some()
635+
}
636+
}
637+
638+
crate_def! {
639+
pub IntrinsicDef;
640+
}
641+
642+
impl IntrinsicDef {
643+
/// Returns the plain name of the intrinsic.
644+
/// e.g., `transmute` for `core::intrinsics::transmute`.
645+
pub fn fn_name(&self) -> Symbol {
646+
with(|cx| cx.intrinsic_name(*self))
647+
}
648+
649+
/// Returns whether the intrinsic has no meaningful body and all backends
650+
/// need to shim all calls to it.
651+
pub fn must_be_overridden(&self) -> bool {
652+
with(|cx| cx.intrinsic_must_be_overridden(*self))
653+
}
625654
}
626655

627656
crate_def! {

0 commit comments

Comments
 (0)