[Bug target/95646] [GCC 9/10] arm-none-eabi function attribute 'cmse_nonsecure_entry' wipes register values with -Os
cvs-commit at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu May 6 09:49:53 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95646
--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by SRINATH PARVATHANENI
<sripar01@gcc.gnu.org>:
https://gcc.gnu.org/g:f1370bf2aa6cac4ab6235d8480b0a5d4f85ca54e
commit r10-9806-gf1370bf2aa6cac4ab6235d8480b0a5d4f85ca54e
Author: Srinath Parvathaneni <srinath.parvathaneni@arm.com>
Date: Thu May 6 10:46:45 2021 +0100
arm: Do not clobber callee saved registers with CMSE.
As reported in bugzilla when the -mcmse option is used while compiling for
size
(-Os) with a thumb-1 target the generated code will clear the registers
r7-r10.
These however are callee saved and should be preserved accross ABI
boundaries.
The reason this happens is because these registers are made "fixed" when
optimising for size with Thumb-1 in a way to make sure they are not used,
as
pushing and popping hi-registers requires extra moves to and from LO_REGS.
To fix this, this patch uses 'callee_saved_reg_p', which accounts for this
optimisation, instead of 'call_used_or_fixed_reg_p'. Be aware of
'callee_saved_reg_p''s definition, as it does still take call used
registers
into account, which aren't callee_saved in my opinion, so it is a rather
misnoemer, works in our advantage here though as it does exactly what we
need.
gcc/ChangeLog:
2020-06-19 Andre Vieira <andre.simoesdiasvieira@arm.com>
PR target/95646
* config/arm/arm.c: (cmse_nonsecure_entry_clear_before_return): Use
'callee_saved_reg_p' instead of 'calL_used_or_fixed_reg_p'.
gcc/testsuite/ChangeLog:
2020-06-19 Andre Vieira <andre.simoesdiasvieira@arm.com>
PR target/95646
* gcc.target/arm/pr95646.c: New test.
(cherry picked from commit 5f426554fd804d65509875d706d8b8bc3a48393b)
More information about the Gcc-bugs
mailing list