Rollup merge of #128363 - Oneirical:not-to-be-undertestimated, r=jieyouxu

Migrate `pdb-buildinfo-cl-cmd` and `pgo-indirect-call-promotion` `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).

Please try:

try-job: x86_64-msvc
try-job: x86_64-mingw
try-job: i686-msvc
try-job: i686-mingw
try-job: x86_64-gnu-llvm-17
try-job: aarch64-apple
This commit is contained in:
Matthias Krüger 2024-08-07 19:35:04 +02:00 committed by GitHub
commit a36bf74d66
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 73 additions and 42 deletions

View File

@ -204,6 +204,7 @@ const KNOWN_DIRECTIVE_NAMES: &[&str] = &[
"only-watchos", "only-watchos",
"only-windows", "only-windows",
"only-windows-gnu", "only-windows-gnu",
"only-windows-msvc",
"only-x86", "only-x86",
"only-x86_64", "only-x86_64",
"only-x86_64-fortanix-unknown-sgx", "only-x86_64-fortanix-unknown-sgx",

View File

@ -16,8 +16,6 @@ run-make/macos-deployment-target/Makefile
run-make/min-global-align/Makefile run-make/min-global-align/Makefile
run-make/native-link-modifier-bundle/Makefile run-make/native-link-modifier-bundle/Makefile
run-make/no-alloc-shim/Makefile run-make/no-alloc-shim/Makefile
run-make/pdb-buildinfo-cl-cmd/Makefile
run-make/pgo-indirect-call-promotion/Makefile
run-make/remap-path-prefix-dwarf/Makefile run-make/remap-path-prefix-dwarf/Makefile
run-make/reproducible-build/Makefile run-make/reproducible-build/Makefile
run-make/rlib-format-packed-bundled-libs/Makefile run-make/rlib-format-packed-bundled-libs/Makefile

View File

@ -1,16 +0,0 @@
include ../tools.mk
# only-windows-msvc
# tests if the pdb contains the following information in the LF_BUILDINFO:
# 1. the commandline args to compile it (cmd)
# 2. full path to the compiler (cl)
# we just do a stringsearch on the pdb, as these need to show up at least once, as the LF_BUILDINFO is created for each cgu
# actual parsing would be better, but this is a simple and good enough solution for now
all:
$(RUSTC_ORIGINAL) main.rs -g --crate-name my_crate_name --crate-type bin -C metadata=dc9ef878b0a48666 --out-dir $(TMPDIR)
cat '$(TMPDIR)/my_crate_name.pdb' | grep -F '$(RUSTC_ORIGINAL)'
# using a file containing the string so I don't have problems with escaping quotes and spaces
cat '$(TMPDIR)/my_crate_name.pdb' | grep -f 'stringlist.txt'

View File

@ -0,0 +1,39 @@
// Check if the pdb file contains the following information in the LF_BUILDINFO:
// 1. full path to the compiler (cl)
// 2. the commandline args to compile it (cmd)
// This is because these used to be missing in #96475.
// See https://github.com/rust-lang/rust/pull/113492
//@ only-windows-msvc
// Reason: pdb files are unique to this architecture
use run_make_support::{assert_contains, bstr, env_var, rfs, rustc};
fn main() {
rustc()
.input("main.rs")
.arg("-g")
.crate_name("my_crate_name")
.crate_type("bin")
.metadata("dc9ef878b0a48666")
.run();
let tests = [
&env_var("RUSTC"),
r#""main.rs""#,
r#""-g""#,
r#""--crate-name""#,
r#""my_crate_name""#,
r#""--crate-type""#,
r#""bin""#,
r#""-Cmetadata=dc9ef878b0a48666""#,
];
for test in tests {
assert_pdb_contains(test);
}
}
fn assert_pdb_contains(needle: &str) {
let needle = needle.as_bytes();
use bstr::ByteSlice;
assert!(&rfs::read("my_crate_name.pdb").find(needle).is_some());
}

View File

@ -1 +0,0 @@
"main.rs" "-g" "--crate-name" "my_crate_name" "--crate-type" "bin" "-C" "metadata=dc9ef878b0a48666" "--out-dir"

View File

@ -1,23 +0,0 @@
# needs-profiler-support
# ignore-cross-compile
include ../tools.mk
all:
# We don't compile `opaque` with either optimizations or instrumentation.
# We don't compile `opaque` with either optimizations or instrumentation.
$(RUSTC) $(COMMON_FLAGS) opaque.rs
# Compile the test program with instrumentation
mkdir -p "$(TMPDIR)"/prof_data_dir
$(RUSTC) $(COMMON_FLAGS) interesting.rs \
-Cprofile-generate="$(TMPDIR)"/prof_data_dir -O -Ccodegen-units=1
$(RUSTC) $(COMMON_FLAGS) main.rs -Cprofile-generate="$(TMPDIR)"/prof_data_dir -O
# The argument below generates to the expected branch weights
$(call RUN,main) || exit 1
"$(LLVM_BIN_DIR)"/llvm-profdata merge \
-o "$(TMPDIR)"/prof_data_dir/merged.profdata \
"$(TMPDIR)"/prof_data_dir
$(RUSTC) $(COMMON_FLAGS) interesting.rs \
-Cprofile-use="$(TMPDIR)"/prof_data_dir/merged.profdata -O \
-Ccodegen-units=1 --emit=llvm-ir
cat "$(TMPDIR)"/interesting.ll | "$(LLVM_FILECHECK)" filecheck-patterns.txt

View File

@ -0,0 +1,33 @@
// This test checks that indirect call promotion is performed. The test
// programs calls the same function a thousand times through a function pointer.
// Only PGO data provides the information that it actually always is the same
// function. We verify that the indirect call promotion pass inserts a check
// whether it can make a direct call instead of the indirect call.
// See https://github.com/rust-lang/rust/pull/66631
//@ needs-profiler-support
// Reason: llvm_profdata is used
//@ ignore-cross-compile
// Reason: the compiled binary is executed
use run_make_support::{llvm_filecheck, llvm_profdata, rfs, run, rustc};
fn main() {
// We don't compile `opaque` with either optimizations or instrumentation.
rustc().input("opaque.rs").run();
// Compile the test program with instrumentation
rfs::create_dir("prof_data_dir");
rustc().input("interesting.rs").profile_generate("prof_data_dir").opt().codegen_units(1).run();
rustc().input("main.rs").profile_generate("prof_data_dir").opt().run();
// The argument below generates to the expected branch weights
run("main");
llvm_profdata().merge().output("prof_data_dir/merged.profdata").input("prof_data_dir").run();
rustc()
.input("interesting.rs")
.profile_use("prof_data_dir/merged.profdata")
.opt()
.codegen_units(1)
.emit("llvm-ir")
.run();
llvm_filecheck().patterns("filecheck-patterns.txt").stdin(rfs::read("interesting.ll")).run();
}