diff --git a/ci/intrinsic-test-docker.sh b/ci/intrinsic-test-docker.sh index 038fc4678e..f62d7e484f 100755 --- a/ci/intrinsic-test-docker.sh +++ b/ci/intrinsic-test-docker.sh @@ -36,6 +36,7 @@ run() { --env NORUN \ --env RUSTFLAGS \ --env CARGO_UNSTABLE_BUILD_STD \ + --env TEST_SAMPLE_INTRINSICS_PERCENTAGE \ --volume "${HOME}/.cargo":/cargo \ --volume "$(rustc --print sysroot)":/rust:ro \ --volume "$(pwd)":/checkout:ro \ diff --git a/ci/intrinsic-test.sh b/ci/intrinsic-test.sh index e14a824b2a..be63f0c0c6 100755 --- a/ci/intrinsic-test.sh +++ b/ci/intrinsic-test.sh @@ -51,6 +51,7 @@ case ${TARGET} in TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_aarch64.txt TEST_CXX_COMPILER="clang++" TEST_RUNNER="${CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER}" + : "${TEST_SAMPLE_INTRINSICS_PERCENTAGE:=100}" ;; aarch64_be-unknown-linux-gnu*) @@ -58,6 +59,7 @@ case ${TARGET} in TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_aarch64.txt TEST_CXX_COMPILER="clang++" TEST_RUNNER="${CARGO_TARGET_AARCH64_BE_UNKNOWN_LINUX_GNU_RUNNER}" + : "${TEST_SAMPLE_INTRINSICS_PERCENTAGE:=100}" ;; armv7-unknown-linux-gnueabihf*) @@ -65,6 +67,7 @@ case ${TARGET} in TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_arm.txt TEST_CXX_COMPILER="clang++" TEST_RUNNER="${CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER}" + : "${TEST_SAMPLE_INTRINSICS_PERCENTAGE:=100}" ;; x86_64-unknown-linux-gnu*) @@ -72,7 +75,7 @@ case ${TARGET} in TEST_CXX_COMPILER="clang++" TEST_RUNNER="${CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER}" TEST_SKIP_INTRINSICS=crates/intrinsic-test/missing_x86.txt - TEST_SAMPLE_INTRINSICS_PERCENTAGE=5 + : "${TEST_SAMPLE_INTRINSICS_PERCENTAGE:=5}" ;; *) ;; @@ -82,23 +85,25 @@ esac # Arm specific case "${TARGET}" in aarch64-unknown-linux-gnu*|armv7-unknown-linux-gnueabihf*) - CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" RUST_LOG=warn \ + CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" RUST_LOG=info \ cargo run "${INTRINSIC_TEST}" "${PROFILE}" \ --bin intrinsic-test -- intrinsics_data/arm_intrinsics.json \ --runner "${TEST_RUNNER}" \ --cppcompiler "${TEST_CXX_COMPILER}" \ --skip "${TEST_SKIP_INTRINSICS}" \ - --target "${TARGET}" + --target "${TARGET}" \ + --sample-percentage "${TEST_SAMPLE_INTRINSICS_PERCENTAGE}" ;; aarch64_be-unknown-linux-gnu*) - CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" RUST_LOG=warn \ + CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" RUST_LOG=info \ cargo run "${INTRINSIC_TEST}" "${PROFILE}" \ --bin intrinsic-test -- intrinsics_data/arm_intrinsics.json \ --runner "${TEST_RUNNER}" \ --cppcompiler "${TEST_CXX_COMPILER}" \ --skip "${TEST_SKIP_INTRINSICS}" \ --target "${TARGET}" \ + --sample-percentage "${TEST_SAMPLE_INTRINSICS_PERCENTAGE}" \ --linker "${CARGO_TARGET_AARCH64_BE_UNKNOWN_LINUX_GNU_LINKER}" \ --cxx-toolchain-dir "${AARCH64_BE_TOOLCHAIN}" ;; @@ -109,7 +114,7 @@ case "${TARGET}" in # Hence the use of `env -u`. env -u CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER \ CPPFLAGS="${TEST_CPPFLAGS}" RUSTFLAGS="${HOST_RUSTFLAGS}" \ - RUST_LOG=warn RUST_BACKTRACE=1 \ + RUST_LOG=info RUST_BACKTRACE=1 \ cargo run "${INTRINSIC_TEST}" "${PROFILE}" \ --bin intrinsic-test -- intrinsics_data/x86-intel.xml \ --runner "${TEST_RUNNER}" \ diff --git a/crates/intrinsic-test/src/arm/mod.rs b/crates/intrinsic-test/src/arm/mod.rs index 7fa5062e86..99c8da854c 100644 --- a/crates/intrinsic-test/src/arm/mod.rs +++ b/crates/intrinsic-test/src/arm/mod.rs @@ -48,8 +48,12 @@ impl SupportedArchitectureTest for ArmArchitectureTest { .expect("Error parsing input file"); intrinsics.sort_by(|a, b| a.name.cmp(&b.name)); + intrinsics.dedup(); + + let sample_percentage: usize = cli_options.sample_percentage as usize; + let sample_size = (intrinsics.len() * sample_percentage) / 100; - let mut intrinsics = intrinsics + let intrinsics = intrinsics .into_iter() // Not sure how we would compare intrinsic that returns void. .filter(|i| i.results.kind() != TypeKind::Void) @@ -61,8 +65,8 @@ impl SupportedArchitectureTest for ArmArchitectureTest { .filter(|i| !i.arguments.iter().any(|a| a.ty.inner_size() == 128)) .filter(|i| !cli_options.skip.contains(&i.name)) .filter(|i| !(a32 && i.arch_tags == vec!["A64".to_string()])) + .take(sample_size) .collect::>(); - intrinsics.dedup(); Self { intrinsics, diff --git a/crates/intrinsic-test/src/common/compare.rs b/crates/intrinsic-test/src/common/compare.rs index 902df94283..c0459b743a 100644 --- a/crates/intrinsic-test/src/common/compare.rs +++ b/crates/intrinsic-test/src/common/compare.rs @@ -86,6 +86,10 @@ pub fn compare_outputs(intrinsic_name_list: &Vec, runner: &str, target: println!("Failed to run rust program for intrinsic {intrinsic}") } }); - println!("{} differences found", intrinsics.len()); + println!( + "{} differences found (tested {} intrinsics)", + intrinsics.len(), + intrinsic_name_list.len() + ); intrinsics.is_empty() } diff --git a/crates/intrinsic-test/src/common/mod.rs b/crates/intrinsic-test/src/common/mod.rs index d8f06ae238..8b6bd943a7 100644 --- a/crates/intrinsic-test/src/common/mod.rs +++ b/crates/intrinsic-test/src/common/mod.rs @@ -79,12 +79,16 @@ pub trait SupportedArchitectureTest { trace!("compiling mod_{i}.cpp"); if let Some(cpp_compiler) = cpp_compiler_wrapped.as_ref() { let compile_output = cpp_compiler - .compile_object_file(&format!("mod_{i}.cpp"), &format!("mod_{i}.o")); + .compile_object_file(&format!("mod_{i}.cpp"), &format!("mod_{i}.o")) + .map_err(|e| format!("Error compiling mod_{i}.cpp: {e:?}"))?; + + assert!( + compile_output.status.success(), + "{}", + String::from_utf8_lossy(&compile_output.stderr) + ); trace!("finished compiling mod_{i}.cpp"); - if let Err(compile_error) = compile_output { - return Err(format!("Error compiling mod_{i}.cpp: {compile_error:?}")); - } } Ok(()) }) diff --git a/crates/intrinsic-test/src/main.rs b/crates/intrinsic-test/src/main.rs index ed3a50067d..3580d80bd1 100644 --- a/crates/intrinsic-test/src/main.rs +++ b/crates/intrinsic-test/src/main.rs @@ -34,7 +34,7 @@ fn run(test_environment: impl SupportedArchitectureTest) { if !test_environment.build_rust_file() { std::process::exit(3); } - info!("comaparing outputs"); + info!("comparing outputs"); if !test_environment.compare_outputs() { std::process::exit(1); } diff --git a/crates/intrinsic-test/src/x86/mod.rs b/crates/intrinsic-test/src/x86/mod.rs index 956e51836f..f2baf07071 100644 --- a/crates/intrinsic-test/src/x86/mod.rs +++ b/crates/intrinsic-test/src/x86/mod.rs @@ -11,7 +11,6 @@ use crate::common::compile_c::CppCompilation; use crate::common::intrinsic::Intrinsic; use crate::common::intrinsic_helpers::TypeKind; use intrinsic::X86IntrinsicType; -use itertools::Itertools; use xml_parser::get_xml_intrinsics; pub struct X86ArchitectureTest { @@ -44,12 +43,16 @@ impl SupportedArchitectureTest for X86ArchitectureTest { const PLATFORM_RUST_CFGS: &str = config::PLATFORM_RUST_CFGS; fn create(cli_options: ProcessedCli) -> Self { - let intrinsics = + let mut intrinsics = get_xml_intrinsics(&cli_options.filename).expect("Error parsing input file"); + intrinsics.sort_by(|a, b| a.name.cmp(&b.name)); + intrinsics.dedup_by(|a, b| a.name == b.name); + let sample_percentage: usize = cli_options.sample_percentage as usize; + let sample_size = (intrinsics.len() * sample_percentage) / 100; - let mut intrinsics = intrinsics + let intrinsics = intrinsics .into_iter() // Not sure how we would compare intrinsic that returns void. .filter(|i| i.results.kind() != TypeKind::Void) @@ -61,13 +64,9 @@ impl SupportedArchitectureTest for X86ArchitectureTest { .filter(|i| !i.arguments.iter().any(|a| a.is_ptr())) .filter(|i| !i.arguments.iter().any(|a| a.ty.inner_size() == 128)) .filter(|i| !cli_options.skip.contains(&i.name)) - .unique_by(|i| i.name.clone()) + .take(sample_size) .collect::>(); - let sample_size = (intrinsics.len() * sample_percentage) / 100; - intrinsics.truncate(sample_size); - - intrinsics.sort_by(|a, b| a.name.cmp(&b.name)); Self { intrinsics: intrinsics, cli_options: cli_options,