Skip to content

Commit c580c49

Browse files
committed
Auto merge of rust-lang#139241 - bvanjoi:less-decoding, r=petrochenkov
don't store opaque info during encoding Now `remapped_ctxts` reserved and let's check the performance. r? `@petrochenkov`
2 parents 5961e5b + 8ae6485 commit c580c49

File tree

4 files changed

+23
-64
lines changed

4 files changed

+23
-64
lines changed

compiler/rustc_metadata/src/rmeta/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ use rustc_serialize::opaque::FileEncoder;
3636
use rustc_session::config::{SymbolManglingVersion, TargetModifier};
3737
use rustc_session::cstore::{CrateDepKind, ForeignModule, LinkagePreference, NativeLib};
3838
use rustc_span::edition::Edition;
39-
use rustc_span::hygiene::{
40-
ExpnIndex, MacroKind, SyntaxContextDataNonRecursive as SyntaxContextData,
41-
};
39+
use rustc_span::hygiene::{ExpnIndex, MacroKind, SyntaxContextKey};
4240
use rustc_span::{self, ExpnData, ExpnHash, ExpnId, Ident, Span, Symbol};
4341
use rustc_target::spec::{PanicStrategy, TargetTuple};
4442
use table::TableBuilder;
@@ -195,7 +193,7 @@ enum LazyState {
195193
Previous(NonZero<usize>),
196194
}
197195

198-
type SyntaxContextTable = LazyTable<u32, Option<LazyValue<SyntaxContextData>>>;
196+
type SyntaxContextTable = LazyTable<u32, Option<LazyValue<SyntaxContextKey>>>;
199197
type ExpnDataTable = LazyTable<ExpnIndex, Option<LazyValue<ExpnData>>>;
200198
type ExpnHashTable = LazyTable<ExpnIndex, Option<LazyValue<ExpnHash>>>;
201199

compiler/rustc_middle/src/query/on_disk_cache.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ use rustc_serialize::opaque::{FileEncodeResult, FileEncoder, IntEncodedWithFixed
1616
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
1717
use rustc_session::Session;
1818
use rustc_span::hygiene::{
19-
ExpnId, HygieneDecodeContext, HygieneEncodeContext, SyntaxContext,
20-
SyntaxContextDataNonRecursive as SyntaxContextData,
19+
ExpnId, HygieneDecodeContext, HygieneEncodeContext, SyntaxContext, SyntaxContextKey,
2120
};
2221
use rustc_span::source_map::Spanned;
2322
use rustc_span::{
@@ -567,7 +566,7 @@ impl<'a, 'tcx> SpanDecoder for CacheDecoder<'a, 'tcx> {
567566
// We look up the position of the associated `SyntaxData` and decode it.
568567
let pos = syntax_contexts.get(&id).unwrap();
569568
this.with_position(pos.to_usize(), |decoder| {
570-
let data: SyntaxContextData = decode_tagged(decoder, TAG_SYNTAX_CONTEXT);
569+
let data: SyntaxContextKey = decode_tagged(decoder, TAG_SYNTAX_CONTEXT);
571570
data
572571
})
573572
})

compiler/rustc_middle/src/ty/parameterized.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ trivially_parameterized_over_tcx! {
113113
rustc_span::Span,
114114
rustc_span::Symbol,
115115
rustc_span::def_id::DefPathHash,
116-
rustc_span::hygiene::SyntaxContextDataNonRecursive,
116+
rustc_span::hygiene::SyntaxContextKey,
117117
rustc_span::Ident,
118118
rustc_type_ir::Variance,
119119
rustc_hir::Attribute,

compiler/rustc_span/src/hygiene.rs

+18-56
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl !PartialOrd for SyntaxContext {}
5656

5757
/// If this part of two syntax contexts is equal, then the whole syntax contexts should be equal.
5858
/// The other fields are only for caching.
59-
type SyntaxContextKey = (SyntaxContext, ExpnId, Transparency);
59+
pub type SyntaxContextKey = (SyntaxContext, ExpnId, Transparency);
6060

6161
#[derive(Clone, Copy, Debug)]
6262
struct SyntaxContextData {
@@ -71,17 +71,6 @@ struct SyntaxContextData {
7171
dollar_crate_name: Symbol,
7272
}
7373

74-
/// Same as `SyntaxContextData`, but `opaque(_and_semitransparent)` cannot be recursive
75-
/// and use `None` if they need to refer to self. Used for encoding and decoding metadata.
76-
#[derive(Encodable, Decodable)]
77-
pub struct SyntaxContextDataNonRecursive {
78-
outer_expn: ExpnId,
79-
outer_transparency: Transparency,
80-
parent: SyntaxContext,
81-
opaque: Option<SyntaxContext>,
82-
opaque_and_semitransparent: Option<SyntaxContext>,
83-
}
84-
8574
impl SyntaxContextData {
8675
fn new(
8776
(parent, outer_expn, outer_transparency): SyntaxContextKey,
@@ -122,19 +111,6 @@ impl SyntaxContextData {
122111
}
123112
}
124113

125-
impl SyntaxContextDataNonRecursive {
126-
fn recursive(&self, ctxt: SyntaxContext) -> SyntaxContextData {
127-
SyntaxContextData {
128-
outer_expn: self.outer_expn,
129-
outer_transparency: self.outer_transparency,
130-
parent: self.parent,
131-
opaque: self.opaque.unwrap_or(ctxt),
132-
opaque_and_semitransparent: self.opaque_and_semitransparent.unwrap_or(ctxt),
133-
dollar_crate_name: kw::DollarCrate,
134-
}
135-
}
136-
}
137-
138114
rustc_index::newtype_index! {
139115
/// A unique ID associated with a macro invocation and expansion.
140116
#[orderable]
@@ -658,19 +634,6 @@ impl HygieneData {
658634
SyntaxContextData::new(key, opaque, opaque_and_semitransparent);
659635
ctxt
660636
}
661-
662-
fn non_recursive_ctxt(&self, ctxt: SyntaxContext) -> SyntaxContextDataNonRecursive {
663-
debug_assert!(!self.syntax_context_data[ctxt.0 as usize].is_decode_placeholder());
664-
let data = &self.syntax_context_data[ctxt.0 as usize];
665-
SyntaxContextDataNonRecursive {
666-
outer_expn: data.outer_expn,
667-
outer_transparency: data.outer_transparency,
668-
parent: data.parent,
669-
opaque: (data.opaque != ctxt).then_some(data.opaque),
670-
opaque_and_semitransparent: (data.opaque_and_semitransparent != ctxt)
671-
.then_some(data.opaque_and_semitransparent),
672-
}
673-
}
674637
}
675638

676639
pub fn walk_chain(span: Span, to: SyntaxContext) -> Span {
@@ -1300,7 +1263,7 @@ impl HygieneEncodeContext {
13001263
pub fn encode<T>(
13011264
&self,
13021265
encoder: &mut T,
1303-
mut encode_ctxt: impl FnMut(&mut T, u32, &SyntaxContextDataNonRecursive),
1266+
mut encode_ctxt: impl FnMut(&mut T, u32, &SyntaxContextKey),
13041267
mut encode_expn: impl FnMut(&mut T, ExpnId, &ExpnData, ExpnHash),
13051268
) {
13061269
// When we serialize a `SyntaxContextData`, we may end up serializing
@@ -1425,10 +1388,7 @@ pub fn decode_expn_id(
14251388
// to track which `SyntaxContext`s we have already decoded.
14261389
// The provided closure will be invoked to deserialize a `SyntaxContextData`
14271390
// if we haven't already seen the id of the `SyntaxContext` we are deserializing.
1428-
pub fn decode_syntax_context<
1429-
D: Decoder,
1430-
F: FnOnce(&mut D, u32) -> SyntaxContextDataNonRecursive,
1431-
>(
1391+
pub fn decode_syntax_context<D: Decoder, F: FnOnce(&mut D, u32) -> SyntaxContextKey>(
14321392
d: &mut D,
14331393
context: &HygieneDecodeContext,
14341394
decode_data: F,
@@ -1450,16 +1410,9 @@ pub fn decode_syntax_context<
14501410

14511411
// Don't try to decode data while holding the lock, since we need to
14521412
// be able to recursively decode a SyntaxContext
1453-
let ctxt_data = decode_data(d, raw_id);
1454-
1455-
let ctxt = HygieneData::with(|hygiene_data| {
1456-
let ctxt_key = (ctxt_data.parent, ctxt_data.outer_expn, ctxt_data.outer_transparency);
1457-
*hygiene_data.syntax_context_map.entry(ctxt_key).or_insert_with(|| {
1458-
let ctxt = SyntaxContext::from_usize(hygiene_data.syntax_context_data.len());
1459-
hygiene_data.syntax_context_data.push(ctxt_data.recursive(ctxt));
1460-
ctxt
1461-
})
1462-
});
1413+
let (parent, expn_id, transparency) = decode_data(d, raw_id);
1414+
let ctxt =
1415+
HygieneData::with(|hygiene_data| hygiene_data.alloc_ctxt(parent, expn_id, transparency));
14631416

14641417
let mut inner = context.inner.lock();
14651418
let new_len = raw_id as usize + 1;
@@ -1471,12 +1424,21 @@ pub fn decode_syntax_context<
14711424
ctxt
14721425
}
14731426

1474-
fn for_all_ctxts_in<F: FnMut(u32, SyntaxContext, &SyntaxContextDataNonRecursive)>(
1427+
fn for_all_ctxts_in<F: FnMut(u32, SyntaxContext, &SyntaxContextKey)>(
14751428
ctxts: impl Iterator<Item = SyntaxContext>,
14761429
mut f: F,
14771430
) {
1478-
let all_data: Vec<_> =
1479-
HygieneData::with(|data| ctxts.map(|ctxt| (ctxt, data.non_recursive_ctxt(ctxt))).collect());
1431+
let all_data: Vec<_> = HygieneData::with(|data| {
1432+
ctxts
1433+
.map(|ctxt| {
1434+
(ctxt, {
1435+
let item = data.syntax_context_data[ctxt.0 as usize];
1436+
debug_assert!(!item.is_decode_placeholder());
1437+
item.key()
1438+
})
1439+
})
1440+
.collect()
1441+
});
14801442
for (ctxt, data) in all_data.into_iter() {
14811443
f(ctxt.0, ctxt, &data);
14821444
}

0 commit comments

Comments
 (0)