@@ -14,7 +14,7 @@ use itertools::Itertools;
14
14
use rayon:: prelude:: * ;
15
15
use types:: TypeKind ;
16
16
17
- use crate :: acle_csv_parser:: get_acle_intrinsics;
17
+ use crate :: acle_csv_parser:: { get_acle_intrinsics, CsvMetadata } ;
18
18
use crate :: argument:: Argument ;
19
19
20
20
mod acle_csv_parser;
@@ -70,6 +70,7 @@ fn gen_code_c(
70
70
}
71
71
72
72
fn generate_c_program (
73
+ notices : & str ,
73
74
header_files : & [ & str ] ,
74
75
intrinsic : & Intrinsic ,
75
76
p64_armv7_workaround : bool ,
@@ -81,7 +82,7 @@ fn generate_c_program(
81
82
. collect_vec ( ) ;
82
83
83
84
format ! (
84
- r#"{header_files}
85
+ r#"{notices}{ header_files}
85
86
#include <iostream>
86
87
#include <cstring>
87
88
#include <iomanip>
@@ -157,15 +158,15 @@ fn gen_code_rust(intrinsic: &Intrinsic, constraints: &[&Argument], name: String)
157
158
}
158
159
}
159
160
160
- fn generate_rust_program ( intrinsic : & Intrinsic , a32 : bool ) -> String {
161
+ fn generate_rust_program ( notices : & str , intrinsic : & Intrinsic , a32 : bool ) -> String {
161
162
let constraints = intrinsic
162
163
. arguments
163
164
. iter ( )
164
165
. filter ( |i| i. has_constraint ( ) )
165
166
. collect_vec ( ) ;
166
167
167
168
format ! (
168
- r#"#![feature(simd_ffi)]
169
+ r#"{notices} #![feature(simd_ffi)]
169
170
#![feature(link_llvm_intrinsics)]
170
171
#![feature(stdsimd)]
171
172
#![allow(overflowing_literals)]
@@ -217,30 +218,52 @@ fn compile_c(c_filename: &str, intrinsic: &Intrinsic, compiler: &str, a32: bool)
217
218
}
218
219
}
219
220
220
- fn build_c ( intrinsics : & Vec < Intrinsic > , compiler : & str , a32 : bool ) -> bool {
221
+ fn build_notices ( csv_metadata : & CsvMetadata , line_prefix : & str ) -> String {
222
+ let mut notices = format ! (
223
+ "\
224
+ {line_prefix}This is a transient test file, not intended for distribution. Some aspects of the
225
+ {line_prefix}test are derived from a CSV specification, published with the following notices:
226
+ {line_prefix}
227
+ "
228
+ ) ;
229
+ let lines = csv_metadata
230
+ . notices_lines ( )
231
+ . map ( |line| format ! ( "{line_prefix} {line}\n " ) ) ;
232
+ notices. extend ( lines) ;
233
+ notices. push_str ( "\n " ) ;
234
+ notices
235
+ }
236
+
237
+ fn build_c ( notices : & str , intrinsics : & Vec < Intrinsic > , compiler : & str , a32 : bool ) -> bool {
221
238
let _ = std:: fs:: create_dir ( "c_programs" ) ;
222
239
intrinsics
223
240
. par_iter ( )
224
241
. map ( |i| {
225
242
let c_filename = format ! ( r#"c_programs/{}.cpp"# , i. name) ;
226
243
let mut file = File :: create ( & c_filename) . unwrap ( ) ;
227
244
228
- let c_code = generate_c_program ( & [ "arm_neon.h" , "arm_acle.h" ] , & i, a32) ;
245
+ let c_code = generate_c_program ( notices , & [ "arm_neon.h" , "arm_acle.h" ] , & i, a32) ;
229
246
file. write_all ( c_code. into_bytes ( ) . as_slice ( ) ) . unwrap ( ) ;
230
247
compile_c ( & c_filename, & i, compiler, a32)
231
248
} )
232
249
. find_any ( |x| !x)
233
250
. is_none ( )
234
251
}
235
252
236
- fn build_rust ( intrinsics : & Vec < Intrinsic > , toolchain : & str , a32 : bool ) -> bool {
253
+ fn build_rust (
254
+ notices : & str ,
255
+ spdx_lic : & str ,
256
+ intrinsics : & Vec < Intrinsic > ,
257
+ toolchain : & str ,
258
+ a32 : bool ,
259
+ ) -> bool {
237
260
intrinsics. iter ( ) . for_each ( |i| {
238
261
let rust_dir = format ! ( r#"rust_programs/{}"# , i. name) ;
239
262
let _ = std:: fs:: create_dir_all ( & rust_dir) ;
240
263
let rust_filename = format ! ( r#"{rust_dir}/main.rs"# ) ;
241
264
let mut file = File :: create ( & rust_filename) . unwrap ( ) ;
242
265
243
- let c_code = generate_rust_program ( & i, a32) ;
266
+ let c_code = generate_rust_program ( notices , & i, a32) ;
244
267
file. write_all ( c_code. into_bytes ( ) . as_slice ( ) ) . unwrap ( ) ;
245
268
} ) ;
246
269
@@ -249,9 +272,10 @@ fn build_rust(intrinsics: &Vec<Intrinsic>, toolchain: &str, a32: bool) -> bool {
249
272
. write_all (
250
273
format ! (
251
274
r#"[package]
252
- name = "intrinsic-test"
275
+ name = "intrinsic-test-programs "
253
276
version = "{version}"
254
277
authors = ["{authors}"]
278
+ license = "{spdx_lic}"
255
279
edition = "2018"
256
280
[workspace]
257
281
[dependencies]
@@ -371,7 +395,7 @@ fn main() {
371
395
} ;
372
396
let a32 = matches. is_present ( "A32" ) ;
373
397
374
- let intrinsics = get_acle_intrinsics ( filename) ;
398
+ let ( csv_metadata , intrinsics) = get_acle_intrinsics ( filename) ;
375
399
376
400
let mut intrinsics = intrinsics
377
401
. into_iter ( )
@@ -394,11 +418,14 @@ fn main() {
394
418
. collect :: < Vec < _ > > ( ) ;
395
419
intrinsics. dedup ( ) ;
396
420
397
- if !build_c ( & intrinsics, cpp_compiler, a32) {
421
+ let notices = build_notices ( & csv_metadata, "// " ) ;
422
+ let spdx_lic = csv_metadata. spdx_license_identifier ( ) ;
423
+
424
+ if !build_c ( & notices, & intrinsics, cpp_compiler, a32) {
398
425
std:: process:: exit ( 2 ) ;
399
426
}
400
427
401
- if !build_rust ( & intrinsics, & toolchain, a32) {
428
+ if !build_rust ( & notices , spdx_lic , & intrinsics, & toolchain, a32) {
402
429
std:: process:: exit ( 3 ) ;
403
430
}
404
431
0 commit comments