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