powerpc64 r13 setjmp/longjmp use; 32-bit setjmp/longjmp powerpc r2 use; they look a little odd to me (but operational)

Mark Millard marklmi at yahoo.com
Tue Apr 2 21:52:12 UTC 2019


In looking around to find what to expect for
32-bit powerpc r2 handling I ran into things
that look a little odd to me for both powerpc64
(r13) and 32-bit powerpc (r2): setjmp/longjmp
handling of those registers. head -r345758 based
for the below examples, system-clang did the
buildworld's involved.


powerpc64 r13 handling for a system-clang-based buildworld:

r13 is saved to 72(r6) but never restored from 72(r3). The
location for 72(r6) seems to be write only. (Recorded for
debugging use? It is not obvious that it should be saved
at all, given the _set_tp r13 use related to thread-local
storage.)

# objdump -d --prefix-addresses /usr/obj/DESTDIRs/clang-powerpc64-installworld_altbinutils-poud/lib/libc.so.7 | egrep -C3 '(_set_tp|.*jmp.*).*(\<r13\>|[^0-9]72\(r)' | more
00000000000a4d68 <.__getcontextx+0x94> blr
        ...
00000000000a4d78 <._set_tp> addi    r3,r3,28688
00000000000a4d7c <._set_tp+0x4> mr      r13,r3
00000000000a4d80 <._set_tp+0x8> blr
        ...
00000000000a4d90 <.__syncicache> mflr    r0
--
00000000000a50cc <.sigsetjmp+0x4c> stfd    f16,240(r6)
00000000000a50d0 <.sigsetjmp+0x50> std     r12,64(r6)
00000000000a50d4 <.sigsetjmp+0x54> stfd    f17,248(r6)
00000000000a50d8 <.sigsetjmp+0x58> std     r13,72(r6)
00000000000a50dc <.sigsetjmp+0x5c> stfd    f18,256(r6)
00000000000a50e0 <.sigsetjmp+0x60> std     r14,80(r6)
00000000000a50e4 <.sigsetjmp+0x64> stfd    f19,264(r6)
--
00000000000a52b0 <.setjmp+0x40> stfd    f16,240(r6)
00000000000a52b4 <.setjmp+0x44> std     r12,64(r6)
00000000000a52b8 <.setjmp+0x48> stfd    f17,248(r6)
00000000000a52bc <.setjmp+0x4c> std     r13,72(r6)
00000000000a52c0 <.setjmp+0x50> stfd    f18,256(r6)
00000000000a52c4 <.setjmp+0x54> std     r14,80(r6)
00000000000a52c8 <.setjmp+0x58> stfd    f19,264(r6)
--
00000000000a5474 <._setjmp+0x24> stfd    f16,240(r3)
00000000000a5478 <._setjmp+0x28> std     r12,64(r3)
00000000000a547c <._setjmp+0x2c> stfd    f17,248(r3)
00000000000a5480 <._setjmp+0x30> std     r13,72(r3)
00000000000a5484 <._setjmp+0x34> stfd    f18,256(r3)
00000000000a5488 <._setjmp+0x38> std     r14,80(r3)
00000000000a548c <._setjmp+0x3c> stfd    f19,264(r3)

(It appears that C++ exception handling should not be saving
or adjusting r13 for powerpc64.)


32-bit powerpc handling for a system-clang-based buildworld:

r2 is saved to 20(r6) (first going through r9) but restored
to r9 via 20(r3), never going back to r2. (Recorded for
debugging use? It is not obvious that it should be saved at
all [or restored to r9], given the _set_tp r2 use related to
thread-local storage.)

# objdump -d --prefix-addresses /usr/obj/DESTDIRs/gcc421-powerpc-installworld/lib/libc.so.7 | egrep -C3 '(_set_tp|.*jmp.*).*(\<r2\>|[^0-9]20\(r)' | more
0005bee8 <sigsetjmp+0x28> mflr    r11
0005beec <sigsetjmp+0x2c> mfcr    r12
0005bef0 <sigsetjmp+0x30> mr      r10,r1
0005bef4 <sigsetjmp+0x34> mr      r9,r2
0005bef8 <sigsetjmp+0x38> stmw    r9,20(r6)
0005befc <sigsetjmp+0x3c> stfd    f14,112(r6)
0005bf00 <sigsetjmp+0x40> stfd    f15,120(r6)
0005bf04 <sigsetjmp+0x44> stfd    f16,128(r6)
--
0005bf44 <sigsetjmp+0x84> li      r3,0
0005bf48 <sigsetjmp+0x88> blr
0005bf4c <sigsetjmp+0x8c> nop
0005bf50 <siglongjmp> lmw     r9,20(r3)
0005bf54 <siglongjmp+0x4> lfd     f14,112(r3)
0005bf58 <siglongjmp+0x8> lfd     f15,120(r3)
0005bf5c <siglongjmp+0xc> lfd     f16,128(r3)
--
0005bffc <setjmp+0x1c> mflr    r11
0005c000 <setjmp+0x20> mfcr    r12
0005c004 <setjmp+0x24> mr      r10,r1
0005c008 <setjmp+0x28> mr      r9,r2
0005c00c <setjmp+0x2c> stmw    r9,20(r6)
0005c010 <setjmp+0x30> stfd    f14,112(r6)
0005c014 <setjmp+0x34> stfd    f15,120(r6)
0005c018 <setjmp+0x38> stfd    f16,128(r6)
--
0005c054 <setjmp+0x74> stfd    f31,248(r6)
0005c058 <setjmp+0x78> li      r3,0
0005c05c <setjmp+0x7c> blr
0005c060 <__longjmp> lmw     r9,20(r3)
0005c064 <__longjmp+0x4> lfd     f14,112(r3)
0005c068 <__longjmp+0x8> lfd     f15,120(r3)
0005c06c <__longjmp+0xc> lfd     f16,128(r3)
--
0005c0f0 <_setjmp> mflr    r11
0005c0f4 <_setjmp+0x4> mfcr    r12
0005c0f8 <_setjmp+0x8> mr      r10,r1
0005c0fc <_setjmp+0xc> mr      r9,r2
0005c100 <_setjmp+0x10> stmw    r9,20(r3)
0005c104 <_setjmp+0x14> stfd    f14,112(r3)
0005c108 <_setjmp+0x18> stfd    f15,120(r3)
0005c10c <_setjmp+0x1c> stfd    f16,128(r3)
--
0005c154 <_setjmp+0x64> nop
0005c158 <_setjmp+0x68> nop
0005c15c <_setjmp+0x6c> nop
0005c160 <_longjmp> lmw     r9,20(r3)
0005c164 <_longjmp+0x4> lfd     f14,112(r3)
0005c168 <_longjmp+0x8> lfd     f15,120(r3)
0005c16c <_longjmp+0xc> lfd     f16,128(r3)
--
0005c3a0 <getcontextx+0x78> b       0005c364 <getcontextx+0x3c>
0005c3a4 <_set_tp> stwu    r1,-32(r1)
0005c3a8 <_set_tp+0x4> addi    r3,r3,28680
0005c3ac <_set_tp+0x8> mr      r2,r3
0005c3b0 <_set_tp+0xc> addi    r1,r1,32
0005c3b4 <_set_tp+0x10> blr
0005c3b8 <__syncicache> stwu    r1,-64(r1)

(It appears that C++ exception handling should not be saving
or adjusting r2 for 32-bit powerpc.)


(I had remembered that there was something odd with
32-bit powerpc r2 handling but had forgotten the
details. Until rediscovering the above, it had left
me wondering if C++ exception handling should involve
adjusting r2 or not for FreeBSD. I've worded some prior
list submittals presuming save/restore was appropriate
for C++ exception handling. That was wrong.)

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-ppc mailing list