Auto merge of #130332 - Zalathar:rollup-eq0qvvy, r=Zalathar
Rollup of 5 pull requests Successful merges: - #130138 (bootstrap: Print more debug info when `find_initial_libdir` fails) - #130199 (Don't call closure_by_move_body_def_id on FnOnce async closures in MIR validation) - #130302 (add llvm-bitcode-linker and llvm-tools bins to ci-rustc's sysroot) - #130306 (avoid updating LLVM submodule during bootstrap unit tests) - #130317 (`ProjectionElem` and `UnOp`/`BinOp` dont need to be `PartialOrd`/`Ord`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
4a47e8e449
@ -788,7 +788,7 @@ fn run_required_analyses(tcx: TyCtxt<'_>) {
|
|||||||
rustc_hir_analysis::check_crate(tcx);
|
rustc_hir_analysis::check_crate(tcx);
|
||||||
sess.time("MIR_coroutine_by_move_body", || {
|
sess.time("MIR_coroutine_by_move_body", || {
|
||||||
tcx.hir().par_body_owners(|def_id| {
|
tcx.hir().par_body_owners(|def_id| {
|
||||||
if tcx.needs_coroutine_by_move_body_def_id(def_id) {
|
if tcx.needs_coroutine_by_move_body_def_id(def_id.to_def_id()) {
|
||||||
tcx.ensure_with_value().coroutine_by_move_body_def_id(def_id);
|
tcx.ensure_with_value().coroutine_by_move_body_def_id(def_id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1094,7 +1094,7 @@ pub struct Place<'tcx> {
|
|||||||
pub projection: &'tcx List<PlaceElem<'tcx>>,
|
pub projection: &'tcx List<PlaceElem<'tcx>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
#[derive(TyEncodable, TyDecodable, HashStable, TypeFoldable, TypeVisitable)]
|
#[derive(TyEncodable, TyDecodable, HashStable, TypeFoldable, TypeVisitable)]
|
||||||
pub enum ProjectionElem<V, T> {
|
pub enum ProjectionElem<V, T> {
|
||||||
Deref,
|
Deref,
|
||||||
@ -1468,7 +1468,7 @@ pub enum NullOp<'tcx> {
|
|||||||
UbChecks,
|
UbChecks,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
#[derive(HashStable, TyEncodable, TyDecodable, TypeFoldable, TypeVisitable)]
|
#[derive(HashStable, TyEncodable, TyDecodable, TypeFoldable, TypeVisitable)]
|
||||||
pub enum UnOp {
|
pub enum UnOp {
|
||||||
/// The `!` operator for logical inversion
|
/// The `!` operator for logical inversion
|
||||||
@ -1486,7 +1486,7 @@ pub enum UnOp {
|
|||||||
PtrMetadata,
|
PtrMetadata,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
#[derive(TyEncodable, TyDecodable, HashStable, TypeFoldable, TypeVisitable)]
|
#[derive(TyEncodable, TyDecodable, HashStable, TypeFoldable, TypeVisitable)]
|
||||||
pub enum BinOp {
|
pub enum BinOp {
|
||||||
/// The `+` operator (addition)
|
/// The `+` operator (addition)
|
||||||
|
@ -3171,7 +3171,7 @@ pub fn impl_polarity(self, def_id: impl IntoQueryParam<DefId>) -> ty::ImplPolari
|
|||||||
self.impl_trait_header(def_id).map_or(ty::ImplPolarity::Positive, |h| h.polarity)
|
self.impl_trait_header(def_id).map_or(ty::ImplPolarity::Positive, |h| h.polarity)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn needs_coroutine_by_move_body_def_id(self, def_id: LocalDefId) -> bool {
|
pub fn needs_coroutine_by_move_body_def_id(self, def_id: DefId) -> bool {
|
||||||
if let Some(hir::CoroutineKind::Desugared(_, hir::CoroutineSource::Closure)) =
|
if let Some(hir::CoroutineKind::Desugared(_, hir::CoroutineSource::Closure)) =
|
||||||
self.coroutine_kind(def_id)
|
self.coroutine_kind(def_id)
|
||||||
&& let ty::Coroutine(_, args) = self.type_of(def_id).instantiate_identity().kind()
|
&& let ty::Coroutine(_, args) = self.type_of(def_id).instantiate_identity().kind()
|
||||||
|
@ -330,7 +330,7 @@ fn mir_promoted(
|
|||||||
tcx.ensure_with_value().has_ffi_unwind_calls(def);
|
tcx.ensure_with_value().has_ffi_unwind_calls(def);
|
||||||
|
|
||||||
// the `by_move_body` query uses the raw mir, so make sure it is run.
|
// the `by_move_body` query uses the raw mir, so make sure it is run.
|
||||||
if tcx.needs_coroutine_by_move_body_def_id(def) {
|
if tcx.needs_coroutine_by_move_body_def_id(def.to_def_id()) {
|
||||||
tcx.ensure_with_value().coroutine_by_move_body_def_id(def);
|
tcx.ensure_with_value().coroutine_by_move_body_def_id(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
//! Validates the MIR to ensure that invariants are upheld.
|
//! Validates the MIR to ensure that invariants are upheld.
|
||||||
|
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_hir as hir;
|
|
||||||
use rustc_hir::LangItem;
|
use rustc_hir::LangItem;
|
||||||
use rustc_index::bit_set::BitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
@ -717,10 +716,7 @@ fn visit_projection_elem(
|
|||||||
// first place.
|
// first place.
|
||||||
let layout = if def_id == self.caller_body.source.def_id() {
|
let layout = if def_id == self.caller_body.source.def_id() {
|
||||||
self.caller_body.coroutine_layout_raw()
|
self.caller_body.coroutine_layout_raw()
|
||||||
} else if let Some(hir::CoroutineKind::Desugared(
|
} else if self.tcx.needs_coroutine_by_move_body_def_id(def_id)
|
||||||
_,
|
|
||||||
hir::CoroutineSource::Closure,
|
|
||||||
)) = self.tcx.coroutine_kind(def_id)
|
|
||||||
&& let ty::ClosureKind::FnOnce =
|
&& let ty::ClosureKind::FnOnce =
|
||||||
args.as_coroutine().kind_ty().to_opt_closure_kind().unwrap()
|
args.as_coroutine().kind_ty().to_opt_closure_kind().unwrap()
|
||||||
&& self.caller_body.source.def_id()
|
&& self.caller_body.source.def_id()
|
||||||
|
@ -1760,6 +1760,49 @@ fn run(self, builder: &Builder<'_>) -> Compiler {
|
|||||||
return target_compiler;
|
return target_compiler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We prepend this bin directory to the user PATH when linking Rust binaries. To
|
||||||
|
// avoid shadowing the system LLD we rename the LLD we provide to `rust-lld`.
|
||||||
|
let libdir = builder.sysroot_libdir(target_compiler, target_compiler.host);
|
||||||
|
let libdir_bin = libdir.parent().unwrap().join("bin");
|
||||||
|
t!(fs::create_dir_all(&libdir_bin));
|
||||||
|
|
||||||
|
if builder.config.llvm_enabled(target_compiler.host) {
|
||||||
|
let llvm::LlvmResult { llvm_config, .. } =
|
||||||
|
builder.ensure(llvm::Llvm { target: target_compiler.host });
|
||||||
|
if !builder.config.dry_run() && builder.config.llvm_tools_enabled {
|
||||||
|
let llvm_bin_dir =
|
||||||
|
command(llvm_config).arg("--bindir").run_capture_stdout(builder).stdout();
|
||||||
|
let llvm_bin_dir = Path::new(llvm_bin_dir.trim());
|
||||||
|
|
||||||
|
// Since we've already built the LLVM tools, install them to the sysroot.
|
||||||
|
// This is the equivalent of installing the `llvm-tools-preview` component via
|
||||||
|
// rustup, and lets developers use a locally built toolchain to
|
||||||
|
// build projects that expect llvm tools to be present in the sysroot
|
||||||
|
// (e.g. the `bootimage` crate).
|
||||||
|
for tool in LLVM_TOOLS {
|
||||||
|
let tool_exe = exe(tool, target_compiler.host);
|
||||||
|
let src_path = llvm_bin_dir.join(&tool_exe);
|
||||||
|
// When using `download-ci-llvm`, some of the tools
|
||||||
|
// may not exist, so skip trying to copy them.
|
||||||
|
if src_path.exists() {
|
||||||
|
builder.copy_link(&src_path, &libdir_bin.join(&tool_exe));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let maybe_install_llvm_bitcode_linker = |compiler| {
|
||||||
|
if builder.config.llvm_bitcode_linker_enabled {
|
||||||
|
let src_path = builder.ensure(crate::core::build_steps::tool::LlvmBitcodeLinker {
|
||||||
|
compiler,
|
||||||
|
target: target_compiler.host,
|
||||||
|
extra_features: vec![],
|
||||||
|
});
|
||||||
|
let tool_exe = exe("llvm-bitcode-linker", target_compiler.host);
|
||||||
|
builder.copy_link(&src_path, &libdir_bin.join(tool_exe));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// If we're downloading a compiler from CI, we can use the same compiler for all stages other than 0.
|
// If we're downloading a compiler from CI, we can use the same compiler for all stages other than 0.
|
||||||
if builder.download_rustc() {
|
if builder.download_rustc() {
|
||||||
builder.ensure(Std::new(target_compiler, target_compiler.host));
|
builder.ensure(Std::new(target_compiler, target_compiler.host));
|
||||||
@ -1772,6 +1815,9 @@ fn run(self, builder: &Builder<'_>) -> Compiler {
|
|||||||
if target_compiler.stage == builder.top_stage {
|
if target_compiler.stage == builder.top_stage {
|
||||||
builder.info(&format!("Creating a sysroot for stage{stage} compiler (use `rustup toolchain link 'name' build/host/stage{stage}`)", stage=target_compiler.stage));
|
builder.info(&format!("Creating a sysroot for stage{stage} compiler (use `rustup toolchain link 'name' build/host/stage{stage}`)", stage=target_compiler.stage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maybe_install_llvm_bitcode_linker(target_compiler);
|
||||||
|
|
||||||
return target_compiler;
|
return target_compiler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1880,11 +1926,6 @@ fn run(self, builder: &Builder<'_>) -> Compiler {
|
|||||||
|
|
||||||
copy_codegen_backends_to_sysroot(builder, build_compiler, target_compiler);
|
copy_codegen_backends_to_sysroot(builder, build_compiler, target_compiler);
|
||||||
|
|
||||||
// We prepend this bin directory to the user PATH when linking Rust binaries. To
|
|
||||||
// avoid shadowing the system LLD we rename the LLD we provide to `rust-lld`.
|
|
||||||
let libdir = builder.sysroot_libdir(target_compiler, target_compiler.host);
|
|
||||||
let libdir_bin = libdir.parent().unwrap().join("bin");
|
|
||||||
t!(fs::create_dir_all(&libdir_bin));
|
|
||||||
if let Some(lld_install) = lld_install {
|
if let Some(lld_install) = lld_install {
|
||||||
let src_exe = exe("lld", target_compiler.host);
|
let src_exe = exe("lld", target_compiler.host);
|
||||||
let dst_exe = exe("rust-lld", target_compiler.host);
|
let dst_exe = exe("rust-lld", target_compiler.host);
|
||||||
@ -1920,40 +1961,7 @@ fn run(self, builder: &Builder<'_>) -> Compiler {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if builder.config.llvm_enabled(target_compiler.host) {
|
maybe_install_llvm_bitcode_linker(build_compiler);
|
||||||
let llvm::LlvmResult { llvm_config, .. } =
|
|
||||||
builder.ensure(llvm::Llvm { target: target_compiler.host });
|
|
||||||
if !builder.config.dry_run() && builder.config.llvm_tools_enabled {
|
|
||||||
let llvm_bin_dir =
|
|
||||||
command(llvm_config).arg("--bindir").run_capture_stdout(builder).stdout();
|
|
||||||
let llvm_bin_dir = Path::new(llvm_bin_dir.trim());
|
|
||||||
|
|
||||||
// Since we've already built the LLVM tools, install them to the sysroot.
|
|
||||||
// This is the equivalent of installing the `llvm-tools-preview` component via
|
|
||||||
// rustup, and lets developers use a locally built toolchain to
|
|
||||||
// build projects that expect llvm tools to be present in the sysroot
|
|
||||||
// (e.g. the `bootimage` crate).
|
|
||||||
for tool in LLVM_TOOLS {
|
|
||||||
let tool_exe = exe(tool, target_compiler.host);
|
|
||||||
let src_path = llvm_bin_dir.join(&tool_exe);
|
|
||||||
// When using `download-ci-llvm`, some of the tools
|
|
||||||
// may not exist, so skip trying to copy them.
|
|
||||||
if src_path.exists() {
|
|
||||||
builder.copy_link(&src_path, &libdir_bin.join(&tool_exe));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if builder.config.llvm_bitcode_linker_enabled {
|
|
||||||
let src_path = builder.ensure(crate::core::build_steps::tool::LlvmBitcodeLinker {
|
|
||||||
compiler: build_compiler,
|
|
||||||
target: target_compiler.host,
|
|
||||||
extra_features: vec![],
|
|
||||||
});
|
|
||||||
let tool_exe = exe("llvm-bitcode-linker", target_compiler.host);
|
|
||||||
builder.copy_link(&src_path, &libdir_bin.join(tool_exe));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure that `libLLVM.so` ends up in the newly build compiler directory,
|
// Ensure that `libLLVM.so` ends up in the newly build compiler directory,
|
||||||
// so that it can be found when the newly built `rustc` is run.
|
// so that it can be found when the newly built `rustc` is run.
|
||||||
|
@ -2739,6 +2739,8 @@ fn parse_download_ci_llvm(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fetching the LLVM submodule is unnecessary for self-tests.
|
||||||
|
#[cfg(not(feature = "bootstrap-self-test"))]
|
||||||
self.update_submodule("src/llvm-project");
|
self.update_submodule("src/llvm-project");
|
||||||
|
|
||||||
// Check for untracked changes in `src/llvm-project`.
|
// Check for untracked changes in `src/llvm-project`.
|
||||||
|
@ -349,10 +349,14 @@ pub fn new(mut config: Config) -> Build {
|
|||||||
};
|
};
|
||||||
let Some(initial_libdir) = find_initial_libdir() else {
|
let Some(initial_libdir) = find_initial_libdir() else {
|
||||||
panic!(
|
panic!(
|
||||||
"couldn't determine `initial_libdir` \
|
"couldn't determine `initial_libdir`:
|
||||||
from target dir {initial_target_dir:?} \
|
- config.initial_rustc: {rustc:?}
|
||||||
and sysroot {initial_sysroot:?}"
|
- initial_target_libdir_str: {initial_target_libdir_str:?}
|
||||||
)
|
- initial_target_dir: {initial_target_dir:?}
|
||||||
|
- initial_sysroot: {initial_sysroot:?}
|
||||||
|
",
|
||||||
|
rustc = config.initial_rustc,
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
let version = std::fs::read_to_string(src.join("src").join("version"))
|
let version = std::fs::read_to_string(src.join("src").join("version"))
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
//@ aux-build:block-on.rs
|
||||||
|
//@ edition:2021
|
||||||
|
//@ build-pass
|
||||||
|
|
||||||
|
#![feature(async_closure)]
|
||||||
|
|
||||||
|
extern crate block_on;
|
||||||
|
|
||||||
|
// Make sure that we don't call `coroutine_by_move_body_def_id` query
|
||||||
|
// on async closures that are `FnOnce`. See issue: #130167.
|
||||||
|
|
||||||
|
async fn empty() {}
|
||||||
|
|
||||||
|
pub async fn call_once<F: async FnOnce()>(f: F) {
|
||||||
|
f().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
block_on::block_on(call_once(async || empty().await));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user