Skip to content

Commit 6b17a76

Browse files
committed
metadata: store is_trivial_mir using a ()
1 parent c9c966e commit 6b17a76

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

compiler/rustc_metadata/src/rmeta/decoder.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -1195,13 +1195,8 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
11951195
}
11961196
}
11971197

1198-
fn get_is_trivial_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> bool {
1199-
self.root
1200-
.tables
1201-
.is_trivial_mir
1202-
.get(self, id)
1203-
.filter(|_| !self.is_proc_macro(id))
1204-
.map_or(false, |v| v.decode((self, tcx)))
1198+
fn get_is_trivial_mir(&self, id: DefIndex) -> bool {
1199+
self.root.tables.is_trivial_mir.get(self, id).filter(|_| !self.is_proc_macro(id)).is_some()
12051200
}
12061201

12071202
fn get_optimized_mir(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> Body<'tcx> {

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ provide! { <'tcx> tcx, def_id, other, cdata,
111111
bug!("coerce_unsized_info: `{:?}` is missing its info", def_id);
112112
})
113113
}
114-
is_trivial_mir => { cdata.get_is_trivial_mir(tcx, def_id.index) }
114+
is_trivial_mir => { cdata.get_is_trivial_mir(def_id.index) }
115115
optimized_mir => { tcx.arena.alloc(cdata.get_optimized_mir(tcx, def_id.index)) }
116116
promoted_mir => { tcx.arena.alloc(cdata.get_promoted_mir(tcx, def_id.index)) }
117117
mir_abstract_const => { cdata.get_mir_abstract_const(tcx, def_id.index) }

compiler/rustc_metadata/src/rmeta/encoder.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,9 @@ impl EncodeContext<'a, 'tcx> {
11611161
debug!("EntryBuilder::encode_mir({:?})", def_id);
11621162
if self.tcx.mir_keys(LOCAL_CRATE).contains(&def_id) {
11631163
if self.tcx.is_trivial_mir(def_id) {
1164-
record!(self.tables.is_trivial_mir[def_id.to_def_id()] <- true);
1164+
// We don't store anything if `is_trivial_mir` is `false`
1165+
// so we can use a unit type here.
1166+
self.tables.is_trivial_mir.set(def_id.local_def_index, ());
11651167
}
11661168

11671169
record!(self.tables.mir[def_id.to_def_id()] <- self.tcx.optimized_mir(def_id));

compiler/rustc_metadata/src/rmeta/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ define_tables! {
300300
super_predicates: Table<DefIndex, Lazy!(ty::GenericPredicates<'tcx>)>,
301301
// As an optimization, a missing entry indicates an empty `&[]`.
302302
explicit_item_bounds: Table<DefIndex, Lazy!([(ty::Predicate<'tcx>, Span)])>,
303-
is_trivial_mir: Table<DefIndex, Lazy<bool>>,
303+
is_trivial_mir: Table<DefIndex, ()>,
304304
mir: Table<DefIndex, Lazy!(mir::Body<'tcx>)>,
305305
promoted_mir: Table<DefIndex, Lazy!(IndexVec<mir::Promoted, mir::Body<'tcx>>)>,
306306
mir_abstract_consts: Table<DefIndex, Lazy!(&'tcx [mir::abstract_const::Node<'tcx>])>,

compiler/rustc_metadata/src/rmeta/table.rs

+25-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_index::vec::Idx;
44
use rustc_serialize::opaque::Encoder;
55
use std::convert::TryInto;
66
use std::marker::PhantomData;
7-
use std::num::NonZeroUsize;
7+
use std::num::{NonZeroU8, NonZeroUsize};
88
use tracing::debug;
99

1010
/// Helper trait, for encoding to, and decoding from, a fixed number of bytes.
@@ -75,6 +75,30 @@ impl FixedSizeEncoding for u32 {
7575
}
7676
}
7777

78+
impl FixedSizeEncoding for Option<NonZeroU8> {
79+
fixed_size_encoding_byte_len_and_defaults!(1);
80+
81+
fn from_bytes(b: &[u8]) -> Self {
82+
NonZeroU8::new(b[0])
83+
}
84+
85+
fn write_to_bytes(self, b: &mut [u8]) {
86+
b[0] = self.map_or(0, |x| x.get());
87+
}
88+
}
89+
90+
impl FixedSizeEncoding for Option<()> {
91+
fixed_size_encoding_byte_len_and_defaults!(Option::<NonZeroU8>::BYTE_LEN);
92+
93+
fn from_bytes(b: &[u8]) -> Self {
94+
Option::<NonZeroU8>::from_bytes(b).map(|_| ())
95+
}
96+
97+
fn write_to_bytes(self, b: &mut [u8]) {
98+
self.map(|()| NonZeroU8::new(1).unwrap()).write_to_bytes(b)
99+
}
100+
}
101+
78102
// NOTE(eddyb) there could be an impl for `usize`, which would enable a more
79103
// generic `Lazy<T>` impl, but in the general case we might not need / want to
80104
// fit every `usize` in `u32`.

0 commit comments

Comments
 (0)