Skip to content

Commit 3a99938

Browse files
authored
Merge pull request #2635 from rust-lang/rustc-pull
Rustc pull update
2 parents 7b242ea + 4e2864a commit 3a99938

File tree

105 files changed

+1678
-1135
lines changed

Some content is hidden

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

105 files changed

+1678
-1135
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,6 @@ degree documented below):
220220
- `solaris` / `illumos`: maintained by @devnexen. Supports the entire test suite.
221221
- `freebsd`: maintained by @YohDeadfall and @LorrensP-2158466. Supports the entire test suite.
222222
- `android`: **maintainer wanted**. Support very incomplete, but a basic "hello world" works.
223-
- `wasi`: **maintainer wanted**. Support very incomplete, but a basic "hello world" works.
224223
- For targets on other operating systems, Miri might fail before even reaching the `main` function.
225224

226225
However, even for targets that we do support, the degree of support for accessing platform APIs

cargo-miri/src/phases.rs

Lines changed: 8 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,6 @@ fn show_version() {
5252
println!();
5353
}
5454

55-
fn forward_patched_extern_arg(args: &mut impl Iterator<Item = String>, cmd: &mut Command) {
56-
cmd.arg("--extern"); // always forward flag, but adjust filename:
57-
let path = args.next().expect("`--extern` should be followed by a filename");
58-
if let Some(lib) = path.strip_suffix(".rlib") {
59-
// If this is an rlib, make it an rmeta.
60-
cmd.arg(format!("{lib}.rmeta"));
61-
} else {
62-
// Some other extern file (e.g. a `.so`). Forward unchanged.
63-
cmd.arg(path);
64-
}
65-
}
66-
6755
pub fn phase_cargo_miri(mut args: impl Iterator<Item = String>) {
6856
// Require a subcommand before any flags.
6957
// We cannot know which of those flags take arguments and which do not,
@@ -276,7 +264,7 @@ pub enum RustcPhase {
276264
Rustdoc,
277265
}
278266

279-
pub fn phase_rustc(mut args: impl Iterator<Item = String>, phase: RustcPhase) {
267+
pub fn phase_rustc(args: impl Iterator<Item = String>, phase: RustcPhase) {
280268
/// Determines if we are being invoked (as rustc) to build a crate for
281269
/// the "target" architecture, in contrast to the "host" architecture.
282270
/// Host crates are for build scripts and proc macros and still need to
@@ -444,7 +432,6 @@ pub fn phase_rustc(mut args: impl Iterator<Item = String>, phase: RustcPhase) {
444432
}
445433

446434
let mut cmd = miri();
447-
let mut emit_link_hack = false;
448435
// Arguments are treated very differently depending on whether this crate is
449436
// for interpretation by Miri, or for use by a build script / proc macro.
450437
if target_crate {
@@ -455,7 +442,7 @@ pub fn phase_rustc(mut args: impl Iterator<Item = String>, phase: RustcPhase) {
455442
}
456443

457444
// Forward arguments, but patched.
458-
let emit_flag = "--emit";
445+
459446
// This hack helps bootstrap run standard library tests in Miri. The issue is as follows:
460447
// when running `cargo miri test` on libcore, cargo builds a local copy of core and makes it
461448
// a dependency of the integration test crate. This copy duplicates all the lang items, so
@@ -471,30 +458,7 @@ pub fn phase_rustc(mut args: impl Iterator<Item = String>, phase: RustcPhase) {
471458
let replace_librs = env::var_os("MIRI_REPLACE_LIBRS_IF_NOT_TEST").is_some()
472459
&& !runnable_crate
473460
&& phase == RustcPhase::Build;
474-
while let Some(arg) = args.next() {
475-
// Patch `--emit`: remove "link" from "--emit" to make this a check-only build.
476-
if let Some(val) = arg.strip_prefix(emit_flag) {
477-
// Patch this argument. First, extract its value.
478-
let val =
479-
val.strip_prefix('=').expect("`cargo` should pass `--emit=X` as one argument");
480-
let mut val: Vec<_> = val.split(',').collect();
481-
// Now make sure "link" is not in there, but "metadata" is.
482-
if let Some(i) = val.iter().position(|&s| s == "link") {
483-
emit_link_hack = true;
484-
val.remove(i);
485-
if !val.contains(&"metadata") {
486-
val.push("metadata");
487-
}
488-
}
489-
cmd.arg(format!("{emit_flag}={}", val.join(",")));
490-
continue;
491-
}
492-
// Patch `--extern` filenames, since Cargo sometimes passes stub `.rlib` files:
493-
// https://github.com/rust-lang/miri/issues/1705
494-
if arg == "--extern" {
495-
forward_patched_extern_arg(&mut args, &mut cmd);
496-
continue;
497-
}
461+
for arg in args {
498462
// If the REPLACE_LIBRS hack is enabled and we are building a `lib.rs` file, and a
499463
// `lib.miri.rs` file exists, then build that instead.
500464
if replace_librs {
@@ -543,17 +507,6 @@ pub fn phase_rustc(mut args: impl Iterator<Item = String>, phase: RustcPhase) {
543507
eprintln!("[cargo-miri rustc] target_crate={target_crate} runnable_crate={runnable_crate}");
544508
}
545509

546-
// Create a stub .rlib file if "link" was requested by cargo.
547-
// This is necessary to prevent cargo from doing rebuilds all the time.
548-
if emit_link_hack {
549-
for filename in out_filenames() {
550-
if verbose > 0 {
551-
eprintln!("[cargo-miri rustc] creating fake lib file at `{}`", filename.display());
552-
}
553-
File::create(filename).expect("failed to create fake lib file");
554-
}
555-
}
556-
557510
debug_cmd("[cargo-miri rustc]", verbose, &cmd);
558511
exec(cmd);
559512
}
@@ -624,17 +577,11 @@ pub fn phase_runner(mut binary_args: impl Iterator<Item = String>, phase: Runner
624577
cmd.arg("--sysroot").arg(env::var_os("MIRI_SYSROOT").unwrap());
625578
}
626579
// Forward rustc arguments.
627-
// We need to patch "--extern" filenames because we forced a check-only
628-
// build without cargo knowing about that: replace `.rlib` suffix by
629-
// `.rmeta`.
630-
// We also need to remove `--error-format` as cargo specifies that to be JSON,
580+
// We need to remove `--error-format` as cargo specifies that to be JSON,
631581
// but when we run here, cargo does not interpret the JSON any more. `--json`
632582
// then also needs to be dropped.
633-
let mut args = info.args.iter();
634-
while let Some(arg) = args.next() {
635-
if arg == "--extern" {
636-
forward_patched_extern_arg(&mut (&mut args).cloned(), &mut cmd);
637-
} else if let Some(suffix) = arg.strip_prefix("--error-format") {
583+
for arg in &info.args {
584+
if let Some(suffix) = arg.strip_prefix("--error-format") {
638585
assert!(suffix.starts_with('='));
639586
// Drop this argument.
640587
} else if let Some(suffix) = arg.strip_prefix("--json") {
@@ -668,23 +615,15 @@ pub fn phase_runner(mut binary_args: impl Iterator<Item = String>, phase: Runner
668615
}
669616
}
670617

671-
pub fn phase_rustdoc(mut args: impl Iterator<Item = String>) {
618+
pub fn phase_rustdoc(args: impl Iterator<Item = String>) {
672619
let verbose = env::var("MIRI_VERBOSE")
673620
.map_or(0, |verbose| verbose.parse().expect("verbosity flag must be an integer"));
674621

675622
// phase_cargo_miri sets the RUSTDOC env var to ourselves, and puts a backup
676623
// of the old value into MIRI_ORIG_RUSTDOC. So that's what we have to invoke now.
677624
let rustdoc = env::var("MIRI_ORIG_RUSTDOC").unwrap_or("rustdoc".to_string());
678625
let mut cmd = Command::new(rustdoc);
679-
680-
while let Some(arg) = args.next() {
681-
if arg == "--extern" {
682-
// Patch --extern arguments to use *.rmeta files, since phase_cargo_rustc only creates stub *.rlib files.
683-
forward_patched_extern_arg(&mut args, &mut cmd);
684-
} else {
685-
cmd.arg(arg);
686-
}
687-
}
626+
cmd.args(args);
688627

689628
// Doctests of `proc-macro` crates (and their dependencies) are always built for the host,
690629
// so we are not able to run them in Miri.

cargo-miri/src/setup.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ pub fn setup(
160160

161161
// Do the build.
162162
let status = SysrootBuilder::new(&sysroot_dir, target)
163-
.build_mode(BuildMode::Check)
163+
.build_mode(BuildMode::Build) // not a real build, since we use dummy codegen
164164
.rustc_version(rustc_version.clone())
165165
.sysroot_config(sysroot_config)
166166
.rustflags(rustflags)

ci/ci.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ case $HOST_TARGET in
153153
BASIC="empty_main integer heap_alloc libc-mem vec string btreemap" # ensures we have the basics: pre-main code, system allocator
154154
UNIX="hello panic/panic panic/unwind concurrency/simple atomic libc-mem libc-misc libc-random env num_cpus" # the things that are very similar across all Unixes, and hence easily supported there
155155
TEST_TARGET=aarch64-linux-android run_tests_minimal $BASIC $UNIX time hashmap random thread sync concurrency epoll eventfd
156-
TEST_TARGET=wasm32-wasip2 run_tests_minimal $BASIC hello wasm
157156
TEST_TARGET=wasm32-unknown-unknown run_tests_minimal no_std empty_main wasm # this target doesn't really have std
158157
TEST_TARGET=thumbv7em-none-eabihf run_tests_minimal no_std
159158
;;

genmc-sys/build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ mod downloading {
2626
use super::GENMC_DOWNLOAD_PATH;
2727

2828
/// The GenMC repository the we get our commit from.
29-
pub(crate) const GENMC_GITHUB_URL: &str = "https://gitlab.inf.ethz.ch/public-plf/genmc.git";
29+
pub(crate) const GENMC_GITHUB_URL: &str = "https://github.com/MPI-SWS/genmc.git";
3030
/// The GenMC commit we depend on. It must be available on the specified GenMC repository.
31-
pub(crate) const GENMC_COMMIT: &str = "ce775ccd7866db820fa12ffca66463087a11dd96";
31+
pub(crate) const GENMC_COMMIT: &str = "d9527280bb99f1cef64326b1803ffd952e3880df";
3232

3333
/// Ensure that a local GenMC repo is present and set to the correct commit.
3434
/// Return the path of the GenMC repo and whether the checked out commit was changed.

genmc-sys/cpp/include/MiriInterface.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,27 +261,27 @@ namespace GenmcScalarExt {
261261
inline GenmcScalar uninit() {
262262
return GenmcScalar {
263263
.value = 0,
264-
.extra = 0,
264+
.provenance = 0,
265265
.is_init = false,
266266
};
267267
}
268268

269269
inline GenmcScalar from_sval(SVal sval) {
270270
return GenmcScalar {
271271
.value = sval.get(),
272-
.extra = sval.getExtra(),
272+
.provenance = sval.getProvenance(),
273273
.is_init = true,
274274
};
275275
}
276276

277277
inline SVal to_sval(GenmcScalar scalar) {
278278
ERROR_ON(!scalar.is_init, "Cannot convert an uninitialized `GenmcScalar` into an `SVal`\n");
279-
return SVal(scalar.value, scalar.extra);
279+
return SVal(scalar.value, scalar.provenance);
280280
}
281281

282282
inline std::optional<SVal> try_to_sval(GenmcScalar scalar) {
283283
if (scalar.is_init)
284-
return { SVal(scalar.value, scalar.extra) };
284+
return { SVal(scalar.value, scalar.provenance) };
285285
return std::nullopt;
286286
}
287287
} // namespace GenmcScalarExt

genmc-sys/src/lib.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ pub fn create_genmc_driver_handle(
4545
}
4646

4747
impl GenmcScalar {
48-
pub const UNINIT: Self = Self { value: 0, extra: 0, is_init: false };
48+
pub const UNINIT: Self = Self { value: 0, provenance: 0, is_init: false };
4949

5050
pub const fn from_u64(value: u64) -> Self {
51-
Self { value, extra: 0, is_init: true }
51+
Self { value, provenance: 0, is_init: true }
5252
}
5353

5454
pub const fn has_provenance(&self) -> bool {
55-
self.extra != 0
55+
self.provenance != 0
5656
}
5757
}
5858

@@ -172,8 +172,9 @@ mod ffi {
172172
value: u64,
173173
/// This is zero for integer values. For pointers, this encodes the provenance by
174174
/// storing the base address of the allocation that this pointer belongs to.
175-
/// Operations on `SVal` in GenMC (e.g., `fetch_add`) preserve the `extra` of the left argument (`left.fetch_add(right, ...)`).
176-
extra: u64,
175+
/// Operations on `SVal` in GenMC (e.g., `fetch_add`) preserve the `provenance` of the left
176+
/// argument (`left.fetch_add(right, ...)`).
177+
provenance: u64,
177178
/// Indicates whether this value is initialized. If this is `false`, the other fields do not matter.
178179
/// (Ideally we'd use `std::optional` but CXX does not support that.)
179180
is_init: bool,

miri-script/Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

miri-script/src/commands.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ impl MiriEnv {
5757
.arg("--")
5858
.args(&["miri", "setup", "--print-sysroot"])
5959
.args(target_flag);
60-
cmd.set_quiet(quiet);
60+
if quiet {
61+
cmd = cmd.arg("--quiet");
62+
}
6163
let output = cmd.read()?;
6264
self.sh.set_var("MIRI_SYSROOT", &output);
6365
Ok(output.into())
@@ -112,8 +114,8 @@ impl Command {
112114
Command::Check { features, flags } => Self::check(features, flags),
113115
Command::Test { bless, target, coverage, features, flags } =>
114116
Self::test(bless, target, coverage, features, flags),
115-
Command::Run { dep, verbose, target, edition, features, flags } =>
116-
Self::run(dep, verbose, target, edition, features, flags),
117+
Command::Run { dep, quiet, target, edition, features, flags } =>
118+
Self::run(dep, quiet, target, edition, features, flags),
117119
Command::Doc { features, flags } => Self::doc(features, flags),
118120
Command::Fmt { flags } => Self::fmt(flags),
119121
Command::Clippy { features, flags } => Self::clippy(features, flags),
@@ -458,7 +460,7 @@ impl Command {
458460

459461
fn run(
460462
dep: bool,
461-
verbose: bool,
463+
quiet: bool,
462464
target: Option<String>,
463465
edition: Option<String>,
464466
features: Vec<String>,
@@ -468,7 +470,7 @@ impl Command {
468470

469471
// Preparation: get a sysroot, and get the miri binary.
470472
let miri_sysroot =
471-
e.build_miri_sysroot(/* quiet */ !verbose, target.as_deref(), &features)?;
473+
e.build_miri_sysroot(/* quiet */ quiet, target.as_deref(), &features)?;
472474
let miri_bin = e
473475
.build_get_binary(".", &features)
474476
.context("failed to get filename of miri executable")?;
@@ -492,7 +494,7 @@ impl Command {
492494
// Compute flags.
493495
let miri_flags = e.sh.var("MIRIFLAGS").unwrap_or_default();
494496
let miri_flags = flagsplit(&miri_flags);
495-
let quiet_flag = if verbose { None } else { Some("--quiet") };
497+
let quiet_flag = if quiet { Some("--quiet") } else { None };
496498

497499
// Run Miri.
498500
// The basic command that executes the Miri driver.
@@ -506,7 +508,7 @@ impl Command {
506508
} else {
507509
cmd!(e.sh, "{miri_bin}")
508510
};
509-
cmd.set_quiet(!verbose);
511+
cmd.set_quiet(quiet);
510512
// Add Miri flags
511513
let mut cmd = cmd.args(&miri_flags).args(&early_flags).args(&flags);
512514
// For `--dep` we also need to set the target in the env var.

miri-script/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ pub enum Command {
7878
/// Build the program with the dependencies declared in `tests/deps/Cargo.toml`.
7979
#[arg(long)]
8080
dep: bool,
81-
/// Show build progress.
81+
/// Hide build progress.
8282
#[arg(long, short)]
83-
verbose: bool,
83+
quiet: bool,
8484
/// The cross-interpretation target.
8585
#[arg(long)]
8686
target: Option<String>,

0 commit comments

Comments
 (0)