[Bug target/89093] [9 Regression] C++ exception handling clobbers d8 VFP register

ramana at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Jan 28 22:08:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89093

Ramana Radhakrishnan <ramana at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ramana at gcc dot gnu.org

--- Comment #7 from Ramana Radhakrishnan <ramana at gcc dot gnu.org> ---
(In reply to Florian Weimer from comment #0)
> In glibc, we have a test, nptl/tst-thread-exit-clobber, that attempts to
> verify if registers are properly restored by unwinding.  (The actual target
> of the the test is pthread_exit, but it covers more than that.)
> 
> This tests fails when running with GCC 9 libstdc++, even if glibc and the
> test were built with GCC 8, and libgcc_s is replaced with the version for
> GCC 8 (which works when running against GCC 8 libstdc++).
> 
> In the test, the d8 register is not restored properly during unwinding, it
> is set to zero.  d9, d10 etc. are restored.
> 
> I noticed that in GCC 9, __gxx_personality_v0 saves the d8 VFP register:
> 
> 0007b620 <__gxx_personality_v0@@CXXABI_1.3>:
>    7b620:       e92d4ff0        push    {r4, r5, r6, r7, r8, r9, sl, fp, lr}
>    7b624:       ed2d8b02        vpush   {d8}
>    7b628:       e3a03000        mov     r3, #0
>    7b62c:       e1a08001        mov     r8, r1
> 
> And it actually uses s16 and s17, apparently for spilling integer registers.
> Perhaps the unwinder is not prepared to deal with that.

d8 is composed of s16 and s17. That should just be fine. The single precision
FP registers are packed into double precision registers in the VFP
architecture.

Ramana


More information about the Gcc-bugs mailing list