diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 3ebeb7f25..e7f8b3103 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2014-03-18 Corinna Vinschen + + Partially revert patch from 2014-03-04. + * exception.h (exception::handler_installed): Declare. + (exception::exception): Install vectored exception handler on x86_64. + (exception::~exception): Remove for x86_64. + * exceptions.cc (exception::handler_installed): Define. + 2014-03-17 Christopher Faylor * sigproc.h (no_thread_exit_protect): New class. diff --git a/winsup/cygwin/exception.h b/winsup/cygwin/exception.h index 5b8b6da77..6792536c9 100644 --- a/winsup/cygwin/exception.h +++ b/winsup/cygwin/exception.h @@ -109,6 +109,7 @@ extern exception_list *_except_list asm ("%fs:0"); class exception { #ifdef __x86_64__ + static bool handler_installed; static int handle (LPEXCEPTION_POINTERS); #else exception_list el; @@ -119,16 +120,11 @@ public: exception () __attribute__ ((always_inline)) { #ifdef __x86_64__ - /* Manually install SEH handler. */ - asm (".l_startframe: \n\ - .seh_handler __C_specific_handler, @except \n\ - .seh_handlerdata \n\ - .long 1 \n\ - .rva .l_startframe, \ - .l_endframe, \ - _ZN9exception6handleEP19_EXCEPTION_POINTERS, \ - .l_endframe \n\ - .text \n"); + if (!handler_installed) + { + handler_installed = true; + AddVectoredExceptionHandler (1, handle); + } #else save = _except_list; el.handler = handle; @@ -136,13 +132,7 @@ public: _except_list = ⪙ #endif /* __x86_64__ */ }; -#ifdef __x86_64__ - ~exception () __attribute__ ((always_inline)) { - asm (" nop \n\ - .l_endframe: \n\ - nop \n"); - } -#else +#ifndef __x86_64__ ~exception () __attribute__ ((always_inline)) { _except_list = save; } #endif /* !__x86_64__ */ }; diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 4b1db9d62..e9e8778c2 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -553,6 +553,8 @@ rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e) #define CYG_EXC_CONTINUE_EXECUTION EXCEPTION_CONTINUE_EXECUTION #define CYG_EXC_CONTINUE_SEARCH EXCEPTION_CONTINUE_SEARCH +bool exception::handler_installed NO_COPY; + int exception::handle (LPEXCEPTION_POINTERS ep) #else