Skip to content
Closed
14 changes: 14 additions & 0 deletions src/tools/run-make-support/src/assertion_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,20 @@ pub fn assert_not_contains_regex<H: AsRef<str>, N: AsRef<str>>(haystack: H, need
}
}

/// Assert that `haystack` contains `needle` a `count` number of times.
#[track_caller]
pub fn assert_count_is<H: AsRef<str>, N: AsRef<str>>(count: usize, haystack: H, needle: N) {
let haystack = haystack.as_ref();
let needle = needle.as_ref();
if count != haystack.matches(needle).count() {
eprintln!("=== HAYSTACK ===");
eprintln!("{}", haystack);
eprintln!("=== NEEDLE ===");
eprintln!("{}", needle);
panic!("needle did not appear {count} times in haystack");
}
}

/// Assert that all files in `dir1` exist and have the same content in `dir2`
pub fn assert_dirs_are_equal(dir1: impl AsRef<Path>, dir2: impl AsRef<Path>) {
let dir2 = dir2.as_ref();
Expand Down
2 changes: 1 addition & 1 deletion src/tools/run-make-support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ pub use path_helpers::{
pub use scoped_run::{run_in_tmpdir, test_while_readonly};

pub use assertion_helpers::{
assert_contains, assert_contains_regex, assert_dirs_are_equal, assert_equals,
assert_contains, assert_contains_regex, assert_count_is, assert_dirs_are_equal, assert_equals,
assert_not_contains, assert_not_contains_regex,
};

Expand Down
6 changes: 0 additions & 6 deletions src/tools/tidy/src/allowed_run_make_makefiles.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
run-make/branch-protection-check-IBT/Makefile
run-make/cat-and-grep-sanity-check/Makefile
run-make/cross-lang-lto-upstream-rlibs/Makefile
run-make/dep-info-doesnt-run-much/Makefile
run-make/dep-info-spaces/Makefile
run-make/dep-info/Makefile
Expand All @@ -13,12 +12,8 @@ run-make/libs-through-symlinks/Makefile
run-make/libtest-json/Makefile
run-make/libtest-junit/Makefile
run-make/libtest-thread-limit/Makefile
run-make/long-linker-command-lines-cmd-exe/Makefile
run-make/long-linker-command-lines/Makefile
run-make/macos-deployment-target/Makefile
run-make/min-global-align/Makefile
run-make/native-link-modifier-bundle/Makefile
run-make/no-alloc-shim/Makefile
run-make/pdb-buildinfo-cl-cmd/Makefile
run-make/pgo-gen-lto/Makefile
run-make/pgo-indirect-call-promotion/Makefile
Expand All @@ -30,7 +25,6 @@ run-make/split-debuginfo/Makefile
run-make/staticlib-dylib-linkage/Makefile
run-make/symbol-mangling-hashed/Makefile
run-make/sysroot-crates-are-unstable/Makefile
run-make/thumb-none-cortex-m/Makefile
run-make/thumb-none-qemu/Makefile
run-make/translation/Makefile
run-make/x86_64-fortanix-unknown-sgx-lvi/Makefile
32 changes: 0 additions & 32 deletions tests/run-make/cross-lang-lto-upstream-rlibs/Makefile

This file was deleted.

57 changes: 57 additions & 0 deletions tests/run-make/cross-lang-lto-upstream-rlibs/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// When using the flag -C linker-plugin-lto, static libraries could lose their upstream object
// files during compilation. This bug was fixed in #53031, and this test compiles a staticlib
// dependent on upstream, checking that the upstream object file still exists after no LTO and
// thin LTO.
// See https://github.com/rust-lang/rust/pull/53031

use run_make_support::{
cwd, has_extension, has_prefix, has_suffix, llvm_ar, rfs, rustc, shallow_find_files,
static_lib_name,
};

fn main() {
// The test starts with no LTO enabled.
rustc().input("upstream.rs").arg("-Clinker-plugin-lto").codegen_units(1).run();
rustc()
.input("staticlib.rs")
.arg("-Clinker-plugin-lto")
.codegen_units(1)
.output(static_lib_name("staticlib"))
.run();
llvm_ar().extract().arg(static_lib_name("staticlib")).run();
// Ensure the upstream object file was included.
assert_eq!(
shallow_find_files(cwd(), |path| {
has_prefix(path, "upstream.") && has_suffix(path, ".rcgu.o")
})
.len(),
1
);
// Remove all output files that are not source Rust code for cleanup.
for file in shallow_find_files(cwd(), |path| !has_extension(path, "rs")) {
rfs::remove_file(file)
}

// Check it again, with Thin LTO.
rustc()
.input("upstream.rs")
.arg("-Clinker-plugin-lto")
.codegen_units(1)
.arg("-Clto=thin")
.run();
rustc()
.input("staticlib.rs")
.arg("-Clinker-plugin-lto")
.codegen_units(1)
.arg("-Clto=thin")
.output(static_lib_name("staticlib"))
.run();
llvm_ar().extract().arg(static_lib_name("staticlib")).run();
assert_eq!(
shallow_find_files(cwd(), |path| {
has_prefix(path, "upstream.") && has_suffix(path, ".rcgu.o")
})
.len(),
1
);
}
7 changes: 0 additions & 7 deletions tests/run-make/long-linker-command-lines-cmd-exe/Makefile

This file was deleted.

26 changes: 3 additions & 23 deletions tests/run-make/long-linker-command-lines-cmd-exe/foo.rs
Original file line number Diff line number Diff line change
@@ -1,30 +1,12 @@
// Like the `long-linker-command-lines` test this test attempts to blow
// a command line limit for running the linker. Unlike that test, however,
// this test is testing `cmd.exe` specifically rather than the OS.
//
// Unfortunately `cmd.exe` has a 8192 limit which is relatively small
// in the grand scheme of things and anyone sripting rustc's linker
// is probably using a `*.bat` script and is likely to hit this limit.
//
// This test uses a `foo.bat` script as the linker which just simply
// delegates back to this program. The compiler should use a lower
// limit for arguments before passing everything via `@`, which
// means that everything should still succeed here.

use std::env;
use std::fs::{self, File};
use std::io::{BufWriter, Read, Write};
use std::path::PathBuf;
use std::process::Command;

fn main() {
if !cfg!(windows) {
return;
}

let tmpdir = PathBuf::from(env::var_os("OUT_DIR").unwrap());
let ok = tmpdir.join("ok");
let not_ok = tmpdir.join("not_ok");
let ok = PathBuf::from("ok");
let not_ok = PathBuf::from("not_ok");
if env::var("YOU_ARE_A_LINKER").is_ok() {
match env::args_os().find(|a| a.to_string_lossy().contains("@")) {
Some(file) => {
Expand All @@ -45,7 +27,7 @@ fn main() {
for i in (1..).map(|i| i * 10) {
println!("attempt: {}", i);

let file = tmpdir.join("bar.rs");
let file = PathBuf::from("bar.rs");
let mut f = BufWriter::new(File::create(&file).unwrap());
let mut lib_name = String::new();
for _ in 0..i {
Expand All @@ -63,8 +45,6 @@ fn main() {
.arg(&file)
.arg("-C")
.arg(&bat_linker)
.arg("--out-dir")
.arg(&tmpdir)
.env("YOU_ARE_A_LINKER", "1")
.env("MY_LINKER", &me)
.status()
Expand Down
26 changes: 26 additions & 0 deletions tests/run-make/long-linker-command-lines-cmd-exe/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Like the `long-linker-command-lines` test this test attempts to blow
// a command line limit for running the linker. Unlike that test, however,
// this test is testing `cmd.exe` specifically rather than the OS.
//
// Unfortunately, the maximum length of the string that you can use at the
// command prompt (`cmd.exe`) is 8191 characters.
// Anyone scripting rustc's linker
// is probably using a `*.bat` script and is likely to hit this limit.
//
// This test uses a `foo.bat` script as the linker which just simply
// delegates back to this program. The compiler should use a lower
// limit for arguments before passing everything via `@`, which
// means that everything should still succeed here.
// See https://github.com/rust-lang/rust/pull/47507

//@ ignore-cross-compile
// Reason: the compiled binary is executed
//@ only-windows
// Reason: this test is specific to Windows executables

use run_make_support::{run, rustc};

fn main() {
rustc().input("foo.rs").arg("-g").run();
run("foo");
}
8 changes: 0 additions & 8 deletions tests/run-make/long-linker-command-lines/Makefile

This file was deleted.

18 changes: 3 additions & 15 deletions tests/run-make/long-linker-command-lines/foo.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,3 @@
// This is a test which attempts to blow out the system limit with how many
// arguments can be passed to a process. This'll successively call rustc with
// larger and larger argument lists in an attempt to find one that's way too
// big for the system at hand. This file itself is then used as a "linker" to
// detect when the process creation succeeds.
//
// Eventually we should see an argument that looks like `@` as we switch from
// passing literal arguments to passing everything in the file.

use std::collections::HashSet;
use std::env;
use std::fs::{self, File};
Expand Down Expand Up @@ -43,8 +34,7 @@ fn read_linker_args(path: &Path) -> String {
}

fn main() {
let tmpdir = PathBuf::from(env::var_os("TMPDIR").unwrap());
let ok = tmpdir.join("ok");
let ok = PathBuf::from("ok");
if env::var("YOU_ARE_A_LINKER").is_ok() {
if let Some(file) = env::args_os().find(|a| a.to_string_lossy().contains("@")) {
let file = file.to_str().expect("non-utf8 file argument");
Expand All @@ -53,20 +43,18 @@ fn main() {
return;
}

let rustc = env::var_os("RUSTC").unwrap_or("rustc".into());
let rustc = env::var_os("RUSTC").unwrap();
let me_as_linker = format!("linker={}", env::current_exe().unwrap().display());
for i in (1..).map(|i| i * 100) {
println!("attempt: {}", i);
let file = tmpdir.join("bar.rs");
let file = PathBuf::from("bar.rs");
let mut expected_libs = write_test_case(&file, i);

drop(fs::remove_file(&ok));
let output = Command::new(&rustc)
.arg(&file)
.arg("-C")
.arg(&me_as_linker)
.arg("--out-dir")
.arg(&tmpdir)
.env("YOU_ARE_A_LINKER", "1")
.output()
.unwrap();
Expand Down
19 changes: 19 additions & 0 deletions tests/run-make/long-linker-command-lines/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// This is a test which attempts to blow out the system limit with how many
// arguments can be passed to a process. This'll successively call rustc with
// larger and larger argument lists in an attempt to find one that's way too
// big for the system at hand. This file itself is then used as a "linker" to
// detect when the process creation succeeds.
//
// Eventually we should see an argument that looks like `@` as we switch from
// passing literal arguments to passing everything in the file.
// See https://github.com/rust-lang/rust/issues/41190

//@ ignore-cross-compile
// Reason: the compiled binary is executed

use run_make_support::{run, rustc};

fn main() {
rustc().input("foo.rs").arg("-g").opt().run();
run("foo");
}
22 changes: 0 additions & 22 deletions tests/run-make/min-global-align/Makefile

This file was deleted.

27 changes: 27 additions & 0 deletions tests/run-make/min-global-align/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// This test checks that global variables respect the target minimum alignment.
// The three bools `STATIC_BOOL`, `STATIC_MUT_BOOL`, and `CONST_BOOL` all have
// type-alignment of 1, but some targets require greater global alignment.
// See https://github.com/rust-lang/rust/pull/44440

//@ only-linux
// Reason: this test is target-independent, considering compilation is targeted
// towards linux architectures only.

use run_make_support::{assert_count_is, llvm_components_contain, rfs, rustc};

fn main() {
// Most targets are happy with default alignment -- take i686 for example.
if llvm_components_contain("x86") {
rustc().target("i686-unknown-linux-gnu").emit("llvm-ir").input("min_global_align.rs").run();
assert_count_is(3, rfs::read_to_string("min_global_align.ll"), "align 1");
}
// SystemZ requires even alignment for PC-relative addressing.
if llvm_components_contain("systemz") {
rustc()
.target("s390x-unknown-linux-gnu")
.emit("llvm-ir")
.input("min_global_align.rs")
.run();
assert_count_is(3, rfs::read_to_string("min_global_align.ll"), "align 2");
}
}
24 changes: 0 additions & 24 deletions tests/run-make/no-alloc-shim/Makefile

This file was deleted.

Loading