Rollup merge of #63933 - wesleywiser:cleanup_from_move_promoted, r=oli-obk
Resolve some small issues related to #63580 This resolves some feedback left on #63580 after it was merged: - Adds documentation to `mir::Static` and `mir::StaticKind` - Simplifies `maybe_get_optimized_mir()` and `maybe_get_promoted_mir()` cc @bjorn3 @RalfJung
This commit is contained in:
commit
b6df8276f8
3 changed files with 32 additions and 33 deletions
|
|
@ -1733,6 +1733,10 @@ pub enum PlaceBase<'tcx> {
|
|||
pub struct Static<'tcx> {
|
||||
pub ty: Ty<'tcx>,
|
||||
pub kind: StaticKind<'tcx>,
|
||||
/// The `DefId` of the item this static was declared in. For promoted values, usually, this is
|
||||
/// the same as the `DefId` of the `mir::Body` containing the `Place` this promoted appears in.
|
||||
/// However, after inlining, that might no longer be the case as inlined `Place`s are copied
|
||||
/// into the calling frame.
|
||||
pub def_id: DefId,
|
||||
}
|
||||
|
||||
|
|
@ -1740,6 +1744,9 @@ pub struct Static<'tcx> {
|
|||
Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, HashStable, RustcEncodable, RustcDecodable,
|
||||
)]
|
||||
pub enum StaticKind<'tcx> {
|
||||
/// Promoted references consist of an id (`Promoted`) and the substs necessary to monomorphize
|
||||
/// it. Usually, these substs are just the identity substs for the item. However, the inliner
|
||||
/// will adjust these substs when it inlines a function based on the substs at the callsite.
|
||||
Promoted(Promoted, SubstsRef<'tcx>),
|
||||
Static,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,24 +125,8 @@ provide! { <'tcx> tcx, def_id, other, cdata,
|
|||
bug!("coerce_unsized_info: `{:?}` is missing its info", def_id);
|
||||
})
|
||||
}
|
||||
optimized_mir => {
|
||||
let mir = cdata.maybe_get_optimized_mir(tcx, def_id.index).unwrap_or_else(|| {
|
||||
bug!("get_optimized_mir: missing MIR for `{:?}`", def_id)
|
||||
});
|
||||
|
||||
let mir = tcx.arena.alloc(mir);
|
||||
|
||||
mir
|
||||
}
|
||||
promoted_mir => {
|
||||
let promoted = cdata.maybe_get_promoted_mir(tcx, def_id.index).unwrap_or_else(|| {
|
||||
bug!("get_promoted_mir: missing promoted MIR for `{:?}`", def_id)
|
||||
});
|
||||
|
||||
let promoted = tcx.arena.alloc(promoted);
|
||||
|
||||
promoted
|
||||
}
|
||||
optimized_mir => { tcx.arena.alloc(cdata.get_optimized_mir(tcx, def_id.index)) }
|
||||
promoted_mir => { tcx.arena.alloc(cdata.get_promoted_mir(tcx, def_id.index)) }
|
||||
mir_const_qualif => {
|
||||
(cdata.mir_const_qualif(def_id.index), tcx.arena.alloc(BitSet::new_empty(0)))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -450,11 +450,19 @@ impl<'a, 'tcx> CrateMetadata {
|
|||
pub fn is_proc_macro_crate(&self) -> bool {
|
||||
self.root.proc_macro_decls_static.is_some()
|
||||
}
|
||||
|
||||
fn is_proc_macro(&self, id: DefIndex) -> bool {
|
||||
self.is_proc_macro_crate() &&
|
||||
self.root.proc_macro_data.unwrap().decode(self).find(|x| *x == id).is_some()
|
||||
}
|
||||
|
||||
fn entry_unless_proc_macro(&self, id: DefIndex) -> Option<Entry<'tcx>> {
|
||||
match self.is_proc_macro(id) {
|
||||
true => None,
|
||||
false => Some(self.entry(id)),
|
||||
}
|
||||
}
|
||||
|
||||
fn maybe_entry(&self, item_id: DefIndex) -> Option<Lazy<Entry<'tcx>>> {
|
||||
self.root.entries_index.lookup(self.blob.raw_bytes(), item_id)
|
||||
}
|
||||
|
|
@ -689,10 +697,8 @@ impl<'a, 'tcx> CrateMetadata {
|
|||
}
|
||||
|
||||
pub fn get_deprecation(&self, id: DefIndex) -> Option<attr::Deprecation> {
|
||||
match self.is_proc_macro(id) {
|
||||
true => None,
|
||||
false => self.entry(id).deprecation.map(|depr| depr.decode(self)),
|
||||
}
|
||||
self.entry_unless_proc_macro(id)
|
||||
.and_then(|entry| entry.deprecation.map(|depr| depr.decode(self)))
|
||||
}
|
||||
|
||||
pub fn get_visibility(&self, id: DefIndex) -> ty::Visibility {
|
||||
|
|
@ -902,22 +908,24 @@ impl<'a, 'tcx> CrateMetadata {
|
|||
self.maybe_entry(id).and_then(|item| item.decode(self).mir).is_some()
|
||||
}
|
||||
|
||||
pub fn maybe_get_optimized_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> Option<Body<'tcx>> {
|
||||
match self.is_proc_macro(id) {
|
||||
true => None,
|
||||
false => self.entry(id).mir.map(|mir| mir.decode((self, tcx))),
|
||||
}
|
||||
pub fn get_optimized_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> Body<'tcx> {
|
||||
self.entry_unless_proc_macro(id)
|
||||
.and_then(|entry| entry.mir.map(|mir| mir.decode((self, tcx))))
|
||||
.unwrap_or_else(|| {
|
||||
bug!("get_optimized_mir: missing MIR for `{:?}", self.local_def_id(id))
|
||||
})
|
||||
}
|
||||
|
||||
pub fn maybe_get_promoted_mir(
|
||||
pub fn get_promoted_mir(
|
||||
&self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
id: DefIndex,
|
||||
) -> Option<IndexVec<Promoted, Body<'tcx>>> {
|
||||
match self.is_proc_macro(id) {
|
||||
true => None,
|
||||
false => self.entry(id).promoted_mir.map(|promoted| promoted.decode((self, tcx)),)
|
||||
}
|
||||
) -> IndexVec<Promoted, Body<'tcx>> {
|
||||
self.entry_unless_proc_macro(id)
|
||||
.and_then(|entry| entry.promoted_mir.map(|promoted| promoted.decode((self, tcx))))
|
||||
.unwrap_or_else(|| {
|
||||
bug!("get_promoted_mir: missing MIR for `{:?}`", self.local_def_id(id))
|
||||
})
|
||||
}
|
||||
|
||||
pub fn mir_const_qualif(&self, id: DefIndex) -> u8 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue