summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-03-18 13:51:18 +0000
committerCorinna Vinschen <corinna@vinschen.de>2014-03-18 13:51:18 +0000
commit8c0389d33013d13b30bbcf5cbc274664127ff5c8 (patch)
treee9f39d6a0b242da0d962cf898ecc78d6ba0d687a
parent4f0b5a097da2464a8d5120ccc64bf9cf24ddd890 (diff)
downloadcygnal-8c0389d33013d13b30bbcf5cbc274664127ff5c8.tar.gz
cygnal-8c0389d33013d13b30bbcf5cbc274664127ff5c8.tar.bz2
cygnal-8c0389d33013d13b30bbcf5cbc274664127ff5c8.zip
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.
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/exception.h24
-rw-r--r--winsup/cygwin/exceptions.cc2
3 files changed, 17 insertions, 17 deletions
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 <corinna@vinschen.de>
+
+ 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 <me.cygwin2014@cgf.cx>
* 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 = &el;
#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