diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2014-08-22 09:21:33 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2014-08-22 09:21:33 +0000 |
commit | 3f3bd10104550243781f0b4d9248975e35d91ac7 (patch) | |
tree | c7ac2839d2c3da2321bd9979a1574667ed39bc26 /winsup/cygwin/exceptions.cc | |
parent | 33ed7bb5bc2cb41259df064229968933d9c898ca (diff) | |
download | cygnal-3f3bd10104550243781f0b4d9248975e35d91ac7.tar.gz cygnal-3f3bd10104550243781f0b4d9248975e35d91ac7.tar.bz2 cygnal-3f3bd10104550243781f0b4d9248975e35d91ac7.zip |
* Throughout, use __try/__except/__endtry blocks, rather than myfault
handler.
* cygtls.cc (_cygtls::remove): Accommodate the fact that pathbufs
has been moved from _local_storage to _cygtls.
* cygtls.h (class tls_pathbuf): Add comment to hint to gendef usage
of counters. Change type of counters to uint32_t for clarity.
Remove _cygtls as friend class.
(struct _local_storage): Move pathbufs from here...
(struct _cygtls): ...to here, allowing to access it from _sigbe.
(class san): Only define on 32 bit. Remove errno, _c_cnt and _w_cnt
members.
(san::setup): Drop parameter. Don't initialize removed members.
(san::leave): Don't set removed members.
(class myfault): Only define on 32 bit.
(myfault::faulted): Only keep implementation not taking any parameter.
Drop argument in call to sebastian.setup.
(__try/__leave/__except/__endtry): Implement to support real SEH. For
now stick to SJLJ on 32 bit.
* dcrt0.cc (dll_crt0_0): Drop 64 bit call to
exception::install_myfault_handler.
* exception.h (exception_handler): Define with EXCEPTION_DISPOSITION
as return type.
(PDISPATCHER_CONTEXT): Define as void * on 32 bit. Define as pointer
to _DISPATCHER_CONTEXT on 64 bit.
(class exception): Define separately for 32 and 64 bit.
(exception::myfault): Add handler for myfault SEH handling on 64 bit.
(exception::exception): Fix mangled method name to account for change
in type of last parameter.
(exception::install_myfault_handler): Remove.
* exceptions.cc (exception::myfault_handle): Remove.
(exception::myfault): New SEH handler for 64 bit.
* gendef (_sigbe): Set tls_pathbuf counters to 0 explicitely when
returning to the caller.
* ntdll.h: Move a comment to a better place.
(struct _SCOPE_TABLE): Define on 64 bit.
* thread.cc (verifyable_object_isvalid): Remove gcc 4.7 workaround.
* tls_pbuf.cc (tls_pbuf): Fix to accommodate new place of pathbufs.
(tls_pathbuf::destroy): Change type of loop variables to uint32_t.
* tls_pbuf.h (class tmp_pathbuf): Change type of buffer counters to
uint32_t. Accommodate new place of pathbufs.
* tlsoffsets.h: Regenerate.
* tlsoffsets64.h: Regenerate.
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 95 |
1 files changed, 41 insertions, 54 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 0e8a977d4..4e9c77036 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -341,38 +341,41 @@ void cygwin_exception::dumpstack () { static bool already_dumped; - myfault efault; - if (efault.faulted ()) - return; - if (already_dumped || cygheap->rlim_core == 0Ul) - return; - already_dumped = true; - open_stackdumpfile (); + __try + { + if (already_dumped || cygheap->rlim_core == 0Ul) + return; + already_dumped = true; + open_stackdumpfile (); - if (e) - dump_exception (); + if (e) + dump_exception (); - int i; + int i; - thestack.init (framep, 1, ctx); /* Initialize from the input CONTEXT */ + thestack.init (framep, 1, ctx); /* Initialize from the input CONTEXT */ #ifdef __x86_64__ - small_printf ("Stack trace:\r\nFrame Function Args\r\n"); + small_printf ("Stack trace:\r\nFrame Function Args\r\n"); #else - small_printf ("Stack trace:\r\nFrame Function Args\r\n"); + small_printf ("Stack trace:\r\nFrame Function Args\r\n"); #endif - for (i = 0; i < 16 && thestack++; i++) - { - small_printf (_AFMT " " _AFMT, thestack.sf.AddrFrame.Offset, - thestack.sf.AddrPC.Offset); - for (unsigned j = 0; j < NPARAMS; j++) - small_printf ("%s" _AFMT, j == 0 ? " (" : ", ", thestack.sf.Params[j]); - small_printf (")\r\n"); + for (i = 0; i < 16 && thestack++; i++) + { + small_printf (_AFMT " " _AFMT, thestack.sf.AddrFrame.Offset, + thestack.sf.AddrPC.Offset); + for (unsigned j = 0; j < NPARAMS; j++) + small_printf ("%s" _AFMT, j == 0 ? " (" : ", ", + thestack.sf.Params[j]); + small_printf (")\r\n"); + } + small_printf ("End of stack trace%s\n", + i == 16 ? " (more stack frames may be present)" : ""); + if (h) + NtClose (h); } - small_printf ("End of stack trace%s\n", - i == 16 ? " (more stack frames may be present)" : ""); - if (h) - NtClose (h); + __except (NO_ERROR) {} + __endtry } bool @@ -549,40 +552,24 @@ rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e) #endif /* __x86_64 */ #ifdef __x86_64__ -/* myfault vectored exception handler */ -LONG -exception::myfault_handle (LPEXCEPTION_POINTERS ep) +/* myfault exception handler. */ +EXCEPTION_DISPOSITION +exception::myfault (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, + PDISPATCHER_CONTEXT dispatch) { - _cygtls& me = _my_tls; - - if (me.andreas) - { - /* Only handle the minimum amount of exceptions the myfault handler - was designed for. */ - switch (ep->ExceptionRecord->ExceptionCode) - { - case STATUS_ACCESS_VIOLATION: - case STATUS_DATATYPE_MISALIGNMENT: -#if 0 - /* PAGE_GUARD-based stack commits are based on structured exception - handling. Short-circuiting STATUS_STACK_OVERFLOW in a vectored - exception handler disables that, which can ultimately result in - a spurious SEGV. */ - case STATUS_STACK_OVERFLOW: -#endif - case STATUS_ARRAY_BOUNDS_EXCEEDED: - me.andreas->leave (); /* Return from a "san" caught fault */ - default: - break; - } - } - return EXCEPTION_CONTINUE_SEARCH; + PSCOPE_TABLE table = (PSCOPE_TABLE) dispatch->HandlerData; + RtlUnwindEx (frame, + (char *) dispatch->ImageBase + table->ScopeRecord[0].JumpTarget, + e, 0, in, dispatch->HistoryTable); + /* NOTREACHED, make gcc happy. */ + return ExceptionContinueSearch; } -#endif /* __x86_64 */ +#endif /* Main exception handler. */ -int -exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void *) +EXCEPTION_DISPOSITION +exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, + PDISPATCHER_CONTEXT dispatch) { static bool NO_COPY debugging; _cygtls& me = _my_tls; |