mirror of https://github.com/rust-lang/rust.git
Rollup merge of #126709 - Oneirical:exitestial-crisis, r=jieyouxu
Migrate `include_bytes_deps`, `optimization-remarks-dir-pgo`, `optimization-remarks-dir`, `issue-40535` and `rmeta-preferred` `run-make` tests to rmake Part of #121876 and the associated [Google Summer of Code project](https://blog.rust-lang.org/2024/05/01/gsoc-2024-selected-projects.html). Needs BSD tryjob. try-job: aarch64-apple try-job: x86_64-msvc try-job: armhf-gnu try-job: test-various
This commit is contained in:
commit
e66f4d3356
|
@ -261,6 +261,40 @@ pub fn test_while_readonly<P: AsRef<Path>, F: FnOnce() + std::panic::UnwindSafe>
|
|||
success.unwrap();
|
||||
}
|
||||
|
||||
/// Browse the directory `path` non-recursively and return all files which respect the parameters
|
||||
/// outlined by `closure`.
|
||||
#[track_caller]
|
||||
pub fn shallow_find_files<P: AsRef<Path>, F: Fn(&PathBuf) -> bool>(
|
||||
path: P,
|
||||
closure: F,
|
||||
) -> Vec<PathBuf> {
|
||||
let mut matching_files = Vec::new();
|
||||
for entry in fs_wrapper::read_dir(path) {
|
||||
let entry = entry.expect("failed to read directory entry.");
|
||||
let path = entry.path();
|
||||
|
||||
if path.is_file() && closure(&path) {
|
||||
matching_files.push(path);
|
||||
}
|
||||
}
|
||||
matching_files
|
||||
}
|
||||
|
||||
/// Returns true if the filename at `path` starts with `prefix`.
|
||||
pub fn has_prefix<P: AsRef<Path>>(path: P, prefix: &str) -> bool {
|
||||
path.as_ref().file_name().is_some_and(|name| name.to_str().unwrap().starts_with(prefix))
|
||||
}
|
||||
|
||||
/// Returns true if the filename at `path` has the extension `extension`.
|
||||
pub fn has_extension<P: AsRef<Path>>(path: P, extension: &str) -> bool {
|
||||
path.as_ref().extension().is_some_and(|ext| ext == extension)
|
||||
}
|
||||
|
||||
/// Returns true if the filename at `path` does not contain `expected`.
|
||||
pub fn not_contains<P: AsRef<Path>>(path: P, expected: &str) -> bool {
|
||||
!path.as_ref().file_name().is_some_and(|name| name.to_str().unwrap().contains(expected))
|
||||
}
|
||||
|
||||
/// Use `cygpath -w` on a path to get a Windows path string back. This assumes that `cygpath` is
|
||||
/// available on the platform!
|
||||
#[track_caller]
|
||||
|
|
|
@ -46,7 +46,6 @@ run-make/fmt-write-bloat/Makefile
|
|||
run-make/foreign-double-unwind/Makefile
|
||||
run-make/foreign-exceptions/Makefile
|
||||
run-make/foreign-rust-exceptions/Makefile
|
||||
run-make/include_bytes_deps/Makefile
|
||||
run-make/incr-add-rust-src-component/Makefile
|
||||
run-make/incr-foreign-head-span/Makefile
|
||||
run-make/interdependent-c-libraries/Makefile
|
||||
|
@ -64,7 +63,6 @@ run-make/issue-33329/Makefile
|
|||
run-make/issue-35164/Makefile
|
||||
run-make/issue-36710/Makefile
|
||||
run-make/issue-37839/Makefile
|
||||
run-make/issue-40535/Makefile
|
||||
run-make/issue-47551/Makefile
|
||||
run-make/issue-69368/Makefile
|
||||
run-make/issue-83045/Makefile
|
||||
|
@ -102,8 +100,6 @@ run-make/no-alloc-shim/Makefile
|
|||
run-make/no-builtins-attribute/Makefile
|
||||
run-make/no-duplicate-libs/Makefile
|
||||
run-make/obey-crate-type-flag/Makefile
|
||||
run-make/optimization-remarks-dir-pgo/Makefile
|
||||
run-make/optimization-remarks-dir/Makefile
|
||||
run-make/output-type-permutations/Makefile
|
||||
run-make/panic-abort-eh_frame/Makefile
|
||||
run-make/pass-linker-flags-flavor/Makefile
|
||||
|
@ -136,7 +132,6 @@ run-make/return-non-c-like-enum-from-c/Makefile
|
|||
run-make/rlib-format-packed-bundled-libs-2/Makefile
|
||||
run-make/rlib-format-packed-bundled-libs-3/Makefile
|
||||
run-make/rlib-format-packed-bundled-libs/Makefile
|
||||
run-make/rmeta-preferred/Makefile
|
||||
run-make/rustc-macro-dep-files/Makefile
|
||||
run-make/sanitizer-cdylib-link/Makefile
|
||||
run-make/sanitizer-dylib-link/Makefile
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
// include_bytes! and include_str! in `main.rs`
|
||||
// should register the included file as of #24423,
|
||||
// and this test checks that this is still the case.
|
||||
// See https://github.com/rust-lang/rust/pull/24423
|
||||
|
||||
use run_make_support::{invalid_utf8_contains, rustc};
|
||||
|
||||
fn main() {
|
||||
rustc().emit("dep-info").input("main.rs").run();
|
||||
invalid_utf8_contains("main.d", "input.txt");
|
||||
invalid_utf8_contains("main.d", "input.bin");
|
||||
invalid_utf8_contains("main.d", "input.md");
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
include ../tools.mk
|
||||
|
||||
# ignore-freebsd
|
||||
|
||||
all:
|
||||
$(RUSTC) --emit dep-info main.rs
|
||||
$(CGREP) "input.txt" "input.bin" "input.md" < $(TMPDIR)/main.d
|
|
@ -1,13 +0,0 @@
|
|||
include ../tools.mk
|
||||
|
||||
# The ICE occurred in the following situation:
|
||||
# * `foo` declares `extern crate bar, baz`, depends only on `bar` (forgetting `baz` in `Cargo.toml`)
|
||||
# * `bar` declares and depends on `extern crate baz`
|
||||
# * All crates built in metadata-only mode (`cargo check`)
|
||||
all:
|
||||
# cc https://github.com/rust-lang/rust/issues/40623
|
||||
$(RUSTC) baz.rs --emit=metadata
|
||||
$(RUSTC) bar.rs --emit=metadata --extern baz=$(TMPDIR)/libbaz.rmeta
|
||||
$(RUSTC) foo.rs --emit=metadata --extern bar=$(TMPDIR)/libbar.rmeta 2>&1 | \
|
||||
$(CGREP) -v "unexpectedly panicked"
|
||||
# ^ Succeeds if it doesn't find the ICE message
|
|
@ -0,0 +1,14 @@
|
|||
// In a dependency hierarchy, metadata-only crates could cause an Internal
|
||||
// Compiler Error (ICE) due to a compiler bug - not correctly fetching sources for
|
||||
// metadata-only crates. This test is a minimal reproduction of a program that triggered
|
||||
// this bug, and checks that no ICE occurs.
|
||||
// See https://github.com/rust-lang/rust/issues/40535
|
||||
|
||||
use run_make_support::rustc;
|
||||
|
||||
fn main() {
|
||||
rustc().input("baz.rs").emit("metadata").run();
|
||||
rustc().input("bar.rs").emit("metadata").extern_("baz", "libbaz.rmeta").run();
|
||||
// There should be no internal compiler error.
|
||||
rustc().input("foo.rs").emit("metadata").extern_("bar", "libbaz.rmeta").run();
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
# needs-profiler-support
|
||||
# ignore-cross-compile
|
||||
|
||||
include ../tools.mk
|
||||
|
||||
PROFILE_DIR=$(TMPDIR)/profiles
|
||||
|
||||
check_hotness:
|
||||
$(RUSTC) -Cprofile-generate="$(TMPDIR)"/profdata -O foo.rs -o$(TMPDIR)/foo
|
||||
$(TMPDIR)/foo
|
||||
"$(LLVM_BIN_DIR)"/llvm-profdata merge \
|
||||
-o "$(TMPDIR)"/merged.profdata \
|
||||
"$(TMPDIR)"/profdata/*.profraw
|
||||
$(RUSTC) -Cprofile-use=$(TMPDIR)/merged.profdata -O foo.rs -Cremark=all -Zremark-dir=$(PROFILE_DIR)
|
||||
|
||||
# Check that PGO hotness is included in the remark files
|
||||
cat $(PROFILE_DIR)/*.opt.yaml | $(CGREP) -e "Hotness"
|
|
@ -0,0 +1,41 @@
|
|||
// This test checks the -Zremark-dir flag, which writes LLVM
|
||||
// optimization remarks to the YAML format. When using PGO (Profile
|
||||
// Guided Optimization), the Hotness attribute should be included in
|
||||
// the output remark files.
|
||||
// See https://github.com/rust-lang/rust/pull/114439
|
||||
|
||||
//@ needs-profiler-support
|
||||
//@ ignore-cross-compile
|
||||
|
||||
use run_make_support::{
|
||||
has_extension, has_prefix, invalid_utf8_contains, llvm_profdata, run, rustc, shallow_find_files,
|
||||
};
|
||||
|
||||
fn main() {
|
||||
rustc().profile_generate("profdata").opt().input("foo.rs").output("foo").run();
|
||||
run("foo");
|
||||
// The profdata filename is a long sequence of numbers, fetch it by prefix and extension
|
||||
// to keep the test working even if the filename changes.
|
||||
let profdata_files = shallow_find_files("profdata", |path| {
|
||||
has_prefix(path, "default") && has_extension(path, "profraw")
|
||||
});
|
||||
let profdata_file = profdata_files.get(0).unwrap();
|
||||
llvm_profdata().merge().output("merged.profdata").input(profdata_file).run();
|
||||
rustc()
|
||||
.profile_use("merged.profdata")
|
||||
.opt()
|
||||
.input("foo.rs")
|
||||
.arg("-Cremark=all")
|
||||
.arg("-Zremark-dir=profiles")
|
||||
.run();
|
||||
// Check that PGO hotness is included in the remark files
|
||||
let remark_files = shallow_find_files("profiles", |path| {
|
||||
has_prefix(path, "foo") && has_extension(path, "yaml")
|
||||
});
|
||||
assert!(!remark_files.is_empty());
|
||||
for file in remark_files {
|
||||
if !file.to_str().unwrap().contains("codegen") {
|
||||
invalid_utf8_contains(file, "Hotness")
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
include ../tools.mk
|
||||
|
||||
PROFILE_DIR=$(TMPDIR)/profiles
|
||||
|
||||
all: check_inline check_filter
|
||||
|
||||
check_inline:
|
||||
$(RUSTC) -O foo.rs --crate-type=lib -Cremark=all -Zremark-dir=$(PROFILE_DIR)
|
||||
cat $(PROFILE_DIR)/*.opt.yaml | $(CGREP) -e "inline"
|
||||
check_filter:
|
||||
$(RUSTC) -O foo.rs --crate-type=lib -Cremark=foo -Zremark-dir=$(PROFILE_DIR)
|
||||
cat $(PROFILE_DIR)/*.opt.yaml | $(CGREP) -e -v "inline"
|
|
@ -0,0 +1,39 @@
|
|||
// In this test, the function `bar` has #[inline(never)] and the function `foo`
|
||||
// does not. This test outputs LLVM optimization remarks twice - first for all
|
||||
// functions (including `bar`, and the `inline` mention), and then for only `foo`
|
||||
// (should not have the `inline` mention).
|
||||
// See https://github.com/rust-lang/rust/pull/113040
|
||||
|
||||
use run_make_support::{
|
||||
has_extension, has_prefix, invalid_utf8_contains, invalid_utf8_not_contains, not_contains,
|
||||
rustc, shallow_find_files,
|
||||
};
|
||||
|
||||
fn main() {
|
||||
rustc()
|
||||
.opt()
|
||||
.input("foo.rs")
|
||||
.crate_type("lib")
|
||||
.arg("-Cremark=all")
|
||||
.arg("-Zremark-dir=profiles_all")
|
||||
.run();
|
||||
let all_remark_files = shallow_find_files("profiles_all", |path| {
|
||||
has_prefix(path, "foo") && has_extension(path, "yaml") && not_contains(path, "codegen")
|
||||
});
|
||||
for file in all_remark_files {
|
||||
invalid_utf8_contains(file, "inline")
|
||||
}
|
||||
rustc()
|
||||
.opt()
|
||||
.input("foo.rs")
|
||||
.crate_type("lib")
|
||||
.arg("-Cremark=foo")
|
||||
.arg("-Zremark-dir=profiles_foo")
|
||||
.run();
|
||||
let foo_remark_files = shallow_find_files("profiles_foo", |path| {
|
||||
has_prefix(path, "foo") && has_extension(path, "yaml")
|
||||
});
|
||||
for file in foo_remark_files {
|
||||
invalid_utf8_not_contains(file, "inline")
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
# ignore-cross-compile
|
||||
include ../tools.mk
|
||||
|
||||
# Test that using rlibs and rmeta dep crates work together. Specifically, that
|
||||
# there can be both an rmeta and an rlib file and rustc will prefer the rmeta
|
||||
# file.
|
||||
#
|
||||
# This behavior is simply making sure this doesn't accidentally change; in this
|
||||
# case we want to make sure that the rlib isn't being used as that would cause
|
||||
# bugs in -Zbinary-dep-depinfo (see #68298).
|
||||
|
||||
all:
|
||||
$(RUSTC) rmeta_aux.rs --crate-type=rlib --emit link,metadata
|
||||
$(RUSTC) lib.rs --crate-type=rlib --emit dep-info -Zbinary-dep-depinfo
|
||||
$(CGREP) "librmeta_aux.rmeta" < $(TMPDIR)/lib.d
|
||||
$(CGREP) -v "librmeta_aux.rlib" < $(TMPDIR)/lib.d
|
|
@ -0,0 +1,18 @@
|
|||
// This test compiles `lib.rs`'s dependency, `rmeta_aux.rs`, as both an rlib
|
||||
// and an rmeta crate. By default, rustc should give the metadata crate (rmeta)
|
||||
// precedence over the rust-lib (rlib). This test inspects the contents of the binary
|
||||
// and that the correct (rmeta) crate was used.
|
||||
// rlibs being preferred could indicate a resurgence of the -Zbinary-dep-depinfo bug
|
||||
// seen in #68298.
|
||||
// See https://github.com/rust-lang/rust/pull/37681
|
||||
|
||||
//@ ignore-cross-compile
|
||||
|
||||
use run_make_support::{invalid_utf8_contains, invalid_utf8_not_contains, rustc};
|
||||
|
||||
fn main() {
|
||||
rustc().input("rmeta_aux.rs").crate_type("rlib").emit("link,metadata").run();
|
||||
rustc().input("lib.rs").crate_type("rlib").emit("dep-info").arg("-Zbinary-dep-depinfo").run();
|
||||
invalid_utf8_contains("lib.d", "librmeta_aux.rmeta");
|
||||
invalid_utf8_not_contains("lib.d", "librmeta_aux.rlib");
|
||||
}
|
Loading…
Reference in New Issue