@@ -2,6 +2,7 @@ use super::config::{AARCH_CONFIGURATIONS, POLY128_OSTREAM_DEF, build_notices};
22use super :: intrinsic:: ArmIntrinsicType ;
33use crate :: arm:: constraint:: Constraint ;
44use crate :: common:: argument:: Argument ;
5+ use crate :: common:: compile_c:: CompilationCommandBuilder ;
56use crate :: common:: format:: Indentation ;
67use crate :: common:: gen_c:: { compile_c, create_c_filenames, generate_c_program} ;
78use crate :: common:: gen_rust:: { compile_rust, create_rust_filenames, generate_rust_program} ;
@@ -161,70 +162,50 @@ fn generate_rust_program_arm(
161162
162163fn compile_c_arm (
163164 intrinsics_name_list : & Vec < String > ,
164- filename_mapping : BTreeMap < & String , String > ,
165+ _filename_mapping : BTreeMap < & String , String > ,
165166 compiler : & str ,
166167 target : & str ,
167168 cxx_toolchain_dir : Option < & str > ,
168169) -> bool {
169170 let compiler_commands = intrinsics_name_list. iter ( ) . map ( |intrinsic_name| {
170- let c_filename = filename_mapping. get ( intrinsic_name) . unwrap ( ) ;
171- let flags = std:: env:: var ( "CPPFLAGS" ) . unwrap_or ( "" . into ( ) ) ;
172- let arch_flags = if target. contains ( "v7" ) {
173- "-march=armv8.6-a+crypto+crc+dotprod+fp16"
171+ let mut command = CompilationCommandBuilder :: new ( ) ;
172+ if target. contains ( "v7" ) {
173+ command. set_arch_flags ( vec ! [ "armv8.6-a" , "crypto" , "crc" , "dotprod" , "fp16" ] )
174174 } else {
175- "-march= armv8.6-a+ crypto+sha3+ crc+ dotprod+ fp16+ faminmax+ lut"
175+ command . set_arch_flags ( vec ! [ " armv8.6-a" , " crypto" , " crc" , " dotprod" , " fp16" , "sha3" , " faminmax" , " lut"] )
176176 } ;
177177
178- let compiler_command = if target == "aarch64_be-unknown-linux-gnu" {
179- let Some ( cxx_toolchain_dir) = cxx_toolchain_dir else {
180- panic ! (
181- "When setting `--target aarch64_be-unknown-linux-gnu` the C++ compilers toolchain directory must be set with `--cxx-toolchain-dir <dest>`"
182- ) ;
183- } ;
178+ command = command
179+ . set_compiler ( compiler)
180+ . set_output_name ( intrinsic_name)
181+ . set_target ( target)
182+ . set_opt_level ( "2" )
183+ . set_cxx_toolchain_dir ( cxx_toolchain_dir)
184+ . set_project_root ( "c_programs" )
185+ . set_input_name ( intrinsic_name)
186+ . add_extra_flags ( vec ! [ "-ffp-contract=off" , "-Wno-narrowing" ] ) ;
184187
185- /* clang++ cannot link an aarch64_be object file, so we invoke
186- * aarch64_be-unknown-linux-gnu's C++ linker. This ensures that we
187- * are testing the intrinsics against LLVM.
188- *
189- * Note: setting `--sysroot=<...>` which is the obvious thing to do
190- * does not work as it gets caught up with `#include_next <stdlib.h>`
191- * not existing... */
192- format ! (
193- "{compiler} {flags} {arch_flags} \
194- -ffp-contract=off \
195- -Wno-narrowing \
196- -O2 \
197- --target=aarch64_be-unknown-linux-gnu \
198- -I{cxx_toolchain_dir}/include \
199- -I{cxx_toolchain_dir}/aarch64_be-none-linux-gnu/include \
200- -I{cxx_toolchain_dir}/aarch64_be-none-linux-gnu/include/c++/14.2.1 \
201- -I{cxx_toolchain_dir}/aarch64_be-none-linux-gnu/include/c++/14.2.1/aarch64_be-none-linux-gnu \
202- -I{cxx_toolchain_dir}/aarch64_be-none-linux-gnu/include/c++/14.2.1/backward \
203- -I{cxx_toolchain_dir}/aarch64_be-none-linux-gnu/libc/usr/include \
204- -c {c_filename} \
205- -o c_programs/{intrinsic_name}.o && \
206- {cxx_toolchain_dir}/bin/aarch64_be-none-linux-gnu-g++ c_programs/{intrinsic_name}.o -o c_programs/{intrinsic_name} && \
207- rm c_programs/{intrinsic_name}.o",
208- )
188+ command = if target == "aarch64_be-unknown-linux-gnu" {
189+ command
190+ . set_linker ( cxx_toolchain_dir. unwrap_or ( "" ) . to_string ( ) + "/bin/aarch64_be-none-linux-gnu-g++" )
191+ . set_include_paths ( vec ! [
192+ "/include" ,
193+ "/aarch64_be-none-linux-gnu/include" ,
194+ "/aarch64_be-none-linux-gnu/include/c++/14.2.1" ,
195+ "/aarch64_be-none-linux-gnu/include/c++/14.2.1/aarch64_be-none-linux-gnu" ,
196+ "/aarch64_be-none-linux-gnu/include/c++/14.2.1/backward" ,
197+ "/aarch64_be-none-linux-gnu/libc/usr/include"
198+ ] )
209199 } else {
210- // -ffp-contract=off emulates Rust's approach of not fusing separate mul-add operations
211- let base_compiler_command = format ! (
212- "{compiler} {flags} {arch_flags} -o c_programs/{intrinsic_name} {c_filename} -ffp-contract=off -Wno-narrowing -O2"
213- ) ;
214-
215- /* `-target` can be passed to some c++ compilers, however if we want to
216- * use a c++ compiler does not support this flag we do not want to pass
217- * the flag. */
218200 if compiler. contains ( "clang" ) {
219- format ! ( "{base_compiler_command} -target {target}" )
201+ command . add_extra_flag ( format ! ( "-target {target}" ) . as_str ( ) )
220202 } else {
221- format ! ( "{base_compiler_command} -flax-vector-conversions")
203+ command . add_extra_flag ( " -flax-vector-conversions")
222204 }
223205 } ;
224206
225- compiler_command
226- } )
227- . collect :: < Vec < _ > > ( ) ;
207+ command. as_str ( )
208+ } ) . collect :: < Vec < _ > > ( ) ;
228209
229210 compile_c ( & compiler_commands)
230211}
0 commit comments