summaryrefslogtreecommitdiffstats
path: root/library/stdarch/crates/intrinsic-test/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/stdarch/crates/intrinsic-test/src/main.rs')
-rw-r--r--library/stdarch/crates/intrinsic-test/src/main.rs51
1 files changed, 39 insertions, 12 deletions
diff --git a/library/stdarch/crates/intrinsic-test/src/main.rs b/library/stdarch/crates/intrinsic-test/src/main.rs
index dac934574..5a29c4767 100644
--- a/library/stdarch/crates/intrinsic-test/src/main.rs
+++ b/library/stdarch/crates/intrinsic-test/src/main.rs
@@ -14,7 +14,7 @@ use itertools::Itertools;
use rayon::prelude::*;
use types::TypeKind;
-use crate::acle_csv_parser::get_acle_intrinsics;
+use crate::acle_csv_parser::{get_acle_intrinsics, CsvMetadata};
use crate::argument::Argument;
mod acle_csv_parser;
@@ -70,6 +70,7 @@ fn gen_code_c(
}
fn generate_c_program(
+ notices: &str,
header_files: &[&str],
intrinsic: &Intrinsic,
p64_armv7_workaround: bool,
@@ -81,7 +82,7 @@ fn generate_c_program(
.collect_vec();
format!(
- r#"{header_files}
+ r#"{notices}{header_files}
#include <iostream>
#include <cstring>
#include <iomanip>
@@ -157,7 +158,7 @@ fn gen_code_rust(intrinsic: &Intrinsic, constraints: &[&Argument], name: String)
}
}
-fn generate_rust_program(intrinsic: &Intrinsic, a32: bool) -> String {
+fn generate_rust_program(notices: &str, intrinsic: &Intrinsic, a32: bool) -> String {
let constraints = intrinsic
.arguments
.iter()
@@ -165,7 +166,7 @@ fn generate_rust_program(intrinsic: &Intrinsic, a32: bool) -> String {
.collect_vec();
format!(
- r#"#![feature(simd_ffi)]
+ r#"{notices}#![feature(simd_ffi)]
#![feature(link_llvm_intrinsics)]
#![feature(stdsimd)]
#![allow(overflowing_literals)]
@@ -217,7 +218,23 @@ fn compile_c(c_filename: &str, intrinsic: &Intrinsic, compiler: &str, a32: bool)
}
}
-fn build_c(intrinsics: &Vec<Intrinsic>, compiler: &str, a32: bool) -> bool {
+fn build_notices(csv_metadata: &CsvMetadata, line_prefix: &str) -> String {
+ let mut notices = format!(
+ "\
+{line_prefix}This is a transient test file, not intended for distribution. Some aspects of the
+{line_prefix}test are derived from a CSV specification, published with the following notices:
+{line_prefix}
+"
+ );
+ let lines = csv_metadata
+ .notices_lines()
+ .map(|line| format!("{line_prefix} {line}\n"));
+ notices.extend(lines);
+ notices.push_str("\n");
+ notices
+}
+
+fn build_c(notices: &str, intrinsics: &Vec<Intrinsic>, compiler: &str, a32: bool) -> bool {
let _ = std::fs::create_dir("c_programs");
intrinsics
.par_iter()
@@ -225,7 +242,7 @@ fn build_c(intrinsics: &Vec<Intrinsic>, compiler: &str, a32: bool) -> bool {
let c_filename = format!(r#"c_programs/{}.cpp"#, i.name);
let mut file = File::create(&c_filename).unwrap();
- let c_code = generate_c_program(&["arm_neon.h", "arm_acle.h"], &i, a32);
+ let c_code = generate_c_program(notices, &["arm_neon.h", "arm_acle.h"], &i, a32);
file.write_all(c_code.into_bytes().as_slice()).unwrap();
compile_c(&c_filename, &i, compiler, a32)
})
@@ -233,14 +250,20 @@ fn build_c(intrinsics: &Vec<Intrinsic>, compiler: &str, a32: bool) -> bool {
.is_none()
}
-fn build_rust(intrinsics: &Vec<Intrinsic>, toolchain: &str, a32: bool) -> bool {
+fn build_rust(
+ notices: &str,
+ spdx_lic: &str,
+ intrinsics: &Vec<Intrinsic>,
+ toolchain: &str,
+ a32: bool,
+) -> bool {
intrinsics.iter().for_each(|i| {
let rust_dir = format!(r#"rust_programs/{}"#, i.name);
let _ = std::fs::create_dir_all(&rust_dir);
let rust_filename = format!(r#"{rust_dir}/main.rs"#);
let mut file = File::create(&rust_filename).unwrap();
- let c_code = generate_rust_program(&i, a32);
+ let c_code = generate_rust_program(notices, &i, a32);
file.write_all(c_code.into_bytes().as_slice()).unwrap();
});
@@ -249,9 +272,10 @@ fn build_rust(intrinsics: &Vec<Intrinsic>, toolchain: &str, a32: bool) -> bool {
.write_all(
format!(
r#"[package]
-name = "intrinsic-test"
+name = "intrinsic-test-programs"
version = "{version}"
authors = ["{authors}"]
+license = "{spdx_lic}"
edition = "2018"
[workspace]
[dependencies]
@@ -371,7 +395,7 @@ fn main() {
};
let a32 = matches.is_present("A32");
- let intrinsics = get_acle_intrinsics(filename);
+ let (csv_metadata, intrinsics) = get_acle_intrinsics(filename);
let mut intrinsics = intrinsics
.into_iter()
@@ -394,11 +418,14 @@ fn main() {
.collect::<Vec<_>>();
intrinsics.dedup();
- if !build_c(&intrinsics, cpp_compiler, a32) {
+ let notices = build_notices(&csv_metadata, "// ");
+ let spdx_lic = csv_metadata.spdx_license_identifier();
+
+ if !build_c(&notices, &intrinsics, cpp_compiler, a32) {
std::process::exit(2);
}
- if !build_rust(&intrinsics, &toolchain, a32) {
+ if !build_rust(&notices, spdx_lic, &intrinsics, &toolchain, a32) {
std::process::exit(3);
}