Skip to content

Commit 18f5391

Browse files
committed
Auto merge of rust-lang#122131 - workingjubilee:rollup-901aab1, r=workingjubilee
Rollup of 13 pull requests Successful merges: - rust-lang#113525 (Dynamically size sigaltstk in std) - rust-lang#114009 (compiler: allow transmute of ZST arrays with generics) - rust-lang#116793 (Allow targets to override default codegen backend) - rust-lang#118623 (Improve std::fs::read_to_string example) - rust-lang#120504 (Vec::try_with_capacity) - rust-lang#121089 (Remove `feed_local_def_id`) - rust-lang#121280 (Implement MaybeUninit::fill{,_with,_from}) - rust-lang#122087 (Add missing background color for top-level rust documentation page and increase contrast by setting text color to black) - rust-lang#122104 (Rust is a proper name: rust → Rust) - rust-lang#122110 (Make `x t miri` respect `MIRI_TEMP`) - rust-lang#122114 (Make not finding core a fatal error) - rust-lang#122115 (Cancel parsing ever made during recovery) - rust-lang#122126 (Fix `tidy --bless` on ̶X̶e̶n̶i̶x̶ Windows) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 51f4839 + c22cf59 commit 18f5391

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1032
-271
lines changed

compiler/rustc_ast_lowering/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
427427
tcx.ensure_with_value().early_lint_checks(());
428428
tcx.ensure_with_value().debugger_visualizers(LOCAL_CRATE);
429429
tcx.ensure_with_value().get_lang_items(());
430-
let (mut resolver, krate) = tcx.resolver_for_lowering(()).steal();
430+
let (mut resolver, krate) = tcx.resolver_for_lowering().steal();
431431

432432
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
433433
let mut owners = IndexVec::from_fn_n(

compiler/rustc_driver_impl/src/lib.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use rustc_session::config::{nightly_options, CG_OPTIONS, Z_OPTIONS};
3737
use rustc_session::config::{ErrorOutputType, Input, OutFileName, OutputType};
3838
use rustc_session::getopts::{self, Matches};
3939
use rustc_session::lint::{Lint, LintId};
40-
use rustc_session::{config, EarlyDiagCtxt, Session};
40+
use rustc_session::{config, filesearch, EarlyDiagCtxt, Session};
4141
use rustc_span::def_id::LOCAL_CRATE;
4242
use rustc_span::source_map::FileLoader;
4343
use rustc_span::symbol::sym;
@@ -418,7 +418,7 @@ fn run_compiler(
418418
}
419419

420420
// Make sure name resolution and macro expansion is run.
421-
queries.global_ctxt()?.enter(|tcx| tcx.resolver_for_lowering(()));
421+
queries.global_ctxt()?.enter(|tcx| tcx.resolver_for_lowering());
422422

423423
if callbacks.after_expansion(compiler, queries) == Compilation::Stop {
424424
return early_exit();
@@ -886,7 +886,11 @@ pub fn version_at_macro_invocation(
886886

887887
let debug_flags = matches.opt_strs("Z");
888888
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
889-
get_codegen_backend(early_dcx, &None, backend_name).print_version();
889+
let opts = config::Options::default();
890+
let sysroot = filesearch::materialize_sysroot(opts.maybe_sysroot.clone());
891+
let target = config::build_target_config(early_dcx, &opts, None, &sysroot);
892+
893+
get_codegen_backend(early_dcx, &sysroot, backend_name, &target).print_version();
890894
}
891895
}
892896

@@ -1091,7 +1095,12 @@ pub fn describe_flag_categories(early_dcx: &EarlyDiagCtxt, matches: &Matches) ->
10911095

10921096
if cg_flags.iter().any(|x| *x == "passes=list") {
10931097
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
1094-
get_codegen_backend(early_dcx, &None, backend_name).print_passes();
1098+
1099+
let opts = config::Options::default();
1100+
let sysroot = filesearch::materialize_sysroot(opts.maybe_sysroot.clone());
1101+
let target = config::build_target_config(early_dcx, &opts, None, &sysroot);
1102+
1103+
get_codegen_backend(early_dcx, &sysroot, backend_name, &target).print_passes();
10951104
return true;
10961105
}
10971106

compiler/rustc_driver_impl/src/pretty.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ impl<'tcx> PrintExtra<'tcx> {
229229
{
230230
match self {
231231
PrintExtra::AfterParsing { krate, .. } => f(krate),
232-
PrintExtra::NeedsAstMap { tcx } => f(&tcx.resolver_for_lowering(()).borrow().1),
232+
PrintExtra::NeedsAstMap { tcx } => f(&tcx.resolver_for_lowering().borrow().1),
233233
}
234234
}
235235

@@ -281,7 +281,7 @@ pub fn print<'tcx>(sess: &Session, ppm: PpMode, ex: PrintExtra<'tcx>) {
281281
}
282282
AstTreeExpanded => {
283283
debug!("pretty-printing expanded AST");
284-
format!("{:#?}", ex.tcx().resolver_for_lowering(()).borrow().1)
284+
format!("{:#?}", ex.tcx().resolver_for_lowering().borrow().1)
285285
}
286286
Hir(s) => {
287287
debug!("pretty printing HIR {:?}", s);

compiler/rustc_interface/src/interface.rs

+48-13
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_parse::maybe_new_parser_from_source_str;
1616
use rustc_query_impl::QueryCtxt;
1717
use rustc_query_system::query::print_query_stack;
1818
use rustc_session::config::{self, Cfg, CheckCfg, ExpectedValues, Input, OutFileName};
19-
use rustc_session::filesearch::sysroot_candidates;
19+
use rustc_session::filesearch::{self, sysroot_candidates};
2020
use rustc_session::parse::ParseSess;
2121
use rustc_session::{lint, CompilerIO, EarlyDiagCtxt, Session};
2222
use rustc_span::source_map::FileLoader;
@@ -339,16 +339,53 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
339339

340340
let early_dcx = EarlyDiagCtxt::new(config.opts.error_format);
341341

342-
let codegen_backend = if let Some(make_codegen_backend) = config.make_codegen_backend {
343-
make_codegen_backend(&config.opts)
344-
} else {
345-
util::get_codegen_backend(
346-
&early_dcx,
347-
&config.opts.maybe_sysroot,
348-
config.opts.unstable_opts.codegen_backend.as_deref(),
349-
)
342+
let sysroot = filesearch::materialize_sysroot(config.opts.maybe_sysroot.clone());
343+
344+
let (codegen_backend, target_override) = match config.make_codegen_backend {
345+
None => {
346+
// Build a target without override, so that it can override the backend if needed
347+
let target =
348+
config::build_target_config(&early_dcx, &config.opts, None, &sysroot);
349+
350+
let backend = util::get_codegen_backend(
351+
&early_dcx,
352+
&sysroot,
353+
config.opts.unstable_opts.codegen_backend.as_deref(),
354+
&target,
355+
);
356+
357+
// target_override is documented to be called before init(), so this is okay
358+
let target_override = backend.target_override(&config.opts);
359+
360+
// Assert that we don't use target's override of the backend and
361+
// backend's override of the target at the same time
362+
if config.opts.unstable_opts.codegen_backend.is_none()
363+
&& target.default_codegen_backend.is_some()
364+
&& target_override.is_some()
365+
{
366+
rustc_middle::bug!(
367+
"Codegen backend requested target override even though the target requested the backend"
368+
);
369+
}
370+
371+
(backend, target_override)
372+
}
373+
Some(make_codegen_backend) => {
374+
// N.B. `make_codegen_backend` takes precedence over `target.default_codegen_backend`,
375+
// which is ignored in this case.
376+
let backend = make_codegen_backend(&config.opts);
377+
378+
// target_override is documented to be called before init(), so this is okay
379+
let target_override = backend.target_override(&config.opts);
380+
381+
(backend, target_override)
382+
}
350383
};
351384

385+
// Re-build target with the (potential) override
386+
let target_cfg =
387+
config::build_target_config(&early_dcx, &config.opts, target_override, &sysroot);
388+
352389
let temps_dir = config.opts.unstable_opts.temps_dir.as_deref().map(PathBuf::from);
353390

354391
let bundle = match rustc_errors::fluent_bundle(
@@ -367,9 +404,6 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
367404
let mut locale_resources = Vec::from(config.locale_resources);
368405
locale_resources.push(codegen_backend.locale_resource());
369406

370-
// target_override is documented to be called before init(), so this is okay
371-
let target_override = codegen_backend.target_override(&config.opts);
372-
373407
let mut sess = rustc_session::build_session(
374408
early_dcx,
375409
config.opts,
@@ -384,7 +418,8 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
384418
locale_resources,
385419
config.lint_caps,
386420
config.file_loader,
387-
target_override,
421+
target_cfg,
422+
sysroot,
388423
util::rustc_version_str().unwrap_or("unknown"),
389424
config.ice_file,
390425
config.using_internal_features,

compiler/rustc_interface/src/passes.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ fn configure_and_expand(
280280

281281
fn early_lint_checks(tcx: TyCtxt<'_>, (): ()) {
282282
let sess = tcx.sess;
283-
let (resolver, krate) = &*tcx.resolver_for_lowering(()).borrow();
283+
let (resolver, krate) = &*tcx.resolver_for_lowering().borrow();
284284
let mut lint_buffer = resolver.lint_buffer.steal();
285285

286286
if sess.opts.unstable_opts.input_stats {
@@ -531,10 +531,10 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
531531
}
532532
}
533533

534-
fn resolver_for_lowering<'tcx>(
534+
fn resolver_for_lowering_raw<'tcx>(
535535
tcx: TyCtxt<'tcx>,
536536
(): (),
537-
) -> &'tcx Steal<(ty::ResolverAstLowering, Lrc<ast::Crate>)> {
537+
) -> (&'tcx Steal<(ty::ResolverAstLowering, Lrc<ast::Crate>)>, &'tcx ty::ResolverGlobalCtxt) {
538538
let arenas = Resolver::arenas();
539539
let _ = tcx.registered_tools(()); // Uses `crate_for_resolver`.
540540
let (krate, pre_configured_attrs) = tcx.crate_for_resolver(()).steal();
@@ -549,16 +549,15 @@ fn resolver_for_lowering<'tcx>(
549549
ast_lowering: untracked_resolver_for_lowering,
550550
} = resolver.into_outputs();
551551

552-
let feed = tcx.feed_unit_query();
553-
feed.resolutions(tcx.arena.alloc(untracked_resolutions));
554-
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, Lrc::new(krate))))
552+
let resolutions = tcx.arena.alloc(untracked_resolutions);
553+
(tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, Lrc::new(krate)))), resolutions)
555554
}
556555

557556
pub(crate) fn write_dep_info(tcx: TyCtxt<'_>) {
558557
// Make sure name resolution and macro expansion is run for
559558
// the side-effect of providing a complete set of all
560559
// accessed files and env vars.
561-
let _ = tcx.resolver_for_lowering(());
560+
let _ = tcx.resolver_for_lowering();
562561

563562
let sess = tcx.sess;
564563
let _timer = sess.timer("write_dep_info");
@@ -607,7 +606,10 @@ pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {
607606
let providers = &mut Providers::default();
608607
providers.analysis = analysis;
609608
providers.hir_crate = rustc_ast_lowering::lower_to_hir;
610-
providers.resolver_for_lowering = resolver_for_lowering;
609+
providers.resolver_for_lowering_raw = resolver_for_lowering_raw;
610+
providers.stripped_cfg_items =
611+
|tcx, _| tcx.arena.alloc_from_iter(tcx.resolutions(()).stripped_cfg_items.steal());
612+
providers.resolutions = |tcx, ()| tcx.resolver_for_lowering_raw(()).1;
611613
providers.early_lint_checks = early_lint_checks;
612614
proc_macro_decls::provide(providers);
613615
rustc_const_eval::provide(providers);

compiler/rustc_interface/src/queries.rs

+3-9
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ use rustc_codegen_ssa::CodegenResults;
88
use rustc_data_structures::steal::Steal;
99
use rustc_data_structures::svh::Svh;
1010
use rustc_data_structures::sync::{AppendOnlyIndexVec, FreezeLock, OnceLock, WorkerLocal};
11-
use rustc_hir::def::DefKind;
12-
use rustc_hir::def_id::{StableCrateId, CRATE_DEF_ID, LOCAL_CRATE};
11+
use rustc_hir::def_id::{StableCrateId, LOCAL_CRATE};
1312
use rustc_hir::definitions::Definitions;
1413
use rustc_incremental::setup_dep_graph;
1514
use rustc_metadata::creader::CStore;
@@ -144,10 +143,8 @@ impl<'tcx> Queries<'tcx> {
144143
stable_crate_id,
145144
)) as _);
146145
let definitions = FreezeLock::new(Definitions::new(stable_crate_id));
147-
let source_span = AppendOnlyIndexVec::new();
148-
let _id = source_span.push(krate.spans.inner_span);
149-
debug_assert_eq!(_id, CRATE_DEF_ID);
150-
let untracked = Untracked { cstore, source_span, definitions };
146+
let untracked =
147+
Untracked { cstore, source_span: AppendOnlyIndexVec::new(), definitions };
151148

152149
let qcx = passes::create_global_ctxt(
153150
self.compiler,
@@ -172,9 +169,6 @@ impl<'tcx> Queries<'tcx> {
172169
)));
173170
feed.crate_for_resolver(tcx.arena.alloc(Steal::new((krate, pre_configured_attrs))));
174171
feed.output_filenames(Arc::new(outputs));
175-
176-
let feed = tcx.feed_local_def_id(CRATE_DEF_ID);
177-
feed.def_kind(DefKind::Mod);
178172
});
179173
Ok(qcx)
180174
})

compiler/rustc_interface/src/tests.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc_session::config::{
1313
use rustc_session::lint::Level;
1414
use rustc_session::search_paths::SearchPath;
1515
use rustc_session::utils::{CanonicalizedPath, NativeLib, NativeLibKind};
16-
use rustc_session::{build_session, getopts, CompilerIO, EarlyDiagCtxt, Session};
16+
use rustc_session::{build_session, filesearch, getopts, CompilerIO, EarlyDiagCtxt, Session};
1717
use rustc_span::edition::{Edition, DEFAULT_EDITION};
1818
use rustc_span::symbol::sym;
1919
use rustc_span::{FileName, SourceFileHashAlgorithm};
@@ -37,6 +37,12 @@ fn mk_session(matches: getopts::Matches) -> (Session, Cfg) {
3737
output_file: None,
3838
temps_dir,
3939
};
40+
41+
let sysroot = filesearch::materialize_sysroot(sessopts.maybe_sysroot.clone());
42+
43+
let target_cfg =
44+
rustc_session::config::build_target_config(&early_dcx, &sessopts, None, &sysroot);
45+
4046
let sess = build_session(
4147
early_dcx,
4248
sessopts,
@@ -46,7 +52,8 @@ fn mk_session(matches: getopts::Matches) -> (Session, Cfg) {
4652
vec![],
4753
Default::default(),
4854
None,
49-
None,
55+
target_cfg,
56+
sysroot,
5057
"",
5158
None,
5259
Arc::default(),

compiler/rustc_interface/src/util.rs

+26-21
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ use rustc_session::{filesearch, output, Session};
1414
use rustc_span::edit_distance::find_best_match_for_name;
1515
use rustc_span::edition::Edition;
1616
use rustc_span::symbol::{sym, Symbol};
17+
use rustc_target::spec::Target;
1718
use session::EarlyDiagCtxt;
18-
use std::env;
1919
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
2020
use std::path::{Path, PathBuf};
2121
use std::sync::atomic::{AtomicBool, Ordering};
2222
use std::sync::OnceLock;
2323
use std::thread;
24+
use std::{env, iter};
2425

2526
/// Function pointer type that constructs a new CodegenBackend.
2627
pub type MakeBackendFn = fn() -> Box<dyn CodegenBackend>;
@@ -182,21 +183,25 @@ fn load_backend_from_dylib(early_dcx: &EarlyDiagCtxt, path: &Path) -> MakeBacken
182183
/// A name of `None` indicates that the default backend should be used.
183184
pub fn get_codegen_backend(
184185
early_dcx: &EarlyDiagCtxt,
185-
maybe_sysroot: &Option<PathBuf>,
186+
sysroot: &Path,
186187
backend_name: Option<&str>,
188+
target: &Target,
187189
) -> Box<dyn CodegenBackend> {
188190
static LOAD: OnceLock<unsafe fn() -> Box<dyn CodegenBackend>> = OnceLock::new();
189191

190192
let load = LOAD.get_or_init(|| {
191-
let default_codegen_backend = option_env!("CFG_DEFAULT_CODEGEN_BACKEND").unwrap_or("llvm");
193+
let backend = backend_name
194+
.or(target.default_codegen_backend.as_deref())
195+
.or(option_env!("CFG_DEFAULT_CODEGEN_BACKEND"))
196+
.unwrap_or("llvm");
192197

193-
match backend_name.unwrap_or(default_codegen_backend) {
198+
match backend {
194199
filename if filename.contains('.') => {
195200
load_backend_from_dylib(early_dcx, filename.as_ref())
196201
}
197202
#[cfg(feature = "llvm")]
198203
"llvm" => rustc_codegen_llvm::LlvmCodegenBackend::new,
199-
backend_name => get_codegen_sysroot(early_dcx, maybe_sysroot, backend_name),
204+
backend_name => get_codegen_sysroot(early_dcx, sysroot, backend_name),
200205
}
201206
});
202207

@@ -231,7 +236,7 @@ fn get_rustc_path_inner(bin_path: &str) -> Option<PathBuf> {
231236
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
232237
fn get_codegen_sysroot(
233238
early_dcx: &EarlyDiagCtxt,
234-
maybe_sysroot: &Option<PathBuf>,
239+
sysroot: &Path,
235240
backend_name: &str,
236241
) -> MakeBackendFn {
237242
// For now we only allow this function to be called once as it'll dlopen a
@@ -248,28 +253,28 @@ fn get_codegen_sysroot(
248253
let target = session::config::host_triple();
249254
let sysroot_candidates = sysroot_candidates();
250255

251-
let sysroot = maybe_sysroot
252-
.iter()
253-
.chain(sysroot_candidates.iter())
256+
let sysroot = iter::once(sysroot)
257+
.chain(sysroot_candidates.iter().map(<_>::as_ref))
254258
.map(|sysroot| {
255259
filesearch::make_target_lib_path(sysroot, target).with_file_name("codegen-backends")
256260
})
257261
.find(|f| {
258262
info!("codegen backend candidate: {}", f.display());
259263
f.exists()
260-
});
261-
let sysroot = sysroot.unwrap_or_else(|| {
262-
let candidates = sysroot_candidates
263-
.iter()
264-
.map(|p| p.display().to_string())
265-
.collect::<Vec<_>>()
266-
.join("\n* ");
267-
let err = format!(
268-
"failed to find a `codegen-backends` folder \
264+
})
265+
.unwrap_or_else(|| {
266+
let candidates = sysroot_candidates
267+
.iter()
268+
.map(|p| p.display().to_string())
269+
.collect::<Vec<_>>()
270+
.join("\n* ");
271+
let err = format!(
272+
"failed to find a `codegen-backends` folder \
269273
in the sysroot candidates:\n* {candidates}"
270-
);
271-
early_dcx.early_fatal(err);
272-
});
274+
);
275+
early_dcx.early_fatal(err);
276+
});
277+
273278
info!("probing {} for a codegen backend", sysroot.display());
274279

275280
let d = sysroot.read_dir().unwrap_or_else(|e| {

0 commit comments

Comments
 (0)