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