Skip to content

Commit 2f92542

Browse files
committed
combine rust files into one compilation
1 parent 9f07931 commit 2f92542

File tree

7 files changed

+244
-242
lines changed

7 files changed

+244
-242
lines changed

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

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ 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::{compile_rust_programs, write_cargo_toml, write_main_rs};
17+
use crate::common::intrinsic::Intrinsic;
1818
use crate::common::intrinsic_helpers::TypeKind;
19-
use crate::common::write_file::write_rust_testfiles;
2019
use config::{AARCH_CONFIGURATIONS, F16_FORMATTING_DEF, build_notices};
2120
use intrinsic::ArmIntrinsicType;
2221
use json_parser::get_neon_intrinsics;
@@ -110,30 +109,65 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
110109
}
111110

112111
fn build_rust_file(&self) -> bool {
113-
let rust_target = if self.cli_options.target.contains("v7") {
112+
std::fs::create_dir_all("rust_programs/src").unwrap();
113+
114+
let architecture = if self.cli_options.target.contains("v7") {
114115
"arm"
115116
} else {
116117
"aarch64"
117118
};
119+
120+
let available_parallelism = std::thread::available_parallelism().unwrap().get();
121+
let chunk_size = self.intrinsics.len().div_ceil(available_parallelism);
122+
123+
let mut cargo = File::create("rust_programs/Cargo.toml").unwrap();
124+
write_cargo_toml(&mut cargo, &[]).unwrap();
125+
126+
let mut main_rs = File::create("rust_programs/src/main.rs").unwrap();
127+
write_main_rs(
128+
&mut main_rs,
129+
available_parallelism,
130+
architecture,
131+
AARCH_CONFIGURATIONS,
132+
F16_FORMATTING_DEF,
133+
self.intrinsics.iter().map(|i| i.name.as_str()),
134+
)
135+
.unwrap();
136+
118137
let target = &self.cli_options.target;
119138
let toolchain = self.cli_options.toolchain.as_deref();
120139
let linker = self.cli_options.linker.as_deref();
121-
let intrinsics_name_list = write_rust_testfiles(
122-
self.intrinsics
123-
.iter()
124-
.map(|i| i as &dyn IntrinsicDefinition<_>)
125-
.collect::<Vec<_>>(),
126-
rust_target,
127-
&build_notices("// "),
128-
F16_FORMATTING_DEF,
129-
AARCH_CONFIGURATIONS,
130-
);
131140

132-
compile_rust_programs(intrinsics_name_list, toolchain, target, linker)
141+
let notice = &build_notices("// ");
142+
self.intrinsics
143+
.par_chunks(chunk_size)
144+
.enumerate()
145+
.map(|(i, chunk)| {
146+
use std::io::Write;
147+
148+
let rust_filename = format!("rust_programs/src/mod_{i}.rs");
149+
trace!("generating `{rust_filename}`");
150+
let mut file = File::create(rust_filename).unwrap();
151+
152+
write!(file, "{notice}")?;
153+
154+
writeln!(file, "use core_arch::arch::{architecture}::*;")?;
155+
writeln!(file, "use crate::{{debug_simd_finish, debug_f16}};")?;
156+
157+
for intrinsic in chunk {
158+
crate::common::gen_rust::create_rust_test_module(&mut file, intrinsic)?;
159+
}
160+
161+
Ok(())
162+
})
163+
.collect::<Result<(), std::io::Error>>()
164+
.unwrap();
165+
166+
compile_rust_programs(toolchain, target, linker)
133167
}
134168

135169
fn compare_outputs(&self) -> bool {
136-
if let Some(ref toolchain) = self.cli_options.toolchain {
170+
if self.cli_options.toolchain.is_some() {
137171
let intrinsics_name_list = self
138172
.intrinsics
139173
.iter()
@@ -142,7 +176,6 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
142176

143177
compare_outputs(
144178
&intrinsics_name_list,
145-
toolchain,
146179
&self.cli_options.c_runner,
147180
&self.cli_options.target,
148181
)

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -146,21 +146,25 @@ where
146146

147147
/// Creates a line for each argument that initializes an array for Rust from which `loads` argument
148148
/// 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")
149+
pub fn gen_arglists_rust(
150+
&self,
151+
w: &mut impl std::io::Write,
152+
indentation: Indentation,
153+
loads: u32,
154+
) -> std::io::Result<()> {
155+
for arg in self.iter().filter(|&arg| !arg.has_constraint()) {
156+
writeln!(
157+
w,
158+
"{indentation}{bind} {name}: [{ty}; {load_size}] = {values};",
159+
bind = arg.rust_vals_array_binding(),
160+
name = arg.rust_vals_array_name(),
161+
ty = arg.ty.rust_scalar_type(),
162+
load_size = arg.ty.num_lanes() * arg.ty.num_vectors() + loads - 1,
163+
values = arg.ty.populate_random(indentation, loads, &Language::Rust)
164+
)?
165+
}
166+
167+
Ok(())
164168
}
165169

166170
/// 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: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@ use super::cli::FailureReason;
22
use rayon::prelude::*;
33
use std::process::Command;
44

5-
pub fn compare_outputs(
6-
intrinsic_name_list: &Vec<String>,
7-
toolchain: &str,
8-
runner: &str,
9-
target: &str,
10-
) -> bool {
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);
9+
10+
cmd
11+
}
12+
13+
pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target: &str) -> bool {
1114
let intrinsics = intrinsic_name_list
1215
.par_iter()
1316
.filter_map(|intrinsic_name| {
14-
let c = Command::new("sh")
15-
.arg("-c")
16-
.arg(format!("{runner} ./c_programs/intrinsic-test-programs {intrinsic_name}"))
17+
18+
let c = runner_command(runner)
19+
.arg("intrinsic-test-programs")
20+
.arg(intrinsic_name)
21+
.current_dir("c_programs")
1722
.output();
1823

19-
let rust = Command::new("sh")
20-
.current_dir("rust_programs")
21-
.arg("-c")
22-
.arg(format!(
23-
"cargo {toolchain} run --target {target} --bin {intrinsic_name} --release",
24-
))
25-
.env("RUSTFLAGS", "-Cdebuginfo=0")
24+
let rust = runner_command(runner)
25+
.arg(format!("target/{target}/release/intrinsic-test-programs"))
26+
.arg(intrinsic_name)
2627
.output();
2728

2829
let (c, rust) = match (c, rust) {
@@ -32,7 +33,7 @@ pub fn compare_outputs(
3233

3334
if !c.status.success() {
3435
error!(
35-
"Failed to run C program for intrinsic {intrinsic_name}\nstdout: {stdout}\nstderr: {stderr}",
36+
"Failed to run C program for intrinsic `{intrinsic_name}`\nstdout: {stdout}\nstderr: {stderr}",
3637
stdout = std::str::from_utf8(&c.stdout).unwrap_or(""),
3738
stderr = std::str::from_utf8(&c.stderr).unwrap_or(""),
3839
);
@@ -41,7 +42,7 @@ pub fn compare_outputs(
4142

4243
if !rust.status.success() {
4344
error!(
44-
"Failed to run Rust program for intrinsic {intrinsic_name}\nstdout: {stdout}\nstderr: {stderr}",
45+
"Failed to run Rust program for intrinsic `{intrinsic_name}`\nstdout: {stdout}\nstderr: {stderr}",
4546
stdout = std::str::from_utf8(&rust.stdout).unwrap_or(""),
4647
stderr = std::str::from_utf8(&rust.stderr).unwrap_or(""),
4748
);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ impl CppCompilation {
209209
let linker_output = cmd.output()?;
210210
if !linker_output.status.success() {
211211
error!("custom linker failed");
212+
error!("{}", String::from_utf8_lossy(&linker_output.stderr));
212213
return Ok(linker_output);
213214
}
214215

0 commit comments

Comments
 (0)