1use std::iter::TrustedLen;
4use std::ops::{Deref, DerefMut};
5use std::path::{Path, PathBuf};
6use std::sync::{Arc, OnceLock};
7use std::{io, mem};
8
9pub(super) use cstore_impl::provide;
10use rustc_ast as ast;
11use rustc_data_structures::fingerprint::Fingerprint;
12use rustc_data_structures::fx::FxIndexMap;
13use rustc_data_structures::owned_slice::OwnedSlice;
14use rustc_data_structures::sync::Lock;
15use rustc_data_structures::unhash::UnhashMap;
16use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
17use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, DeriveProcMacro};
18use rustc_hir::Safety;
19use rustc_hir::def::Res;
20use rustc_hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE};
21use rustc_hir::definitions::{DefPath, DefPathData};
22use rustc_hir::diagnostic_items::DiagnosticItems;
23use rustc_index::Idx;
24use rustc_middle::middle::lib_features::LibFeatures;
25use rustc_middle::mir::interpret::{AllocDecodingSession, AllocDecodingState};
26use rustc_middle::ty::Visibility;
27use rustc_middle::ty::codec::TyDecoder;
28use rustc_middle::{bug, implement_ty_decoder};
29use rustc_proc_macro::bridge::client::Client as ProcMacroClient;
30use rustc_serialize::opaque::MemDecoder;
31use rustc_serialize::{Decodable, Decoder};
32use rustc_session::config::TargetModifier;
33use rustc_session::config::mitigation_coverage::DeniedPartialMitigation;
34use rustc_session::cstore::{CrateSource, ExternCrate};
35use rustc_span::hygiene::HygieneDecodeContext;
36use rustc_span::{
37 BlobDecoder, BytePos, ByteSymbol, DUMMY_SP, Pos, RemapPathScopeComponents, SpanData,
38 SpanDecoder, Symbol, SyntaxContext, kw,
39};
40use tracing::debug;
41
42use crate::creader::CStore;
43use crate::eii::EiiMapEncodedKeyValue;
44use crate::rmeta::table::IsDefault;
45use crate::rmeta::*;
46
47mod cstore_impl;
48
49pub(crate) struct MetadataBlob(OwnedSlice);
53
54impl std::ops::Deref for MetadataBlob {
55 type Target = [u8];
56
57 #[inline]
58 fn deref(&self) -> &[u8] {
59 &self.0[..]
60 }
61}
62
63impl MetadataBlob {
64 pub(crate) fn new(slice: OwnedSlice) -> Result<Self, ()> {
66 if MemDecoder::new(&slice, 0).is_ok() { Ok(Self(slice)) } else { Err(()) }
67 }
68
69 pub(crate) fn bytes(&self) -> &OwnedSlice {
72 &self.0
73 }
74}
75
76pub(crate) type CrateNumMap = IndexVec<CrateNum, CrateNum>;
81
82pub(crate) type TargetModifiers = Vec<TargetModifier>;
85
86pub(crate) type DeniedPartialMitigations = Vec<DeniedPartialMitigation>;
90
91pub(crate) struct CrateMetadata {
92 blob: MetadataBlob,
94
95 root: CrateRoot,
98 trait_impls: FxIndexMap<(u32, DefIndex), LazyArray<(DefIndex, Option<SimplifiedType>)>>,
102 incoherent_impls: FxIndexMap<SimplifiedType, LazyArray<DefIndex>>,
107 raw_proc_macros: Option<&'static [ProcMacroClient]>,
109 source_map_import_info: Lock<Vec<Option<ImportedSourceFile>>>,
111 def_path_hash_map: DefPathHashMapRef<'static>,
113 expn_hash_map: OnceLock<UnhashMap<ExpnHash, ExpnIndex>>,
115 alloc_decoding_state: AllocDecodingState,
117 def_key_cache: Lock<FxHashMap<DefIndex, DefKey>>,
119
120 cnum: CrateNum,
123 cnum_map: CrateNumMap,
126 dep_kind: CrateDepKind,
128 source: Arc<CrateSource>,
130 private_dep: bool,
134 host_hash: Option<Svh>,
136 used: bool,
138
139 hygiene_context: HygieneDecodeContext,
145
146 extern_crate: Option<ExternCrate>,
150}
151
152#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImportedSourceFile {
#[inline]
fn clone(&self) -> ImportedSourceFile {
ImportedSourceFile {
original_start_pos: ::core::clone::Clone::clone(&self.original_start_pos),
original_end_pos: ::core::clone::Clone::clone(&self.original_end_pos),
translated_source_file: ::core::clone::Clone::clone(&self.translated_source_file),
}
}
}Clone)]
155struct ImportedSourceFile {
156 original_start_pos: rustc_span::BytePos,
158 original_end_pos: rustc_span::BytePos,
160 translated_source_file: Arc<rustc_span::SourceFile>,
162}
163
164pub(super) struct BlobDecodeContext<'a> {
168 opaque: MemDecoder<'a>,
169 blob: &'a MetadataBlob,
170 lazy_state: LazyState,
171}
172
173pub(super) trait LazyDecoder: BlobDecoder {
179 fn set_lazy_state(&mut self, state: LazyState);
180 fn get_lazy_state(&self) -> LazyState;
181
182 fn read_lazy<T>(&mut self) -> LazyValue<T> {
183 self.read_lazy_offset_then(|pos| LazyValue::from_position(pos))
184 }
185
186 fn read_lazy_array<T>(&mut self, len: usize) -> LazyArray<T> {
187 self.read_lazy_offset_then(|pos| LazyArray::from_position_and_num_elems(pos, len))
188 }
189
190 fn read_lazy_table<I, T>(&mut self, width: usize, len: usize) -> LazyTable<I, T> {
191 self.read_lazy_offset_then(|pos| LazyTable::from_position_and_encoded_size(pos, width, len))
192 }
193
194 #[inline]
195 fn read_lazy_offset_then<T>(&mut self, f: impl Fn(NonZero<usize>) -> T) -> T {
196 let distance = self.read_usize();
197 let position = match self.get_lazy_state() {
198 LazyState::NoNode => ::rustc_middle::util::bug::bug_fmt(format_args!("read_lazy_with_meta: outside of a metadata node"))bug!("read_lazy_with_meta: outside of a metadata node"),
199 LazyState::NodeStart(start) => {
200 let start = start.get();
201 if !(distance <= start) {
::core::panicking::panic("assertion failed: distance <= start")
};assert!(distance <= start);
202 start - distance
203 }
204 LazyState::Previous(last_pos) => last_pos.get() + distance,
205 };
206 let position = NonZero::new(position).unwrap();
207 self.set_lazy_state(LazyState::Previous(position));
208 f(position)
209 }
210}
211
212impl<'a> LazyDecoder for BlobDecodeContext<'a> {
213 fn set_lazy_state(&mut self, state: LazyState) {
214 self.lazy_state = state;
215 }
216
217 fn get_lazy_state(&self) -> LazyState {
218 self.lazy_state
219 }
220}
221
222pub(super) struct MetadataDecodeContext<'a, 'tcx> {
227 blob_decoder: BlobDecodeContext<'a>,
228 cdata: &'a CrateMetadata,
229 tcx: TyCtxt<'tcx>,
230
231 alloc_decoding_session: AllocDecodingSession<'a>,
233}
234
235impl<'a, 'tcx> LazyDecoder for MetadataDecodeContext<'a, 'tcx> {
236 fn set_lazy_state(&mut self, state: LazyState) {
237 self.lazy_state = state;
238 }
239
240 fn get_lazy_state(&self) -> LazyState {
241 self.lazy_state
242 }
243}
244
245impl<'a, 'tcx> DerefMut for MetadataDecodeContext<'a, 'tcx> {
246 fn deref_mut(&mut self) -> &mut Self::Target {
247 &mut self.blob_decoder
248 }
249}
250
251impl<'a, 'tcx> Deref for MetadataDecodeContext<'a, 'tcx> {
252 type Target = BlobDecodeContext<'a>;
253
254 fn deref(&self) -> &Self::Target {
255 &self.blob_decoder
256 }
257}
258
259pub(super) trait MetaBlob<'a>: Copy {
260 fn blob(&self) -> &'a MetadataBlob;
261}
262
263pub(super) trait MetaDecoder: Copy {
264 type Context: BlobDecoder + LazyDecoder;
265
266 fn decoder(self, pos: usize) -> Self::Context;
267}
268
269impl<'a> MetaBlob<'a> for &'a MetadataBlob {
270 fn blob(&self) -> &'a MetadataBlob {
271 self
272 }
273}
274
275impl<'a> MetaDecoder for &'a MetadataBlob {
276 type Context = BlobDecodeContext<'a>;
277
278 fn decoder(self, pos: usize) -> Self::Context {
279 BlobDecodeContext {
280 opaque: MemDecoder::new(self, pos).unwrap(),
288 lazy_state: LazyState::NoNode,
289 blob: self.blob(),
290 }
291 }
292}
293
294impl<'a> MetaBlob<'a> for &'a CrateMetadata {
295 fn blob(&self) -> &'a MetadataBlob {
296 &self.blob
297 }
298}
299
300impl<'a, 'tcx> MetaDecoder for (&'a CrateMetadata, TyCtxt<'tcx>) {
301 type Context = MetadataDecodeContext<'a, 'tcx>;
302
303 fn decoder(self, pos: usize) -> MetadataDecodeContext<'a, 'tcx> {
304 MetadataDecodeContext {
305 blob_decoder: self.0.blob().decoder(pos),
306 cdata: self.0,
307 tcx: self.1,
308 alloc_decoding_session: self.0.alloc_decoding_state.new_decoding_session(),
309 }
310 }
311}
312
313impl<T: ParameterizedOverTcx> LazyValue<T> {
314 #[inline]
315 fn decode<'tcx, M: MetaDecoder>(self, metadata: M) -> T::Value<'tcx>
316 where
317 T::Value<'tcx>: Decodable<M::Context>,
318 {
319 let mut dcx = metadata.decoder(self.position.get());
320 dcx.set_lazy_state(LazyState::NodeStart(self.position));
321 T::Value::decode(&mut dcx)
322 }
323}
324
325struct DecodeIterator<T, D> {
326 elem_counter: std::ops::Range<usize>,
327 dcx: D,
328 _phantom: PhantomData<fn() -> T>,
329}
330
331impl<D: Decoder, T: Decodable<D>> Iterator for DecodeIterator<T, D> {
332 type Item = T;
333
334 #[inline(always)]
335 fn next(&mut self) -> Option<Self::Item> {
336 self.elem_counter.next().map(|_| T::decode(&mut self.dcx))
337 }
338
339 #[inline(always)]
340 fn size_hint(&self) -> (usize, Option<usize>) {
341 self.elem_counter.size_hint()
342 }
343}
344
345impl<D: Decoder, T: Decodable<D>> ExactSizeIterator for DecodeIterator<T, D> {
346 fn len(&self) -> usize {
347 self.elem_counter.len()
348 }
349}
350
351unsafe impl<D: Decoder, T: Decodable<D>> TrustedLen for DecodeIterator<T, D> {}
352
353impl<T: ParameterizedOverTcx> LazyArray<T> {
354 #[inline]
355 fn decode<'tcx, M: MetaDecoder>(self, metadata: M) -> DecodeIterator<T::Value<'tcx>, M::Context>
356 where
357 T::Value<'tcx>: Decodable<M::Context>,
358 {
359 let mut dcx = metadata.decoder(self.position.get());
360 dcx.set_lazy_state(LazyState::NodeStart(self.position));
361 DecodeIterator { elem_counter: (0..self.num_elems), dcx, _phantom: PhantomData }
362 }
363}
364
365impl<'a, 'tcx> MetadataDecodeContext<'a, 'tcx> {
366 #[inline]
367 fn map_encoded_cnum_to_current(&self, cnum: CrateNum) -> CrateNum {
368 self.cdata.map_encoded_cnum_to_current(cnum)
369 }
370}
371
372impl<'a> BlobDecodeContext<'a> {
373 #[inline]
374 pub(crate) fn blob(&self) -> &'a MetadataBlob {
375 self.blob
376 }
377
378 fn decode_symbol_or_byte_symbol<S>(
379 &mut self,
380 new_from_index: impl Fn(u32) -> S,
381 read_and_intern_str_or_byte_str_this: impl Fn(&mut Self) -> S,
382 read_and_intern_str_or_byte_str_opaque: impl Fn(&mut MemDecoder<'a>) -> S,
383 ) -> S {
384 let tag = self.read_u8();
385
386 match tag {
387 SYMBOL_STR => read_and_intern_str_or_byte_str_this(self),
388 SYMBOL_OFFSET => {
389 let pos = self.read_usize();
391
392 self.opaque.with_position(pos, |d| read_and_intern_str_or_byte_str_opaque(d))
394 }
395 SYMBOL_PREDEFINED => new_from_index(self.read_u32()),
396 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
397 }
398 }
399}
400
401impl<'a, 'tcx> TyDecoder<'tcx> for MetadataDecodeContext<'a, 'tcx> {
402 const CLEAR_CROSS_CRATE: bool = true;
403
404 #[inline]
405 fn interner(&self) -> TyCtxt<'tcx> {
406 self.tcx
407 }
408
409 fn cached_ty_for_shorthand<F>(&mut self, shorthand: usize, or_insert_with: F) -> Ty<'tcx>
410 where
411 F: FnOnce(&mut Self) -> Ty<'tcx>,
412 {
413 let tcx = self.tcx;
414
415 let key = ty::CReaderCacheKey { cnum: Some(self.cdata.cnum), pos: shorthand };
416
417 if let Some(&ty) = tcx.ty_rcache.borrow().get(&key) {
418 return ty;
419 }
420
421 let ty = or_insert_with(self);
422 tcx.ty_rcache.borrow_mut().insert(key, ty);
423 ty
424 }
425
426 fn with_position<F, R>(&mut self, pos: usize, f: F) -> R
427 where
428 F: FnOnce(&mut Self) -> R,
429 {
430 let new_opaque = self.blob_decoder.opaque.split_at(pos);
431 let old_opaque = mem::replace(&mut self.blob_decoder.opaque, new_opaque);
432 let old_state = mem::replace(&mut self.blob_decoder.lazy_state, LazyState::NoNode);
433 let r = f(self);
434 self.blob_decoder.opaque = old_opaque;
435 self.blob_decoder.lazy_state = old_state;
436 r
437 }
438
439 fn decode_alloc_id(&mut self) -> rustc_middle::mir::interpret::AllocId {
440 let ads = self.alloc_decoding_session;
441 ads.decode_alloc_id(self)
442 }
443}
444
445impl<'a, 'tcx> Decodable<MetadataDecodeContext<'a, 'tcx>> for ExpnIndex {
446 #[inline]
447 fn decode(d: &mut MetadataDecodeContext<'a, 'tcx>) -> ExpnIndex {
448 ExpnIndex::from_u32(d.read_u32())
449 }
450}
451
452impl<'a, 'tcx> SpanDecoder for MetadataDecodeContext<'a, 'tcx> {
453 fn decode_attr_id(&mut self) -> rustc_span::AttrId {
454 self.tcx.sess.psess.attr_id_generator.mk_attr_id()
455 }
456
457 fn decode_crate_num(&mut self) -> CrateNum {
458 let cnum = CrateNum::from_u32(self.read_u32());
459 self.map_encoded_cnum_to_current(cnum)
460 }
461
462 fn decode_def_id(&mut self) -> DefId {
463 DefId { krate: Decodable::decode(self), index: Decodable::decode(self) }
464 }
465
466 fn decode_syntax_context(&mut self) -> SyntaxContext {
467 let cdata = self.cdata;
468 let tcx = self.tcx;
469
470 let cname = cdata.root.name();
471 rustc_span::hygiene::decode_syntax_context(self, &cdata.hygiene_context, |_, id| {
472 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:472",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(472u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("SpecializedDecoder<SyntaxContext>: decoding {0}",
id) as &dyn Value))])
});
} else { ; }
};debug!("SpecializedDecoder<SyntaxContext>: decoding {}", id);
473 cdata
474 .root
475 .syntax_contexts
476 .get(cdata, id)
477 .unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("Missing SyntaxContext {0:?} for crate {1:?}",
id, cname));
}panic!("Missing SyntaxContext {id:?} for crate {cname:?}"))
478 .decode((cdata, tcx))
479 })
480 }
481
482 fn decode_expn_id(&mut self) -> ExpnId {
483 let tcx = self.tcx;
484 let cnum = CrateNum::decode(self);
485 let index = u32::decode(self);
486
487 let expn_id = rustc_span::hygiene::decode_expn_id(cnum, index, |expn_id| {
488 let ExpnId { krate: cnum, local_id: index } = expn_id;
489 if true {
match (&cnum, &LOCAL_CRATE) {
(left_val, right_val) => {
if *left_val == *right_val {
let kind = ::core::panicking::AssertKind::Ne;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
};
};debug_assert_ne!(cnum, LOCAL_CRATE);
492 let cstore;
493 let cdata = if cnum == self.cdata.cnum {
494 self.cdata
495 } else {
496 cstore = CStore::from_tcx(tcx);
497 cstore.get_crate_data(cnum)
498 };
499 let expn_data = cdata.root.expn_data.get(cdata, index).unwrap().decode((cdata, tcx));
500 let expn_hash = cdata.root.expn_hashes.get(cdata, index).unwrap().decode((cdata, tcx));
501 (expn_data, expn_hash)
502 });
503 expn_id
504 }
505
506 fn decode_span(&mut self) -> Span {
507 let start = self.position();
508 let tag = SpanTag(self.peek_byte());
509 let data = if tag.kind() == SpanKind::Indirect {
510 self.read_u8();
512 let bytes_needed = tag.length().unwrap().0 as usize;
514 let mut total = [0u8; usize::BITS as usize / 8];
515 total[..bytes_needed].copy_from_slice(self.read_raw_bytes(bytes_needed));
516 let offset_or_position = usize::from_le_bytes(total);
517 let position = if tag.is_relative_offset() {
518 start - offset_or_position
519 } else {
520 offset_or_position
521 };
522 self.with_position(position, SpanData::decode)
523 } else {
524 SpanData::decode(self)
525 };
526 data.span()
527 }
528}
529
530impl<'a, 'tcx> BlobDecoder for MetadataDecodeContext<'a, 'tcx> {
531 fn decode_def_index(&mut self) -> DefIndex {
532 self.blob_decoder.decode_def_index()
533 }
534 fn decode_symbol(&mut self) -> Symbol {
535 self.blob_decoder.decode_symbol()
536 }
537
538 fn decode_byte_symbol(&mut self) -> ByteSymbol {
539 self.blob_decoder.decode_byte_symbol()
540 }
541}
542
543impl<'a> BlobDecoder for BlobDecodeContext<'a> {
544 fn decode_def_index(&mut self) -> DefIndex {
545 DefIndex::from_u32(self.read_u32())
546 }
547 fn decode_symbol(&mut self) -> Symbol {
548 self.decode_symbol_or_byte_symbol(
549 Symbol::new,
550 |this| Symbol::intern(this.read_str()),
551 |opaque| Symbol::intern(opaque.read_str()),
552 )
553 }
554
555 fn decode_byte_symbol(&mut self) -> ByteSymbol {
556 self.decode_symbol_or_byte_symbol(
557 ByteSymbol::new,
558 |this| ByteSymbol::intern(this.read_byte_str()),
559 |opaque| ByteSymbol::intern(opaque.read_byte_str()),
560 )
561 }
562}
563
564impl<'a, 'tcx> Decodable<MetadataDecodeContext<'a, 'tcx>> for SpanData {
565 fn decode(decoder: &mut MetadataDecodeContext<'a, 'tcx>) -> SpanData {
566 let tag = SpanTag::decode(decoder);
567 let ctxt = tag.context().unwrap_or_else(|| SyntaxContext::decode(decoder));
568
569 if tag.kind() == SpanKind::Partial {
570 return DUMMY_SP.with_ctxt(ctxt).data();
571 }
572
573 if true {
if !(tag.kind() == SpanKind::Local || tag.kind() == SpanKind::Foreign) {
::core::panicking::panic("assertion failed: tag.kind() == SpanKind::Local || tag.kind() == SpanKind::Foreign")
};
};debug_assert!(tag.kind() == SpanKind::Local || tag.kind() == SpanKind::Foreign);
574
575 let lo = BytePos::decode(decoder);
576 let len = tag.length().unwrap_or_else(|| BytePos::decode(decoder));
577 let hi = lo + len;
578
579 let tcx = decoder.tcx;
580
581 let metadata_index = u32::decode(decoder);
583
584 let source_file = if tag.kind() == SpanKind::Local {
613 decoder.cdata.imported_source_file(tcx, metadata_index)
614 } else {
615 if decoder.cdata.root.is_proc_macro_crate() {
618 let cnum = u32::decode(decoder);
621 {
::core::panicking::panic_fmt(format_args!("Decoding of crate {0:?} tried to access proc-macro dep {1:?}",
decoder.cdata.root.header.name, cnum));
};panic!(
622 "Decoding of crate {:?} tried to access proc-macro dep {:?}",
623 decoder.cdata.root.header.name, cnum
624 );
625 }
626 let cnum = CrateNum::decode(decoder);
628 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:628",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(628u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("SpecializedDecoder<Span>::specialized_decode: loading source files from cnum {0:?}",
cnum) as &dyn Value))])
});
} else { ; }
};debug!(
629 "SpecializedDecoder<Span>::specialized_decode: loading source files from cnum {:?}",
630 cnum
631 );
632
633 let cstore = CStore::from_tcx(tcx);
634 let foreign_cdata = cstore.get_crate_data(cnum);
635 foreign_cdata.imported_source_file(tcx, metadata_index)
636 };
637
638 if true {
if !(lo + source_file.original_start_pos <= source_file.original_end_pos)
{
{
::core::panicking::panic_fmt(format_args!("Malformed encoded span: lo={0:?} source_file.original_start_pos={1:?} source_file.original_end_pos={2:?}",
lo, source_file.original_start_pos,
source_file.original_end_pos));
}
};
};debug_assert!(
640 lo + source_file.original_start_pos <= source_file.original_end_pos,
641 "Malformed encoded span: lo={:?} source_file.original_start_pos={:?} source_file.original_end_pos={:?}",
642 lo,
643 source_file.original_start_pos,
644 source_file.original_end_pos
645 );
646
647 if true {
if !(hi + source_file.original_start_pos <= source_file.original_end_pos)
{
{
::core::panicking::panic_fmt(format_args!("Malformed encoded span: hi={0:?} source_file.original_start_pos={1:?} source_file.original_end_pos={2:?}",
hi, source_file.original_start_pos,
source_file.original_end_pos));
}
};
};debug_assert!(
649 hi + source_file.original_start_pos <= source_file.original_end_pos,
650 "Malformed encoded span: hi={:?} source_file.original_start_pos={:?} source_file.original_end_pos={:?}",
651 hi,
652 source_file.original_start_pos,
653 source_file.original_end_pos
654 );
655
656 let lo = lo + source_file.translated_source_file.start_pos;
657 let hi = hi + source_file.translated_source_file.start_pos;
658
659 SpanData { lo, hi, ctxt, parent: None }
661 }
662}
663
664impl<'a, 'tcx> Decodable<MetadataDecodeContext<'a, 'tcx>> for &'tcx [(ty::Clause<'tcx>, Span)] {
665 fn decode(d: &mut MetadataDecodeContext<'a, 'tcx>) -> Self {
666 ty::codec::RefDecodable::decode(d)
667 }
668}
669
670impl<D: LazyDecoder, T> Decodable<D> for LazyValue<T> {
671 fn decode(decoder: &mut D) -> Self {
672 decoder.read_lazy()
673 }
674}
675
676impl<D: LazyDecoder, T> Decodable<D> for LazyArray<T> {
677 #[inline]
678 fn decode(decoder: &mut D) -> Self {
679 let len = decoder.read_usize();
680 if len == 0 { LazyArray::default() } else { decoder.read_lazy_array(len) }
681 }
682}
683
684impl<I: Idx, D: LazyDecoder, T> Decodable<D> for LazyTable<I, T> {
685 fn decode(decoder: &mut D) -> Self {
686 let width = decoder.read_usize();
687 let len = decoder.read_usize();
688 decoder.read_lazy_table(width, len)
689 }
690}
691
692mod meta {
693 use super::*;
694 mod __ty_decoder_impl {
use rustc_serialize::Decoder;
use super::MetadataDecodeContext;
impl<'a, 'tcx> Decoder for MetadataDecodeContext<'a, 'tcx> {
#[inline]
fn read_usize(&mut self) -> usize { self.opaque.read_usize() }
#[inline]
fn read_u128(&mut self) -> u128 { self.opaque.read_u128() }
#[inline]
fn read_u64(&mut self) -> u64 { self.opaque.read_u64() }
#[inline]
fn read_u32(&mut self) -> u32 { self.opaque.read_u32() }
#[inline]
fn read_u16(&mut self) -> u16 { self.opaque.read_u16() }
#[inline]
fn read_u8(&mut self) -> u8 { self.opaque.read_u8() }
#[inline]
fn read_isize(&mut self) -> isize { self.opaque.read_isize() }
#[inline]
fn read_i128(&mut self) -> i128 { self.opaque.read_i128() }
#[inline]
fn read_i64(&mut self) -> i64 { self.opaque.read_i64() }
#[inline]
fn read_i32(&mut self) -> i32 { self.opaque.read_i32() }
#[inline]
fn read_i16(&mut self) -> i16 { self.opaque.read_i16() }
#[inline]
fn read_raw_bytes(&mut self, len: usize) -> &[u8] {
self.opaque.read_raw_bytes(len)
}
#[inline]
fn peek_byte(&self) -> u8 { self.opaque.peek_byte() }
#[inline]
fn position(&self) -> usize { self.opaque.position() }
}
}implement_ty_decoder!(MetadataDecodeContext<'a, 'tcx>);
695}
696mod blob {
697 use super::*;
698 mod __ty_decoder_impl {
use rustc_serialize::Decoder;
use super::BlobDecodeContext;
impl<'a> Decoder for BlobDecodeContext<'a> {
#[inline]
fn read_usize(&mut self) -> usize { self.opaque.read_usize() }
#[inline]
fn read_u128(&mut self) -> u128 { self.opaque.read_u128() }
#[inline]
fn read_u64(&mut self) -> u64 { self.opaque.read_u64() }
#[inline]
fn read_u32(&mut self) -> u32 { self.opaque.read_u32() }
#[inline]
fn read_u16(&mut self) -> u16 { self.opaque.read_u16() }
#[inline]
fn read_u8(&mut self) -> u8 { self.opaque.read_u8() }
#[inline]
fn read_isize(&mut self) -> isize { self.opaque.read_isize() }
#[inline]
fn read_i128(&mut self) -> i128 { self.opaque.read_i128() }
#[inline]
fn read_i64(&mut self) -> i64 { self.opaque.read_i64() }
#[inline]
fn read_i32(&mut self) -> i32 { self.opaque.read_i32() }
#[inline]
fn read_i16(&mut self) -> i16 { self.opaque.read_i16() }
#[inline]
fn read_raw_bytes(&mut self, len: usize) -> &[u8] {
self.opaque.read_raw_bytes(len)
}
#[inline]
fn peek_byte(&self) -> u8 { self.opaque.peek_byte() }
#[inline]
fn position(&self) -> usize { self.opaque.position() }
}
}implement_ty_decoder!(BlobDecodeContext<'a>);
699}
700
701impl MetadataBlob {
702 pub(crate) fn check_compatibility(
703 &self,
704 cfg_version: &'static str,
705 ) -> Result<(), Option<String>> {
706 if !self.starts_with(METADATA_HEADER) {
707 if self.starts_with(b"rust") {
708 return Err(Some("<unknown rustc version>".to_owned()));
709 }
710 return Err(None);
711 }
712
713 let found_version =
714 LazyValue::<String>::from_position(NonZero::new(METADATA_HEADER.len() + 8).unwrap())
715 .decode(self);
716 if rustc_version(cfg_version) != found_version {
717 return Err(Some(found_version));
718 }
719
720 Ok(())
721 }
722
723 fn root_pos(&self) -> NonZero<usize> {
724 let offset = METADATA_HEADER.len();
725 let pos_bytes = self[offset..][..8].try_into().unwrap();
726 let pos = u64::from_le_bytes(pos_bytes);
727 NonZero::new(pos as usize).unwrap()
728 }
729
730 pub(crate) fn get_header(&self) -> CrateHeader {
731 let pos = self.root_pos();
732 LazyValue::<CrateHeader>::from_position(pos).decode(self)
733 }
734
735 pub(crate) fn get_root(&self) -> CrateRoot {
736 let pos = self.root_pos();
737 LazyValue::<CrateRoot>::from_position(pos).decode(self)
738 }
739
740 pub(crate) fn list_crate_metadata(
741 &self,
742 out: &mut dyn io::Write,
743 ls_kinds: &[String],
744 ) -> io::Result<()> {
745 let root = self.get_root();
746
747 let all_ls_kinds = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
["root".to_owned(), "lang_items".to_owned(), "features".to_owned(),
"items".to_owned()]))vec![
748 "root".to_owned(),
749 "lang_items".to_owned(),
750 "features".to_owned(),
751 "items".to_owned(),
752 ];
753 let ls_kinds = if ls_kinds.contains(&"all".to_owned()) { &all_ls_kinds } else { ls_kinds };
754
755 for kind in ls_kinds {
756 match &**kind {
757 "root" => {
758 out.write_fmt(format_args!("Crate info:\n"))writeln!(out, "Crate info:")?;
759 out.write_fmt(format_args!("name {0}{1}\n", root.name(), root.extra_filename))writeln!(out, "name {}{}", root.name(), root.extra_filename)?;
760 out.write_fmt(format_args!("hash {0} stable_crate_id {1:?}\n", root.hash(),
root.stable_crate_id))writeln!(
761 out,
762 "hash {} stable_crate_id {:?}",
763 root.hash(),
764 root.stable_crate_id
765 )?;
766 out.write_fmt(format_args!("proc_macro {0:?}\n",
root.proc_macro_data.is_some()))writeln!(out, "proc_macro {:?}", root.proc_macro_data.is_some())?;
767 out.write_fmt(format_args!("triple {0}\n", root.header.triple.tuple()))writeln!(out, "triple {}", root.header.triple.tuple())?;
768 out.write_fmt(format_args!("edition {0}\n", root.edition))writeln!(out, "edition {}", root.edition)?;
769 out.write_fmt(format_args!("symbol_mangling_version {0:?}\n",
root.symbol_mangling_version))writeln!(out, "symbol_mangling_version {:?}", root.symbol_mangling_version)?;
770 out.write_fmt(format_args!("required_panic_strategy {0:?} panic_in_drop_strategy {1:?}\n",
root.required_panic_strategy, root.panic_in_drop_strategy))writeln!(
771 out,
772 "required_panic_strategy {:?} panic_in_drop_strategy {:?}",
773 root.required_panic_strategy, root.panic_in_drop_strategy
774 )?;
775 out.write_fmt(format_args!("has_global_allocator {0} has_alloc_error_handler {1} has_panic_handler {2} has_default_lib_allocator {3}\n",
root.has_global_allocator, root.has_alloc_error_handler,
root.has_panic_handler, root.has_default_lib_allocator))writeln!(
776 out,
777 "has_global_allocator {} has_alloc_error_handler {} has_panic_handler {} has_default_lib_allocator {}",
778 root.has_global_allocator,
779 root.has_alloc_error_handler,
780 root.has_panic_handler,
781 root.has_default_lib_allocator
782 )?;
783 out.write_fmt(format_args!("compiler_builtins {0} needs_allocator {1} needs_panic_runtime {2} no_builtins {3} panic_runtime {4} profiler_runtime {5}\n",
root.compiler_builtins, root.needs_allocator,
root.needs_panic_runtime, root.no_builtins, root.panic_runtime,
root.profiler_runtime))writeln!(
784 out,
785 "compiler_builtins {} needs_allocator {} needs_panic_runtime {} no_builtins {} panic_runtime {} profiler_runtime {}",
786 root.compiler_builtins,
787 root.needs_allocator,
788 root.needs_panic_runtime,
789 root.no_builtins,
790 root.panic_runtime,
791 root.profiler_runtime
792 )?;
793
794 out.write_fmt(format_args!("=External Dependencies=\n"))writeln!(out, "=External Dependencies=")?;
795 let dylib_dependency_formats =
796 root.dylib_dependency_formats.decode(self).collect::<Vec<_>>();
797 for (i, dep) in root.crate_deps.decode(self).enumerate() {
798 let CrateDep { name, extra_filename, hash, host_hash, kind, is_private } =
799 dep;
800 let number = i + 1;
801
802 out.write_fmt(format_args!("{2} {3}{4} hash {5} host_hash {6:?} kind {7:?} {0}{1}\n",
if is_private { "private" } else { "public" },
if dylib_dependency_formats.is_empty() {
String::new()
} else {
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" linkage {0:?}",
dylib_dependency_formats[i]))
})
}, number, name, extra_filename, hash, host_hash, kind))writeln!(
803 out,
804 "{number} {name}{extra_filename} hash {hash} host_hash {host_hash:?} kind {kind:?} {privacy}{linkage}",
805 privacy = if is_private { "private" } else { "public" },
806 linkage = if dylib_dependency_formats.is_empty() {
807 String::new()
808 } else {
809 format!(" linkage {:?}", dylib_dependency_formats[i])
810 }
811 )?;
812 }
813 out.write_fmt(format_args!("\n"))write!(out, "\n")?;
814 }
815
816 "lang_items" => {
817 out.write_fmt(format_args!("=Lang items=\n"))writeln!(out, "=Lang items=")?;
818 for (id, lang_item) in root.lang_items.decode(self) {
819 out.write_fmt(format_args!("{0} = crate{1}\n", lang_item.name(),
DefPath::make(LOCAL_CRATE, id,
|parent|
root.tables.def_keys.get(self,
parent).unwrap().decode(self)).to_string_no_crate_verbose()))writeln!(
820 out,
821 "{} = crate{}",
822 lang_item.name(),
823 DefPath::make(LOCAL_CRATE, id, |parent| root
824 .tables
825 .def_keys
826 .get(self, parent)
827 .unwrap()
828 .decode(self))
829 .to_string_no_crate_verbose()
830 )?;
831 }
832 for lang_item in root.lang_items_missing.decode(self) {
833 out.write_fmt(format_args!("{0} = <missing>\n", lang_item.name()))writeln!(out, "{} = <missing>", lang_item.name())?;
834 }
835 out.write_fmt(format_args!("\n"))write!(out, "\n")?;
836 }
837
838 "features" => {
839 out.write_fmt(format_args!("=Lib features=\n"))writeln!(out, "=Lib features=")?;
840 for (feature, since) in root.lib_features.decode(self) {
841 out.write_fmt(format_args!("{0}{1}\n", feature,
if let FeatureStability::AcceptedSince(since) = since {
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" since {0}", since))
})
} else { String::new() }))writeln!(
842 out,
843 "{}{}",
844 feature,
845 if let FeatureStability::AcceptedSince(since) = since {
846 format!(" since {since}")
847 } else {
848 String::new()
849 }
850 )?;
851 }
852 out.write_fmt(format_args!("\n"))write!(out, "\n")?;
853 }
854
855 "items" => {
856 out.write_fmt(format_args!("=Items=\n"))writeln!(out, "=Items=")?;
857
858 fn print_item(
859 blob: &MetadataBlob,
860 out: &mut dyn io::Write,
861 item: DefIndex,
862 indent: usize,
863 ) -> io::Result<()> {
864 let root = blob.get_root();
865
866 let def_kind = root.tables.def_kind.get(blob, item).unwrap();
867 let def_key = root.tables.def_keys.get(blob, item).unwrap().decode(blob);
868 #[allow(rustc::symbol_intern_string_literal)]
869 let def_name = if item == CRATE_DEF_INDEX {
870 kw::Crate
871 } else {
872 def_key
873 .disambiguated_data
874 .data
875 .get_opt_name()
876 .unwrap_or_else(|| Symbol::intern("???"))
877 };
878 let visibility =
879 root.tables.visibility.get(blob, item).unwrap().decode(blob).map_id(
880 |index| {
881 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("crate{0}",
DefPath::make(LOCAL_CRATE, index,
|parent|
root.tables.def_keys.get(blob,
parent).unwrap().decode(blob)).to_string_no_crate_verbose()))
})format!(
882 "crate{}",
883 DefPath::make(LOCAL_CRATE, index, |parent| root
884 .tables
885 .def_keys
886 .get(blob, parent)
887 .unwrap()
888 .decode(blob))
889 .to_string_no_crate_verbose()
890 )
891 },
892 );
893 out.write_fmt(format_args!("{3: <4$}{0:?} {1:?} {2} {{", visibility, def_kind,
def_name, "", indent))write!(
894 out,
895 "{nil: <indent$}{:?} {:?} {} {{",
896 visibility,
897 def_kind,
898 def_name,
899 nil = "",
900 )?;
901
902 if let Some(children) =
903 root.tables.module_children_non_reexports.get(blob, item)
904 {
905 out.write_fmt(format_args!("\n"))write!(out, "\n")?;
906 for child in children.decode(blob) {
907 print_item(blob, out, child, indent + 4)?;
908 }
909 out.write_fmt(format_args!("{0: <1$}}}\n", "", indent))writeln!(out, "{nil: <indent$}}}", nil = "")?;
910 } else {
911 out.write_fmt(format_args!("}}\n"))writeln!(out, "}}")?;
912 }
913
914 Ok(())
915 }
916
917 print_item(self, out, CRATE_DEF_INDEX, 0)?;
918
919 out.write_fmt(format_args!("\n"))write!(out, "\n")?;
920 }
921
922 _ => {
923 out.write_fmt(format_args!("unknown -Zls kind. allowed values are: all, root, lang_items, features, items\n"))writeln!(
924 out,
925 "unknown -Zls kind. allowed values are: all, root, lang_items, features, items"
926 )?;
927 }
928 }
929 }
930
931 Ok(())
932 }
933
934 pub(crate) fn get_proc_macro_info(&self) -> Vec<ProcMacroKind> {
935 self.get_root()
936 .proc_macro_data
937 .unwrap()
938 .macros
939 .decode(self)
940 .map(|(_id, kind)| kind.decode(self))
941 .collect::<Vec<_>>()
942 }
943}
944
945impl CrateRoot {
946 pub(crate) fn is_proc_macro_crate(&self) -> bool {
947 self.proc_macro_data.is_some()
948 }
949
950 pub(crate) fn name(&self) -> Symbol {
951 self.header.name
952 }
953
954 pub(crate) fn hash(&self) -> Svh {
955 self.header.hash
956 }
957
958 pub(crate) fn stable_crate_id(&self) -> StableCrateId {
959 self.stable_crate_id
960 }
961
962 pub(crate) fn decode_crate_deps<'a>(
963 &self,
964 metadata: &'a MetadataBlob,
965 ) -> impl ExactSizeIterator<Item = CrateDep> {
966 self.crate_deps.decode(metadata)
967 }
968
969 pub(crate) fn decode_target_modifiers<'a>(
970 &self,
971 metadata: &'a MetadataBlob,
972 ) -> impl ExactSizeIterator<Item = TargetModifier> {
973 self.target_modifiers.decode(metadata)
974 }
975
976 pub(crate) fn decode_denied_partial_mitigations<'a>(
977 &self,
978 metadata: &'a MetadataBlob,
979 ) -> impl ExactSizeIterator<Item = DeniedPartialMitigation> {
980 self.denied_partial_mitigations.decode(metadata)
981 }
982}
983
984impl CrateMetadata {
985 fn missing(&self, descr: &str, id: DefIndex) -> ! {
986 ::rustc_middle::util::bug::bug_fmt(format_args!("missing `{1}` for {0:?}",
self.local_def_id(id), descr))bug!("missing `{descr}` for {:?}", self.local_def_id(id))
987 }
988
989 fn raw_proc_macro(&self, tcx: TyCtxt<'_>, id: DefIndex) -> (ProcMacroClient, ProcMacroKind) {
990 let (pos, (_id, kind)) = self
993 .root
994 .proc_macro_data
995 .as_ref()
996 .unwrap()
997 .macros
998 .decode((self, tcx))
999 .enumerate()
1000 .find(|(_pos, (i, _))| *i == id)
1001 .unwrap();
1002 (self.raw_proc_macros.unwrap()[pos], kind.decode((self, tcx)))
1003 }
1004
1005 fn opt_item_name(&self, item_index: DefIndex) -> Option<Symbol> {
1006 let def_key = self.def_key(item_index);
1007 def_key.disambiguated_data.data.get_opt_name().or_else(|| {
1008 if def_key.disambiguated_data.data == DefPathData::Ctor {
1009 let parent_index = def_key.parent.expect("no parent for a constructor");
1010 self.def_key(parent_index).disambiguated_data.data.get_opt_name()
1011 } else {
1012 None
1013 }
1014 })
1015 }
1016
1017 fn item_name(&self, item_index: DefIndex) -> Symbol {
1018 self.opt_item_name(item_index).expect("no encoded ident for item")
1019 }
1020
1021 fn opt_item_ident(&self, tcx: TyCtxt<'_>, item_index: DefIndex) -> Option<Ident> {
1022 let name = self.opt_item_name(item_index)?;
1023 let span = self
1024 .root
1025 .tables
1026 .def_ident_span
1027 .get(self, item_index)
1028 .unwrap_or_else(|| self.missing("def_ident_span", item_index))
1029 .decode((self, tcx));
1030 Some(Ident::new(name, span))
1031 }
1032
1033 fn item_ident(&self, tcx: TyCtxt<'_>, item_index: DefIndex) -> Ident {
1034 self.opt_item_ident(tcx, item_index).expect("no encoded ident for item")
1035 }
1036
1037 #[inline]
1038 pub(super) fn map_encoded_cnum_to_current(&self, cnum: CrateNum) -> CrateNum {
1039 if cnum == LOCAL_CRATE { self.cnum } else { self.cnum_map[cnum] }
1040 }
1041
1042 fn def_kind(&self, item_id: DefIndex) -> DefKind {
1043 self.root
1044 .tables
1045 .def_kind
1046 .get(self, item_id)
1047 .unwrap_or_else(|| self.missing("def_kind", item_id))
1048 }
1049
1050 fn get_span(&self, tcx: TyCtxt<'_>, index: DefIndex) -> Span {
1051 self.root
1052 .tables
1053 .def_span
1054 .get(self, index)
1055 .unwrap_or_else(|| self.missing("def_span", index))
1056 .decode((self, tcx))
1057 }
1058
1059 fn load_proc_macro<'tcx>(&self, tcx: TyCtxt<'tcx>, id: DefIndex) -> SyntaxExtension {
1060 let (name, kind, helper_attrs) = match self.raw_proc_macro(tcx, id) {
1061 (client, ProcMacroKind::CustomDerive { trait_name, attributes }) => {
1062 let helper_attrs =
1063 attributes.into_iter().map(|attr| Symbol::intern(&attr)).collect();
1064 (
1065 trait_name,
1066 SyntaxExtensionKind::Derive(Arc::new(DeriveProcMacro { client })),
1067 helper_attrs,
1068 )
1069 }
1070 (client, ProcMacroKind::Attr { name }) => {
1071 (name, SyntaxExtensionKind::Attr(Arc::new(AttrProcMacro { client })), Vec::new())
1072 }
1073 (client, ProcMacroKind::Bang { name }) => {
1074 (name, SyntaxExtensionKind::Bang(Arc::new(BangProcMacro { client })), Vec::new())
1075 }
1076 };
1077
1078 let sess = tcx.sess;
1079 let attrs: Vec<_> = self.get_item_attrs(tcx, id).collect();
1080 SyntaxExtension::new(
1081 sess,
1082 kind,
1083 self.get_span(tcx, id),
1084 helper_attrs,
1085 self.root.edition,
1086 Symbol::intern(&name),
1087 &attrs,
1088 false,
1089 )
1090 }
1091
1092 fn get_variant(
1093 &self,
1094 tcx: TyCtxt<'_>,
1095 kind: DefKind,
1096 index: DefIndex,
1097 parent_did: DefId,
1098 ) -> (VariantIdx, ty::VariantDef) {
1099 let adt_kind = match kind {
1100 DefKind::Variant => ty::AdtKind::Enum,
1101 DefKind::Struct => ty::AdtKind::Struct,
1102 DefKind::Union => ty::AdtKind::Union,
1103 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("impossible case reached"))bug!(),
1104 };
1105
1106 let data = self.root.tables.variant_data.get(self, index).unwrap().decode((self, tcx));
1107
1108 let variant_did =
1109 if adt_kind == ty::AdtKind::Enum { Some(self.local_def_id(index)) } else { None };
1110 let ctor = data.ctor.map(|(kind, index)| (kind, self.local_def_id(index)));
1111
1112 (
1113 data.idx,
1114 ty::VariantDef::new(
1115 self.item_name(index),
1116 variant_did,
1117 ctor,
1118 data.discr,
1119 self.get_associated_item_or_field_def_ids(tcx, index)
1120 .map(|did| ty::FieldDef {
1121 did,
1122 name: self.item_name(did.index),
1123 vis: self.get_visibility(tcx, did.index),
1124 safety: self.get_safety(did.index),
1125 value: self.get_default_field(tcx, did.index),
1126 })
1127 .collect(),
1128 parent_did,
1129 None,
1130 data.is_non_exhaustive,
1131 ),
1132 )
1133 }
1134
1135 fn get_adt_def<'tcx>(&self, tcx: TyCtxt<'tcx>, item_id: DefIndex) -> ty::AdtDef<'tcx> {
1136 let kind = self.def_kind(item_id);
1137 let did = self.local_def_id(item_id);
1138
1139 let adt_kind = match kind {
1140 DefKind::Enum => ty::AdtKind::Enum,
1141 DefKind::Struct => ty::AdtKind::Struct,
1142 DefKind::Union => ty::AdtKind::Union,
1143 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("get_adt_def called on a non-ADT {0:?}",
did))bug!("get_adt_def called on a non-ADT {:?}", did),
1144 };
1145 let repr = self.root.tables.repr_options.get(self, item_id).unwrap().decode((self, tcx));
1146
1147 let mut variants: Vec<_> = if let ty::AdtKind::Enum = adt_kind {
1148 self.root
1149 .tables
1150 .module_children_non_reexports
1151 .get(self, item_id)
1152 .expect("variants are not encoded for an enum")
1153 .decode((self, tcx))
1154 .filter_map(|index| {
1155 let kind = self.def_kind(index);
1156 match kind {
1157 DefKind::Ctor(..) => None,
1158 _ => Some(self.get_variant(tcx, kind, index, did)),
1159 }
1160 })
1161 .collect()
1162 } else {
1163 std::iter::once(self.get_variant(tcx, kind, item_id, did)).collect()
1164 };
1165
1166 variants.sort_by_key(|(idx, _)| *idx);
1167
1168 tcx.mk_adt_def(
1169 did,
1170 adt_kind,
1171 variants.into_iter().map(|(_, variant)| variant).collect(),
1172 repr,
1173 )
1174 }
1175
1176 fn get_visibility(&self, tcx: TyCtxt<'_>, id: DefIndex) -> Visibility<DefId> {
1177 self.root
1178 .tables
1179 .visibility
1180 .get(self, id)
1181 .unwrap_or_else(|| self.missing("visibility", id))
1182 .decode((self, tcx))
1183 .map_id(|index| self.local_def_id(index))
1184 }
1185
1186 fn get_safety(&self, id: DefIndex) -> Safety {
1187 self.root.tables.safety.get(self, id)
1188 }
1189
1190 fn get_default_field(&self, tcx: TyCtxt<'_>, id: DefIndex) -> Option<DefId> {
1191 self.root.tables.default_fields.get(self, id).map(|d| d.decode((self, tcx)))
1192 }
1193
1194 fn get_expn_that_defined(&self, tcx: TyCtxt<'_>, id: DefIndex) -> ExpnId {
1195 self.root
1196 .tables
1197 .expn_that_defined
1198 .get(self, id)
1199 .unwrap_or_else(|| self.missing("expn_that_defined", id))
1200 .decode((self, tcx))
1201 }
1202
1203 fn get_debugger_visualizers(&self, tcx: TyCtxt<'_>) -> Vec<DebuggerVisualizerFile> {
1204 self.root.debugger_visualizers.decode((self, tcx)).collect::<Vec<_>>()
1205 }
1206
1207 fn get_lib_features(&self, tcx: TyCtxt<'_>) -> LibFeatures {
1209 LibFeatures {
1210 stability: self
1211 .root
1212 .lib_features
1213 .decode((self, tcx))
1214 .map(|(sym, stab)| (sym, (stab, DUMMY_SP)))
1215 .collect(),
1216 }
1217 }
1218
1219 fn get_stability_implications<'tcx>(&self, tcx: TyCtxt<'tcx>) -> &'tcx [(Symbol, Symbol)] {
1223 tcx.arena.alloc_from_iter(self.root.stability_implications.decode((self, tcx)))
1224 }
1225
1226 fn get_lang_items<'tcx>(&self, tcx: TyCtxt<'tcx>) -> &'tcx [(DefId, LangItem)] {
1228 tcx.arena.alloc_from_iter(
1229 self.root
1230 .lang_items
1231 .decode((self, tcx))
1232 .map(move |(def_index, index)| (self.local_def_id(def_index), index)),
1233 )
1234 }
1235
1236 fn get_stripped_cfg_items<'tcx>(
1237 &self,
1238 tcx: TyCtxt<'tcx>,
1239 cnum: CrateNum,
1240 ) -> &'tcx [StrippedCfgItem] {
1241 let item_names = self
1242 .root
1243 .stripped_cfg_items
1244 .decode((self, tcx))
1245 .map(|item| item.map_scope_id(|index| DefId { krate: cnum, index }));
1246 tcx.arena.alloc_from_iter(item_names)
1247 }
1248
1249 fn get_diagnostic_items(&self, tcx: TyCtxt<'_>) -> DiagnosticItems {
1251 let mut id_to_name = DefIdMap::default();
1252 let name_to_id = self
1253 .root
1254 .diagnostic_items
1255 .decode((self, tcx))
1256 .map(|(name, def_index)| {
1257 let id = self.local_def_id(def_index);
1258 id_to_name.insert(id, name);
1259 (name, id)
1260 })
1261 .collect();
1262 DiagnosticItems { id_to_name, name_to_id }
1263 }
1264
1265 fn get_mod_child(&self, tcx: TyCtxt<'_>, id: DefIndex) -> ModChild {
1266 let ident = self.item_ident(tcx, id);
1267 let res = Res::Def(self.def_kind(id), self.local_def_id(id));
1268 let vis = self.get_visibility(tcx, id);
1269
1270 ModChild { ident, res, vis, reexport_chain: Default::default() }
1271 }
1272
1273 fn get_module_children(&self, tcx: TyCtxt<'_>, id: DefIndex) -> impl Iterator<Item = ModChild> {
1282 gen move {
1283 if let Some(data) = &self.root.proc_macro_data {
1284 if id == CRATE_DEF_INDEX {
1287 for (child_index, _) in data.macros.decode((self, tcx)) {
1288 yield self.get_mod_child(tcx, child_index);
1289 }
1290 }
1291 } else {
1292 let non_reexports = self.root.tables.module_children_non_reexports.get(self, id);
1294 let non_reexports =
1295 non_reexports.expect("provided `DefIndex` must refer to a module-like item");
1296 for child_index in non_reexports.decode((self, tcx)) {
1297 yield self.get_mod_child(tcx, child_index);
1298 }
1299
1300 let reexports = self.root.tables.module_children_reexports.get(self, id);
1301 if !reexports.is_default() {
1302 for reexport in reexports.decode((self, tcx)) {
1303 yield reexport;
1304 }
1305 }
1306 }
1307 }
1308 }
1309
1310 fn get_ambig_module_children(
1311 &self,
1312 tcx: TyCtxt<'_>,
1313 id: DefIndex,
1314 ) -> impl Iterator<Item = AmbigModChild> {
1315 gen move {
1316 let children = self.root.tables.ambig_module_children.get(self, id);
1317 if !children.is_default() {
1318 for child in children.decode((self, tcx)) {
1319 yield child;
1320 }
1321 }
1322 }
1323 }
1324
1325 fn is_item_mir_available(&self, id: DefIndex) -> bool {
1326 self.root.tables.optimized_mir.get(self, id).is_some()
1327 }
1328
1329 fn get_fn_has_self_parameter(&self, tcx: TyCtxt<'_>, id: DefIndex) -> bool {
1330 self.root
1331 .tables
1332 .fn_arg_idents
1333 .get(self, id)
1334 .expect("argument names not encoded for a function")
1335 .decode((self, tcx))
1336 .nth(0)
1337 .is_some_and(|ident| #[allow(non_exhaustive_omitted_patterns)] match ident {
Some(Ident { name: kw::SelfLower, .. }) => true,
_ => false,
}matches!(ident, Some(Ident { name: kw::SelfLower, .. })))
1338 }
1339
1340 fn get_associated_item_or_field_def_ids(
1341 &self,
1342 tcx: TyCtxt<'_>,
1343 id: DefIndex,
1344 ) -> impl Iterator<Item = DefId> {
1345 self.root
1346 .tables
1347 .associated_item_or_field_def_ids
1348 .get(self, id)
1349 .unwrap_or_else(|| self.missing("associated_item_or_field_def_ids", id))
1350 .decode((self, tcx))
1351 .map(move |child_index| self.local_def_id(child_index))
1352 }
1353
1354 fn get_associated_item(&self, tcx: TyCtxt<'_>, id: DefIndex) -> ty::AssocItem {
1355 let kind = match self.def_kind(id) {
1356 DefKind::AssocConst { is_type_const } => {
1357 ty::AssocKind::Const { name: self.item_name(id), is_type_const }
1358 }
1359 DefKind::AssocFn => ty::AssocKind::Fn {
1360 name: self.item_name(id),
1361 has_self: self.get_fn_has_self_parameter(tcx, id),
1362 },
1363 DefKind::AssocTy => {
1364 let data = if let Some(rpitit_info) = self.root.tables.opt_rpitit_info.get(self, id)
1365 {
1366 ty::AssocTypeData::Rpitit(rpitit_info.decode((self, tcx)))
1367 } else {
1368 ty::AssocTypeData::Normal(self.item_name(id))
1369 };
1370 ty::AssocKind::Type { data }
1371 }
1372 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("cannot get associated-item of `{0:?}`",
self.def_key(id)))bug!("cannot get associated-item of `{:?}`", self.def_key(id)),
1373 };
1374 let container = self.root.tables.assoc_container.get(self, id).unwrap().decode((self, tcx));
1375
1376 ty::AssocItem { kind, def_id: self.local_def_id(id), container }
1377 }
1378
1379 fn get_ctor(&self, tcx: TyCtxt<'_>, node_id: DefIndex) -> Option<(CtorKind, DefId)> {
1380 match self.def_kind(node_id) {
1381 DefKind::Struct | DefKind::Variant => {
1382 let vdata =
1383 self.root.tables.variant_data.get(self, node_id).unwrap().decode((self, tcx));
1384 vdata.ctor.map(|(kind, index)| (kind, self.local_def_id(index)))
1385 }
1386 _ => None,
1387 }
1388 }
1389
1390 fn get_item_attrs(
1391 &self,
1392 tcx: TyCtxt<'_>,
1393 id: DefIndex,
1394 ) -> impl Iterator<Item = hir::Attribute> {
1395 self.root
1396 .tables
1397 .attributes
1398 .get(self, id)
1399 .unwrap_or_else(|| {
1400 let def_key = self.def_key(id);
1404 match (&def_key.disambiguated_data.data, &DefPathData::Ctor) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(def_key.disambiguated_data.data, DefPathData::Ctor);
1405 let parent_id = def_key.parent.expect("no parent for a constructor");
1406 self.root
1407 .tables
1408 .attributes
1409 .get(self, parent_id)
1410 .expect("no encoded attributes for a structure or variant")
1411 })
1412 .decode((self, tcx))
1413 }
1414
1415 fn get_inherent_implementations_for_type<'tcx>(
1416 &self,
1417 tcx: TyCtxt<'tcx>,
1418 id: DefIndex,
1419 ) -> &'tcx [DefId] {
1420 tcx.arena.alloc_from_iter(
1421 self.root
1422 .tables
1423 .inherent_impls
1424 .get(self, id)
1425 .decode((self, tcx))
1426 .map(|index| self.local_def_id(index)),
1427 )
1428 }
1429
1430 fn get_traits(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId> {
1432 self.root.traits.decode((self, tcx)).map(move |index| self.local_def_id(index))
1433 }
1434
1435 fn get_trait_impls(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId> {
1437 self.trait_impls.values().flat_map(move |impls| {
1438 impls.decode((self, tcx)).map(move |(impl_index, _)| self.local_def_id(impl_index))
1439 })
1440 }
1441
1442 fn get_incoherent_impls<'tcx>(&self, tcx: TyCtxt<'tcx>, simp: SimplifiedType) -> &'tcx [DefId] {
1443 if let Some(impls) = self.incoherent_impls.get(&simp) {
1444 tcx.arena.alloc_from_iter(impls.decode((self, tcx)).map(|idx| self.local_def_id(idx)))
1445 } else {
1446 &[]
1447 }
1448 }
1449
1450 fn get_implementations_of_trait<'tcx>(
1451 &self,
1452 tcx: TyCtxt<'tcx>,
1453 trait_def_id: DefId,
1454 ) -> &'tcx [(DefId, Option<SimplifiedType>)] {
1455 if self.trait_impls.is_empty() {
1456 return &[];
1457 }
1458
1459 let key = match self.reverse_translate_def_id(trait_def_id) {
1462 Some(def_id) => (def_id.krate.as_u32(), def_id.index),
1463 None => return &[],
1464 };
1465
1466 if let Some(impls) = self.trait_impls.get(&key) {
1467 tcx.arena.alloc_from_iter(
1468 impls
1469 .decode((self, tcx))
1470 .map(|(idx, simplified_self_ty)| (self.local_def_id(idx), simplified_self_ty)),
1471 )
1472 } else {
1473 &[]
1474 }
1475 }
1476
1477 fn get_native_libraries(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = NativeLib> {
1478 self.root.native_libraries.decode((self, tcx))
1479 }
1480
1481 fn get_proc_macro_quoted_span(&self, tcx: TyCtxt<'_>, index: usize) -> Span {
1482 self.root
1483 .tables
1484 .proc_macro_quoted_spans
1485 .get(self, index)
1486 .unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("Missing proc macro quoted span: {0:?}",
index));
}panic!("Missing proc macro quoted span: {index:?}"))
1487 .decode((self, tcx))
1488 }
1489
1490 fn get_foreign_modules(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = ForeignModule> {
1491 self.root.foreign_modules.decode((self, tcx))
1492 }
1493
1494 fn get_dylib_dependency_formats<'tcx>(
1495 &self,
1496 tcx: TyCtxt<'tcx>,
1497 ) -> &'tcx [(CrateNum, LinkagePreference)] {
1498 tcx.arena.alloc_from_iter(
1499 self.root.dylib_dependency_formats.decode((self, tcx)).enumerate().flat_map(
1500 |(i, link)| {
1501 let cnum = CrateNum::new(i + 1); link.map(|link| (self.cnum_map[cnum], link))
1503 },
1504 ),
1505 )
1506 }
1507
1508 fn get_externally_implementable_items(
1509 &self,
1510 tcx: TyCtxt<'_>,
1511 ) -> impl Iterator<Item = EiiMapEncodedKeyValue> {
1512 self.root.externally_implementable_items.decode((self, tcx))
1513 }
1514
1515 fn get_missing_lang_items<'tcx>(&self, tcx: TyCtxt<'tcx>) -> &'tcx [LangItem] {
1516 tcx.arena.alloc_from_iter(self.root.lang_items_missing.decode((self, tcx)))
1517 }
1518
1519 fn get_exportable_items(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId> {
1520 self.root.exportable_items.decode((self, tcx)).map(move |index| self.local_def_id(index))
1521 }
1522
1523 fn get_stable_order_of_exportable_impls(
1524 &self,
1525 tcx: TyCtxt<'_>,
1526 ) -> impl Iterator<Item = (DefId, usize)> {
1527 self.root
1528 .stable_order_of_exportable_impls
1529 .decode((self, tcx))
1530 .map(move |v| (self.local_def_id(v.0), v.1))
1531 }
1532
1533 fn exported_non_generic_symbols<'tcx>(
1534 &self,
1535 tcx: TyCtxt<'tcx>,
1536 ) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)] {
1537 tcx.arena.alloc_from_iter(self.root.exported_non_generic_symbols.decode((self, tcx)))
1538 }
1539
1540 fn exported_generic_symbols<'tcx>(
1541 &self,
1542 tcx: TyCtxt<'tcx>,
1543 ) -> &'tcx [(ExportedSymbol<'tcx>, SymbolExportInfo)] {
1544 tcx.arena.alloc_from_iter(self.root.exported_generic_symbols.decode((self, tcx)))
1545 }
1546
1547 fn get_macro(&self, tcx: TyCtxt<'_>, id: DefIndex) -> ast::MacroDef {
1548 match self.def_kind(id) {
1549 DefKind::Macro(_) => {
1550 let macro_rules = self.root.tables.is_macro_rules.get(self, id);
1551 let body =
1552 self.root.tables.macro_definition.get(self, id).unwrap().decode((self, tcx));
1553 ast::MacroDef { macro_rules, body: Box::new(body), eii_declaration: None }
1554 }
1555 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("impossible case reached"))bug!(),
1556 }
1557 }
1558
1559 #[inline]
1560 fn def_key(&self, index: DefIndex) -> DefKey {
1561 *self.def_key_cache.lock().entry(index).or_insert_with(|| {
1562 self.root.tables.def_keys.get(&self.blob, index).unwrap().decode(&self.blob)
1563 })
1564 }
1565
1566 fn def_path(&self, id: DefIndex) -> DefPath {
1568 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:1568",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(1568u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("def_path(cnum={0:?}, id={1:?})",
self.cnum, id) as &dyn Value))])
});
} else { ; }
};debug!("def_path(cnum={:?}, id={:?})", self.cnum, id);
1569 DefPath::make(self.cnum, id, |parent| self.def_key(parent))
1570 }
1571
1572 #[inline]
1573 fn def_path_hash(&self, index: DefIndex) -> DefPathHash {
1574 let fingerprint = Fingerprint::new(
1578 self.root.stable_crate_id.as_u64(),
1579 self.root.tables.def_path_hashes.get(&self.blob, index),
1580 );
1581 DefPathHash::new(self.root.stable_crate_id, fingerprint.split().1)
1582 }
1583
1584 #[inline]
1585 fn def_path_hash_to_def_index(&self, hash: DefPathHash) -> Option<DefIndex> {
1586 self.def_path_hash_map.def_path_hash_to_def_index(&hash)
1587 }
1588
1589 fn expn_hash_to_expn_id(&self, tcx: TyCtxt<'_>, index_guess: u32, hash: ExpnHash) -> ExpnId {
1590 let index_guess = ExpnIndex::from_u32(index_guess);
1591 let old_hash =
1592 self.root.expn_hashes.get(self, index_guess).map(|lazy| lazy.decode((self, tcx)));
1593
1594 let index = if old_hash == Some(hash) {
1595 index_guess
1599 } else {
1600 let map = self.expn_hash_map.get_or_init(|| {
1604 let end_id = self.root.expn_hashes.size() as u32;
1605 let mut map =
1606 UnhashMap::with_capacity_and_hasher(end_id as usize, Default::default());
1607 for i in 0..end_id {
1608 let i = ExpnIndex::from_u32(i);
1609 if let Some(hash) = self.root.expn_hashes.get(self, i) {
1610 map.insert(hash.decode((self, tcx)), i);
1611 }
1612 }
1613 map
1614 });
1615 map[&hash]
1616 };
1617
1618 let data = self.root.expn_data.get(self, index).unwrap().decode((self, tcx));
1619 rustc_span::hygiene::register_expn_id(self.cnum, index, data, hash)
1620 }
1621
1622 fn imported_source_file(&self, tcx: TyCtxt<'_>, source_file_index: u32) -> ImportedSourceFile {
1648 fn filter<'a>(
1649 tcx: TyCtxt<'_>,
1650 real_source_base_dir: &Option<PathBuf>,
1651 path: Option<&'a Path>,
1652 ) -> Option<&'a Path> {
1653 path.filter(|_| {
1654 real_source_base_dir.is_some()
1656 && tcx.sess.opts.unstable_opts.translate_remapped_path_to_local_path
1658 })
1659 .filter(|virtual_dir| {
1660 !tcx.sess.opts.remap_path_prefix.iter().any(|(_from, to)| to == virtual_dir)
1664 })
1665 }
1666
1667 let try_to_translate_virtual_to_real =
1668 |virtual_source_base_dir: Option<&str>,
1669 real_source_base_dir: &Option<PathBuf>,
1670 name: &mut rustc_span::FileName| {
1671 let virtual_source_base_dir = [
1672 filter(tcx, real_source_base_dir, virtual_source_base_dir.map(Path::new)),
1673 filter(
1674 tcx,
1675 real_source_base_dir,
1676 tcx.sess.opts.unstable_opts.simulate_remapped_rust_src_base.as_deref(),
1677 ),
1678 ];
1679
1680 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:1680",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(1680u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("try_to_translate_virtual_to_real(name={0:?}): virtual_source_base_dir={1:?}, real_source_base_dir={2:?}",
name, virtual_source_base_dir, real_source_base_dir) as
&dyn Value))])
});
} else { ; }
};debug!(
1681 "try_to_translate_virtual_to_real(name={:?}): \
1682 virtual_source_base_dir={:?}, real_source_base_dir={:?}",
1683 name, virtual_source_base_dir, real_source_base_dir,
1684 );
1685
1686 for virtual_dir in virtual_source_base_dir.iter().flatten() {
1687 if let Some(real_dir) = &real_source_base_dir
1688 && let rustc_span::FileName::Real(old_name) = name
1689 && let virtual_path = old_name.path(RemapPathScopeComponents::MACRO)
1690 && let Ok(rest) = virtual_path.strip_prefix(virtual_dir)
1691 {
1692 let new_path = real_dir.join(rest);
1693
1694 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:1694",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(1694u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("try_to_translate_virtual_to_real: `{0}` -> `{1}`",
virtual_path.display(), new_path.display()) as
&dyn Value))])
});
} else { ; }
};debug!(
1695 "try_to_translate_virtual_to_real: `{}` -> `{}`",
1696 virtual_path.display(),
1697 new_path.display(),
1698 );
1699
1700 *name = rustc_span::FileName::Real(
1706 tcx.sess
1707 .source_map()
1708 .path_mapping()
1709 .to_real_filename(&rustc_span::RealFileName::empty(), new_path),
1710 );
1711 }
1712 }
1713 };
1714
1715 let try_to_translate_real_to_virtual =
1716 |virtual_source_base_dir: Option<&str>,
1717 real_source_base_dir: &Option<PathBuf>,
1718 subdir: &str,
1719 name: &mut rustc_span::FileName| {
1720 if let Some(virtual_dir) =
1721 &tcx.sess.opts.unstable_opts.simulate_remapped_rust_src_base
1722 && let Some(real_dir) = real_source_base_dir
1723 && let rustc_span::FileName::Real(old_name) = name
1724 {
1725 let (_working_dir, embeddable_path) =
1726 old_name.embeddable_name(RemapPathScopeComponents::MACRO);
1727 let relative_path = embeddable_path.strip_prefix(real_dir).ok().or_else(|| {
1728 virtual_source_base_dir
1729 .and_then(|virtual_dir| embeddable_path.strip_prefix(virtual_dir).ok())
1730 });
1731 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:1731",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(1731u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message",
"relative_path", "virtual_dir", "subdir"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("simulate_remapped_rust_src_base")
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&debug(&relative_path)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&debug(&virtual_dir)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&debug(&subdir) as
&dyn Value))])
});
} else { ; }
};debug!(
1732 ?relative_path,
1733 ?virtual_dir,
1734 ?subdir,
1735 "simulate_remapped_rust_src_base"
1736 );
1737 if let Some(rest) = relative_path.and_then(|p| p.strip_prefix(subdir).ok()) {
1738 *name =
1739 rustc_span::FileName::Real(rustc_span::RealFileName::from_virtual_path(
1740 &virtual_dir.join(subdir).join(rest),
1741 ))
1742 }
1743 }
1744 };
1745
1746 let mut import_info = self.source_map_import_info.lock();
1747 for _ in import_info.len()..=(source_file_index as usize) {
1748 import_info.push(None);
1749 }
1750 import_info[source_file_index as usize]
1751 .get_or_insert_with(|| {
1752 let source_file_to_import = self
1753 .root
1754 .source_map
1755 .get(self, source_file_index)
1756 .expect("missing source file")
1757 .decode((self, tcx));
1758
1759 let original_end_pos = source_file_to_import.end_position();
1762 let rustc_span::SourceFile {
1763 mut name,
1764 src_hash,
1765 checksum_hash,
1766 start_pos: original_start_pos,
1767 normalized_source_len,
1768 unnormalized_source_len,
1769 lines,
1770 multibyte_chars,
1771 normalized_pos,
1772 stable_id,
1773 ..
1774 } = source_file_to_import;
1775
1776 try_to_translate_real_to_virtual(
1784 ::core::option::Option::Some("/rustc/bc2112ed56c99fa649e09ab3ab286afab3d9059a")option_env!("CFG_VIRTUAL_RUST_SOURCE_BASE_DIR"),
1785 &tcx.sess.opts.real_rust_source_base_dir,
1786 "library",
1787 &mut name,
1788 );
1789
1790 try_to_translate_real_to_virtual(
1795 ::core::option::Option::Some("/rustc-dev/bc2112ed56c99fa649e09ab3ab286afab3d9059a")option_env!("CFG_VIRTUAL_RUSTC_DEV_SOURCE_BASE_DIR"),
1796 &tcx.sess.opts.real_rustc_dev_source_base_dir,
1797 "compiler",
1798 &mut name,
1799 );
1800
1801 try_to_translate_virtual_to_real(
1807 ::core::option::Option::Some("/rustc/bc2112ed56c99fa649e09ab3ab286afab3d9059a")option_env!("CFG_VIRTUAL_RUST_SOURCE_BASE_DIR"),
1808 &tcx.sess.opts.real_rust_source_base_dir,
1809 &mut name,
1810 );
1811
1812 try_to_translate_virtual_to_real(
1818 ::core::option::Option::Some("/rustc-dev/bc2112ed56c99fa649e09ab3ab286afab3d9059a")option_env!("CFG_VIRTUAL_RUSTC_DEV_SOURCE_BASE_DIR"),
1819 &tcx.sess.opts.real_rustc_dev_source_base_dir,
1820 &mut name,
1821 );
1822
1823 let local_version = tcx.sess.source_map().new_imported_source_file(
1824 name,
1825 src_hash,
1826 checksum_hash,
1827 stable_id,
1828 normalized_source_len.to_u32(),
1829 unnormalized_source_len,
1830 self.cnum,
1831 lines,
1832 multibyte_chars,
1833 normalized_pos,
1834 source_file_index,
1835 );
1836 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_metadata/src/rmeta/decoder.rs:1836",
"rustc_metadata::rmeta::decoder", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_metadata/src/rmeta/decoder.rs"),
::tracing_core::__macro_support::Option::Some(1836u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::rmeta::decoder"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("CrateMetaData::imported_source_files alloc source_file {0:?} original (start_pos {1:?} source_len {2:?}) translated (start_pos {3:?} source_len {4:?})",
local_version.name, original_start_pos,
normalized_source_len, local_version.start_pos,
local_version.normalized_source_len) as &dyn Value))])
});
} else { ; }
};debug!(
1837 "CrateMetaData::imported_source_files alloc \
1838 source_file {:?} original (start_pos {:?} source_len {:?}) \
1839 translated (start_pos {:?} source_len {:?})",
1840 local_version.name,
1841 original_start_pos,
1842 normalized_source_len,
1843 local_version.start_pos,
1844 local_version.normalized_source_len
1845 );
1846
1847 ImportedSourceFile {
1848 original_start_pos,
1849 original_end_pos,
1850 translated_source_file: local_version,
1851 }
1852 })
1853 .clone()
1854 }
1855
1856 fn get_attr_flags(&self, index: DefIndex) -> AttrFlags {
1857 self.root.tables.attr_flags.get(self, index)
1858 }
1859
1860 fn get_intrinsic(&self, tcx: TyCtxt<'_>, index: DefIndex) -> Option<ty::IntrinsicDef> {
1861 self.root.tables.intrinsic.get(self, index).map(|d| d.decode((self, tcx)))
1862 }
1863
1864 fn get_doc_link_resolutions(&self, tcx: TyCtxt<'_>, index: DefIndex) -> DocLinkResMap {
1865 self.root
1866 .tables
1867 .doc_link_resolutions
1868 .get(self, index)
1869 .expect("no resolutions for a doc link")
1870 .decode((self, tcx))
1871 }
1872
1873 fn get_doc_link_traits_in_scope(
1874 &self,
1875 tcx: TyCtxt<'_>,
1876 index: DefIndex,
1877 ) -> impl Iterator<Item = DefId> {
1878 self.root
1879 .tables
1880 .doc_link_traits_in_scope
1881 .get(self, index)
1882 .expect("no traits in scope for a doc link")
1883 .decode((self, tcx))
1884 }
1885}
1886
1887impl CrateMetadata {
1888 pub(crate) fn new(
1889 tcx: TyCtxt<'_>,
1890 blob: MetadataBlob,
1891 root: CrateRoot,
1892 raw_proc_macros: Option<&'static [ProcMacroClient]>,
1893 cnum: CrateNum,
1894 cnum_map: CrateNumMap,
1895 dep_kind: CrateDepKind,
1896 source: CrateSource,
1897 private_dep: bool,
1898 host_hash: Option<Svh>,
1899 ) -> CrateMetadata {
1900 let trait_impls = root
1901 .impls
1902 .decode(&blob)
1903 .map(|trait_impls| (trait_impls.trait_id, trait_impls.impls))
1904 .collect();
1905 let alloc_decoding_state =
1906 AllocDecodingState::new(root.interpret_alloc_index.decode(&blob).collect());
1907
1908 let def_path_hash_map = root.def_path_hash_map.decode(&blob);
1911
1912 let mut cdata = CrateMetadata {
1913 blob,
1914 root,
1915 trait_impls,
1916 incoherent_impls: Default::default(),
1917 raw_proc_macros,
1918 source_map_import_info: Lock::new(Vec::new()),
1919 def_path_hash_map,
1920 expn_hash_map: Default::default(),
1921 alloc_decoding_state,
1922 cnum,
1923 cnum_map,
1924 dep_kind,
1925 source: Arc::new(source),
1926 private_dep,
1927 host_hash,
1928 used: false,
1929 extern_crate: None,
1930 hygiene_context: Default::default(),
1931 def_key_cache: Default::default(),
1932 };
1933
1934 cdata.incoherent_impls = cdata
1935 .root
1936 .incoherent_impls
1937 .decode((&cdata, tcx))
1938 .map(|incoherent_impls| {
1939 (incoherent_impls.self_ty.decode((&cdata, tcx)), incoherent_impls.impls)
1940 })
1941 .collect();
1942
1943 cdata
1944 }
1945
1946 pub(crate) fn dependencies(&self) -> impl Iterator<Item = CrateNum> {
1947 self.cnum_map.iter().copied()
1948 }
1949
1950 pub(crate) fn target_modifiers(&self) -> TargetModifiers {
1951 self.root.decode_target_modifiers(&self.blob).collect()
1952 }
1953
1954 pub(crate) fn enabled_denied_partial_mitigations(&self) -> DeniedPartialMitigations {
1955 self.root.decode_denied_partial_mitigations(&self.blob).collect()
1956 }
1957
1958 pub(crate) fn update_extern_crate_diagnostics(
1960 &mut self,
1961 new_extern_crate: ExternCrate,
1962 ) -> bool {
1963 let update =
1964 self.extern_crate.as_ref().is_none_or(|old| old.rank() < new_extern_crate.rank());
1965 if update {
1966 self.extern_crate = Some(new_extern_crate);
1967 }
1968 update
1969 }
1970
1971 pub(crate) fn source(&self) -> &CrateSource {
1972 &*self.source
1973 }
1974
1975 pub(crate) fn dep_kind(&self) -> CrateDepKind {
1976 self.dep_kind
1977 }
1978
1979 pub(crate) fn set_dep_kind(&mut self, dep_kind: CrateDepKind) {
1980 self.dep_kind = dep_kind;
1981 }
1982
1983 pub(crate) fn update_and_private_dep(&mut self, private_dep: bool) {
1984 self.private_dep &= private_dep;
1985 }
1986
1987 pub(crate) fn used(&self) -> bool {
1988 self.used
1989 }
1990
1991 pub(crate) fn required_panic_strategy(&self) -> Option<PanicStrategy> {
1992 self.root.required_panic_strategy
1993 }
1994
1995 pub(crate) fn needs_panic_runtime(&self) -> bool {
1996 self.root.needs_panic_runtime
1997 }
1998
1999 pub(crate) fn is_private_dep(&self) -> bool {
2000 self.private_dep
2001 }
2002
2003 pub(crate) fn is_panic_runtime(&self) -> bool {
2004 self.root.panic_runtime
2005 }
2006
2007 pub(crate) fn is_profiler_runtime(&self) -> bool {
2008 self.root.profiler_runtime
2009 }
2010
2011 pub(crate) fn is_compiler_builtins(&self) -> bool {
2012 self.root.compiler_builtins
2013 }
2014
2015 pub(crate) fn needs_allocator(&self) -> bool {
2016 self.root.needs_allocator
2017 }
2018
2019 pub(crate) fn has_global_allocator(&self) -> bool {
2020 self.root.has_global_allocator
2021 }
2022
2023 pub(crate) fn has_alloc_error_handler(&self) -> bool {
2024 self.root.has_alloc_error_handler
2025 }
2026
2027 pub(crate) fn has_default_lib_allocator(&self) -> bool {
2028 self.root.has_default_lib_allocator
2029 }
2030
2031 pub(crate) fn is_proc_macro_crate(&self) -> bool {
2032 self.root.is_proc_macro_crate()
2033 }
2034
2035 pub(crate) fn proc_macros_for_crate(
2036 &self,
2037 tcx: TyCtxt<'_>,
2038 krate: CrateNum,
2039 ) -> impl Iterator<Item = DefId> {
2040 gen move {
2041 for def_id in self.root.proc_macro_data.as_ref().into_iter().flat_map(move |data| {
2042 data.macros.decode((self, tcx)).map(move |(index, _)| DefId { index, krate })
2043 }) {
2044 yield def_id;
2045 }
2046 }
2047 }
2048
2049 pub(crate) fn name(&self) -> Symbol {
2050 self.root.header.name
2051 }
2052
2053 pub(crate) fn hash(&self) -> Svh {
2054 self.root.header.hash
2055 }
2056
2057 pub(crate) fn has_async_drops(&self) -> bool {
2058 self.root.tables.adt_async_destructor.len > 0
2059 }
2060
2061 fn num_def_ids(&self) -> usize {
2062 self.root.tables.def_keys.size()
2063 }
2064
2065 fn local_def_id(&self, index: DefIndex) -> DefId {
2066 DefId { krate: self.cnum, index }
2067 }
2068
2069 fn reverse_translate_def_id(&self, did: DefId) -> Option<DefId> {
2072 for (local, &global) in self.cnum_map.iter_enumerated() {
2073 if global == did.krate {
2074 return Some(DefId { krate: local, index: did.index });
2075 }
2076 }
2077
2078 None
2079 }
2080}