summaryrefslogtreecommitdiff
path: root/gcc/ada/raise-gcc.c
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2012-07-09 10:46:00 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2012-07-09 10:46:00 +0000
commit84ed75235e0062d03d7ff1477bc777e8f313b73f (patch)
tree5b16f576baa23d7e0de6a273e17513f322081aef /gcc/ada/raise-gcc.c
parent00c092f42f8f5c033185cdafe859837dfdd677d1 (diff)
downloadgcc-84ed75235e0062d03d7ff1477bc777e8f313b73f.tar.gz
2012-07-09 Tristan Gingold <gingold@adacore.com>
* seh_init.c (__gnat_SEH_error_handler): On Win64 and SEH, return for unknown exceptions. * raise-gcc.c (__gnat_personality_seh0): Call __gnat_SEH_error_handler. 2012-07-09 Joel Brobecker <brobecker@adacore.com brobecker> * exp_dbug.ads (No_Dollar_In_Label): Delete. 2012-07-09 Vincent Pucci <pucci@adacore.com> * sem_ch13.adb (Check_Overloaded_Name): New routine. 2012-07-09 Vincent Pucci <pucci@adacore.com> * freeze.adb (Freeze_Record_Type): Analyze the delayed aspects of the components in a record type. 2012-07-09 Pascal Obry <obry@adacore.com> * prj-util.ads: Minor reformatting. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189369 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/raise-gcc.c')
-rw-r--r--gcc/ada/raise-gcc.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/ada/raise-gcc.c b/gcc/ada/raise-gcc.c
index 53a56e1d04b..0ef580b6ffb 100644
--- a/gcc/ada/raise-gcc.c
+++ b/gcc/ada/raise-gcc.c
@@ -1182,11 +1182,22 @@ __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e,
#endif /* __USING_SJLJ_EXCEPTIONS__ */
#ifdef __SEH__
+
+#define STATUS_USER_DEFINED (1U << 29)
+EXCEPTION_DISPOSITION __gnat_SEH_error_handler
+ (struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);
+
EXCEPTION_DISPOSITION
__gnat_personality_seh0 (PEXCEPTION_RECORD ms_exc, void *this_frame,
PCONTEXT ms_orig_context,
PDISPATCHER_CONTEXT ms_disp)
{
+ /* Possibly transform run-time errors into Ada exceptions. As a small
+ optimization, we call __gnat_SEH_error_handler only on non-user
+ exceptions. */
+ if (!(ms_exc->ExceptionCode & STATUS_USER_DEFINED))
+ __gnat_SEH_error_handler (ms_exc, this_frame, ms_orig_context, ms_disp);
+
return _GCC_specific_handler (ms_exc, this_frame, ms_orig_context,
ms_disp, __gnat_personality_imp);
}