Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-03-18 17:51:18 +0400
committerCorinna Vinschen <corinna@vinschen.de>2014-03-18 17:51:18 +0400
commit8c0389d33013d13b30bbcf5cbc274664127ff5c8 (patch)
treee9f39d6a0b242da0d962cf898ecc78d6ba0d687a /winsup/cygwin/exception.h
parent4f0b5a097da2464a8d5120ccc64bf9cf24ddd890 (diff)
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.
Diffstat (limited to 'winsup/cygwin/exception.h')
-rw-r--r--winsup/cygwin/exception.h24
1 files changed, 7 insertions, 17 deletions
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__ */
};