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]

Re: [darwin] unwind context question



On Monday, July 7, 2003, at 11:13 AM, Andreas Tobler wrote:


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.

Won't Darwin do this for you? All you should need to do is catch 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.

Maybe. It's hard to tell without seeing how the return address got set. You'll note that the code there does eventually wind up in sigreturn.


Now where does this context come from? I see the init here:

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

Yes, it starts there.


But I don't follow, do we have a __builtin_unwind_init on darwin?

No, we don't.


And what about __builtin_return_address ? There are some comments from mrs in rs6000.h

Yes, we do have one of those.


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]