This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[darwin] unwind context question


Hi,

I'm still trying to implement the MD_FALLBACK_FRAME_STATE_FOR macro for darwin. While doing so I get a bit confused about the context I find during debugging.

First, some words on how I do it.
In libgcj we need this macro to catch NullPointerExceptions and friends.
To catch a EXC_BAD_ACCESS under darwin we have to install a mach message handler to catch the exception, then we can modify the threadstate and call a forwarding function to call a SIGSEGV.
After that the MAKE_THROW_FRAME from libjava/include/*signal.h gets invoked.


The mechanism is not finished yet but for prototyping it should work.

Now I can run the Throw_2 testcase from libjava.lang and catch the EXC_BAD_ACCESS. Then I modify the threadstate to call a raise(SIGSEGV).
I end up in the MAKE_THROW_FRAME and there it should start with unwinding. Here I have my problems in understanding.


I enter the MD_FALLBACK_FRAME_STATE_FOR and see a context->ra which is in the middle of sigtramp and not as I would expect at the beginning of sigreturn.

Below the disass.
I would expect context->ra at 0x9000fae0 and not at 0x9000fa9c.
Now where does this context come from? I see the init here:

unwind-dw2.c:1184#define uw_init_context(CONTEXT)

But I don't follow, do we have a __builtin_unwind_init on darwin?
And what about __builtin_return_address ? There are some comments from mrs in rs6000.h


Any further readings, hints are very appreciated.

Thank you in advance.

Andreas



(gdb) p context->ra
$3 = (void *) 0x9000fa9c

Dump of assembler code from 0x9000fa9c to 0x9000fb20:
0x9000fa9c <_sigtramp+92>:      addi    r11,r29,4648
0x9000faa0 <_sigtramp+96>:      mr      r3,r30
0x9000faa4 <_sigtramp+100>:     lwz     r9,0(r11)
0x9000faa8 <_sigtramp+104>:     addi    r9,r9,-1
0x9000faac <_sigtramp+108>:     stw     r9,0(r11)
0x9000fab0 <_sigtramp+112>:     lwz     r0,88(r1)
0x9000fab4 <_sigtramp+116>:     addi    r1,r1,80
0x9000fab8 <_sigtramp+120>:     lmw     r29,-12(r1)
0x9000fabc <_sigtramp+124>:     mtlr    r0
0x9000fac0 <_sigtramp+128>:     b       0x900cca1c <dyld_stub_sigreturn>
0x9000fac4 <_sigtramp+132>:     .long 0x0
0x9000fac8 <_sigtramp+136>:     .long 0x0
0x9000facc <_sigtramp+140>:     .long 0x0
0x9000fad0 <_sigtramp+144>:     .long 0x0
0x9000fad4 <_sigtramp+148>:     .long 0x0
0x9000fad8 <_sigtramp+152>:     .long 0x0
0x9000fadc <_sigtramp+156>:     .long 0x0
0x9000fae0 <sigreturn+0>:       li      r0,103
0x9000fae4 <sigreturn+4>:       sc
0x9000fae8 <sigreturn+8>:       b       0x9000faf0 <sigreturn+16>
0x9000faec <sigreturn+12>:      b       0x9000fb10 <sigreturn+48>
0x9000faf0 <sigreturn+16>:      mflr    r0
0x9000faf4 <sigreturn+20>:      bl      0x9000faf8 <sigreturn+24>
0x9000faf8 <sigreturn+24>:      mflr    r12
0x9000fafc <sigreturn+28>:      mtlr    r0
0x9000fb00 <sigreturn+32>:      addis   r12,r12,4095
0x9000fb04 <sigreturn+36>:      lwz     r12,21960(r12)
0x9000fb08 <sigreturn+40>:      mtctr   r12
0x9000fb0c <sigreturn+44>:      bctr
0x9000fb10 <sigreturn+48>:      nop
0x9000fb14 <sigreturn+52>:      blr
0x9000fb18 <sigreturn+56>:      .long 0x0
0x9000fb1c <sigreturn+60>:      .long 0x0
End of assembler dump.




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]