Merge commit 'b7091eca6d8eb0fe88b58cc9a7aec405d8de5b85' into subtree-update_cg_gcc_2025-06-28

This commit is contained in:
Guillaume Gomez
2025-06-28 23:37:08 +02:00
12 changed files with 150 additions and 117 deletions

View File

@@ -0,0 +1,65 @@
use std::ffi::OsStr;
use std::path::Path;
use crate::utils::run_command_with_output;
fn show_usage() {
println!(
r#"
`abi-test` command help:
--help : Show this help"#
);
}
pub fn run() -> Result<(), String> {
let mut args = std::env::args().skip(2);
// FractalFir: In the future, I'd like to add some more subcommands / options.
// So, this loop ought to stay for that purpose. It should also stay as a while loop(to parse args)
#[allow(clippy::never_loop, clippy::while_let_on_iterator)]
while let Some(arg) = args.next() {
match arg.as_str() {
"--help" => {
show_usage();
return Ok(());
}
_ => return Err(format!("Unknown option {arg:?}")),
}
}
// Ensure that we have a cloned version of abi-cafe on hand.
crate::utils::git_clone(
"https://github.com/Gankra/abi-cafe.git",
Some("clones/abi-cafe".as_ref()),
true,
)
.map_err(|err| (format!("Git clone failed with message: {err:?}!")))?;
// Configure abi-cafe to use the exact same rustc version we use - this is crucial.
// Otherwise, the concept of ABI compatibility becomes meanignless.
std::fs::copy("rust-toolchain", "clones/abi-cafe/rust-toolchain")
.expect("Could not copy toolchain configs!");
// Get the backend path.
// We will use the *debug* build of the backend - it has more checks enabled.
let backend_path = std::path::absolute("target/debug/librustc_codegen_gcc.so").unwrap();
let backend_arg = format!("--add-rustc-codegen-backend=cg_gcc:{}", backend_path.display());
// Run ABI cafe using cargo.
let cmd: &[&dyn AsRef<OsStr>] = &[
&"cargo",
&"run",
&"--release",
&"--",
&backend_arg,
// Test rust-LLVM to Rust-GCC calls
&"--pairs",
&"rustc_calls_cg_gcc",
&"--pairs",
&"cg_gcc_calls_rustc",
// Test Rust-GCC to C calls
&"--pairs",
&"cg_gcc_calls_c",
&"--pairs",
&"c_calls_cg_gcc",
];
// Run ABI cafe.
run_command_with_output(cmd, Some(Path::new("clones/abi-cafe")))?;
Ok(())
}

View File

@@ -1,5 +1,6 @@
use std::{env, process};
mod abi_test;
mod build;
mod clean;
mod clone_gcc;
@@ -12,7 +13,6 @@ mod rust_tools;
mod rustc_info;
mod test;
mod utils;
const BUILD_DIR: &str = "build";
macro_rules! arg_error {
@@ -44,7 +44,8 @@ Commands:
info : Displays information about the build environment and project configuration.
clone-gcc : Clones the GCC compiler from a specified source.
fmt : Runs rustfmt
fuzz : Fuzzes `cg_gcc` using rustlantis"
fuzz : Fuzzes `cg_gcc` using rustlantis
abi-test : Runs the abi-cafe test suite on the codegen, checking for ABI compatibility with LLVM"
);
}
@@ -59,6 +60,7 @@ pub enum Command {
Info,
Fmt,
Fuzz,
AbiTest,
}
fn main() {
@@ -77,6 +79,7 @@ fn main() {
Some("test") => Command::Test,
Some("info") => Command::Info,
Some("clone-gcc") => Command::CloneGcc,
Some("abi-test") => Command::AbiTest,
Some("fmt") => Command::Fmt,
Some("fuzz") => Command::Fuzz,
Some("--help") => {
@@ -102,6 +105,7 @@ fn main() {
Command::CloneGcc => clone_gcc::run(),
Command::Fmt => fmt::run(),
Command::Fuzz => fuzz::run(),
Command::AbiTest => abi_test::run(),
} {
eprintln!("Command failed to run: {e}");
process::exit(1);

View File

@@ -738,14 +738,7 @@ fn test_libcore(env: &Env, args: &TestArg) -> Result<(), String> {
let path = get_sysroot_dir().join("sysroot_src/library/coretests");
let _ = remove_dir_all(path.join("target"));
// TODO(antoyo): run in release mode when we fix the failures.
// TODO(antoyo): remove the --skip f16::test_total_cmp when this issue is fixed:
// https://github.com/rust-lang/rust/issues/141503
run_cargo_command(
&[&"test", &"--", &"--skip", &"f16::test_total_cmp"],
Some(&path),
env,
args,
)?;
run_cargo_command(&[&"test"], Some(&path), env, args)?;
Ok(())
}