Browse Source

ARMClang: allow fallback to -march and correct setting of --cpu flags

allows cmake to fall back to CMAKE_SYSTEM_ARCH in case CMAKE_SYSTEM_PROCESSOR is not in armclang -mcpu=list
additionally checks if CMAKE_SYSTEM_PROCESSOR belongs to armlink --cpu=list

Fixes: #19962
Osama Moharam 5 years ago
parent
commit
ef816610be
1 changed files with 57 additions and 10 deletions
  1. 57 10
      Modules/Compiler/ARMClang.cmake

+ 57 - 10
Modules/Compiler/ARMClang.cmake

@@ -46,6 +46,32 @@ function(__armclang_check_processor processor list out_var)
   endif()
 endfunction()
 
+# get compiler supported arch list
+function(__armclang_set_arch_list lang out_var)
+  execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -march=list
+    OUTPUT_VARIABLE arch_list
+    ERROR_VARIABLE arch_list)
+  string(REGEX MATCHALL "-march=([^ \n]*)" arch_list "${arch_list}")
+  string(REGEX REPLACE "-march=" "" arch_list "${arch_list}")
+  set(${out_var} "${arch_list}" PARENT_SCOPE)
+endfunction()
+
+# get linker supported cpu list
+function(__armlink_set_cpu_list lang out_var)
+  if(__CMAKE_ARMClang_USING_armlink)
+    set(__linker_wrapper_flags "")
+  else()
+    set(__linker_wrapper_flags --target=${CMAKE_${lang}_COMPILER_TARGET} -XLinker)
+  endif()
+
+  execute_process(COMMAND "${CMAKE_LINKER}" ${__linker_wrapper_flags} --cpu=list
+    OUTPUT_VARIABLE cpu_list
+    ERROR_VARIABLE cpu_list)
+  string(REGEX MATCHALL "--cpu=([^ \n]*)" cpu_list "${cpu_list}")
+  string(REGEX REPLACE "--cpu=" "" cpu_list "${cpu_list}")
+  set(${out_var} "${cpu_list}" PARENT_SCOPE)
+endfunction()
+
 macro(__compiler_armclang lang)
   if(NOT CMAKE_${lang}_COMPILER_TARGET)
     set(CMAKE_${lang}_COMPILER_TARGET arm-arm-none-eabi)
@@ -53,19 +79,40 @@ macro(__compiler_armclang lang)
   if(NOT CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
     __armclang_set_processor_list(${lang} CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
   endif()
-  if(NOT CMAKE_SYSTEM_PROCESSOR)
-    message(FATAL_ERROR "  CMAKE_SYSTEM_PROCESSOR must be set for ARMClang\n"
-      "  Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n")
+  if(NOT CMAKE_${lang}_COMPILER_ARCH_LIST)
+    __armclang_set_arch_list(${lang} CMAKE_${lang}_COMPILER_ARCH_LIST)
+  endif()
+  if(NOT CMAKE_SYSTEM_PROCESSOR AND NOT CMAKE_SYSTEM_ARCH)
+    message(FATAL_ERROR "  CMAKE_SYSTEM_PROCESSOR or CMAKE_SYSTEM_ARCH must be set for ARMClang\n"
+      "  Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n"
+      "  Supported Architecture: ${CMAKE_${lang}_COMPILER_ARCH_LIST}")
   else()
-    __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}" _CMAKE_${lang}_CHECK_RESULT)
-    if(NOT _CMAKE_${lang}_CHECK_RESULT)
-      message(FATAL_ERROR "  System processor '${CMAKE_SYSTEM_PROCESSOR}' not supported by ARMClang ${lang} compiler\n"
-        "  Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n")
+    __armclang_check_processor("${CMAKE_SYSTEM_ARCH}" "${CMAKE_${lang}_COMPILER_ARCH_LIST}" _CMAKE_${lang}_CHECK_ARCH_RESULT)
+    if( _CMAKE_${lang}_CHECK_ARCH_RESULT)
+      string(APPEND CMAKE_${lang}_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
+      set(__march_flag_set TRUE)
+    endif()
+    __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}" _CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
+    if(_CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
+      string(APPEND CMAKE_${lang}_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+      set(__mcpu_flag_set TRUE)
     endif()
-    unset(_CMAKE_${lang}_CHECK_RESULT)
+    if(NOT __march_flag_set AND NOT __mcpu_flag_set)
+      message(FATAL_ERROR "Atleast one of the variables CMAKE_SYSTEM_PROCESSOR or CMAKE_SYSTEM_ARCH must be set for ARMClang\n"
+                          "Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n"
+                          "  Supported Architecture: ${CMAKE_${lang}_COMPILER_ARCH_LIST}")
+    endif()
+    unset(_CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
+    unset(_CMAKE_${lang}_CHECK_ARCH_RESULT)
+  endif()
+
+  #check if CMAKE_SYSTEM_PROCESSOR belongs to supported cpu list for armlink
+  __armlink_set_cpu_list( ${lang} CMAKE_LINKER_CPU_LIST)
+  list(TRANSFORM CMAKE_LINKER_CPU_LIST TOLOWER)
+  __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_LINKER_CPU_LIST}" _CMAKE_CHECK_LINK_CPU_RESULT)
+  if(_CMAKE_CHECK_LINK_CPU_RESULT)
+    string(APPEND CMAKE_${lang}_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
   endif()
-  string(APPEND CMAKE_${lang}_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
-  string(APPEND CMAKE_${lang}_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
 
   if(__CMAKE_ARMClang_USING_armlink)
     set(__CMAKE_ARMClang_USING_armlink_WRAPPER "")