When checking -mcmse support, it will always fail. Because it checks the return value with "$?", but in makefile it should be "$$?". I have a simple patch for the bug: --- a/libgcc/config/arm/t-arm +++ b/libgcc/config/arm/t-arm @@ -4,7 +4,7 @@ LIB1ASMFUNCS = _thumb1_case_sqi _thumb1_case_uqi _thumb1_case_shi \ HAVE_CMSE:=$(findstring __ARM_FEATURE_CMSE,$(shell $(gcc_compile_bare) -dM -E - </dev/null)) HAVE_V81M:=$(findstring armv8.1-m.main,$(gcc_compile_bare)) -ifeq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null >/dev/null 2>/dev/null; echo $?),0) +ifeq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null >/dev/null 2>/dev/null; echo $$?),0) CMSE_OPTS:=-mcmse endif
Some cross links to this issue: Original stackoverflow question: https://stackoverflow.com/q/66240436/1358283 Question to arm embedded toolchain: https://answers.launchpad.net/gcc-arm-embedded/+question/695596
Created attachment 50221 [details] libgcc objdump result for gcc-7 and gcc-10
Here are some more info. This check determines whether macro __ARM_FEATURE_CMSE is set to 3, and affects CMSE support for function cmse_check_address_range(): void * __attribute__ ((warn_unused_result)) cmse_check_address_range (void *p, size_t size, int flags) { ... #if __ARM_FEATURE_CMSE & 2 case CMSE_MPU_NONSECURE: permb = cmse_TTA (pb); perme = singleCheck ? permb : cmse_TTA (pe); break; case CMSE_MPU_UNPRIV | CMSE_MPU_NONSECURE: permb = cmse_TTAT (pb); perme = singleCheck ? permb : cmse_TTAT (pe); break; #endif ... } Since the check always fail, CMSE support for all multilibs are disabled. The objdump results of v8-m.main libgcc for gcc-arm-none-eabi-7-2018-q2-update and gcc-arm-none-eabi-10-2020-q4-major are attached.
Confirmed. The proposed fix works. I sent the patch to the gcc-patches list: https://gcc.gnu.org/pipermail/gcc-patches/2021-February/565732.html Hau Hsu, can you confirm your name and email address are OK in the ChangeLog entry? Thanks
Hi Christophe, The name and email are OK. Thanks!
The master branch has been updated by Christophe Lyon <clyon@gcc.gnu.org>: https://gcc.gnu.org/g:be30dd89926d5dd19d72f90c1586b0e2557fde43 commit r11-7361-gbe30dd89926d5dd19d72f90c1586b0e2557fde43 Author: Christophe Lyon <christophe.lyon@linaro.org> Date: Wed Feb 24 15:51:52 2021 +0000 arm: Fix CMSE support detection in libgcc (PR target/99157) As discussed in the PR, the Makefile fragment lacks a double '$' to get the return-code from GCC invocation, resulting is CMSE support missing from multilibs. I checked that the simple patch proposed in the PR fixes the problem. 2021-02-23 Christophe Lyon <christophe.lyon@linaro.org> Hau Hsu <hsuhau617@gmail.com> PR target/99157 libgcc/ * config/arm/t-arm: Fix cmse support detection.
The releases/gcc-10 branch has been updated by Christophe Lyon <clyon@gcc.gnu.org>: https://gcc.gnu.org/g:fcfd5cc0f428262fcce874a4c3b41e06d1296901 commit r10-9388-gfcfd5cc0f428262fcce874a4c3b41e06d1296901 Author: Christophe Lyon <christophe.lyon@linaro.org> Date: Wed Feb 24 15:51:52 2021 +0000 arm: Fix CMSE support detection in libgcc (PR target/99157) As discussed in the PR, the Makefile fragment lacks a double '$' to get the return-code from GCC invocation, resulting is CMSE support missing from multilibs. I checked that the simple patch proposed in the PR fixes the problem. 2021-02-23 Christophe Lyon <christophe.lyon@linaro.org> Hau Hsu <hsuhau617@gmail.com> PR target/99157 libgcc/ * config/arm/t-arm: Fix cmse support detection. (cherry picked from commit be30dd89926d5dd19d72f90c1586b0e2557fde43)
Now fixed on trunk and gcc-10. Thanks for the report & patch.