mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
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();
|
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
|
/// Use `cygpath -w` on a path to get a Windows path string back. This assumes that `cygpath` is
|
||||||
/// available on the platform!
|
/// available on the platform!
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
|
@ -46,7 +46,6 @@ run-make/fmt-write-bloat/Makefile
|
|||||||
run-make/foreign-double-unwind/Makefile
|
run-make/foreign-double-unwind/Makefile
|
||||||
run-make/foreign-exceptions/Makefile
|
run-make/foreign-exceptions/Makefile
|
||||||
run-make/foreign-rust-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-add-rust-src-component/Makefile
|
||||||
run-make/incr-foreign-head-span/Makefile
|
run-make/incr-foreign-head-span/Makefile
|
||||||
run-make/interdependent-c-libraries/Makefile
|
run-make/interdependent-c-libraries/Makefile
|
||||||
@ -64,7 +63,6 @@ run-make/issue-33329/Makefile
|
|||||||
run-make/issue-35164/Makefile
|
run-make/issue-35164/Makefile
|
||||||
run-make/issue-36710/Makefile
|
run-make/issue-36710/Makefile
|
||||||
run-make/issue-37839/Makefile
|
run-make/issue-37839/Makefile
|
||||||
run-make/issue-40535/Makefile
|
|
||||||
run-make/issue-47551/Makefile
|
run-make/issue-47551/Makefile
|
||||||
run-make/issue-69368/Makefile
|
run-make/issue-69368/Makefile
|
||||||
run-make/issue-83045/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-builtins-attribute/Makefile
|
||||||
run-make/no-duplicate-libs/Makefile
|
run-make/no-duplicate-libs/Makefile
|
||||||
run-make/obey-crate-type-flag/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/output-type-permutations/Makefile
|
||||||
run-make/panic-abort-eh_frame/Makefile
|
run-make/panic-abort-eh_frame/Makefile
|
||||||
run-make/pass-linker-flags-flavor/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-2/Makefile
|
||||||
run-make/rlib-format-packed-bundled-libs-3/Makefile
|
run-make/rlib-format-packed-bundled-libs-3/Makefile
|
||||||
run-make/rlib-format-packed-bundled-libs/Makefile
|
run-make/rlib-format-packed-bundled-libs/Makefile
|
||||||
run-make/rmeta-preferred/Makefile
|
|
||||||
run-make/rustc-macro-dep-files/Makefile
|
run-make/rustc-macro-dep-files/Makefile
|
||||||
run-make/sanitizer-cdylib-link/Makefile
|
run-make/sanitizer-cdylib-link/Makefile
|
||||||
run-make/sanitizer-dylib-link/Makefile
|
run-make/sanitizer-dylib-link/Makefile
|
||||||
|
13
tests/run-make/include-bytes-deps/rmake.rs
Normal file
13
tests/run-make/include-bytes-deps/rmake.rs
Normal file
@ -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
|
|
14
tests/run-make/metadata-only-crate-no-ice/rmake.rs
Normal file
14
tests/run-make/metadata-only-crate-no-ice/rmake.rs
Normal file
@ -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"
|
|
41
tests/run-make/optimization-remarks-dir-pgo/rmake.rs
Normal file
41
tests/run-make/optimization-remarks-dir-pgo/rmake.rs
Normal file
@ -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"
|
|
39
tests/run-make/optimization-remarks-dir/rmake.rs
Normal file
39
tests/run-make/optimization-remarks-dir/rmake.rs
Normal file
@ -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
|
|
18
tests/run-make/rmeta-preferred/rmake.rs
Normal file
18
tests/run-make/rmeta-preferred/rmake.rs
Normal file
@ -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
Block a user