Skip to content

Commit 644e34e

Browse files
authored
Merge pull request #1863 from folkertdev/combine-rust-files
`intrinsic-test`: combine rust files for faster compilation
2 parents af40774 + e0a2cf1 commit 644e34e

File tree

8 files changed

+294
-258
lines changed

8 files changed

+294
-258
lines changed

crates/intrinsic-test/src/arm/mod.rs

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ use crate::common::SupportedArchitectureTest;
1313
use crate::common::cli::ProcessedCli;
1414
use crate::common::compare::compare_outputs;
1515
use crate::common::gen_c::{write_main_cpp, write_mod_cpp};
16-
use crate::common::gen_rust::compile_rust_programs;
17-
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
16+
use crate::common::gen_rust::{
17+
compile_rust_programs, write_bin_cargo_toml, write_lib_cargo_toml, write_lib_rs, write_main_rs,
18+
};
19+
use crate::common::intrinsic::Intrinsic;
1820
use crate::common::intrinsic_helpers::TypeKind;
19-
use crate::common::write_file::write_rust_testfiles;
2021
use config::{AARCH_CONFIGURATIONS, F16_FORMATTING_DEF, build_notices};
2122
use intrinsic::ArmIntrinsicType;
2223
use json_parser::get_neon_intrinsics;
@@ -118,26 +119,60 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
118119
}
119120

120121
fn build_rust_file(&self) -> bool {
121-
let rust_target = if self.cli_options.target.contains("v7") {
122+
std::fs::create_dir_all("rust_programs/src").unwrap();
123+
124+
let architecture = if self.cli_options.target.contains("v7") {
122125
"arm"
123126
} else {
124127
"aarch64"
125128
};
129+
130+
let (chunk_size, chunk_count) = chunk_info(self.intrinsics.len());
131+
132+
let mut cargo = File::create("rust_programs/Cargo.toml").unwrap();
133+
write_bin_cargo_toml(&mut cargo, chunk_count).unwrap();
134+
135+
let mut main_rs = File::create("rust_programs/src/main.rs").unwrap();
136+
write_main_rs(
137+
&mut main_rs,
138+
chunk_count,
139+
AARCH_CONFIGURATIONS,
140+
"",
141+
self.intrinsics.iter().map(|i| i.name.as_str()),
142+
)
143+
.unwrap();
144+
126145
let target = &self.cli_options.target;
127146
let toolchain = self.cli_options.toolchain.as_deref();
128147
let linker = self.cli_options.linker.as_deref();
129-
let intrinsics_name_list = write_rust_testfiles(
130-
self.intrinsics
131-
.iter()
132-
.map(|i| i as &dyn IntrinsicDefinition<_>)
133-
.collect::<Vec<_>>(),
134-
rust_target,
135-
&build_notices("// "),
136-
F16_FORMATTING_DEF,
137-
AARCH_CONFIGURATIONS,
138-
);
139148

140-
compile_rust_programs(intrinsics_name_list, toolchain, target, linker)
149+
let notice = &build_notices("// ");
150+
self.intrinsics
151+
.par_chunks(chunk_size)
152+
.enumerate()
153+
.map(|(i, chunk)| {
154+
std::fs::create_dir_all(format!("rust_programs/mod_{i}/src"))?;
155+
156+
let rust_filename = format!("rust_programs/mod_{i}/src/lib.rs");
157+
trace!("generating `{rust_filename}`");
158+
let mut file = File::create(rust_filename)?;
159+
160+
let cfg = AARCH_CONFIGURATIONS;
161+
let definitions = F16_FORMATTING_DEF;
162+
write_lib_rs(&mut file, architecture, notice, cfg, definitions, chunk)?;
163+
164+
let toml_filename = format!("rust_programs/mod_{i}/Cargo.toml");
165+
trace!("generating `{toml_filename}`");
166+
let mut file = File::create(toml_filename).unwrap();
167+
168+
write_lib_cargo_toml(&mut file, &format!("mod_{i}"))?;
169+
170+
Ok(())
171+
})
172+
.collect::<Result<(), std::io::Error>>()
173+
.unwrap();
174+
175+
compile_rust_programs(toolchain, target, linker)
141176
}
142177

143178
fn compare_outputs(&self) -> bool {

crates/intrinsic-test/src/arm/types.rs

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,6 @@ impl IntrinsicTypeDefinition for ArmIntrinsicType {
3333
}
3434
}
3535

36-
fn rust_type(&self) -> String {
37-
let rust_prefix = self.0.kind.rust_prefix();
38-
let c_prefix = self.0.kind.c_prefix();
39-
if self.0.ptr_constant {
40-
self.c_type()
41-
} else if let (Some(bit_len), simd_len, vec_len) =
42-
(self.0.bit_len, self.0.simd_len, self.0.vec_len)
43-
{
44-
match (simd_len, vec_len) {
45-
(None, None) => format!("{rust_prefix}{bit_len}"),
46-
(Some(simd), None) => format!("{c_prefix}{bit_len}x{simd}_t"),
47-
(Some(simd), Some(vec)) => format!("{c_prefix}{bit_len}x{simd}x{vec}_t"),
48-
(None, Some(_)) => todo!("{:#?}", self), // Likely an invalid case
49-
}
50-
} else {
51-
todo!("{:#?}", self)
52-
}
53-
}
54-
5536
/// Determines the load function for this type.
5637
fn get_load_function(&self, language: Language) -> String {
5738
if let IntrinsicType {

crates/intrinsic-test/src/common/argument.rs

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,6 @@ where
114114
.join(", ")
115115
}
116116

117-
pub fn as_constraint_parameters_rust(&self) -> String {
118-
self.iter()
119-
.filter(|a| a.has_constraint())
120-
.map(|arg| arg.name.clone())
121-
.collect::<Vec<String>>()
122-
.join(", ")
123-
}
124-
125117
/// Creates a line for each argument that initializes an array for C from which `loads` argument
126118
/// values can be loaded as a sliding window.
127119
/// e.g `const int32x2_t a_vals = {0x3effffff, 0x3effffff, 0x3f7fffff}`, if loads=2.
@@ -146,21 +138,25 @@ where
146138

147139
/// Creates a line for each argument that initializes an array for Rust from which `loads` argument
148140
/// values can be loaded as a sliding window, e.g `const A_VALS: [u32; 20] = [...];`
149-
pub fn gen_arglists_rust(&self, indentation: Indentation, loads: u32) -> String {
150-
self.iter()
151-
.filter(|&arg| !arg.has_constraint())
152-
.map(|arg| {
153-
format!(
154-
"{indentation}{bind} {name}: [{ty}; {load_size}] = {values};",
155-
bind = arg.rust_vals_array_binding(),
156-
name = arg.rust_vals_array_name(),
157-
ty = arg.ty.rust_scalar_type(),
158-
load_size = arg.ty.num_lanes() * arg.ty.num_vectors() + loads - 1,
159-
values = arg.ty.populate_random(indentation, loads, &Language::Rust)
160-
)
161-
})
162-
.collect::<Vec<_>>()
163-
.join("\n")
141+
pub fn gen_arglists_rust(
142+
&self,
143+
w: &mut impl std::io::Write,
144+
indentation: Indentation,
145+
loads: u32,
146+
) -> std::io::Result<()> {
147+
for arg in self.iter().filter(|&arg| !arg.has_constraint()) {
148+
writeln!(
149+
w,
150+
"{indentation}{bind} {name}: [{ty}; {load_size}] = {values};",
151+
bind = arg.rust_vals_array_binding(),
152+
name = arg.rust_vals_array_name(),
153+
ty = arg.ty.rust_scalar_type(),
154+
load_size = arg.ty.num_lanes() * arg.ty.num_vectors() + loads - 1,
155+
values = arg.ty.populate_random(indentation, loads, &Language::Rust)
156+
)?
157+
}
158+
159+
Ok(())
164160
}
165161

166162
/// Creates a line for each argument that initializes the argument from an array `[arg]_vals` at

crates/intrinsic-test/src/common/compare.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,29 @@ use super::cli::FailureReason;
22
use rayon::prelude::*;
33
use std::process::Command;
44

5-
pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target: &str) -> bool {
6-
fn runner_command(runner: &str) -> Command {
7-
let mut it = runner.split_whitespace();
8-
let mut cmd = Command::new(it.next().unwrap());
9-
cmd.args(it);
5+
fn runner_command(runner: &str) -> Command {
6+
let mut it = runner.split_whitespace();
7+
let mut cmd = Command::new(it.next().unwrap());
8+
cmd.args(it);
109

11-
cmd
12-
}
10+
cmd
11+
}
1312

13+
pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target: &str) -> bool {
1414
let intrinsics = intrinsic_name_list
1515
.par_iter()
1616
.filter_map(|intrinsic_name| {
17+
1718
let c = runner_command(runner)
18-
.arg("./c_programs/intrinsic-test-programs")
19+
.arg("intrinsic-test-programs")
1920
.arg(intrinsic_name)
21+
.current_dir("c_programs")
2022
.output();
2123

2224
let rust = runner_command(runner)
23-
.arg(format!("target/{target}/release/{intrinsic_name}"))
25+
.arg(format!("target/{target}/release/intrinsic-test-programs"))
26+
.arg(intrinsic_name)
27+
.current_dir("rust_programs")
2428
.output();
2529

2630
let (c, rust) = match (c, rust) {
@@ -30,7 +34,7 @@ pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target:
3034

3135
if !c.status.success() {
3236
error!(
33-
"Failed to run C program for intrinsic {intrinsic_name}\nstdout: {stdout}\nstderr: {stderr}",
37+
"Failed to run C program for intrinsic `{intrinsic_name}`\nstdout: {stdout}\nstderr: {stderr}",
3438
stdout = std::str::from_utf8(&c.stdout).unwrap_or(""),
3539
stderr = std::str::from_utf8(&c.stderr).unwrap_or(""),
3640
);
@@ -39,9 +43,9 @@ pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target:
3943

4044
if !rust.status.success() {
4145
error!(
42-
"Failed to run Rust program for intrinsic {intrinsic_name}\nstdout: {stdout}\nstderr: {stderr}",
43-
stdout = String::from_utf8_lossy(&rust.stdout),
44-
stderr = String::from_utf8_lossy(&rust.stderr),
46+
"Failed to run Rust program for intrinsic `{intrinsic_name}`\nstdout: {stdout}\nstderr: {stderr}",
47+
stdout = std::str::from_utf8(&rust.stdout).unwrap_or(""),
48+
stderr = std::str::from_utf8(&rust.stderr).unwrap_or(""),
4549
);
4650
return Some(FailureReason::RunRust(intrinsic_name.clone()));
4751
}

0 commit comments

Comments
 (0)