1+ use crate :: common:: cli:: ProcessedCli ;
12use crate :: common:: compile_c:: CompilationCommandBuilder ;
23use crate :: common:: gen_c:: compile_c_programs;
34
4- pub fn compile_c_arm (
5- intrinsics_name_list : & [ String ] ,
6- compiler : & str ,
7- target : & str ,
8- cxx_toolchain_dir : Option < & str > ,
9- ) -> bool {
5+ pub fn compile_c_arm ( config : & ProcessedCli , intrinsics_name_list : & [ String ] ) -> bool {
6+ let Some ( ref cpp_compiler) = config. cpp_compiler else {
7+ return true ;
8+ } ;
9+
1010 // -ffp-contract=off emulates Rust's approach of not fusing separate mul-add operations
1111 let mut command = CompilationCommandBuilder :: new ( )
1212 . add_arch_flags ( vec ! [ "armv8.6-a" , "crypto" , "crc" , "dotprod" , "fp16" ] )
13- . set_compiler ( compiler )
14- . set_target ( target)
13+ . set_compiler ( cpp_compiler )
14+ . set_target ( & config . target )
1515 . set_opt_level ( "2" )
16- . set_cxx_toolchain_dir ( cxx_toolchain_dir)
16+ . set_cxx_toolchain_dir ( config . cxx_toolchain_dir . as_deref ( ) )
1717 . set_project_root ( "c_programs" )
1818 . add_extra_flags ( vec ! [ "-ffp-contract=off" , "-Wno-narrowing" ] ) ;
1919
20- if !target. contains ( "v7" ) {
20+ if !config . target . contains ( "v7" ) {
2121 command = command. add_arch_flags ( vec ! [ "faminmax" , "lut" , "sha3" ] ) ;
2222 }
2323
@@ -30,22 +30,33 @@ pub fn compile_c_arm(
3030 * does not work as it gets caught up with `#include_next <stdlib.h>`
3131 * not existing...
3232 */
33- if target. contains ( "aarch64_be" ) {
34- command = command
35- . set_linker (
36- cxx_toolchain_dir. unwrap_or ( "" ) . to_string ( ) + "/bin/aarch64_be-none-linux-gnu-g++" ,
33+ if config. target . contains ( "aarch64_be" ) {
34+ let Some ( ref cxx_toolchain_dir) = config. cxx_toolchain_dir else {
35+ panic ! (
36+ "target `{}` must specify `cxx_toolchain_dir`" ,
37+ config. target
3738 )
38- . set_include_paths ( vec ! [
39+ } ;
40+
41+ let linker = if let Some ( ref linker) = config. linker {
42+ linker. to_owned ( )
43+ } else {
44+ format ! ( "{cxx_toolchain_dir}/bin/aarch64_be-none-linux-gnu-g++" )
45+ } ;
46+
47+ trace ! ( "using linker: {linker}" ) ;
48+
49+ command = command. set_linker ( linker) . set_include_paths ( vec ! [
3950 "/include" ,
4051 "/aarch64_be-none-linux-gnu/include" ,
4152 "/aarch64_be-none-linux-gnu/include/c++/14.3.1" ,
4253 "/aarch64_be-none-linux-gnu/include/c++/14.3.1/aarch64_be-none-linux-gnu" ,
4354 "/aarch64_be-none-linux-gnu/include/c++/14.3.1/backward" ,
4455 "/aarch64_be-none-linux-gnu/libc/usr/include" ,
45- ] ) ;
56+ ] ) ;
4657 }
4758
48- if !compiler . contains ( "clang" ) {
59+ if !cpp_compiler . contains ( "clang" ) {
4960 command = command. add_extra_flag ( "-flax-vector-conversions" ) ;
5061 }
5162
0 commit comments