toolchain: Remove toolchain reset magic
Removed compiler/linker reset magic for IAR and Armclang.
It is not necessary in the split build.
Signed-off-by: Dávid Házi <david.hazi@arm.com>
Change-Id: I03cc11595764c6219ab9cd684d512bff3bd985d2
diff --git a/toolchain_ARMCLANG.cmake b/toolchain_ARMCLANG.cmake
index 964b032..3e632da 100644
--- a/toolchain_ARMCLANG.cmake
+++ b/toolchain_ARMCLANG.cmake
@@ -23,35 +23,137 @@
# with the Ninja generator.
set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_CURRENT_LIST_DIR}/cmake/set_extensions.cmake)
+# CMAKE_C_COMPILER_VERSION is not guaranteed to be defined.
+EXECUTE_PROCESS( COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE ARMCLANG_VERSION )
+string(REGEX MATCH "([0-9]+\.[0-9]+)" ARMCLANG_VERSION "${ARMCLANG_VERSION}")
+set(ARMCLANG_VERSION ${CMAKE_MATCH_1})
+
if(NOT DEFINED CMAKE_OBJCOPY)
set(CMAKE_OBJCOPY ${CROSS_COMPILE}-objcopy CACHE FILEPATH "Path to objcopy")
endif()
-macro(tfm_toolchain_reset_compiler_flags)
- set_property(DIRECTORY PROPERTY COMPILE_OPTIONS "")
+if (DEFINED TFM_SYSTEM_PROCESSOR)
+ set(CMAKE_SYSTEM_PROCESSOR ${TFM_SYSTEM_PROCESSOR})
- add_compile_options(
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-ignored-optimization-argument>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-unused-command-line-argument>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wall>
- # Don't error when the MBEDTLS_NULL_ENTROPY warning is shown
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-error=cpp>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-c>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fdata-sections>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-ffunction-sections>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fno-builtin>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-enums>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-wchar>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-funsigned-char>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-masm=auto>
- $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-nostdlib>
- $<$<COMPILE_LANGUAGE:C>:-std=c99>
- $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
- $<$<COMPILE_LANGUAGE:ASM>:--cpu=${CMAKE_ASM_CPU_FLAG}>
- $<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
- $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
- )
-endmacro()
+ if (TFM_SYSTEM_ARCHITECTURE STREQUAL "armv8.1-m.main")
+ message(WARNING "MVE is not yet supported using ARMCLANG")
+ string(APPEND CMAKE_SYSTEM_PROCESSOR "+nomve")
+ endif()
+
+ if (DEFINED TFM_SYSTEM_DSP)
+ if(NOT TFM_SYSTEM_DSP)
+ string(APPEND CMAKE_SYSTEM_PROCESSOR "+nodsp")
+ endif()
+ endif()
+
+ # ARMCLANG specifies that '+nofp' is available on following M-profile cpus:
+ # 'cortex-m4', 'cortex-m7', 'cortex-m33', 'cortex-m35p', 'cortex-m55' and 'cortex-m85'.
+ # Build fails if other M-profile cpu, such as 'cortex-m23', is added with '+nofp'.
+ # Explicitly list those cpu to align with ARMCLANG description.
+ if (NOT CONFIG_TFM_FLOAT_ABI STREQUAL "hard" AND
+ (TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m4"
+ OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m7"
+ OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m33"
+ OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m35p"
+ OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m55"
+ OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m85"))
+ string(APPEND CMAKE_SYSTEM_PROCESSOR "+nofp")
+ endif()
+
+ string(REGEX REPLACE "\\+nodsp" ".no_dsp" CMAKE_ASM_CPU_FLAG "${CMAKE_SYSTEM_PROCESSOR}")
+ string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
+ string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
+else()
+ set(CMAKE_ASM_CPU_FLAG ${TFM_SYSTEM_ARCHITECTURE})
+
+ # Armasm uses different syntax than armclang for architecture targets
+ string(REGEX REPLACE "\\armv" "" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
+ string(REGEX REPLACE "\\armv" "" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
+
+ # Modifiers are additive instead of subtractive (.fp Vs .no_fp)
+ if (TFM_SYSTEM_DSP)
+ string(APPEND CMAKE_ASM_CPU_FLAG ".dsp")
+ endif()
+
+ if (CONFIG_TFM_FLOAT_ABI STREQUAL "hard")
+ string(APPEND CMAKE_ASM_CPU_FLAG ".fp")
+ endif()
+endif()
+
+# CMAKE_SYSTEM_ARCH is an ARMCLANG CMAKE internal variable, used to set
+# compile and linker flags up until CMake 3.21 where CMP0123 was introduced:
+# https://cmake.org/cmake/help/latest/policy/CMP0123.html
+# Another use of this variable is to statisfy a requirement for ARMCLANG to
+# set either the target CPU or the Architecture. This variable needs to be
+# set to allow targeting architectures without a specific CPU.
+set(CMAKE_SYSTEM_ARCH ${TFM_SYSTEM_ARCHITECTURE})
+
+set(CMAKE_C_COMPILER_TARGET arm-${CROSS_COMPILE})
+set(CMAKE_CXX_COMPILER_TARGET arm-${CROSS_COMPILE})
+set(CMAKE_ASM_COMPILER_TARGET arm-${CROSS_COMPILE})
+
+# MVE is currently not supported in case of armclang
+if (TFM_SYSTEM_ARCHITECTURE STREQUAL "armv8.1-m.main")
+ string(APPEND CMAKE_SYSTEM_ARCH "+nomve")
+endif()
+
+if (DEFINED TFM_SYSTEM_DSP)
+ if(NOT TFM_SYSTEM_DSP)
+ string(APPEND CMAKE_SYSTEM_ARCH "+nodsp")
+ endif()
+endif()
+
+# Cmake's ARMClang support has several issues with compiler validation. To
+# avoid these, we set the list of supported -mcpu and -march variables to
+# the ones we intend to use so that the validation will never fail.
+include(Compiler/ARMClang)
+set(CMAKE_C_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
+set(CMAKE_C_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
+set(CMAKE_CXX_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
+set(CMAKE_CXX_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
+set(CMAKE_ASM_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
+set(CMAKE_ASM_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
+
+add_compile_options(
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-ignored-optimization-argument>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-unused-command-line-argument>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wall>
+ # Don't error when the MBEDTLS_NULL_ENTROPY warning is shown
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-Wno-error=cpp>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-c>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fdata-sections>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-ffunction-sections>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fno-builtin>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-enums>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-fshort-wchar>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-funsigned-char>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-masm=auto>
+ $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-nostdlib>
+ $<$<COMPILE_LANGUAGE:C>:-std=c99>
+ $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>
+ $<$<COMPILE_LANGUAGE:ASM>:--cpu=${CMAKE_ASM_CPU_FLAG}>
+ $<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
+ $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:${TFM_DEBUG_SYMBOLS}>>:-g>
+)
+
+add_link_options(
+ ${MEMORY_USAGE_FLAG}
+ --strict
+ --symbols
+ --xref
+ $<$<AND:$<VERSION_GREATER:${TFM_ISOLATION_LEVEL},1>,$<STREQUAL:"${TEST_PSA_API}","IPC">>:--no-merge>
+ # Suppress link warnings that are consistant (and therefore hopefully
+ # harmless)
+ # https://developer.arm.com/documentation/100074/0608/linker-errors-and-warnings/list-of-the-armlink-error-and-warning-messages
+ # Empty region description
+ --diag_suppress=6312
+ # Ns section matches pattern
+ --diag_suppress=6314
+ # Duplicate input files
+ --diag_suppress=6304
+ # Pattern only matches removed unused sections.
+ --diag_suppress=6329
+)
if(CONFIG_TFM_MEMORY_USAGE_QUIET)
set(MEMORY_USAGE_FLAG "")
@@ -59,256 +161,120 @@
set(MEMORY_USAGE_FLAG --info=summarysizes,sizes,totals,unused,veneers)
endif()
-macro(tfm_toolchain_reset_linker_flags)
- set_property(DIRECTORY PROPERTY LINK_OPTIONS "")
+if (ARMCLANG_VERSION VERSION_LESS 6.13)
+ message(FATAL_ERROR "Please select newer Arm compiler version starting from 6.13.")
+endif()
- add_link_options(
- ${MEMORY_USAGE_FLAG}
- --strict
- --symbols
- --xref
- $<$<AND:$<VERSION_GREATER:${TFM_ISOLATION_LEVEL},1>,$<STREQUAL:"${TEST_PSA_API}","IPC">>:--no-merge>
- # Suppress link warnings that are consistant (and therefore hopefully
- # harmless)
- # https://developer.arm.com/documentation/100074/0608/linker-errors-and-warnings/list-of-the-armlink-error-and-warning-messages
- # Empty region description
- --diag_suppress=6312
- # Ns section matches pattern
- --diag_suppress=6314
- # Duplicate input files
- --diag_suppress=6304
- # Pattern only matches removed unused sections.
- --diag_suppress=6329
+if (ARMCLANG_VERSION VERSION_GREATER_EQUAL 6.15 AND
+ ARMCLANG_VERSION VERSION_LESS 6.18)
+ message(FATAL_ERROR "Armclang 6.15~6.17 may cause MemManage fault."
+ " This defect has been fixed since Armclang 6.18."
+ " See [SDCOMP-59788] in Armclang 6.18 release note for details."
+ " Please use other Armclang versions instead.")
+endif()
+
+if (CMAKE_SYSTEM_PROCESSOR)
+ set(CMAKE_C_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(CMAKE_CXX_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(CMAKE_C_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(CMAKE_CXX_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(CMAKE_ASM_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
+ # But armlink doesn't support this +dsp syntax
+ string(REGEX REPLACE "\\+nodsp" "" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nodsp" "" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nodsp" "" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
+ # And uses different syntax for +nofp
+ string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
+
+ string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
+ string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
+else()
+ set(CMAKE_C_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
+ set(CMAKE_CXX_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
+endif()
+
+set(CMAKE_ASM_FLAGS ${CMAKE_ASM_FLAGS_INIT})
+
+set(BL2_COMPILER_CP_FLAG
+ $<$<COMPILE_LANGUAGE:C>:-mfpu=softvfp>
+ $<$<COMPILE_LANGUAGE:ASM>:--fpu=softvfp>
+)
+# As BL2 does not use hardware FPU, specify '--fpu=SoftVFP' explicitly to use software
+# library functions for BL2 to override any implicit FPU option, such as '--cpu' option.
+# Because the implicit hardware FPU option enforces BL2 to initialize FPU but hardware FPU
+# is not actually enabled in BL2, it will cause BL2 runtime fault.
+set(BL2_LINKER_CP_OPTION --fpu=SoftVFP)
+
+set(BL1_COMPILER_CP_FLAG
+ $<$<COMPILE_LANGUAGE:C>:-mfpu=softvfp>
+ $<$<COMPILE_LANGUAGE:ASM>:--fpu=softvfp>
+)
+set(BL1_LINKER_CP_OPTION --fpu=SoftVFP)
+
+if (CONFIG_TFM_FLOAT_ABI STREQUAL "hard")
+ set(COMPILER_CP_FLAG
+ $<$<COMPILE_LANGUAGE:C>:-mfloat-abi=hard>
)
-endmacro()
-
-macro(tfm_toolchain_set_processor_arch)
- if (DEFINED TFM_SYSTEM_PROCESSOR)
- set(CMAKE_SYSTEM_PROCESSOR ${TFM_SYSTEM_PROCESSOR})
-
- if (TFM_SYSTEM_ARCHITECTURE STREQUAL "armv8.1-m.main")
- message(WARNING "MVE is not yet supported using ARMCLANG")
- string(APPEND CMAKE_SYSTEM_PROCESSOR "+nomve")
- endif()
-
- if (DEFINED TFM_SYSTEM_DSP)
- if(NOT TFM_SYSTEM_DSP)
- string(APPEND CMAKE_SYSTEM_PROCESSOR "+nodsp")
- endif()
- endif()
-
- # ARMCLANG specifies that '+nofp' is available on following M-profile cpus:
- # 'cortex-m4', 'cortex-m7', 'cortex-m33', 'cortex-m35p', 'cortex-m55' and 'cortex-m85'.
- # Build fails if other M-profile cpu, such as 'cortex-m23', is added with '+nofp'.
- # Explicitly list those cpu to align with ARMCLANG description.
- if (NOT CONFIG_TFM_FLOAT_ABI STREQUAL "hard" AND
- (TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m4"
- OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m7"
- OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m33"
- OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m35p"
- OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m55"
- OR TFM_SYSTEM_PROCESSOR STREQUAL "cortex-m85"))
- string(APPEND CMAKE_SYSTEM_PROCESSOR "+nofp")
- endif()
-
- string(REGEX REPLACE "\\+nodsp" ".no_dsp" CMAKE_ASM_CPU_FLAG "${CMAKE_SYSTEM_PROCESSOR}")
- string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
- string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
- else()
- set(CMAKE_ASM_CPU_FLAG ${TFM_SYSTEM_ARCHITECTURE})
-
- # Armasm uses different syntax than armclang for architecture targets
- string(REGEX REPLACE "\\armv" "" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
- string(REGEX REPLACE "\\armv" "" CMAKE_ASM_CPU_FLAG "${CMAKE_ASM_CPU_FLAG}")
-
- # Modifiers are additive instead of subtractive (.fp Vs .no_fp)
- if (TFM_SYSTEM_DSP)
- string(APPEND CMAKE_ASM_CPU_FLAG ".dsp")
- endif()
-
- if (CONFIG_TFM_FLOAT_ABI STREQUAL "hard")
- string(APPEND CMAKE_ASM_CPU_FLAG ".fp")
- endif()
+ if (CONFIG_TFM_ENABLE_FP)
+ set(COMPILER_CP_FLAG
+ $<$<COMPILE_LANGUAGE:C>:-mfpu=${CONFIG_TFM_FP_ARCH};-mfloat-abi=hard>
+ $<$<COMPILE_LANGUAGE:ASM>:--fpu=${CONFIG_TFM_FP_ARCH_ASM}>
+ )
+ # armasm and armlink have the same option "--fpu" and are both used to
+ # specify the target FPU architecture. So the supported FPU architecture
+ # names can be shared by armasm and armlink.
+ set(LINKER_CP_OPTION --fpu=${CONFIG_TFM_FP_ARCH_ASM})
endif()
-
- # CMAKE_SYSTEM_ARCH is an ARMCLANG CMAKE internal variable, used to set
- # compile and linker flags up until CMake 3.21 where CMP0123 was introduced:
- # https://cmake.org/cmake/help/latest/policy/CMP0123.html
- # This behavior is overwritten by setting CMAKE_C_FLAGS in
- # tfm_toolchain_reload_compiler.
- # Another use of this variable is to statisfy a requirement for ARMCLANG to
- # set either the target CPU or the Architecture. This variable needs to be
- # set to allow targeting architectures without a specific CPU.
- set(CMAKE_SYSTEM_ARCH ${TFM_SYSTEM_ARCHITECTURE})
-
- set(CMAKE_C_COMPILER_TARGET arm-${CROSS_COMPILE})
- set(CMAKE_CXX_COMPILER_TARGET arm-${CROSS_COMPILE})
- set(CMAKE_ASM_COMPILER_TARGET arm-${CROSS_COMPILE})
-
- # MVE is currently not supported in case of armclang
- if (TFM_SYSTEM_ARCHITECTURE STREQUAL "armv8.1-m.main")
- string(APPEND CMAKE_SYSTEM_ARCH "+nomve")
- endif()
-
- if (DEFINED TFM_SYSTEM_DSP)
- if(NOT TFM_SYSTEM_DSP)
- string(APPEND CMAKE_SYSTEM_ARCH "+nodsp")
- endif()
- endif()
-
- # Cmake's ARMClang support has several issues with compiler validation. To
- # avoid these, we set the list of supported -mcpu and -march variables to
- # the ones we intend to use so that the validation will never fail.
- include(Compiler/ARMClang)
- set(CMAKE_C_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
- set(CMAKE_C_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
- set(CMAKE_CXX_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
- set(CMAKE_CXX_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
- set(CMAKE_ASM_COMPILER_PROCESSOR_LIST ${CMAKE_SYSTEM_PROCESSOR})
- set(CMAKE_ASM_COMPILER_ARCH_LIST ${CMAKE_SYSTEM_ARCH})
-endmacro()
-
-macro(tfm_toolchain_reload_compiler)
- tfm_toolchain_set_processor_arch()
- tfm_toolchain_reset_compiler_flags()
- tfm_toolchain_reset_linker_flags()
-
- unset(CMAKE_C_FLAGS_INIT)
- unset(CMAKE_CXX_FLAGS_INIT)
- unset(CMAKE_C_LINK_FLAGS)
- unset(CMAKE_ASM_FLAGS_INIT)
- unset(CMAKE_ASM_LINK_FLAGS)
- unset(__mcpu_flag_set)
- unset(__march_flag_set)
-
- include(Compiler/ARMClang)
- __compiler_armclang(C)
- include(Compiler/ARMCC-ASM)
- __compiler_armcc(ASM)
-
- if (CMAKE_C_COMPILER_VERSION VERSION_LESS 6.13)
- message(FATAL_ERROR "Please select newer Arm compiler version starting from 6.13.")
- endif()
-
- if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 6.15 AND
- CMAKE_C_COMPILER_VERSION VERSION_LESS 6.18)
- message(FATAL_ERROR "Armclang 6.15~6.17 may cause MemManage fault."
- " This defect has been fixed since Armclang 6.18."
- " See [SDCOMP-59788] in Armclang 6.18 release note for details."
- " Please use other Armclang versions instead.")
- endif()
-
- set(CMAKE_ASM_FLAGS ${CMAKE_ASM_FLAGS_INIT})
-
- if (DEFINED TFM_SYSTEM_PROCESSOR)
- set(CMAKE_C_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
- set(CMAKE_CXX_FLAGS "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
- set(CMAKE_C_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
- set(CMAKE_CXX_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
- set(CMAKE_ASM_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
- # But armlink doesn't support this +dsp syntax
- string(REGEX REPLACE "\\+nodsp" "" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
- string(REGEX REPLACE "\\+nodsp" "" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
- string(REGEX REPLACE "\\+nodsp" "" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
- # And uses different syntax for +nofp
- string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
- string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
- string(REGEX REPLACE "\\+nofp" ".no_fp" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
-
- string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
- string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
- string(REGEX REPLACE "\\+nomve" ".no_mve" CMAKE_ASM_LINK_FLAGS "${CMAKE_ASM_LINK_FLAGS}")
- else()
- set(CMAKE_C_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
- set(CMAKE_CXX_FLAGS "-march=${CMAKE_SYSTEM_ARCH}")
- endif()
-
- set(BL2_COMPILER_CP_FLAG
+else()
+ set(COMPILER_CP_FLAG
$<$<COMPILE_LANGUAGE:C>:-mfpu=softvfp>
$<$<COMPILE_LANGUAGE:ASM>:--fpu=softvfp>
)
- # As BL2 does not use hardware FPU, specify '--fpu=SoftVFP' explicitly to use software
- # library functions for BL2 to override any implicit FPU option, such as '--cpu' option.
- # Because the implicit hardware FPU option enforces BL2 to initialize FPU but hardware FPU
- # is not actually enabled in BL2, it will cause BL2 runtime fault.
- set(BL2_LINKER_CP_OPTION --fpu=SoftVFP)
+ set(LINKER_CP_OPTION --fpu=SoftVFP)
+endif()
- set(BL1_COMPILER_CP_FLAG
- $<$<COMPILE_LANGUAGE:C>:-mfpu=softvfp>
- $<$<COMPILE_LANGUAGE:ASM>:--fpu=softvfp>
- )
- set(BL1_LINKER_CP_OPTION --fpu=SoftVFP)
+# Workaround for issues with --depend-single-line with armasm and Ninja
+if (CMAKE_GENERATOR STREQUAL "Ninja")
+ set( CMAKE_DEPFILE_FLAGS_ASM "--depend=<OBJECT>.d")
+endif()
- if (CONFIG_TFM_FLOAT_ABI STREQUAL "hard")
- set(COMPILER_CP_FLAG
- $<$<COMPILE_LANGUAGE:C>:-mfloat-abi=hard>
- )
- if (CONFIG_TFM_ENABLE_FP)
- set(COMPILER_CP_FLAG
- $<$<COMPILE_LANGUAGE:C>:-mfpu=${CONFIG_TFM_FP_ARCH};-mfloat-abi=hard>
- $<$<COMPILE_LANGUAGE:ASM>:--fpu=${CONFIG_TFM_FP_ARCH_ASM}>
- )
- # armasm and armlink have the same option "--fpu" and are both used to
- # specify the target FPU architecture. So the supported FPU architecture
- # names can be shared by armasm and armlink.
- set(LINKER_CP_OPTION --fpu=${CONFIG_TFM_FP_ARCH_ASM})
- endif()
+set(CMAKE_C_FLAGS_MINSIZEREL "-Oz -DNDEBUG")
+
+#
+# Pointer Authentication Code and Branch Target Identification (PACBTI) Options
+#
+if (${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_NONE)
+ set(BRANCH_PROTECTION_OPTIONS "none")
+elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_STANDARD)
+ set(BRANCH_PROTECTION_OPTIONS "standard")
+elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_PACRET)
+ set(BRANCH_PROTECTION_OPTIONS "pac-ret")
+elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_PACRET_LEAF)
+ set(BRANCH_PROTECTION_OPTIONS "pac-ret+leaf")
+elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_BTI)
+ set(BRANCH_PROTECTION_OPTIONS "bti")
+endif()
+
+if(NOT ${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_DISABLED)
+ if(ARMCLANG_VERSION VERSION_LESS 6.18)
+ message(FATAL_ERROR "Your compiler does not support BRANCH_PROTECTION")
else()
- set(COMPILER_CP_FLAG
- $<$<COMPILE_LANGUAGE:C>:-mfpu=softvfp>
- $<$<COMPILE_LANGUAGE:ASM>:--fpu=softvfp>
- )
- set(LINKER_CP_OPTION --fpu=SoftVFP)
- endif()
+ if((TFM_SYSTEM_PROCESSOR MATCHES "cortex-m85") AND
+ (TFM_SYSTEM_ARCHITECTURE STREQUAL "armv8.1-m.main"))
+ message(NOTICE "BRANCH_PROTECTION enabled with: ${BRANCH_PROTECTION_OPTIONS}")
- # Workaround for issues with --depend-single-line with armasm and Ninja
- if (CMAKE_GENERATOR STREQUAL "Ninja")
- set( CMAKE_DEPFILE_FLAGS_ASM "--depend=<OBJECT>.d")
- endif()
+ string(APPEND CMAKE_C_FLAGS " -mbranch-protection=${BRANCH_PROTECTION_OPTIONS}")
+ string(APPEND CMAKE_CXX_FLAGS " -mbranch-protection=${BRANCH_PROTECTION_OPTIONS}")
- set(CMAKE_C_FLAGS_MINSIZEREL "-Oz -DNDEBUG")
-
- #
- # Pointer Authentication Code and Branch Target Identification (PACBTI) Options
- #
- if (${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_NONE)
- set(BRANCH_PROTECTION_OPTIONS "none")
- elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_STANDARD)
- set(BRANCH_PROTECTION_OPTIONS "standard")
- elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_PACRET)
- set(BRANCH_PROTECTION_OPTIONS "pac-ret")
- elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_PACRET_LEAF)
- set(BRANCH_PROTECTION_OPTIONS "pac-ret+leaf")
- elseif(${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_BTI)
- set(BRANCH_PROTECTION_OPTIONS "bti")
- endif()
-
- if(NOT ${CONFIG_TFM_BRANCH_PROTECTION_FEAT} STREQUAL BRANCH_PROTECTION_DISABLED)
- if(CMAKE_C_COMPILER_VERSION VERSION_LESS 6.18)
- message(FATAL_ERROR "Your compiler does not support BRANCH_PROTECTION")
+ add_link_options(--library_security=pacbti-m)
else()
- if((TFM_SYSTEM_PROCESSOR MATCHES "cortex-m85") AND
- (TFM_SYSTEM_ARCHITECTURE STREQUAL "armv8.1-m.main"))
- message(NOTICE "BRANCH_PROTECTION enabled with: ${BRANCH_PROTECTION_OPTIONS}")
-
- string(APPEND CMAKE_C_FLAGS " -mbranch-protection=${BRANCH_PROTECTION_OPTIONS}")
- string(APPEND CMAKE_CXX_FLAGS " -mbranch-protection=${BRANCH_PROTECTION_OPTIONS}")
-
- add_link_options(--library_security=pacbti-m)
- else()
- message(FATAL_ERROR "Your architecture does not support BRANCH_PROTECTION")
- endif()
+ message(FATAL_ERROR "Your architecture does not support BRANCH_PROTECTION")
endif()
endif()
-
-endmacro()
-
-# Configure environment for the compiler setup run by cmake at the first
-# `project` call in <tfm_root>/CMakeLists.txt. After this mandatory setup is
-# done, all further compiler setup is done via tfm_toolchain_reload_compiler()
-tfm_toolchain_set_processor_arch()
-tfm_toolchain_reset_compiler_flags()
-tfm_toolchain_reset_linker_flags()
+endif()
# Behaviour for handling scatter files is so wildly divergent between compilers
# that this macro is required.