Auto merge of #122338 - workingjubilee:rollup-xzpt4v4, r=workingjubilee
Rollup of 15 pull requests Successful merges: - #116791 (Allow codegen backends to opt-out of parallel codegen) - #116793 (Allow targets to override default codegen backend) - #117458 (LLVM Bitcode Linker: A self contained linker for nvptx and other targets) - #119385 (Fix type resolution of associated const equality bounds (take 2)) - #121438 (std support for wasm32 panic=unwind) - #121893 (Add tests (and a bit of cleanup) for interior mut handling in promotion and const-checking) - #122080 (Clarity improvements to `DropTree`) - #122152 (Improve diagnostics for parenthesized type arguments) - #122166 (Remove the unused `field_remapping` field from `TypeLowering`) - #122249 (interpret: do not call machine read hooks during validation) - #122299 (Store backtrace for `must_produce_diag`) - #122318 (Revision-related tweaks for next-solver tests) - #122320 (Use ptradd for vtable indexing) - #122328 (unix_sigpipe: Replace `inherit` with `sig_dfl` in syntax tests) - #122330 (bootstrap readme: fix, improve, update) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
6554a5645a
251 changed files with 2111 additions and 735 deletions
|
@ -16,7 +16,7 @@ use rustc_parse::maybe_new_parser_from_source_str;
|
|||
use rustc_query_impl::QueryCtxt;
|
||||
use rustc_query_system::query::print_query_stack;
|
||||
use rustc_session::config::{self, Cfg, CheckCfg, ExpectedValues, Input, OutFileName};
|
||||
use rustc_session::filesearch::sysroot_candidates;
|
||||
use rustc_session::filesearch::{self, sysroot_candidates};
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_session::{lint, CompilerIO, EarlyDiagCtxt, Session};
|
||||
use rustc_span::source_map::FileLoader;
|
||||
|
@ -339,16 +339,53 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
|||
|
||||
let early_dcx = EarlyDiagCtxt::new(config.opts.error_format);
|
||||
|
||||
let codegen_backend = if let Some(make_codegen_backend) = config.make_codegen_backend {
|
||||
make_codegen_backend(&config.opts)
|
||||
} else {
|
||||
util::get_codegen_backend(
|
||||
&early_dcx,
|
||||
&config.opts.maybe_sysroot,
|
||||
config.opts.unstable_opts.codegen_backend.as_deref(),
|
||||
)
|
||||
let sysroot = filesearch::materialize_sysroot(config.opts.maybe_sysroot.clone());
|
||||
|
||||
let (codegen_backend, target_override) = match config.make_codegen_backend {
|
||||
None => {
|
||||
// Build a target without override, so that it can override the backend if needed
|
||||
let target =
|
||||
config::build_target_config(&early_dcx, &config.opts, None, &sysroot);
|
||||
|
||||
let backend = util::get_codegen_backend(
|
||||
&early_dcx,
|
||||
&sysroot,
|
||||
config.opts.unstable_opts.codegen_backend.as_deref(),
|
||||
&target,
|
||||
);
|
||||
|
||||
// target_override is documented to be called before init(), so this is okay
|
||||
let target_override = backend.target_override(&config.opts);
|
||||
|
||||
// Assert that we don't use target's override of the backend and
|
||||
// backend's override of the target at the same time
|
||||
if config.opts.unstable_opts.codegen_backend.is_none()
|
||||
&& target.default_codegen_backend.is_some()
|
||||
&& target_override.is_some()
|
||||
{
|
||||
rustc_middle::bug!(
|
||||
"Codegen backend requested target override even though the target requested the backend"
|
||||
);
|
||||
}
|
||||
|
||||
(backend, target_override)
|
||||
}
|
||||
Some(make_codegen_backend) => {
|
||||
// N.B. `make_codegen_backend` takes precedence over `target.default_codegen_backend`,
|
||||
// which is ignored in this case.
|
||||
let backend = make_codegen_backend(&config.opts);
|
||||
|
||||
// target_override is documented to be called before init(), so this is okay
|
||||
let target_override = backend.target_override(&config.opts);
|
||||
|
||||
(backend, target_override)
|
||||
}
|
||||
};
|
||||
|
||||
// Re-build target with the (potential) override
|
||||
let target_cfg =
|
||||
config::build_target_config(&early_dcx, &config.opts, target_override, &sysroot);
|
||||
|
||||
let temps_dir = config.opts.unstable_opts.temps_dir.as_deref().map(PathBuf::from);
|
||||
|
||||
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
|
|||
let mut locale_resources = Vec::from(config.locale_resources);
|
||||
locale_resources.push(codegen_backend.locale_resource());
|
||||
|
||||
// target_override is documented to be called before init(), so this is okay
|
||||
let target_override = codegen_backend.target_override(&config.opts);
|
||||
|
||||
let mut sess = rustc_session::build_session(
|
||||
early_dcx,
|
||||
config.opts,
|
||||
|
@ -384,7 +418,8 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
|||
locale_resources,
|
||||
config.lint_caps,
|
||||
config.file_loader,
|
||||
target_override,
|
||||
target_cfg,
|
||||
sysroot,
|
||||
util::rustc_version_str().unwrap_or("unknown"),
|
||||
config.ice_file,
|
||||
config.using_internal_features,
|
||||
|
|
|
@ -13,7 +13,7 @@ use rustc_session::config::{
|
|||
use rustc_session::lint::Level;
|
||||
use rustc_session::search_paths::SearchPath;
|
||||
use rustc_session::utils::{CanonicalizedPath, NativeLib, NativeLibKind};
|
||||
use rustc_session::{build_session, getopts, CompilerIO, EarlyDiagCtxt, Session};
|
||||
use rustc_session::{build_session, filesearch, getopts, CompilerIO, EarlyDiagCtxt, Session};
|
||||
use rustc_span::edition::{Edition, DEFAULT_EDITION};
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_span::{FileName, SourceFileHashAlgorithm};
|
||||
|
@ -37,6 +37,12 @@ fn mk_session(matches: getopts::Matches) -> (Session, Cfg) {
|
|||
output_file: None,
|
||||
temps_dir,
|
||||
};
|
||||
|
||||
let sysroot = filesearch::materialize_sysroot(sessopts.maybe_sysroot.clone());
|
||||
|
||||
let target_cfg =
|
||||
rustc_session::config::build_target_config(&early_dcx, &sessopts, None, &sysroot);
|
||||
|
||||
let sess = build_session(
|
||||
early_dcx,
|
||||
sessopts,
|
||||
|
@ -46,7 +52,8 @@ fn mk_session(matches: getopts::Matches) -> (Session, Cfg) {
|
|||
vec![],
|
||||
Default::default(),
|
||||
None,
|
||||
None,
|
||||
target_cfg,
|
||||
sysroot,
|
||||
"",
|
||||
None,
|
||||
Arc::default(),
|
||||
|
@ -685,7 +692,7 @@ fn test_unstable_options_tracking_hash() {
|
|||
untracked!(nll_facts, true);
|
||||
untracked!(no_analysis, true);
|
||||
untracked!(no_leak_check, true);
|
||||
untracked!(no_parallel_llvm, true);
|
||||
untracked!(no_parallel_backend, true);
|
||||
untracked!(parse_only, true);
|
||||
// `pre_link_arg` is omitted because it just forwards to `pre_link_args`.
|
||||
untracked!(pre_link_args, vec![String::from("abc"), String::from("def")]);
|
||||
|
|
|
@ -14,13 +14,14 @@ use rustc_session::{filesearch, output, Session};
|
|||
use rustc_span::edit_distance::find_best_match_for_name;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::symbol::{sym, Symbol};
|
||||
use rustc_target::spec::Target;
|
||||
use session::EarlyDiagCtxt;
|
||||
use std::env;
|
||||
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::OnceLock;
|
||||
use std::thread;
|
||||
use std::{env, iter};
|
||||
|
||||
/// Function pointer type that constructs a new CodegenBackend.
|
||||
pub type MakeBackendFn = fn() -> Box<dyn CodegenBackend>;
|
||||
|
@ -195,21 +196,25 @@ fn load_backend_from_dylib(early_dcx: &EarlyDiagCtxt, path: &Path) -> MakeBacken
|
|||
/// A name of `None` indicates that the default backend should be used.
|
||||
pub fn get_codegen_backend(
|
||||
early_dcx: &EarlyDiagCtxt,
|
||||
maybe_sysroot: &Option<PathBuf>,
|
||||
sysroot: &Path,
|
||||
backend_name: Option<&str>,
|
||||
target: &Target,
|
||||
) -> Box<dyn CodegenBackend> {
|
||||
static LOAD: OnceLock<unsafe fn() -> Box<dyn CodegenBackend>> = OnceLock::new();
|
||||
|
||||
let load = LOAD.get_or_init(|| {
|
||||
let default_codegen_backend = option_env!("CFG_DEFAULT_CODEGEN_BACKEND").unwrap_or("llvm");
|
||||
let backend = backend_name
|
||||
.or(target.default_codegen_backend.as_deref())
|
||||
.or(option_env!("CFG_DEFAULT_CODEGEN_BACKEND"))
|
||||
.unwrap_or("llvm");
|
||||
|
||||
match backend_name.unwrap_or(default_codegen_backend) {
|
||||
match backend {
|
||||
filename if filename.contains('.') => {
|
||||
load_backend_from_dylib(early_dcx, filename.as_ref())
|
||||
}
|
||||
#[cfg(feature = "llvm")]
|
||||
"llvm" => rustc_codegen_llvm::LlvmCodegenBackend::new,
|
||||
backend_name => get_codegen_sysroot(early_dcx, maybe_sysroot, backend_name),
|
||||
backend_name => get_codegen_sysroot(early_dcx, sysroot, backend_name),
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -244,7 +249,7 @@ fn get_rustc_path_inner(bin_path: &str) -> Option<PathBuf> {
|
|||
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
|
||||
fn get_codegen_sysroot(
|
||||
early_dcx: &EarlyDiagCtxt,
|
||||
maybe_sysroot: &Option<PathBuf>,
|
||||
sysroot: &Path,
|
||||
backend_name: &str,
|
||||
) -> MakeBackendFn {
|
||||
// For now we only allow this function to be called once as it'll dlopen a
|
||||
|
@ -261,28 +266,28 @@ fn get_codegen_sysroot(
|
|||
let target = session::config::host_triple();
|
||||
let sysroot_candidates = sysroot_candidates();
|
||||
|
||||
let sysroot = maybe_sysroot
|
||||
.iter()
|
||||
.chain(sysroot_candidates.iter())
|
||||
let sysroot = iter::once(sysroot)
|
||||
.chain(sysroot_candidates.iter().map(<_>::as_ref))
|
||||
.map(|sysroot| {
|
||||
filesearch::make_target_lib_path(sysroot, target).with_file_name("codegen-backends")
|
||||
})
|
||||
.find(|f| {
|
||||
info!("codegen backend candidate: {}", f.display());
|
||||
f.exists()
|
||||
});
|
||||
let sysroot = sysroot.unwrap_or_else(|| {
|
||||
let candidates = sysroot_candidates
|
||||
.iter()
|
||||
.map(|p| p.display().to_string())
|
||||
.collect::<Vec<_>>()
|
||||
.join("\n* ");
|
||||
let err = format!(
|
||||
"failed to find a `codegen-backends` folder \
|
||||
})
|
||||
.unwrap_or_else(|| {
|
||||
let candidates = sysroot_candidates
|
||||
.iter()
|
||||
.map(|p| p.display().to_string())
|
||||
.collect::<Vec<_>>()
|
||||
.join("\n* ");
|
||||
let err = format!(
|
||||
"failed to find a `codegen-backends` folder \
|
||||
in the sysroot candidates:\n* {candidates}"
|
||||
);
|
||||
early_dcx.early_fatal(err);
|
||||
});
|
||||
);
|
||||
early_dcx.early_fatal(err);
|
||||
});
|
||||
|
||||
info!("probing {} for a codegen backend", sysroot.display());
|
||||
|
||||
let d = sysroot.read_dir().unwrap_or_else(|e| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue