Skip to content

Commit d8b43ea

Browse files
committed
only add builtins if not already included
1 parent b15f5f0 commit d8b43ea

File tree

7 files changed

+70
-6
lines changed

7 files changed

+70
-6
lines changed

compiler/rustc_builtin_macros/src/standard_library_imports.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub fn inject(
4747
for &name in names.iter().rev() {
4848
let ident_span = if edition >= Edition2018 { span } else { call_site };
4949
let item = if name == sym::compiler_builtins {
50+
eprintln!("INJECTING BUILTINS");
5051
// compiler_builtins is a private implementation detail. We only
5152
// need to insert it into the crate graph for linking and should not
5253
// expose any of its public API.

compiler/rustc_metadata/messages.ftl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ metadata_crate_dep_rustc_driver =
4747
metadata_crate_location_unknown_type =
4848
extern location for {$crate_name} is of an unknown type: {$path}
4949
50+
metadata_crate_not_compiler_builtins =
51+
the crate `{$crate_name}` resolved as `compiler_builtins` but is not `#![compiler_builtins]`
52+
5053
metadata_crate_not_panic_runtime =
5154
the crate `{$crate_name}` is not a panic runtime
5255

compiler/rustc_metadata/src/creader.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
685685

686686
match result {
687687
(LoadResult::Previous(cnum), None) => {
688-
info!("library for `{}` was loaded previously", name);
688+
info!("library for `{}` was loaded previously, cnum {cnum}", name);
689689
// When `private_dep` is none, it indicates the directly dependent crate. If it is
690690
// not specified by `--extern` on command line parameters, it may be
691691
// `private-dependency` when `register_crate` is called for the first time. Then it must be updated to
@@ -1031,6 +1031,39 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
10311031
}
10321032
}
10331033

1034+
fn inject_compiler_builtins(&mut self, krate: &ast::Crate) {
1035+
if attr::contains_name(&krate.attrs, sym::compiler_builtins)
1036+
|| attr::contains_name(&krate.attrs, sym::no_core)
1037+
{
1038+
// `compiler_builtins` does not get extern builtins, nor do `#![no_core]` crates
1039+
info!("`compiler_builtins` unneeded");
1040+
return;
1041+
}
1042+
1043+
for (cnum, cmeta) in self.cstore.iter_crate_data() {
1044+
if cmeta.is_compiler_builtins() {
1045+
info!("`compiler_builtins` already exists (cnum = {cnum}); skipping injection");
1046+
return;
1047+
}
1048+
}
1049+
1050+
let Ok(cnum) = self.maybe_resolve_crate(
1051+
sym::compiler_builtins,
1052+
CrateDepKind::Implicit,
1053+
CrateOrigin::Injected,
1054+
) else {
1055+
info!("`compiler_builtins` not resolved");
1056+
return;
1057+
};
1058+
1059+
let cmeta = self.cstore.get_crate_data(cnum);
1060+
1061+
// Sanity check the loaded crate to ensure it is indeed compiler_builtins
1062+
if !cmeta.is_compiler_builtins() {
1063+
self.dcx().emit_err(errors::CrateNotCompilerBuiltins { crate_name: cmeta.name() });
1064+
}
1065+
}
1066+
10341067
fn inject_dependency_if(
10351068
&mut self,
10361069
krate: CrateNum,
@@ -1140,6 +1173,8 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
11401173
}
11411174

11421175
pub fn postprocess(&mut self, krate: &ast::Crate) {
1176+
info!("POSTPROCESS");
1177+
self.inject_compiler_builtins(krate);
11431178
self.inject_forced_externs();
11441179
self.inject_profiler_runtime();
11451180
self.inject_allocator_crate(krate);
@@ -1171,12 +1206,18 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
11711206
}
11721207
None => item.ident.name,
11731208
};
1209+
11741210
let dep_kind = if attr::contains_name(&item.attrs, sym::no_link) {
11751211
CrateDepKind::MacrosOnly
11761212
} else {
11771213
CrateDepKind::Explicit
11781214
};
11791215

1216+
if name == sym::compiler_builtins {
1217+
info!("BUILTINS DETECTED dep_kind {dep_kind:?}");
1218+
return None;
1219+
}
1220+
11801221
let cnum = self.resolve_crate(name, item.span, dep_kind, CrateOrigin::AstExtern)?;
11811222

11821223
let path_len = definitions.def_path(def_id).data.len();

compiler/rustc_metadata/src/errors.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,12 @@ pub struct CrateNotPanicRuntime {
332332
pub crate_name: Symbol,
333333
}
334334

335+
#[derive(Diagnostic)]
336+
#[diag(metadata_crate_not_compiler_builtins)]
337+
pub struct CrateNotCompilerBuiltins {
338+
pub crate_name: Symbol,
339+
}
340+
335341
#[derive(Diagnostic)]
336342
#[diag(metadata_no_panic_strategy)]
337343
pub struct NoPanicStrategy {

compiler/rustc_metadata/src/locator.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ pub(crate) struct CrateLocator<'a> {
260260
crate_rejections: CrateRejections,
261261
}
262262

263-
#[derive(Clone)]
263+
#[derive(Clone, Debug)]
264264
pub(crate) struct CratePaths {
265265
pub(crate) name: Symbol,
266266
source: CrateSource,
@@ -272,7 +272,7 @@ impl CratePaths {
272272
}
273273
}
274274

275-
#[derive(Copy, Clone, PartialEq)]
275+
#[derive(Copy, Clone, Debug, PartialEq)]
276276
pub(crate) enum CrateFlavor {
277277
Rlib,
278278
Rmeta,
@@ -893,13 +893,13 @@ fn get_flavor_from_path(path: &Path) -> CrateFlavor {
893893

894894
// ------------------------------------------ Error reporting -------------------------------------
895895

896-
#[derive(Clone)]
896+
#[derive(Clone, Debug)]
897897
struct CrateMismatch {
898898
path: PathBuf,
899899
got: String,
900900
}
901901

902-
#[derive(Clone, Default)]
902+
#[derive(Clone, Debug, Default)]
903903
struct CrateRejections {
904904
via_hash: Vec<CrateMismatch>,
905905
via_triple: Vec<CrateMismatch>,
@@ -912,6 +912,7 @@ struct CrateRejections {
912912
/// Candidate rejection reasons collected during crate search.
913913
/// If no candidate is accepted, then these reasons are presented to the user,
914914
/// otherwise they are ignored.
915+
#[derive(Debug)]
915916
pub(crate) struct CombinedLocatorError {
916917
crate_name: Symbol,
917918
dep_root: Option<CratePaths>,
@@ -921,6 +922,7 @@ pub(crate) struct CombinedLocatorError {
921922
crate_rejections: CrateRejections,
922923
}
923924

925+
#[derive(Debug)]
924926
pub(crate) enum CrateError {
925927
NonAsciiName(Symbol),
926928
ExternLocationNotExist(Symbol, PathBuf),

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1928,6 +1928,10 @@ impl CrateMetadata {
19281928
self.root.profiler_runtime
19291929
}
19301930

1931+
pub(crate) fn is_compiler_builtins(&self) -> bool {
1932+
self.root.compiler_builtins
1933+
}
1934+
19311935
pub(crate) fn needs_allocator(&self) -> bool {
19321936
self.root.needs_allocator
19331937
}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1+
error: `#[panic_handler]` function required, but not found
2+
3+
error: unwinding panics are not supported without std
4+
|
5+
= help: using nightly cargo, use -Zbuild-std with panic="abort" to avoid unwinding
6+
= note: since the core library is usually precompiled with panic="unwind", rebuilding your crate with panic="abort" may not be enough to fix the problem
7+
18
error: requires `sized` lang_item
29

3-
error: aborting due to 1 previous error
10+
error: aborting due to 3 previous errors
411

0 commit comments

Comments
 (0)