1use std::collections::BTreeMap;
4use std::path::Path;
5use std::str::FromStr;
6use std::{cmp, env, iter};
7
8use rustc_ast::expand::allocator::{ALLOC_ERROR_HANDLER, AllocatorKind, global_fn_name};
9use rustc_ast::{self as ast, *};
10use rustc_crate_store::{CrateDepKind, CrateSource, ExternCrate, ExternCrateSource};
11use rustc_data_structures::fx::FxHashSet;
12use rustc_data_structures::owned_slice::OwnedSlice;
13use rustc_data_structures::svh::Svh;
14use rustc_data_structures::sync::{self, FreezeReadGuard, FreezeWriteGuard};
15use rustc_data_structures::unord::UnordMap;
16use rustc_expand::base::SyntaxExtension;
17use rustc_hir as hir;
18use rustc_hir::def_id::{CrateNum, LOCAL_CRATE, LocalDefId, StableCrateId};
19use rustc_hir::definitions::Definitions;
20use rustc_index::IndexVec;
21use rustc_lint_defs as lint;
22use rustc_lint_defs::builtin::UNUSED_CRATE_DEPENDENCIES;
23use rustc_middle::bug;
24use rustc_middle::ty::data_structures::IndexSet;
25use rustc_middle::ty::{TyCtxt, TyCtxtFeed};
26use rustc_proc_macro::bridge::client::Client as ProcMacroClient;
27use rustc_session::Session;
28use rustc_session::config::mitigation_coverage::DeniedPartialMitigationLevel;
29use rustc_session::config::{
30 ExtendedTargetModifierInfo, ExternLocation, Externs, OptionsTargetModifiers, TargetModifier,
31};
32use rustc_session::output::validate_crate_name;
33use rustc_session::search_paths::PathKind;
34use rustc_span::def_id::DefId;
35use rustc_span::edition::Edition;
36use rustc_span::{DUMMY_SP, Ident, Span, Symbol, sym};
37use rustc_structures::CrateType;
38use rustc_target::spec::{PanicStrategy, Target};
39use tracing::{debug, info};
40
41use crate::diagnostics;
42use crate::locator::{CrateError, CrateLocator, CratePaths, CrateRejections};
43use crate::rmeta::{
44 CrateDep, CrateMetadata, CrateNumMap, CrateRoot, MetadataBlob, TargetModifiers,
45};
46
47pub trait MetadataLoader {
52 fn get_rlib_metadata(&self, target: &Target, filename: &Path) -> Result<OwnedSlice, String>;
53 fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result<OwnedSlice, String>;
54}
55
56pub type MetadataLoaderDyn = dyn MetadataLoader + Send + Sync + sync::DynSend + sync::DynSync;
57
58pub struct CStore {
59 metadata_loader: Box<MetadataLoaderDyn>,
60
61 metas: IndexVec<CrateNum, Option<Box<CrateMetadata>>>,
62 injected_panic_runtime: Option<CrateNum>,
63 allocator_kind: Option<AllocatorKind>,
66 alloc_error_handler_kind: Option<AllocatorKind>,
69 has_global_allocator: bool,
71 has_alloc_error_handler: bool,
73
74 hash_to_cnum: UnordMap<Svh, CrateNum>,
76
77 resolved_externs: UnordMap<Symbol, CrateNum>,
79
80 unused_externs: Vec<Symbol>,
82
83 used_extern_options: FxHashSet<Symbol>,
84 has_crate_resolve_with_fail: bool,
87}
88
89pub enum LoadedMacro {
90 MacroDef {
91 def: MacroDef,
92 ident: Ident,
93 attrs: Vec<hir::Attribute>,
94 span: Span,
95 edition: Edition,
96 },
97 ProcMacro(SyntaxExtension),
98}
99
100pub(crate) struct Library {
101 pub source: CrateSource,
102 pub metadata: MetadataBlob,
103}
104
105enum LoadResult {
106 Previous(CrateNum),
107 Loaded(Library),
108}
109
110impl std::fmt::Debug for CStore {
111 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
112 fmt.write_fmt(format_args!("resolved crates:\n"))writeln!(fmt, "resolved crates:")?;
113 for (cnum, data) in self.iter_crate_data() {
114 fmt.write_fmt(format_args!(" name: {0}\n", data.name()))writeln!(fmt, " name: {}", data.name())?;
115 fmt.write_fmt(format_args!(" cnum: {0}\n", cnum))writeln!(fmt, " cnum: {cnum}")?;
116 fmt.write_fmt(format_args!(" hash: {0}\n", data.hash()))writeln!(fmt, " hash: {}", data.hash())?;
117 fmt.write_fmt(format_args!(" reqd: {0:?}\n", data.dep_kind()))writeln!(fmt, " reqd: {:?}", data.dep_kind())?;
118 fmt.write_fmt(format_args!(" priv: {0:?}\n", data.is_private_dep()))writeln!(fmt, " priv: {:?}", data.is_private_dep())?;
119 let CrateSource { dylib, rlib, rmeta, sdylib_interface } = data.source();
120 if let Some(dylib) = dylib {
121 fmt.write_fmt(format_args!(" dylib: {0}\n", dylib.display()))writeln!(fmt, " dylib: {}", dylib.display())?;
122 }
123 if let Some(rlib) = rlib {
124 fmt.write_fmt(format_args!(" rlib: {0}\n", rlib.display()))writeln!(fmt, " rlib: {}", rlib.display())?;
125 }
126 if let Some(rmeta) = rmeta {
127 fmt.write_fmt(format_args!(" rmeta: {0}\n", rmeta.display()))writeln!(fmt, " rmeta: {}", rmeta.display())?;
128 }
129 if let Some(sdylib_interface) = sdylib_interface {
130 fmt.write_fmt(format_args!(" sdylib interface: {0}\n",
sdylib_interface.display()))writeln!(fmt, " sdylib interface: {}", sdylib_interface.display())?;
131 }
132 }
133 Ok(())
134 }
135}
136
137#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'a> ::core::clone::TrivialClone for CrateOrigin<'a> { }
#[automatically_derived]
impl<'a> ::core::clone::Clone for CrateOrigin<'a> {
#[inline]
fn clone(&self) -> CrateOrigin<'a> {
let _: ::core::clone::AssertParamIsClone<&'a CratePaths>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'a CrateDep>;
*self
}
}Clone, #[automatically_derived]
impl<'a> ::core::marker::Copy for CrateOrigin<'a> { }Copy)]
139enum CrateOrigin<'a> {
140 IndirectDependency {
142 dep_root_for_errors: &'a CratePaths,
144 parent_private: bool,
146 dep: &'a CrateDep,
148 },
149 Injected,
151 Extern,
153}
154
155impl<'a> CrateOrigin<'a> {
156 fn dep_root_for_errors(&self) -> Option<&'a CratePaths> {
158 match self {
159 CrateOrigin::IndirectDependency { dep_root_for_errors, .. } => {
160 Some(dep_root_for_errors)
161 }
162 _ => None,
163 }
164 }
165
166 fn dep(&self) -> Option<&'a CrateDep> {
168 match self {
169 CrateOrigin::IndirectDependency { dep, .. } => Some(dep),
170 _ => None,
171 }
172 }
173
174 fn private_dep(&self) -> Option<bool> {
177 match self {
178 CrateOrigin::IndirectDependency { parent_private, dep, .. } => {
179 Some(dep.is_private || *parent_private)
180 }
181 CrateOrigin::Injected => Some(true),
182 _ => None,
183 }
184 }
185}
186
187impl CStore {
188 pub fn from_tcx(tcx: TyCtxt<'_>) -> FreezeReadGuard<'_, CStore> {
189 FreezeReadGuard::map(tcx.untracked().cstore.read(), |cstore| {
190 cstore.as_any().downcast_ref::<CStore>().expect("`tcx.cstore` is not a `CStore`")
191 })
192 }
193
194 pub fn from_tcx_mut(tcx: TyCtxt<'_>) -> FreezeWriteGuard<'_, CStore> {
195 FreezeWriteGuard::map(tcx.untracked().cstore.write(), |cstore| {
196 cstore.untracked_as_any().downcast_mut().expect("`tcx.cstore` is not a `CStore`")
197 })
198 }
199
200 fn intern_stable_crate_id<'tcx>(
201 &mut self,
202 tcx: TyCtxt<'tcx>,
203 root: &CrateRoot,
204 ) -> Result<TyCtxtFeed<'tcx, CrateNum>, CrateError> {
205 {
match (&self.metas.len(), &tcx.untracked().stable_crate_ids.read().len())
{
(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!(self.metas.len(), tcx.untracked().stable_crate_ids.read().len());
206 let num = tcx.create_crate_num(root.stable_crate_id()).map_err(|existing| {
207 if existing == LOCAL_CRATE {
209 CrateError::SymbolConflictsCurrent(root.name())
210 } else if let Some(crate_name1) = self.metas[existing].as_ref().map(|data| data.name())
211 {
212 let crate_name0 = root.name();
213 CrateError::StableCrateIdCollision(crate_name0, crate_name1)
214 } else {
215 CrateError::NotFound(root.name())
216 }
217 })?;
218
219 self.metas.push(None);
220 Ok(num)
221 }
222
223 pub fn has_crate_data(&self, cnum: CrateNum) -> bool {
224 self.metas[cnum].is_some()
225 }
226
227 pub(crate) fn get_crate_data(&self, cnum: CrateNum) -> &CrateMetadata {
228 self.metas[cnum].as_ref().unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("Failed to get crate data for {0:?}",
cnum));
}panic!("Failed to get crate data for {cnum:?}"))
229 }
230
231 pub(crate) fn get_crate_data_mut(&mut self, cnum: CrateNum) -> &mut CrateMetadata {
232 self.metas[cnum].as_mut().unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("Failed to get crate data for {0:?}",
cnum));
}panic!("Failed to get crate data for {cnum:?}"))
233 }
234
235 fn set_crate_data(&mut self, cnum: CrateNum, data: CrateMetadata) {
236 if !self.metas[cnum].is_none() {
{
::core::panicking::panic_fmt(format_args!("Overwriting crate metadata entry"));
}
};assert!(self.metas[cnum].is_none(), "Overwriting crate metadata entry");
237 self.hash_to_cnum.insert(data.hash(), cnum);
238 self.metas[cnum] = Some(Box::new(data));
239 }
240
241 pub(crate) fn set_resolved_extern_crate_name(&mut self, name: Symbol, extern_crate: CrateNum) {
246 self.resolved_externs.insert(name, extern_crate);
247 }
248
249 pub fn resolved_extern_crate(&self, externs_name: Symbol) -> Option<CrateNum> {
254 self.resolved_externs.get(&externs_name).copied()
255 }
256
257 pub(crate) fn iter_crate_data(&self) -> impl Iterator<Item = (CrateNum, &CrateMetadata)> {
258 self.metas
259 .iter_enumerated()
260 .filter_map(|(cnum, data)| data.as_deref().map(|data| (cnum, data)))
261 }
262
263 pub fn all_proc_macro_def_ids(&self, tcx: TyCtxt<'_>) -> impl Iterator<Item = DefId> {
264 self.iter_crate_data().flat_map(move |(krate, data)| data.proc_macros_for_crate(tcx, krate))
265 }
266
267 fn push_dependencies_in_postorder(&self, deps: &mut IndexSet<CrateNum>, cnum: CrateNum) {
268 if !deps.contains(&cnum) {
269 let cdata = self.get_crate_data(cnum);
270 for dep in cdata.dependencies() {
271 if dep != cnum {
272 self.push_dependencies_in_postorder(deps, dep);
273 }
274 }
275
276 deps.insert(cnum);
277 }
278 }
279
280 pub(crate) fn crate_dependencies_in_postorder(&self, cnum: CrateNum) -> IndexSet<CrateNum> {
281 let mut deps = IndexSet::default();
282 if cnum == LOCAL_CRATE {
283 for (cnum, _) in self.iter_crate_data() {
284 self.push_dependencies_in_postorder(&mut deps, cnum);
285 }
286 } else {
287 self.push_dependencies_in_postorder(&mut deps, cnum);
288 }
289 deps
290 }
291
292 pub(crate) fn injected_panic_runtime(&self) -> Option<CrateNum> {
293 self.injected_panic_runtime
294 }
295
296 pub(crate) fn allocator_kind(&self) -> Option<AllocatorKind> {
297 self.allocator_kind
298 }
299
300 pub(crate) fn alloc_error_handler_kind(&self) -> Option<AllocatorKind> {
301 self.alloc_error_handler_kind
302 }
303
304 pub(crate) fn has_global_allocator(&self) -> bool {
305 self.has_global_allocator
306 }
307
308 pub(crate) fn has_alloc_error_handler(&self) -> bool {
309 self.has_alloc_error_handler
310 }
311
312 pub fn had_extern_crate_load_failure(&self) -> bool {
313 self.has_crate_resolve_with_fail
314 }
315
316 pub fn report_unused_deps(&self, tcx: TyCtxt<'_>) {
317 let json_unused_externs = tcx.sess.opts.json_unused_externs;
318
319 if !json_unused_externs.is_enabled() {
323 return;
324 }
325 let level =
326 tcx.lint_level_spec_at_node(UNUSED_CRATE_DEPENDENCIES, rustc_hir::CRATE_HIR_ID).level();
327 if level != lint::Level::Allow {
328 let unused_externs =
329 self.unused_externs.iter().map(|ident| ident.to_ident_string()).collect::<Vec<_>>();
330 let unused_externs = unused_externs.iter().map(String::as_str).collect::<Vec<&str>>();
331 tcx.dcx().emit_unused_externs(level, json_unused_externs.is_loud(), &unused_externs);
332 }
333 }
334
335 fn report_target_modifiers_extended(
336 tcx: TyCtxt<'_>,
337 mods: &TargetModifiers,
338 dep_mods: &TargetModifiers,
339 data: &CrateMetadata,
340 ) {
341 let allowed_flag_mismatches = &tcx.sess.opts.cg.unsafe_allow_abi_mismatch;
342 let local_crate = tcx.crate_name(LOCAL_CRATE);
343 let tmod_extender = |tmod: &TargetModifier| (tmod.extend(), tmod.clone());
344 let report_diff = |prefix: &String,
345 opt_name: &String,
346 flag_local_value: Option<&String>,
347 flag_extern_value: Option<&String>| {
348 if allowed_flag_mismatches.contains(&opt_name) {
349 return;
350 }
351 let extern_crate = data.name();
352 let flag_name = opt_name.clone();
353 let flag_name_prefixed = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("-{0}{1}", prefix, opt_name))
})format!("-{}{}", prefix, opt_name);
354
355 match (flag_local_value, flag_extern_value) {
356 (Some(local_value), Some(extern_value)) => {
357 tcx.dcx().emit_err(diagnostics::IncompatibleTargetModifiers {
358 extern_crate,
359 local_crate,
360 flag_name,
361 flag_name_prefixed,
362 local_value: local_value.to_string(),
363 extern_value: extern_value.to_string(),
364 })
365 }
366 (None, Some(extern_value)) => {
367 tcx.dcx().emit_err(diagnostics::IncompatibleTargetModifiersLMissed {
368 extern_crate,
369 local_crate,
370 flag_name,
371 flag_name_prefixed,
372 extern_value: extern_value.to_string(),
373 has_extern_value: !extern_value.is_empty(),
374 })
375 }
376 (Some(local_value), None) => {
377 tcx.dcx().emit_err(diagnostics::IncompatibleTargetModifiersRMissed {
378 extern_crate,
379 local_crate,
380 flag_name,
381 flag_name_prefixed,
382 local_value: local_value.to_string(),
383 has_local_value: !local_value.is_empty(),
384 })
385 }
386 (None, None) => {
::core::panicking::panic_fmt(format_args!("Incorrect target modifiers report_diff(None, None)"));
}panic!("Incorrect target modifiers report_diff(None, None)"),
387 };
388 };
389 let mut it1 = mods.iter().map(tmod_extender);
390 let mut it2 = dep_mods.iter().map(tmod_extender);
391 let mut left_name_val: Option<(ExtendedTargetModifierInfo, TargetModifier)> = None;
392 let mut right_name_val: Option<(ExtendedTargetModifierInfo, TargetModifier)> = None;
393 loop {
394 left_name_val = left_name_val.or_else(|| it1.next());
395 right_name_val = right_name_val.or_else(|| it2.next());
396 match (&left_name_val, &right_name_val) {
397 (Some(l), Some(r)) => match l.1.opt.cmp(&r.1.opt) {
398 cmp::Ordering::Equal => {
399 if !l.1.consistent(&tcx.sess, Some(&r.1)) {
400 report_diff(
401 &l.0.prefix,
402 &l.0.name,
403 Some(&l.1.value_name),
404 Some(&r.1.value_name),
405 );
406 }
407 left_name_val = None;
408 right_name_val = None;
409 }
410 cmp::Ordering::Greater => {
411 if !r.1.consistent(&tcx.sess, None) {
412 report_diff(&r.0.prefix, &r.0.name, None, Some(&r.1.value_name));
413 }
414 right_name_val = None;
415 }
416 cmp::Ordering::Less => {
417 if !l.1.consistent(&tcx.sess, None) {
418 report_diff(&l.0.prefix, &l.0.name, Some(&l.1.value_name), None);
419 }
420 left_name_val = None;
421 }
422 },
423 (Some(l), None) => {
424 if !l.1.consistent(&tcx.sess, None) {
425 report_diff(&l.0.prefix, &l.0.name, Some(&l.1.value_name), None);
426 }
427 left_name_val = None;
428 }
429 (None, Some(r)) => {
430 if !r.1.consistent(&tcx.sess, None) {
431 report_diff(&r.0.prefix, &r.0.name, None, Some(&r.1.value_name));
432 }
433 right_name_val = None;
434 }
435 (None, None) => break,
436 }
437 }
438 }
439
440 pub fn report_session_incompatibilities(&self, tcx: TyCtxt<'_>, krate: &Crate) {
441 self.report_incompatible_target_modifiers(tcx);
442 self.report_incompatible_partial_mitigations(tcx);
443 self.report_incompatible_async_drop_feature(tcx, krate);
444 }
445
446 pub fn report_incompatible_target_modifiers(&self, tcx: TyCtxt<'_>) {
447 for flag_name in &tcx.sess.opts.cg.unsafe_allow_abi_mismatch {
448 if !OptionsTargetModifiers::is_target_modifier(flag_name) {
449 tcx.dcx().emit_err(diagnostics::UnknownTargetModifierUnsafeAllowed {
450 flag_name: flag_name.clone(),
451 });
452 }
453 }
454 let mods = tcx.sess.opts.gather_target_modifiers();
455 for (_cnum, data) in self.iter_crate_data() {
456 if data.is_proc_macro_crate() {
457 continue;
458 }
459 let dep_mods = data.target_modifiers();
460 if mods != dep_mods {
461 Self::report_target_modifiers_extended(tcx, &mods, &dep_mods, data);
462 }
463 }
464 }
465
466 pub fn report_incompatible_partial_mitigations(&self, tcx: TyCtxt<'_>) {
467 let my_mitigations = tcx.sess.gather_enabled_denied_partial_mitigations();
468 let mut my_mitigations: BTreeMap<_, _> =
469 my_mitigations.iter().map(|mitigation| (mitigation.kind, mitigation)).collect();
470 for skipped_mitigation in tcx.sess.opts.allowed_partial_mitigations(tcx.sess.edition()) {
471 my_mitigations.remove(&skipped_mitigation);
472 }
473 const MAX_ERRORS_PER_MITIGATION: usize = 5;
474 let mut errors_per_mitigation = BTreeMap::new();
475 for (_cnum, data) in self.iter_crate_data() {
476 if data.is_proc_macro_crate() {
477 continue;
478 }
479 let their_mitigations = data.enabled_denied_partial_mitigations();
480 for my_mitigation in my_mitigations.values() {
481 let their_mitigation = their_mitigations
482 .iter()
483 .find(|mitigation| mitigation.kind == my_mitigation.kind)
484 .map_or(DeniedPartialMitigationLevel::Enabled(false), |m| m.level);
485 if their_mitigation < my_mitigation.level {
486 let errors = errors_per_mitigation.entry(my_mitigation.kind).or_insert(0);
487 if *errors >= MAX_ERRORS_PER_MITIGATION {
488 continue;
489 }
490 *errors += 1;
491
492 tcx.dcx().emit_err(diagnostics::MitigationLessStrictInDependency {
493 mitigation_name: my_mitigation.kind.to_string(),
494 mitigation_level: my_mitigation.level.level_str().to_string(),
495 extern_crate: data.name(),
496 });
497 }
498 }
499 }
500 }
501
502 pub fn report_incompatible_async_drop_feature(&self, tcx: TyCtxt<'_>, krate: &Crate) {
504 if tcx.features().async_drop() {
505 return;
506 }
507 for (_cnum, data) in self.iter_crate_data() {
508 if data.is_proc_macro_crate() {
509 continue;
510 }
511 if data.has_async_drops() {
512 let extern_crate = data.name();
513 let local_crate = tcx.crate_name(LOCAL_CRATE);
514 tcx.dcx().emit_warn(diagnostics::AsyncDropTypesInDependency {
515 span: krate.spans.inner_span.shrink_to_lo(),
516 extern_crate,
517 local_crate,
518 });
519 }
520 }
521 }
522
523 pub fn new(metadata_loader: Box<MetadataLoaderDyn>) -> CStore {
524 CStore {
525 metadata_loader,
526 metas: IndexVec::from_iter(iter::once(None)),
531 injected_panic_runtime: None,
532 allocator_kind: None,
533 alloc_error_handler_kind: None,
534 has_global_allocator: false,
535 has_alloc_error_handler: false,
536 hash_to_cnum: UnordMap::default(),
537 resolved_externs: UnordMap::default(),
538 unused_externs: Vec::new(),
539 used_extern_options: Default::default(),
540 has_crate_resolve_with_fail: false,
541 }
542 }
543
544 fn existing_match(&self, name: Symbol, hash: Option<Svh>) -> Option<CrateNum> {
545 let hash = hash?;
546 let cnum = *self.hash_to_cnum.get(&hash)?;
547 if true {
{
match (&self.get_crate_data(cnum).name(), &name) {
(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);
}
}
}
};
};debug_assert_eq!(self.get_crate_data(cnum).name(), name);
548 Some(cnum)
549 }
550
551 fn is_private_dep(&self, externs: &Externs, name: Symbol, private_dep: Option<bool>) -> bool {
562 let extern_private = externs.get(name.as_str()).map(|e| e.is_private_dep);
563 match (extern_private, private_dep) {
564 (Some(false), _) | (_, Some(false)) | (None, None) => false,
567 (Some(true) | None, Some(true) | None) => true,
569 }
570 }
571
572 fn register_crate<'tcx>(
573 &mut self,
574 tcx: TyCtxt<'tcx>,
575 host_lib: Option<Library>,
576 origin: CrateOrigin<'_>,
577 lib: Library,
578 dep_kind: CrateDepKind,
579 name: Symbol,
580 private_dep: Option<bool>,
581 ) -> Result<CrateNum, CrateError> {
582 let _prof_timer =
583 tcx.sess.prof.generic_activity_with_arg("metadata_register_crate", name.as_str());
584
585 let Library { source, metadata } = lib;
586 let crate_root = metadata.get_root();
587 let host_hash = host_lib.as_ref().map(|lib| lib.metadata.get_root().hash());
588 let private_dep = self.is_private_dep(&tcx.sess.opts.externs, name, private_dep);
589
590 let feed = self.intern_stable_crate_id(tcx, &crate_root)?;
592 let cnum = feed.key();
593
594 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:594",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(594u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("register crate `{0}` (cnum = {1}. private_dep = {2})",
crate_root.name(), cnum, private_dep) as
&dyn ::tracing::field::Value))])
});
} else { ; }
};info!(
595 "register crate `{}` (cnum = {}. private_dep = {})",
596 crate_root.name(),
597 cnum,
598 private_dep
599 );
600
601 let crate_paths;
604 let dep_root_for_errors = if let Some(dep_root_for_errors) = origin.dep_root_for_errors() {
605 dep_root_for_errors
606 } else {
607 crate_paths = CratePaths::new(crate_root.name(), source.clone());
608 &crate_paths
609 };
610
611 let cnum_map = self.resolve_crate_deps(
612 tcx,
613 dep_root_for_errors,
614 &crate_root,
615 &metadata,
616 cnum,
617 dep_kind,
618 private_dep,
619 )?;
620
621 let raw_proc_macros = if crate_root.is_proc_macro_crate() {
622 let temp_root;
623 let (dlsym_source, dlsym_root) = match &host_lib {
624 Some(host_lib) => (&host_lib.source, {
625 temp_root = host_lib.metadata.get_root();
626 &temp_root
627 }),
628 None => (&source, &crate_root),
629 };
630 let dlsym_dylib = dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate");
631 Some(self.dlsym_proc_macros(dlsym_dylib, dlsym_root.stable_crate_id())?)
632 } else {
633 None
634 };
635
636 let crate_metadata = CrateMetadata::new(
637 tcx,
638 metadata,
639 crate_root,
640 raw_proc_macros,
641 cnum,
642 cnum_map,
643 dep_kind,
644 source,
645 private_dep,
646 host_hash,
647 );
648
649 self.set_crate_data(cnum, crate_metadata);
650
651 Ok(cnum)
652 }
653
654 fn load_proc_macro<'a, 'b>(
655 &self,
656 sess: &'a Session,
657 locator: &mut CrateLocator<'b>,
658 crate_rejections: &mut CrateRejections,
659 path_kind: PathKind,
660 host_hash: Option<Svh>,
661 ) -> Result<Option<(LoadResult, Option<Library>)>, CrateError>
662 where
663 'a: 'b,
664 {
665 if sess.opts.unstable_opts.dual_proc_macros {
666 let mut proc_macro_locator = locator.clone();
669
670 proc_macro_locator.for_target_proc_macro(sess, path_kind);
672
673 let target_result =
675 match self.load(&mut proc_macro_locator, &mut CrateRejections::default())? {
676 Some(LoadResult::Previous(cnum)) => {
677 return Ok(Some((LoadResult::Previous(cnum), None)));
678 }
679 Some(LoadResult::Loaded(library)) => Some(LoadResult::Loaded(library)),
680 None => return Ok(None),
681 };
682
683 *crate_rejections = CrateRejections::default();
686
687 locator.for_proc_macro(sess, path_kind);
689
690 locator.hash = host_hash;
691
692 let Some(host_result) = self.load(locator, crate_rejections)? else {
693 return Ok(None);
694 };
695
696 let host_result = match host_result {
697 LoadResult::Previous(..) => {
698 {
::core::panicking::panic_fmt(format_args!("host and target proc macros must be loaded in lock-step"));
}panic!("host and target proc macros must be loaded in lock-step")
699 }
700 LoadResult::Loaded(library) => library,
701 };
702 Ok(Some((target_result.unwrap(), Some(host_result))))
703 } else {
704 let mut proc_macro_locator = locator.clone();
707
708 proc_macro_locator.for_proc_macro(sess, path_kind);
710
711 if let Some(host_result) =
712 self.load(&mut proc_macro_locator, &mut CrateRejections::default())?
713 {
714 Ok(Some((host_result, None)))
715 } else if sess.opts.unstable_opts.wasm_proc_macros {
716 proc_macro_locator.for_wasm_proc_macro(sess, path_kind);
718
719 match self.load(&mut proc_macro_locator, &mut CrateRejections::default())? {
720 Some(host_result) => Ok(Some((host_result, None))),
721 None => Ok(None),
722 }
723 } else {
724 Ok(None)
725 }
726 }
727 }
728
729 fn resolve_crate<'tcx>(
730 &mut self,
731 tcx: TyCtxt<'tcx>,
732 name: Symbol,
733 span: Span,
734 dep_kind: CrateDepKind,
735 origin: CrateOrigin<'_>,
736 ) -> Option<CrateNum> {
737 self.used_extern_options.insert(name);
738 match self.maybe_resolve_crate(tcx, name, dep_kind, origin) {
739 Ok(cnum) => {
740 self.set_used_recursively(cnum);
741 Some(cnum)
742 }
743 Err(err) => {
744 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:744",
"rustc_metadata::creader", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(744u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::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!("failed to resolve crate {0} {1:?}",
name, dep_kind) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("failed to resolve crate {} {:?}", name, dep_kind);
745 if !tcx.sess.dcx().has_errors().is_some() && !span.is_dummy() {
750 self.has_crate_resolve_with_fail = true;
751 }
752 let missing_core = self
753 .maybe_resolve_crate(
754 tcx,
755 sym::core,
756 CrateDepKind::Unconditional,
757 CrateOrigin::Extern,
758 )
759 .is_err();
760 err.report(tcx.sess, span, missing_core);
761 None
762 }
763 }
764 }
765
766 fn maybe_resolve_crate<'b, 'tcx>(
767 &'b mut self,
768 tcx: TyCtxt<'tcx>,
769 name: Symbol,
770 mut dep_kind: CrateDepKind,
771 origin: CrateOrigin<'b>,
772 ) -> Result<CrateNum, CrateError> {
773 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:773",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(773u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("resolving crate `{0}`",
name) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("resolving crate `{}`", name);
774 if !name.as_str().is_ascii() {
775 return Err(CrateError::NonAsciiName(name));
776 }
777
778 let dep_root_for_errors = origin.dep_root_for_errors();
779 let dep = origin.dep();
780 let hash = dep.map(|d| d.hash);
781 let host_hash = dep.map(|d| d.host_hash).flatten();
782 let extra_filename = dep.map(|d| &d.extra_filename[..]);
783 let path_kind = if dep.is_some() { PathKind::Dependency } else { PathKind::Crate };
784 let private_dep = origin.private_dep();
785
786 let result = if let Some(cnum) = self.existing_match(name, hash) {
787 (LoadResult::Previous(cnum), None)
788 } else {
789 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:789",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(789u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("falling back to a load")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("falling back to a load");
790 let mut locator = CrateLocator::new(
791 tcx.sess,
792 &*self.metadata_loader,
793 name,
794 tcx.crate_types().iter().all(|c| *c == CrateType::Rlib),
797 hash,
798 extra_filename,
799 path_kind,
800 );
801 let mut crate_rejections = CrateRejections::default();
802
803 match self.load(&mut locator, &mut crate_rejections)? {
804 Some(res) => (res, None),
805 None => {
806 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:806",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(806u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("falling back to loading proc_macro")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("falling back to loading proc_macro");
807 dep_kind = CrateDepKind::MacrosOnly;
808 match self.load_proc_macro(
809 tcx.sess,
810 &mut locator,
811 &mut crate_rejections,
812 path_kind,
813 host_hash,
814 )? {
815 Some(res) => res,
816 None => {
817 return Err(
818 locator.into_error(crate_rejections, dep_root_for_errors.cloned())
819 );
820 }
821 }
822 }
823 }
824 };
825
826 match result {
827 (LoadResult::Previous(cnum), None) => {
828 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:828",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(828u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("library for `{0}` was loaded previously, cnum {1}",
name, cnum) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("library for `{}` was loaded previously, cnum {cnum}", name);
829 let private_dep = self.is_private_dep(&tcx.sess.opts.externs, name, private_dep);
834 let cdata = self.get_crate_data_mut(cnum);
835 if cdata.is_proc_macro_crate() {
836 dep_kind = CrateDepKind::MacrosOnly;
837 }
838 cdata.set_dep_kind(cmp::max(cdata.dep_kind(), dep_kind));
839 cdata.update_and_private_dep(private_dep);
840 Ok(cnum)
841 }
842 (LoadResult::Loaded(library), host_library) => {
843 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:843",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(843u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("register newly loaded library for `{0}`",
name) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("register newly loaded library for `{}`", name);
844 self.register_crate(tcx, host_library, origin, library, dep_kind, name, private_dep)
845 }
846 _ => ::core::panicking::panic("explicit panic")panic!(),
847 }
848 }
849
850 fn load(
851 &self,
852 locator: &CrateLocator<'_>,
853 crate_rejections: &mut CrateRejections,
854 ) -> Result<Option<LoadResult>, CrateError> {
855 let Some(library) = locator.maybe_load_library_crate(crate_rejections)? else {
856 return Ok(None);
857 };
858
859 let root = library.metadata.get_root();
864 let mut result = LoadResult::Loaded(library);
865 for (cnum, data) in self.iter_crate_data() {
866 if data.name() == root.name() && root.hash() == data.hash() {
867 if !locator.hash.is_none() {
::core::panicking::panic("assertion failed: locator.hash.is_none()")
};assert!(locator.hash.is_none());
868 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:868",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(868u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("load success, going to previous cnum: {0}",
cnum) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("load success, going to previous cnum: {}", cnum);
869 result = LoadResult::Previous(cnum);
870 break;
871 }
872 }
873 Ok(Some(result))
874 }
875
876 fn resolve_crate_deps(
878 &mut self,
879 tcx: TyCtxt<'_>,
880 dep_root_for_errors: &CratePaths,
881 crate_root: &CrateRoot,
882 metadata: &MetadataBlob,
883 krate: CrateNum,
884 dep_kind: CrateDepKind,
885 parent_is_private: bool,
886 ) -> Result<CrateNumMap, CrateError> {
887 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:887",
"rustc_metadata::creader", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(887u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::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!("resolving deps of external crate `{0}` with dep root `{1}`",
crate_root.name(), dep_root_for_errors.name) as
&dyn ::tracing::field::Value))])
});
} else { ; }
};debug!(
888 "resolving deps of external crate `{}` with dep root `{}`",
889 crate_root.name(),
890 dep_root_for_errors.name
891 );
892 if crate_root.is_proc_macro_crate() {
893 return Ok(CrateNumMap::new());
894 }
895
896 let deps = crate_root.decode_crate_deps(metadata);
900 let mut crate_num_map = CrateNumMap::with_capacity(1 + deps.len());
901 crate_num_map.push(krate);
902 for dep in deps {
903 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:903",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(903u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("resolving dep `{0}`->`{1}` hash: `{2}` extra filename: `{3}` private {4}",
crate_root.name(), dep.name, dep.hash, dep.extra_filename,
dep.is_private) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!(
904 "resolving dep `{}`->`{}` hash: `{}` extra filename: `{}` private {}",
905 crate_root.name(),
906 dep.name,
907 dep.hash,
908 dep.extra_filename,
909 dep.is_private,
910 );
911 let dep_kind = match dep_kind {
912 CrateDepKind::MacrosOnly => CrateDepKind::MacrosOnly,
913 _ => dep.kind,
914 };
915 let cnum = self.maybe_resolve_crate(
916 tcx,
917 dep.name,
918 dep_kind,
919 CrateOrigin::IndirectDependency {
920 dep_root_for_errors,
921 parent_private: parent_is_private,
922 dep: &dep,
923 },
924 )?;
925 crate_num_map.push(cnum);
926 }
927
928 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:928",
"rustc_metadata::creader", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(928u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::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!("resolve_crate_deps: cnum_map for {0:?} is {1:?}",
krate, crate_num_map) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("resolve_crate_deps: cnum_map for {:?} is {:?}", krate, crate_num_map);
929 Ok(crate_num_map)
930 }
931
932 fn dlsym_proc_macros(
933 &self,
934 path: &Path,
935 stable_crate_id: StableCrateId,
936 ) -> Result<&'static [ProcMacroClient], CrateError> {
937 Ok(crate::host_dylib::dlsym_proc_macros(path, stable_crate_id)?)
938 }
939
940 fn inject_panic_runtime(&mut self, tcx: TyCtxt<'_>, krate: &ast::Crate) {
941 let is_std = attr::contains_name(&krate.attrs, sym::needs_panic_runtime);
942 let only_rlib = tcx.crate_types().iter().all(|ct| *ct == CrateType::Rlib);
945 if only_rlib && !is_std {
946 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:946",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(946u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("panic runtime injection skipped, only generating rlib")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("panic runtime injection skipped, only generating rlib");
947 return;
948 }
949
950 let desired_strategy = tcx.sess.panic_strategy();
951 let name = match desired_strategy {
952 PanicStrategy::Unwind => sym::panic_unwind,
953 PanicStrategy::Abort => sym::panic_abort,
954 PanicStrategy::ImmediateAbort => {
955 return;
957 }
958 };
959
960 let mut found_panic_runtime = None;
964 let mut needs_panic_runtime = is_std;
965 for (cnum, data) in self.iter_crate_data() {
966 needs_panic_runtime |= data.needs_panic_runtime();
967
968 if data.is_panic_runtime() && data.name() == name {
969 found_panic_runtime = Some(cnum)
970 }
971 }
972
973 if !needs_panic_runtime {
976 return;
977 }
978
979 if let Some(found_panic_runtime) = found_panic_runtime {
988 self.injected_panic_runtime = Some(found_panic_runtime);
989 return;
990 }
991
992 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:992",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(992u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("panic runtime not found -- loading {0}",
name) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("panic runtime not found -- loading {}", name);
993
994 let Some(cnum) = self.resolve_crate(
1007 tcx,
1008 name,
1009 DUMMY_SP,
1010 CrateDepKind::Conditional,
1011 CrateOrigin::Injected,
1012 ) else {
1013 return;
1014 };
1015 let cdata = self.get_crate_data(cnum);
1016
1017 if !cdata.is_panic_runtime() {
1019 tcx.dcx().emit_err(diagnostics::CrateNotPanicRuntime { crate_name: name });
1020 }
1021 if desired_strategy == PanicStrategy::Abort
1023 && cdata.required_panic_strategy() != Some(PanicStrategy::Abort)
1024 {
1025 tcx.dcx().emit_err(diagnostics::NoPanicStrategy {
1026 crate_name: name,
1027 strategy: desired_strategy,
1028 });
1029 }
1030
1031 self.injected_panic_runtime = Some(cnum);
1032 }
1033
1034 fn inject_profiler_runtime(&mut self, tcx: TyCtxt<'_>) {
1035 let needs_profiler_runtime =
1036 tcx.sess.instrument_coverage() || tcx.sess.opts.cg.profile_generate.enabled();
1037 if !needs_profiler_runtime || tcx.sess.opts.unstable_opts.no_profiler_runtime {
1038 return;
1039 }
1040
1041 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:1041",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(1041u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("loading profiler")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("loading profiler");
1042
1043 let name = Symbol::intern(&tcx.sess.opts.unstable_opts.profiler_runtime);
1051 let Some(cnum) = self.resolve_crate(
1052 tcx,
1053 name,
1054 DUMMY_SP,
1055 CrateDepKind::Conditional,
1056 CrateOrigin::Injected,
1057 ) else {
1058 return;
1059 };
1060 let cdata = self.get_crate_data(cnum);
1061
1062 if !cdata.is_profiler_runtime() {
1064 tcx.dcx().emit_err(diagnostics::NotProfilerRuntime { crate_name: name });
1065 }
1066 }
1067
1068 fn inject_allocator_crate(&mut self, tcx: TyCtxt<'_>, krate: &ast::Crate) {
1069 self.has_global_allocator =
1070 match &*fn_spans(krate, Symbol::intern(&global_fn_name(sym::alloc))) {
1071 [span1, span2, ..] => {
1072 tcx.dcx().emit_err(diagnostics::NoMultipleGlobalAlloc {
1073 span2: *span2,
1074 span1: *span1,
1075 });
1076 true
1077 }
1078 spans => !spans.is_empty(),
1079 };
1080 let alloc_error_handler = Symbol::intern(&global_fn_name(ALLOC_ERROR_HANDLER));
1081 self.has_alloc_error_handler = match &*fn_spans(krate, alloc_error_handler) {
1082 [span1, span2, ..] => {
1083 tcx.dcx().emit_err(diagnostics::NoMultipleAllocErrorHandler {
1084 span2: *span2,
1085 span1: *span1,
1086 });
1087 true
1088 }
1089 spans => !spans.is_empty(),
1090 };
1091
1092 if !attr::contains_name(&krate.attrs, sym::needs_allocator)
1096 && !self.iter_crate_data().any(|(_, data)| data.needs_allocator())
1097 {
1098 return;
1099 }
1100
1101 let all_rlib = tcx.crate_types().iter().all(|ct| #[allow(non_exhaustive_omitted_patterns)] match *ct {
CrateType::Rlib => true,
_ => false,
}matches!(*ct, CrateType::Rlib));
1105 if all_rlib {
1106 return;
1107 }
1108
1109 #[allow(rustc::symbol_intern_string_literal)]
1117 let this_crate = Symbol::intern("this crate");
1118
1119 let mut global_allocator = self.has_global_allocator.then_some(this_crate);
1120 for (_, data) in self.iter_crate_data() {
1121 if data.has_global_allocator() {
1122 match global_allocator {
1123 Some(other_crate) => {
1124 tcx.dcx().emit_err(diagnostics::ConflictingGlobalAlloc {
1125 crate_name: data.name(),
1126 other_crate_name: other_crate,
1127 });
1128 }
1129 None => global_allocator = Some(data.name()),
1130 }
1131 }
1132 }
1133 let mut alloc_error_handler = self.has_alloc_error_handler.then_some(this_crate);
1134 for (_, data) in self.iter_crate_data() {
1135 if data.has_alloc_error_handler() {
1136 match alloc_error_handler {
1137 Some(other_crate) => {
1138 tcx.dcx().emit_err(diagnostics::ConflictingAllocErrorHandler {
1139 crate_name: data.name(),
1140 other_crate_name: other_crate,
1141 });
1142 }
1143 None => alloc_error_handler = Some(data.name()),
1144 }
1145 }
1146 }
1147
1148 if global_allocator.is_some() {
1149 self.allocator_kind = Some(AllocatorKind::Global);
1150 } else {
1151 if !attr::contains_name(&krate.attrs, sym::default_lib_allocator)
1156 && !self.iter_crate_data().any(|(_, data)| data.has_default_lib_allocator())
1157 {
1158 tcx.dcx().emit_err(diagnostics::GlobalAllocRequired);
1159 }
1160 self.allocator_kind = Some(AllocatorKind::Default);
1161 }
1162
1163 if alloc_error_handler.is_some() {
1164 self.alloc_error_handler_kind = Some(AllocatorKind::Global);
1165 } else {
1166 self.alloc_error_handler_kind = Some(AllocatorKind::Default);
1169 }
1170 }
1171
1172 fn inject_forced_externs(&mut self, tcx: TyCtxt<'_>) {
1173 for (name, entry) in tcx.sess.opts.externs.iter() {
1174 if entry.force {
1175 let name_interned = Symbol::intern(name);
1176 if !self.used_extern_options.contains(&name_interned) {
1177 self.resolve_crate(
1178 tcx,
1179 name_interned,
1180 DUMMY_SP,
1181 CrateDepKind::Unconditional,
1182 CrateOrigin::Extern,
1183 );
1184 }
1185 }
1186 }
1187 }
1188
1189 fn inject_compiler_builtins(&mut self, tcx: TyCtxt<'_>, krate: &ast::Crate) {
1191 if attr::contains_name(&krate.attrs, sym::compiler_builtins)
1193 || attr::contains_name(&krate.attrs, sym::no_core)
1194 {
1195 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:1195",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(1195u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("`compiler_builtins` unneeded")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("`compiler_builtins` unneeded");
1196 return;
1197 }
1198
1199 for (cnum, cmeta) in self.iter_crate_data() {
1202 if cmeta.is_compiler_builtins() {
1203 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:1203",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(1203u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("`compiler_builtins` already exists (cnum = {0}); skipping injection",
cnum) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("`compiler_builtins` already exists (cnum = {cnum}); skipping injection");
1204 return;
1205 }
1206 }
1207
1208 let Some(cnum) = self.resolve_crate(
1210 tcx,
1211 sym::compiler_builtins,
1212 krate.spans.inner_span.shrink_to_lo(),
1213 CrateDepKind::Unconditional,
1214 CrateOrigin::Injected,
1215 ) else {
1216 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:1216",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(1216u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("`compiler_builtins` not resolved")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("`compiler_builtins` not resolved");
1217 return;
1218 };
1219
1220 let cdata = self.get_crate_data(cnum);
1222 if !cdata.is_compiler_builtins() {
1223 tcx.dcx().emit_err(diagnostics::CrateNotCompilerBuiltins { crate_name: cdata.name() });
1224 }
1225 }
1226
1227 fn report_unused_deps_in_crate(&mut self, tcx: TyCtxt<'_>, krate: &ast::Crate) {
1228 let span = krate.spans.inner_span.shrink_to_lo();
1230 for (name, entry) in tcx.sess.opts.externs.iter() {
1232 if let ExternLocation::FoundInLibrarySearchDirectories = entry.location {
1233 continue;
1235 }
1236 if entry.nounused_dep || entry.force {
1237 continue;
1239 }
1240 let name_interned = Symbol::intern(name);
1241 if self.used_extern_options.contains(&name_interned) {
1242 continue;
1243 }
1244
1245 if tcx.sess.opts.json_unused_externs.is_enabled() {
1247 self.unused_externs.push(name_interned);
1248 continue;
1249 }
1250
1251 tcx.sess.psess.buffer_lint(
1252 UNUSED_CRATE_DEPENDENCIES,
1253 span,
1254 ast::CRATE_NODE_ID,
1255 diagnostics::UnusedCrateDependency {
1256 extern_crate: name_interned,
1257 local_crate: tcx.crate_name(LOCAL_CRATE),
1258 },
1259 );
1260 }
1261 }
1262
1263 fn report_future_incompatible_deps(&self, tcx: TyCtxt<'_>, krate: &ast::Crate) {
1264 let name = tcx.crate_name(LOCAL_CRATE);
1265
1266 if name.as_str() == "wasm_bindgen" {
1267 let major = env::var("CARGO_PKG_VERSION_MAJOR")
1268 .ok()
1269 .and_then(|major| u64::from_str(&major).ok());
1270 let minor = env::var("CARGO_PKG_VERSION_MINOR")
1271 .ok()
1272 .and_then(|minor| u64::from_str(&minor).ok());
1273 let patch = env::var("CARGO_PKG_VERSION_PATCH")
1274 .ok()
1275 .and_then(|patch| u64::from_str(&patch).ok());
1276
1277 match (major, minor, patch) {
1278 (Some(1..), _, _) => return,
1280 (Some(0), Some(3..), _) => return,
1282 (Some(0), Some(2), Some(88..)) => return,
1284 (None, None, None) => return,
1286 _ => (),
1287 }
1288
1289 let span = krate.spans.inner_span.shrink_to_lo();
1291
1292 tcx.sess.dcx().emit_err(diagnostics::WasmCAbi { span });
1293 }
1294 }
1295
1296 pub fn postprocess(&mut self, tcx: TyCtxt<'_>, krate: &ast::Crate) {
1297 self.inject_compiler_builtins(tcx, krate);
1298 self.inject_forced_externs(tcx);
1299 self.inject_profiler_runtime(tcx);
1300 self.inject_allocator_crate(tcx, krate);
1301 self.inject_panic_runtime(tcx, krate);
1302
1303 self.report_unused_deps_in_crate(tcx, krate);
1304 self.report_future_incompatible_deps(tcx, krate);
1305
1306 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:1306",
"rustc_metadata::creader", ::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(1306u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::INFO <=
::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!("{0:?}",
self) as &dyn ::tracing::field::Value))])
});
} else { ; }
};info!("{:?}", self);
1307 }
1308
1309 pub fn process_extern_crate(
1311 &mut self,
1312 tcx: TyCtxt<'_>,
1313 item: &ast::Item,
1314 def_id: LocalDefId,
1315 definitions: &Definitions,
1316 ) -> Option<CrateNum> {
1317 match item.kind {
1318 ast::ItemKind::ExternCrate(orig_name, ident) => {
1319 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs:1319",
"rustc_metadata::creader", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/cea272fa356e94bd2ee2cadf376630aa0683867a/compiler/rustc_metadata/src/creader.rs"),
::tracing_core::__macro_support::Option::Some(1319u32),
::tracing_core::__macro_support::Option::Some("rustc_metadata::creader"),
::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!("resolving extern crate stmt. ident: {0} orig_name: {1:?}",
ident, orig_name) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("resolving extern crate stmt. ident: {} orig_name: {:?}", ident, orig_name);
1320 let name = match orig_name {
1321 Some(orig_name) => {
1322 validate_crate_name(tcx.sess, orig_name, Some(item.span));
1323 orig_name
1324 }
1325 None => ident.name,
1326 };
1327 let dep_kind = if attr::contains_name(&item.attrs, sym::no_link) {
1328 CrateDepKind::MacrosOnly
1329 } else {
1330 CrateDepKind::Unconditional
1331 };
1332
1333 let cnum =
1334 self.resolve_crate(tcx, name, item.span, dep_kind, CrateOrigin::Extern)?;
1335
1336 let path_len = definitions.def_path(def_id).data.len();
1337 self.update_extern_crate(
1338 cnum,
1339 name,
1340 ExternCrate {
1341 src: ExternCrateSource::Extern(def_id.to_def_id()),
1342 span: item.span,
1343 path_len,
1344 dependency_of: LOCAL_CRATE,
1345 },
1346 );
1347 Some(cnum)
1348 }
1349 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("impossible case reached"))bug!(),
1350 }
1351 }
1352
1353 pub fn process_path_extern(
1354 &mut self,
1355 tcx: TyCtxt<'_>,
1356 name: Symbol,
1357 span: Span,
1358 ) -> Option<CrateNum> {
1359 let cnum =
1360 self.resolve_crate(tcx, name, span, CrateDepKind::Unconditional, CrateOrigin::Extern)?;
1361
1362 self.update_extern_crate(
1363 cnum,
1364 name,
1365 ExternCrate {
1366 src: ExternCrateSource::Path,
1367 span,
1368 path_len: usize::MAX,
1370 dependency_of: LOCAL_CRATE,
1371 },
1372 );
1373
1374 Some(cnum)
1375 }
1376
1377 pub fn maybe_process_path_extern(&mut self, tcx: TyCtxt<'_>, name: Symbol) -> Option<CrateNum> {
1378 self.maybe_resolve_crate(tcx, name, CrateDepKind::Unconditional, CrateOrigin::Extern).ok()
1379 }
1380}
1381
1382fn fn_spans(krate: &ast::Crate, name: Symbol) -> Vec<Span> {
1383 struct Finder {
1384 name: Symbol,
1385 spans: Vec<Span>,
1386 }
1387 impl<'ast> visit::Visitor<'ast> for Finder {
1388 fn visit_item(&mut self, item: &'ast ast::Item) {
1389 if let Some(ident) = item.kind.ident()
1390 && ident.name == self.name
1391 && attr::contains_name(&item.attrs, sym::rustc_std_internal_symbol)
1392 {
1393 self.spans.push(item.span);
1394 }
1395 visit::walk_item(self, item)
1396 }
1397 }
1398
1399 let mut f = Finder { name, spans: Vec::new() };
1400 visit::walk_crate(&mut f, krate);
1401 f.spans
1402}