diff --git a/Cargo.lock b/Cargo.lock index 2bf07149cc86c..116e587b22bf0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -307,7 +307,7 @@ dependencies = [ "cargo-test-macro", "cargo-test-support", "cargo-util", - "clap", + "clap 3.2.5", "crates-io", "crossbeam-utils", "curl", @@ -572,6 +572,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", + "yaml-rust 0.3.5", +] + [[package]] name = "clap" version = "3.2.5" @@ -584,9 +600,9 @@ dependencies = [ "clap_lex", "indexmap", "once_cell", - "strsim", + "strsim 0.10.0", "termcolor", - "textwrap", + "textwrap 0.15.0", ] [[package]] @@ -595,7 +611,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df6f3613c0a3cddfd78b41b10203eb322cb29b600cbdf808a7d3db95691b8e25" dependencies = [ - "clap", + "clap 3.2.5", ] [[package]] @@ -653,7 +669,7 @@ name = "clippy_dev" version = "0.0.1" dependencies = [ "aho-corasick", - "clap", + "clap 3.2.5", "indoc", "itertools", "opener", @@ -1226,7 +1242,7 @@ name = "expand-yaml-anchors" version = "0.1.0" dependencies = [ "yaml-merge-keys", - "yaml-rust", + "yaml-rust 0.4.4", ] [[package]] @@ -1846,7 +1862,7 @@ name = "installer" version = "0.0.0" dependencies = [ "anyhow", - "clap", + "clap 2.34.0", "flate2", "lazy_static", "num_cpus", @@ -2294,7 +2310,7 @@ dependencies = [ "ammonia", "anyhow", "chrono", - "clap", + "clap 3.2.5", "clap_complete", "elasticlunr-rs", "env_logger 0.7.1", @@ -3369,7 +3385,7 @@ dependencies = [ name = "rustbook" version = "0.1.0" dependencies = [ - "clap", + "clap 3.2.5", "env_logger 0.7.1", "mdbook", ] @@ -3457,7 +3473,7 @@ version = "1.0.0" dependencies = [ "bstr", "byteorder", - "clap", + "clap 3.2.5", "crossbeam-utils", "libc", "libz-sys", @@ -4646,7 +4662,7 @@ dependencies = [ "anyhow", "bytecount", "cargo_metadata", - "clap", + "clap 3.2.5", "derive-new", "diff", "dirs", @@ -5037,6 +5053,12 @@ dependencies = [ "vte", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" @@ -5177,6 +5199,15 @@ dependencies = [ "term", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "textwrap" version = "0.15.0" @@ -5697,6 +5728,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "vergen" version = "5.1.0" @@ -5855,9 +5892,15 @@ checksum = "fd236a7dc9bb598f349fe4a8754f49181fee50284daa15cd1ba652d722280004" dependencies = [ "lazy_static", "thiserror", - "yaml-rust", + "yaml-rust 0.4.4", ] +[[package]] +name = "yaml-rust" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" + [[package]] name = "yaml-rust" version = "0.4.4" diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 26314e3fe8eac..3bd233ce95ee8 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -824,6 +824,10 @@ pub struct LocalDecl<'tcx> { /// │ │← `drop(x)` // This accesses `x: u32`. /// ``` pub source_info: SourceInfo, + + /// `true` if the local has a fixed storage for the duration of the body + /// (that is, it does not have `StorageLive`/`StorageDead` annotations). + pub always_storage_live: bool, } // `LocalDecl` is used a lot. Make sure it doesn't unintentionally get bigger. @@ -949,6 +953,7 @@ impl<'tcx> LocalDecl<'tcx> { ty, user_ty: None, source_info, + always_storage_live: false, } } diff --git a/compiler/rustc_middle/src/mir/visit.rs b/compiler/rustc_middle/src/mir/visit.rs index 0ecb83996a8af..a7fe46cdfe4f9 100644 --- a/compiler/rustc_middle/src/mir/visit.rs +++ b/compiler/rustc_middle/src/mir/visit.rs @@ -867,6 +867,7 @@ macro_rules! make_mir_visitor { internal: _, local_info: _, is_block_tail: _, + always_storage_live: _, } = local_decl; self.visit_ty($(& $mutability)? *ty, TyContext::LocalDecl { diff --git a/compiler/rustc_mir_build/src/build/matches/mod.rs b/compiler/rustc_mir_build/src/build/matches/mod.rs index 1628f1a4b850b..2ee8ba692d6e3 100644 --- a/compiler/rustc_mir_build/src/build/matches/mod.rs +++ b/compiler/rustc_mir_build/src/build/matches/mod.rs @@ -2241,6 +2241,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { pat_span, }, ))))), + always_storage_live: false, }; let for_arm_body = self.local_decls.push(local); self.var_debug_info.push(VarDebugInfo { @@ -2261,6 +2262,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { local_info: Some(Box::new(LocalInfo::User(ClearCrossCrate::Set( BindingForm::RefForGuard, )))), + always_storage_live: false, }); self.var_debug_info.push(VarDebugInfo { name, diff --git a/compiler/rustc_mir_dataflow/src/storage.rs b/compiler/rustc_mir_dataflow/src/storage.rs index 566c9d2d5054e..8fc447821d3b6 100644 --- a/compiler/rustc_mir_dataflow/src/storage.rs +++ b/compiler/rustc_mir_dataflow/src/storage.rs @@ -1,21 +1,16 @@ use rustc_index::bit_set::BitSet; -use rustc_middle::mir::{self, Local}; +use rustc_middle::mir::{self, HasLocalDecls, Local}; -/// The set of locals in a MIR body that do not have `StorageLive`/`StorageDead` annotations. +/// Returns the set of locals in a MIR body that do not have `StorageLive`/`StorageDead` +/// annotations. /// /// These locals have fixed storage for the duration of the body. -// -// FIXME: Currently, we need to traverse the entire MIR to compute this. We should instead store it -// as a field in the `LocalDecl` for each `Local`. -pub fn always_storage_live_locals(body: &mir::Body<'_>) -> BitSet { +pub fn always_live_locals(body: &mir::Body<'_>) -> BitSet { let mut always_live_locals = BitSet::new_filled(body.local_decls.len()); - for block in body.basic_blocks() { - for statement in &block.statements { - use mir::StatementKind::{StorageDead, StorageLive}; - if let StorageLive(l) | StorageDead(l) = statement.kind { - always_live_locals.remove(l); - } + for (local, local_decl) in body.local_decls().iter_enumerated() { + if !local_decl.always_storage_live { + always_live_locals.remove(local); } } diff --git a/src/tools/cargo b/src/tools/cargo index b1dd22e668af5..c0bbd42ce5e83 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit b1dd22e668af5279e13a071ad4b17435bd6bfa4c +Subproject commit c0bbd42ce5e83fe2a93e817c3f9b955492d3130a diff --git a/src/tools/miri b/src/tools/miri index cde87d18239b8..f76ebd6feb9f5 160000 --- a/src/tools/miri +++ b/src/tools/miri @@ -1 +1 @@ -Subproject commit cde87d18239b8d9afa9c6bf1051bf5573dbf326e +Subproject commit f76ebd6feb9f59be993336f84ecfdc441ad33d81 diff --git a/src/tools/rust-installer b/src/tools/rust-installer index 300b5ec61ef38..5254dbfd25d52 160000 --- a/src/tools/rust-installer +++ b/src/tools/rust-installer @@ -1 +1 @@ -Subproject commit 300b5ec61ef38855a07e6bb4955a37aa1c414c00 +Subproject commit 5254dbfd25d5284728ab624dca1969d61427a0db