mirror of git://gcc.gnu.org/git/gcc.git
except.c: Revert 04-01 and 04-02 forced-unwind changes.
gcc/ * except.c: Revert 04-01 and 04-02 forced-unwind changes. * flags.h, toplev.c, doc/invoke.texi: Likewise. * unwind-dw2.c (_Unwind_GetCFA): Fix ptr->int conversion warning. * unwind.inc (_Unwind_DeleteException): Check for null exception_cleanup. * unwind-sjlj.c (_Unwind_SjLj_Resume_or_Rethrow): New. * unwind.inc (_Unwind_Resume_or_Rethrow): New. * unwind.h: Declare them. * libgcc-std.ver (GCC_3.3): Export them. gcc/cp/ * cfns.gperf: Comment out POSIX thread cancellation points, plus abort and raise. * cfns.h: Regenerate. gcc/testsuite/ * g++.dg/eh/forced1.C: Expect catch-all handlers to run. Verify exception_cleanup not called for rethrows. * g++.dg/eh/forced2.C: Test that exception_cleanup is called when exiting catch block without rethrowing. * g++.dg/eh/forced3.C: New. * g++.dg/eh/forced4.C: New. libstdc++-v3/ * libsupc++/eh_catch.cc (__cxa_begin_catch): Handle foreign exceptions. (__cxa_end_catch): Likewise. * libsupc++/eh_throw.cc (__cxa_rethrow): Likewise. Use _Unwind_Resume_or_Rethrow. * libsupc++/eh_personality.cc (empty_exception_spec): New. (PERSONALITY_FUNCTION): Don't ignore terminate or catch-all for _UA_FORCE_UNWIND. Honor empty filter spec for foreign exceptions. Don't push terminate/unexpected to cxa functions. (__cxa_call_unexpected): Remove foreign exception fixmes. From-SVN: r66583
This commit is contained in:
parent
a21d83cd14
commit
a944ceb94a
|
@ -1,3 +1,18 @@
|
||||||
|
2003-05-07 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
PR c++/10570
|
||||||
|
* except.c: Revert 04-01 and 04-02 forced-unwind changes.
|
||||||
|
* flags.h, toplev.c, doc/invoke.texi: Likewise.
|
||||||
|
|
||||||
|
* unwind-dw2.c (_Unwind_GetCFA): Fix ptr->int conversion warning.
|
||||||
|
* unwind.inc (_Unwind_DeleteException): Check for null
|
||||||
|
exception_cleanup.
|
||||||
|
|
||||||
|
* unwind-sjlj.c (_Unwind_SjLj_Resume_or_Rethrow): New.
|
||||||
|
* unwind.inc (_Unwind_Resume_or_Rethrow): New.
|
||||||
|
* unwind.h: Declare them.
|
||||||
|
* libgcc-std.ver (GCC_3.3): Export them.
|
||||||
|
|
||||||
2003-05-07 Richard Henderson <rth@redhat.com>
|
2003-05-07 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* unwind-dw2.c (_Unwind_GetCFA): Cast pointer to _Unwind_Ptr,
|
* unwind-dw2.c (_Unwind_GetCFA): Cast pointer to _Unwind_Ptr,
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2003-05-07 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
PR c++/10570
|
||||||
|
* cfns.gperf: Comment out POSIX thread cancellation points,
|
||||||
|
plus abort and raise.
|
||||||
|
* cfns.h: Regenerate.
|
||||||
|
|
||||||
2003-05-07 Jason Merrill <jason@redhat.com>
|
2003-05-07 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
* call.c (build_conditional_expr): Don't assume that the folded
|
* call.c (build_conditional_expr): Don't assume that the folded
|
||||||
|
|
|
@ -16,9 +16,9 @@ const char * libc_name_p (const char *, unsigned int);
|
||||||
# exception, unless it calls a program-supplied function that
|
# exception, unless it calls a program-supplied function that
|
||||||
# throws an exception.
|
# throws an exception.
|
||||||
#
|
#
|
||||||
# bsearch and qsort are commented out because they can call such functions.
|
# Specific functions are commented out for the reason noted in each case.
|
||||||
#
|
#
|
||||||
abort
|
# abort -- synchronous exception from SIGABRT handler
|
||||||
abs
|
abs
|
||||||
acos
|
acos
|
||||||
asctime
|
asctime
|
||||||
|
@ -29,7 +29,7 @@ atexit
|
||||||
atof
|
atof
|
||||||
atoi
|
atoi
|
||||||
atol
|
atol
|
||||||
#bsearch
|
#bsearch -- calls user function which may throw exception
|
||||||
btowc
|
btowc
|
||||||
calloc
|
calloc
|
||||||
ceil
|
ceil
|
||||||
|
@ -43,41 +43,41 @@ div
|
||||||
exit
|
exit
|
||||||
exp
|
exp
|
||||||
fabs
|
fabs
|
||||||
fclose
|
#fclose -- POSIX thread cancellation point
|
||||||
feof
|
feof
|
||||||
ferror
|
ferror
|
||||||
fflush
|
#fflush -- POSIX thread cancellation point
|
||||||
fgetc
|
#fgetc -- POSIX thread cancellation point
|
||||||
fgetpos
|
#fgetpos -- POSIX thread cancellation point
|
||||||
fgets
|
#fgets -- POSIX thread cancellation point
|
||||||
fgetwc
|
#fgetwc -- POSIX thread cancellation point
|
||||||
fgetws
|
#fgetws -- POSIX thread cancellation point
|
||||||
floor
|
floor
|
||||||
fmod
|
fmod
|
||||||
fopen
|
#fopen -- POSIX thread cancellation point
|
||||||
fprintf
|
#fprintf -- POSIX thread cancellation point
|
||||||
fputc
|
#fputc -- POSIX thread cancellation point
|
||||||
fputs
|
#fputs -- POSIX thread cancellation point
|
||||||
fputwc
|
#fputwc -- POSIX thread cancellation point
|
||||||
fputws
|
#fputws -- POSIX thread cancellation point
|
||||||
fread
|
#fread -- POSIX thread cancellation point
|
||||||
free
|
free
|
||||||
freopen
|
#freopen -- POSIX thread cancellation point
|
||||||
frexp
|
frexp
|
||||||
fscanf
|
#fscanf -- POSIX thread cancellation point
|
||||||
fseek
|
fseek
|
||||||
fsetpos
|
#fsetpos -- POSIX thread cancellation point
|
||||||
ftell
|
#ftell -- POSIX thread cancellation point
|
||||||
fwide
|
fwide
|
||||||
fwprintf
|
#fwprintf -- POSIX thread cancellation point
|
||||||
fwrite
|
#fwrite -- POSIX thread cancellation point
|
||||||
fwscanf
|
#fwscanf -- POSIX thread cancellation point
|
||||||
getc
|
#getc -- POSIX thread cancellation point
|
||||||
getchar
|
#getchar -- POSIX thread cancellation point
|
||||||
getenv
|
getenv
|
||||||
gets
|
#gets -- POSIX thread cancellation point
|
||||||
getwc
|
#getwc -- POSIX thread cancellation point
|
||||||
getwchar
|
#getwchar -- POSIX thread cancellation point
|
||||||
gmtime
|
gmtime
|
||||||
isalnum
|
isalnum
|
||||||
isalpha
|
isalpha
|
||||||
|
@ -125,22 +125,22 @@ memmove
|
||||||
memset
|
memset
|
||||||
mktime
|
mktime
|
||||||
modf
|
modf
|
||||||
perror
|
#perror -- POSIX thread cancellation point
|
||||||
pow
|
pow
|
||||||
printf
|
#printf -- POSIX thread cancellation point
|
||||||
putc
|
#putc -- POSIX thread cancellation point
|
||||||
putchar
|
#putchar -- POSIX thread cancellation point
|
||||||
puts
|
#puts -- POSIX thread cancellation point
|
||||||
putwc
|
#putwc -- POSIX thread cancellation point
|
||||||
putwchar
|
#putwchar -- POSIX thread cancellation point
|
||||||
#qsort
|
#qsort -- calls user function which may throw exception
|
||||||
raise
|
#raise -- synchronous exception from signal handler
|
||||||
rand
|
rand
|
||||||
realloc
|
realloc
|
||||||
remove
|
#remove -- POSIX thread cancellation point
|
||||||
rename
|
#rename -- POSIX thread cancellation point
|
||||||
rewind
|
#rewind -- POSIX thread cancellation point
|
||||||
scanf
|
#scanf -- POSIX thread cancellation point
|
||||||
setbuf
|
setbuf
|
||||||
setlocale
|
setlocale
|
||||||
setvbuf
|
setvbuf
|
||||||
|
@ -157,7 +157,7 @@ strcmp
|
||||||
strcoll
|
strcoll
|
||||||
strcpy
|
strcpy
|
||||||
strcspn
|
strcspn
|
||||||
strerror
|
#strerror -- POSIX thread cancellation point
|
||||||
strftime
|
strftime
|
||||||
strlen
|
strlen
|
||||||
strncat
|
strncat
|
||||||
|
@ -174,25 +174,25 @@ strtoul
|
||||||
strxfrm
|
strxfrm
|
||||||
swprintf
|
swprintf
|
||||||
swscanf
|
swscanf
|
||||||
system
|
#system -- POSIX thread cancellation point
|
||||||
tan
|
tan
|
||||||
tanh
|
tanh
|
||||||
time
|
time
|
||||||
tmpfile
|
#tmpfile -- POSIX thread cancellation point
|
||||||
tmpnam
|
#tmpnam -- POSIX thread cancellation point
|
||||||
tolower
|
tolower
|
||||||
toupper
|
toupper
|
||||||
towctrans
|
towctrans
|
||||||
towlower
|
towlower
|
||||||
towupper
|
towupper
|
||||||
ungetc
|
#ungetc -- POSIX thread cancellation point
|
||||||
ungetwc
|
#ungetwc -- POSIX thread cancellation point
|
||||||
vfprintf
|
#vfprintf -- POSIX thread cancellation point
|
||||||
vfwprintf
|
#vfwprintf -- POSIX thread cancellation point
|
||||||
vprintf
|
#vprintf -- POSIX thread cancellation point
|
||||||
vsprintf
|
vsprintf
|
||||||
vswprintf
|
vswprintf
|
||||||
vwprintf
|
#vwprintf -- POSIX thread cancellation point
|
||||||
wcrtomb
|
wcrtomb
|
||||||
wcscat
|
wcscat
|
||||||
wcschr
|
wcschr
|
||||||
|
@ -225,5 +225,5 @@ wmemcmp
|
||||||
wmemcpy
|
wmemcpy
|
||||||
wmemmove
|
wmemmove
|
||||||
wmemset
|
wmemset
|
||||||
wprintf
|
#wprintf -- POSIX thread cancellation point
|
||||||
wscanf
|
#wscanf -- POSIX thread cancellation point
|
||||||
|
|
540
gcc/cp/cfns.h
540
gcc/cp/cfns.h
|
@ -1,5 +1,5 @@
|
||||||
/* C code produced by gperf version 2.7.2 */
|
/* C code produced by gperf version 2.7.2 */
|
||||||
/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p ../../gcc/gcc/cp/cfns.gperf */
|
/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p ../../../src-gcc/gcc/cp/cfns.gperf */
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__inline
|
__inline
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,7 @@ static unsigned int hash (const char *, unsigned int);
|
||||||
__inline
|
__inline
|
||||||
#endif
|
#endif
|
||||||
const char * libc_name_p (const char *, unsigned int);
|
const char * libc_name_p (const char *, unsigned int);
|
||||||
/* maximum key range = 1020, duplicates = 1 */
|
/* maximum key range = 480, duplicates = 1 */
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__inline
|
__inline
|
||||||
|
@ -24,32 +24,32 @@ hash (str, len)
|
||||||
{
|
{
|
||||||
static const unsigned short asso_values[] =
|
static const unsigned short asso_values[] =
|
||||||
{
|
{
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 0, 1,
|
483, 483, 483, 483, 483, 483, 483, 483, 0, 0,
|
||||||
0, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
1, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 247, 218, 144,
|
483, 483, 483, 483, 483, 483, 483, 106, 76, 0,
|
||||||
0, 0, 40, 7, 126, 184, 2, 15, 146, 67,
|
21, 0, 0, 11, 43, 26, 0, 66, 106, 17,
|
||||||
9, 60, 0, 0, 3, 0, 7, 8, 197, 1,
|
121, 0, 17, 0, 7, 0, 3, 19, 49, 1,
|
||||||
40, 8, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
3, 41, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
|
483, 483, 483, 483, 483, 483, 483, 483, 483, 483,
|
||||||
1038, 1038, 1038, 1038, 1038, 1038
|
483, 483, 483, 483, 483, 483
|
||||||
};
|
};
|
||||||
register int hval = len;
|
register int hval = len;
|
||||||
|
|
||||||
|
@ -83,356 +83,236 @@ libc_name_p (str, len)
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TOTAL_KEYWORDS = 207,
|
TOTAL_KEYWORDS = 156,
|
||||||
MIN_WORD_LENGTH = 3,
|
MIN_WORD_LENGTH = 3,
|
||||||
MAX_WORD_LENGTH = 10,
|
MAX_WORD_LENGTH = 10,
|
||||||
MIN_HASH_VALUE = 18,
|
MIN_HASH_VALUE = 3,
|
||||||
MAX_HASH_VALUE = 1037
|
MAX_HASH_VALUE = 482
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const wordlist[] =
|
static const char * const wordlist[] =
|
||||||
{
|
{
|
||||||
"gets",
|
"cos",
|
||||||
"puts",
|
"feof",
|
||||||
"sqrt",
|
|
||||||
"strerror",
|
|
||||||
"strstr",
|
|
||||||
"strspn",
|
|
||||||
"exp",
|
|
||||||
"free",
|
"free",
|
||||||
"fgets",
|
"sqrt",
|
||||||
"fputs",
|
"wcsrtombs",
|
||||||
"fgetws",
|
|
||||||
"fputws",
|
|
||||||
"pow",
|
"pow",
|
||||||
"fseek",
|
"towctrans",
|
||||||
"perror",
|
"wcsstr",
|
||||||
"strtod",
|
"wcstombs",
|
||||||
"toupper",
|
"strstr",
|
||||||
"towupper",
|
|
||||||
"frexp",
|
|
||||||
"strtok",
|
|
||||||
"fsetpos",
|
|
||||||
"ferror",
|
"ferror",
|
||||||
"freopen",
|
"wcsxfrm",
|
||||||
"fgetpos",
|
"wcsftime",
|
||||||
"fopen",
|
"exit",
|
||||||
|
"exp",
|
||||||
|
"modf",
|
||||||
|
"strxfrm",
|
||||||
"wmemset",
|
"wmemset",
|
||||||
"memset",
|
"memset",
|
||||||
"system",
|
|
||||||
"wcsstr",
|
|
||||||
"wctype",
|
|
||||||
"strxfrm",
|
|
||||||
"wcsspn",
|
|
||||||
"strcspn",
|
|
||||||
"fmod",
|
|
||||||
"strcpy",
|
|
||||||
"strncpy",
|
|
||||||
"strlen",
|
|
||||||
"ungetwc",
|
|
||||||
"feof",
|
|
||||||
"ldexp",
|
|
||||||
"isupper",
|
|
||||||
"rewind",
|
|
||||||
"iswupper",
|
|
||||||
"sin",
|
|
||||||
"cos",
|
|
||||||
"modf",
|
|
||||||
"iswpunct",
|
|
||||||
"wcstod",
|
|
||||||
"log10",
|
|
||||||
"log",
|
|
||||||
"wcsrtombs",
|
|
||||||
"strcmp",
|
|
||||||
"fwide",
|
|
||||||
"towctrans",
|
|
||||||
"strncmp",
|
|
||||||
"strtoul",
|
|
||||||
"fwrite",
|
|
||||||
"exit",
|
|
||||||
"swprintf",
|
|
||||||
"wcstok",
|
|
||||||
"strftime",
|
"strftime",
|
||||||
"sprintf",
|
"frexp",
|
||||||
"wprintf",
|
|
||||||
"strpbrk",
|
|
||||||
"time",
|
"time",
|
||||||
"rand",
|
|
||||||
"srand",
|
|
||||||
"wmemmove",
|
|
||||||
"tan",
|
|
||||||
"tolower",
|
|
||||||
"fwprintf",
|
|
||||||
"towlower",
|
|
||||||
"wcstombs",
|
|
||||||
"printf",
|
|
||||||
"fprintf",
|
|
||||||
"strchr",
|
|
||||||
"strrchr",
|
|
||||||
"wmemcpy",
|
|
||||||
"fread",
|
|
||||||
"getwchar",
|
|
||||||
"putwchar",
|
|
||||||
"longjmp",
|
|
||||||
"memcpy",
|
|
||||||
"wcsxfrm",
|
|
||||||
"wcscspn",
|
|
||||||
"getc",
|
|
||||||
"putc",
|
|
||||||
"getwc",
|
|
||||||
"putwc",
|
|
||||||
"wcscpy",
|
|
||||||
"wcsncpy",
|
|
||||||
"wcslen",
|
|
||||||
"floor",
|
|
||||||
"setbuf",
|
|
||||||
"ungetc",
|
|
||||||
"rename",
|
|
||||||
"remove",
|
|
||||||
"gmtime",
|
|
||||||
"mktime",
|
|
||||||
"fgetc",
|
|
||||||
"fputc",
|
|
||||||
"fgetwc",
|
|
||||||
"fputwc",
|
|
||||||
"memcmp",
|
|
||||||
"iswctype",
|
|
||||||
"wmemcmp",
|
|
||||||
"ispunct",
|
|
||||||
"mbstowcs",
|
|
||||||
"wcscmp",
|
|
||||||
"mbsrtowcs",
|
|
||||||
"setlocale",
|
|
||||||
"wcsncmp",
|
|
||||||
"wcstoul",
|
|
||||||
"strtol",
|
|
||||||
"wcsftime",
|
|
||||||
"iswprint",
|
|
||||||
"wcspbrk",
|
|
||||||
"iswdigit",
|
|
||||||
"isprint",
|
|
||||||
"fclose",
|
|
||||||
"atof",
|
|
||||||
"islower",
|
|
||||||
"iswlower",
|
|
||||||
"ctime",
|
"ctime",
|
||||||
"wmemchr",
|
"wcstod",
|
||||||
"memchr",
|
"fwide",
|
||||||
"wctrans",
|
"wcscmp",
|
||||||
"strcat",
|
"wmemmove",
|
||||||
"getenv",
|
"strtod",
|
||||||
"strncat",
|
"fmod",
|
||||||
"iswxdigit",
|
|
||||||
"wcschr",
|
"wcschr",
|
||||||
"wcsrchr",
|
"wcsrchr",
|
||||||
"isxdigit",
|
"strcmp",
|
||||||
"vswprintf",
|
"wctype",
|
||||||
"raise",
|
"toupper",
|
||||||
"iswspace",
|
"towupper",
|
||||||
"vsprintf",
|
"strchr",
|
||||||
"vwprintf",
|
"strrchr",
|
||||||
"vprintf",
|
"wmemcmp",
|
||||||
"swscanf",
|
"iswctype",
|
||||||
"sinh",
|
"gmtime",
|
||||||
"tmpfile",
|
|
||||||
"asin",
|
|
||||||
"mblen",
|
|
||||||
"acos",
|
|
||||||
"mbrlen",
|
|
||||||
"cosh",
|
|
||||||
"difftime",
|
"difftime",
|
||||||
|
"btowc",
|
||||||
|
"iswprint",
|
||||||
|
"iswxdigit",
|
||||||
|
"cosh",
|
||||||
|
"memcmp",
|
||||||
|
"wmemchr",
|
||||||
|
"isupper",
|
||||||
|
"iswupper",
|
||||||
|
"iswdigit",
|
||||||
|
"memchr",
|
||||||
|
"isxdigit",
|
||||||
|
"wmemcpy",
|
||||||
|
"mbtowc",
|
||||||
|
"setbuf",
|
||||||
|
"mbstowcs",
|
||||||
|
"wcscpy",
|
||||||
"memmove",
|
"memmove",
|
||||||
"abs",
|
"vswprintf",
|
||||||
"tmpnam",
|
"acos",
|
||||||
"vfwprintf",
|
|
||||||
"setvbuf",
|
|
||||||
"vfprintf",
|
|
||||||
"scanf",
|
|
||||||
"sscanf",
|
|
||||||
"wscanf",
|
|
||||||
"fwscanf",
|
|
||||||
"ftell",
|
|
||||||
"fflush",
|
|
||||||
"atexit",
|
|
||||||
"iswcntrl",
|
|
||||||
"iscntrl",
|
|
||||||
"mbrtowc",
|
"mbrtowc",
|
||||||
"wcrtomb",
|
"wcrtomb",
|
||||||
"fabs",
|
"mbsrtowcs",
|
||||||
"wcstol",
|
"atof",
|
||||||
"strcoll",
|
"strcpy",
|
||||||
"atan2",
|
"setlocale",
|
||||||
"tanh",
|
|
||||||
"atan",
|
|
||||||
"fscanf",
|
|
||||||
"clock",
|
|
||||||
"getchar",
|
|
||||||
"putchar",
|
|
||||||
"abort",
|
|
||||||
"clearerr",
|
|
||||||
"wcscat",
|
"wcscat",
|
||||||
"wcsncat",
|
|
||||||
"isdigit",
|
"isdigit",
|
||||||
"isgraph",
|
"log10",
|
||||||
"iswgraph",
|
"tolower",
|
||||||
"btowc",
|
"floor",
|
||||||
|
"towlower",
|
||||||
|
"strcat",
|
||||||
|
"log",
|
||||||
|
"mktime",
|
||||||
|
"wcstoul",
|
||||||
|
"fseek",
|
||||||
|
"memcpy",
|
||||||
|
"wcstok",
|
||||||
|
"strtoul",
|
||||||
|
"wcscspn",
|
||||||
|
"islower",
|
||||||
"div",
|
"div",
|
||||||
|
"iswlower",
|
||||||
|
"atexit",
|
||||||
|
"strtok",
|
||||||
|
"setvbuf",
|
||||||
|
"strcspn",
|
||||||
"isspace",
|
"isspace",
|
||||||
"atol",
|
"iswspace",
|
||||||
"labs",
|
|
||||||
"ceil",
|
|
||||||
"mbtowc",
|
|
||||||
"wcscoll",
|
|
||||||
"wctob",
|
|
||||||
"asctime",
|
"asctime",
|
||||||
"iswalnum",
|
"wctob",
|
||||||
"isalnum",
|
"wcsncmp",
|
||||||
"mbsinit",
|
|
||||||
"atoi",
|
"atoi",
|
||||||
|
"ldexp",
|
||||||
|
"strncmp",
|
||||||
|
"wcspbrk",
|
||||||
"wctomb",
|
"wctomb",
|
||||||
|
"swprintf",
|
||||||
|
"sprintf",
|
||||||
|
"strpbrk",
|
||||||
|
"abs",
|
||||||
|
"fabs",
|
||||||
|
"wcsncpy",
|
||||||
|
"ispunct",
|
||||||
|
"iswpunct",
|
||||||
|
"strncpy",
|
||||||
|
"iswgraph",
|
||||||
|
"isprint",
|
||||||
|
"isgraph",
|
||||||
|
"wcscoll",
|
||||||
|
"wcstol",
|
||||||
|
"vsprintf",
|
||||||
|
"strcoll",
|
||||||
|
"strtol",
|
||||||
|
"sscanf",
|
||||||
|
"clearerr",
|
||||||
|
"swscanf",
|
||||||
|
"sinh",
|
||||||
|
"wcsncat",
|
||||||
|
"getenv",
|
||||||
|
"ceil",
|
||||||
|
"clock",
|
||||||
|
"wctrans",
|
||||||
|
"strncat",
|
||||||
"ldiv",
|
"ldiv",
|
||||||
"signal",
|
"iswcntrl",
|
||||||
"realloc",
|
"wcsspn",
|
||||||
|
"iscntrl",
|
||||||
|
"sin",
|
||||||
|
"strspn",
|
||||||
|
"mbsinit",
|
||||||
|
"longjmp",
|
||||||
|
"rand",
|
||||||
|
"srand",
|
||||||
|
"labs",
|
||||||
|
"tanh",
|
||||||
|
"calloc",
|
||||||
|
"atol",
|
||||||
"localtime",
|
"localtime",
|
||||||
|
"realloc",
|
||||||
|
"malloc",
|
||||||
|
"atan2",
|
||||||
|
"tan",
|
||||||
|
"wcslen",
|
||||||
|
"strlen",
|
||||||
"iswalpha",
|
"iswalpha",
|
||||||
"localeconv",
|
"localeconv",
|
||||||
|
"asin",
|
||||||
|
"iswalnum",
|
||||||
|
"isalnum",
|
||||||
"isalpha",
|
"isalpha",
|
||||||
"malloc",
|
"mblen",
|
||||||
"calloc"
|
"mbrlen",
|
||||||
|
"atan",
|
||||||
|
"signal"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const short lookup[] =
|
static const short lookup[] =
|
||||||
{
|
{
|
||||||
|
-1, -1, -1, 0, 1, -1, -1, -1,
|
||||||
|
-1, -1, -1, 2, -1, -1, -1, -1,
|
||||||
|
-1, 3, -1, -1, 4, -1, 5, 6,
|
||||||
|
7, -1, -1, -1, -1, 8, -1, -1,
|
||||||
|
-1, 9, 10, 11, -1, -1, 12, 13,
|
||||||
|
14, -1, 15, -1, 16, 17, 18, 19,
|
||||||
|
-1, 20, 21, 22, 23, 24, -1, -1,
|
||||||
|
-1, -1, 25, -1, 26, 27, -1, 28,
|
||||||
|
29, 30, -1, 31, 32, -1, 33, -1,
|
||||||
|
34, 35, 36, -1, 37, -1, -1, 38,
|
||||||
|
39, -1, -1, -1, 40, 41, -1, -1,
|
||||||
|
42, 43, 44, 45, 46, 47, -1, 48,
|
||||||
|
49, 50, 51, -1, 52, -1, -1, 53,
|
||||||
|
54, 55, 56, 57, -1, 58, 59, -273,
|
||||||
|
62, 63, -1, 64, -96, -2, 65, 66,
|
||||||
|
67, -1, 68, -1, 69, 70, 71, -1,
|
||||||
|
72, -1, -1, 73, -1, -1, -1, 74,
|
||||||
|
75, 76, -1, 77, -1, -1, 78, -1,
|
||||||
|
-1, 79, 80, 81, 82, 83, 84, 85,
|
||||||
|
-1, -1, 86, 87, 88, -1, 89, 90,
|
||||||
|
-1, 91, -1, 92, -1, 93, -1, -1,
|
||||||
|
-1, 94, -1, -1, 95, -1, 96, -1,
|
||||||
|
-1, -1, -1, 97, 98, 99, -1, 100,
|
||||||
|
-1, 101, 102, 103, -1, -1, -1, -1,
|
||||||
|
-1, 104, -1, 105, 106, -1, -1, -1,
|
||||||
|
-1, -1, 107, -1, -1, -1, -1, 108,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, 109, -1, -1, 110, -1, 111, -1,
|
||||||
|
-1, -1, -1, -1, 112, 113, -1, 114,
|
||||||
|
-1, 115, 116, 117, -1, 118, 119, 120,
|
||||||
|
-1, -1, 121, 122, -1, 123, -1, 124,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, 125,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, 0, 1, -1, 2, -1, -1,
|
-1, 126, 127, -1, -1, -1, 128, 129,
|
||||||
-1, -1, -1, 3, -1, 4, -1, -1,
|
-1, -1, -1, 130, 131, -1, -1, 132,
|
||||||
-1, -1, 5, -1, -1, -1, -1, -1,
|
133, 134, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, 6, -1, -1, -1, 7,
|
-1, -1, -1, -1, 135, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, 8, 9, 10, 11, -1,
|
|
||||||
-1, 12, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, 13, -1, -1, 14, -1,
|
|
||||||
-1, -1, -1, 15, -1, 16, -1, 17,
|
|
||||||
18, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, 19, 20, -1, -1, -1, 21, 22,
|
|
||||||
-1, 23, -1, 24, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, 25, -1, -1,
|
|
||||||
-1, -1, 26, 27, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, 28, -1, 29, 30,
|
|
||||||
-1, 31, 32, 33, -1, -1, -1, -1,
|
|
||||||
34, -1, 35, -1, 36, -1, -1, 37,
|
|
||||||
38, -1, -1, -1, -1, -1, -1, 39,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, 40, 41, 42, 43, -1, 44,
|
|
||||||
-1, -1, -1, 45, -1, -1, -1, -1,
|
|
||||||
-1, 46, 47, 48, -1, -1, -1, 49,
|
|
||||||
50, -1, -1, 51, -1, -1, 52, 53,
|
|
||||||
-1, -1, -1, -1, -1, 54, 55, -1,
|
|
||||||
-1, 56, 57, -1, -1, 58, -1, -1,
|
|
||||||
59, 60, 61, 62, -1, 63, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, 64, 65,
|
|
||||||
66, -1, -1, -1, -1, -1, 67, -1,
|
|
||||||
-1, -1, -1, 68, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, 69, 70, 71, 72,
|
|
||||||
-1, 73, 74, -1, 75, 76, 77, 78,
|
|
||||||
79, 80, 81, -1, 82, -1, 83, -1,
|
|
||||||
-1, 84, 85, 86, 87, 88, -1, 89,
|
|
||||||
-1, 90, -1, 91, -1, 92, -1, 93,
|
|
||||||
-1, -1, -1, -1, -1, 94, -1, -1,
|
|
||||||
-1, -1, -1, -1, 95, 96, -1, -1,
|
|
||||||
-1, -1, 97, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, 98, 99, 100, 101, 102, 103,
|
|
||||||
104, 105, -1, -1, -1, -1, -1, 106,
|
|
||||||
-1, 107, 108, -1, 109, -1, 110, -1,
|
|
||||||
-1, -1, -1, -1, 111, 112, -1, 113,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
114, -1, -1, 115, 116, -1, -1, 117,
|
|
||||||
-1, -1, 118, -1, 119, -1, 120, -1,
|
|
||||||
-1, 121, -1, 122, -1, -1, -1, 123,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, 124,
|
|
||||||
125, -1, 126, -1, -1, 127, -1, 128,
|
|
||||||
129, 130, -1, 131, 132, -1, 133, -1,
|
|
||||||
-1, -1, 134, -1, -1, -1, -1, 135,
|
|
||||||
136, 137, 138, -1, -1, -1, -1, 139,
|
|
||||||
140, 141, -1, 142, -1, 143, 144, 145,
|
|
||||||
-1, -1, 146, -1, 147, -1, -1, 148,
|
|
||||||
-1, 149, -1, -1, 150, -1, 151, -1,
|
|
||||||
-1, -1, 152, -1, -1, 153, -1, -1,
|
|
||||||
-1, 154, -1, -1, -1, 155, 156, 157,
|
|
||||||
158, -1, 159, -1, 160, -1, -1, -1,
|
|
||||||
-1, -1, 161, 162, 163, -1, -1, -1,
|
|
||||||
-1, -1, -1, -719, -1, 166, 167, -43,
|
|
||||||
-2, 168, -1, 169, -1, -1, -1, 170,
|
|
||||||
-1, -1, -1, 171, -1, -1, 172, -1,
|
|
||||||
-1, 173, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, 174, 175, -1,
|
|
||||||
-1, -1, -1, 176, -1, -1, -1, 177,
|
|
||||||
-1, -1, -1, -1, 178, -1, -1, 179,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, 180, 181, -1,
|
|
||||||
182, -1, -1, 183, -1, 184, 185, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, 186, -1, -1, -1, -1, 187,
|
136, -1, -1, -1, 137, 138, -1, -1,
|
||||||
|
-1, -1, 139, -1, 140, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, 141, -1, 142,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
188, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, 143, 144, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, 145, -1, -1, -1,
|
||||||
|
-1, -1, 146, -1, -1, -1, -1, -1,
|
||||||
|
-1, 147, 148, -1, -1, -1, -1, -1,
|
||||||
|
-1, 149, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, 189,
|
-1, -1, 150, -1, -1, -1, -1, -1,
|
||||||
190, -1, -1, -1, -1, 191, -1, -1,
|
-1, -1, -1, 151, -1, -1, -1, -1,
|
||||||
192, -1, -1, -1, -1, -1, 193, -1,
|
|
||||||
-1, -1, -1, -1, 194, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, 195, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, 196, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, 152, -1,
|
||||||
-1, 197, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, 153, -1,
|
||||||
198, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, 154, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, 199, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, 200, -1, -1, -1, -1, -1, 201,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, 155
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, 202, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, 203, -1,
|
|
||||||
-1, -1, -1, -1, -1, 204, -1, -1,
|
|
||||||
205, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, 206
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||||
|
|
|
@ -665,7 +665,7 @@ in the following sections.
|
||||||
@gccoptlist{-fcall-saved-@var{reg} -fcall-used-@var{reg} @gol
|
@gccoptlist{-fcall-saved-@var{reg} -fcall-used-@var{reg} @gol
|
||||||
-ffixed-@var{reg} -fexceptions @gol
|
-ffixed-@var{reg} -fexceptions @gol
|
||||||
-fnon-call-exceptions -funwind-tables @gol
|
-fnon-call-exceptions -funwind-tables @gol
|
||||||
-fasynchronous-unwind-tables -fforced-unwind-exceptions @gol
|
-fasynchronous-unwind-tables @gol
|
||||||
-finhibit-size-directive -finstrument-functions @gol
|
-finhibit-size-directive -finstrument-functions @gol
|
||||||
-fno-common -fno-ident -fno-gnu-linker @gol
|
-fno-common -fno-ident -fno-gnu-linker @gol
|
||||||
-fpcc-struct-return -fpic -fPIC @gol
|
-fpcc-struct-return -fpic -fPIC @gol
|
||||||
|
@ -10849,13 +10849,6 @@ instructions to throw exceptions, i.e.@: memory references or floating
|
||||||
point instructions. It does not allow exceptions to be thrown from
|
point instructions. It does not allow exceptions to be thrown from
|
||||||
arbitrary signal handlers such as @code{SIGALRM}.
|
arbitrary signal handlers such as @code{SIGALRM}.
|
||||||
|
|
||||||
@item -fforced-unwind-exceptions
|
|
||||||
@opindex fforced-unwind-exceptions
|
|
||||||
Generate code that checks for non-catchable exceptions derived from
|
|
||||||
@code{_Unwind_ForcedUnwind}, such as from @code{longjmp_unwind} or
|
|
||||||
from pthread cancellation. There is some amount of code-size
|
|
||||||
overhead associated with this, so it is not default.
|
|
||||||
|
|
||||||
@item -funwind-tables
|
@item -funwind-tables
|
||||||
@opindex funwind-tables
|
@opindex funwind-tables
|
||||||
Similar to @option{-fexceptions}, except that it will just generate any needed
|
Similar to @option{-fexceptions}, except that it will just generate any needed
|
||||||
|
|
149
gcc/except.c
149
gcc/except.c
|
@ -564,9 +564,7 @@ expand_eh_region_end_cleanup (handler)
|
||||||
|
|
||||||
emit_label (region->label);
|
emit_label (region->label);
|
||||||
|
|
||||||
if (flag_non_call_exceptions
|
if (flag_non_call_exceptions || region->may_contain_throw)
|
||||||
|| flag_forced_unwind_exceptions
|
|
||||||
|| region->may_contain_throw)
|
|
||||||
{
|
{
|
||||||
/* Give the language a chance to specify an action to be taken if an
|
/* Give the language a chance to specify an action to be taken if an
|
||||||
exception is thrown that would propagate out of the HANDLER. */
|
exception is thrown that would propagate out of the HANDLER. */
|
||||||
|
@ -1135,40 +1133,21 @@ convert_from_eh_region_ranges_1 (pinsns, orig_sp, cur)
|
||||||
}
|
}
|
||||||
else if (INSN_P (insn))
|
else if (INSN_P (insn))
|
||||||
{
|
{
|
||||||
rtx note;
|
if (cur > 0
|
||||||
switch (cur)
|
&& ! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
|
||||||
|
/* Calls can always potentially throw exceptions, unless
|
||||||
|
they have a REG_EH_REGION note with a value of 0 or less.
|
||||||
|
Which should be the only possible kind so far. */
|
||||||
|
&& (GET_CODE (insn) == CALL_INSN
|
||||||
|
/* If we wanted exceptions for non-call insns, then
|
||||||
|
any may_trap_p instruction could throw. */
|
||||||
|
|| (flag_non_call_exceptions
|
||||||
|
&& GET_CODE (PATTERN (insn)) != CLOBBER
|
||||||
|
&& GET_CODE (PATTERN (insn)) != USE
|
||||||
|
&& may_trap_p (PATTERN (insn)))))
|
||||||
{
|
{
|
||||||
default:
|
REG_NOTES (insn) = alloc_EXPR_LIST (REG_EH_REGION, GEN_INT (cur),
|
||||||
/* An existing region note may be present to suppress
|
|
||||||
exception handling. Anything with a note value of -1
|
|
||||||
cannot throw an exception of any kind. A note value
|
|
||||||
of 0 means that "normal" exceptions are suppressed,
|
|
||||||
but not necessarily "forced unwind" exceptions. */
|
|
||||||
note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
|
|
||||||
if (note)
|
|
||||||
{
|
|
||||||
if (flag_forced_unwind_exceptions
|
|
||||||
&& INTVAL (XEXP (note, 0)) >= 0)
|
|
||||||
XEXP (note, 0) = GEN_INT (cur);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calls can always potentially throw exceptions; if we wanted
|
|
||||||
exceptions for non-call insns, then any may_trap_p
|
|
||||||
instruction can throw. */
|
|
||||||
if (GET_CODE (insn) != CALL_INSN
|
|
||||||
&& (!flag_non_call_exceptions
|
|
||||||
|| GET_CODE (PATTERN (insn)) == CLOBBER
|
|
||||||
|| GET_CODE (PATTERN (insn)) == USE
|
|
||||||
|| !may_trap_p (PATTERN (insn))))
|
|
||||||
break;
|
|
||||||
|
|
||||||
REG_NOTES (insn) = alloc_EXPR_LIST (REG_EH_REGION,
|
|
||||||
GEN_INT (cur),
|
|
||||||
REG_NOTES (insn));
|
REG_NOTES (insn));
|
||||||
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GET_CODE (insn) == CALL_INSN
|
if (GET_CODE (insn) == CALL_INSN
|
||||||
|
@ -1727,14 +1706,7 @@ build_post_landing_pads ()
|
||||||
for (c = region->u.try.catch; c ; c = c->u.catch.next_catch)
|
for (c = region->u.try.catch; c ; c = c->u.catch.next_catch)
|
||||||
{
|
{
|
||||||
if (c->u.catch.type_list == NULL)
|
if (c->u.catch.type_list == NULL)
|
||||||
{
|
emit_jump (c->label);
|
||||||
if (flag_forced_unwind_exceptions)
|
|
||||||
emit_cmp_and_jump_insns
|
|
||||||
(cfun->eh->filter, const0_rtx, GT, NULL_RTX,
|
|
||||||
word_mode, 0, c->label);
|
|
||||||
else
|
|
||||||
emit_jump (c->label);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Need for one cmp/jump per type caught. Each type
|
/* Need for one cmp/jump per type caught. Each type
|
||||||
|
@ -1795,33 +1767,8 @@ build_post_landing_pads ()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ERT_CLEANUP:
|
case ERT_CLEANUP:
|
||||||
region->post_landing_pad = region->label;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ERT_MUST_NOT_THROW:
|
case ERT_MUST_NOT_THROW:
|
||||||
/* See maybe_remove_eh_handler about removing region->label. */
|
region->post_landing_pad = region->label;
|
||||||
if (flag_forced_unwind_exceptions && region->label)
|
|
||||||
{
|
|
||||||
region->post_landing_pad = gen_label_rtx ();
|
|
||||||
|
|
||||||
start_sequence ();
|
|
||||||
|
|
||||||
emit_label (region->post_landing_pad);
|
|
||||||
emit_cmp_and_jump_insns (cfun->eh->filter, const0_rtx, GT,
|
|
||||||
NULL_RTX, word_mode, 0, region->label);
|
|
||||||
|
|
||||||
region->resume
|
|
||||||
= emit_jump_insn (gen_rtx_RESX (VOIDmode,
|
|
||||||
region->region_number));
|
|
||||||
emit_barrier ();
|
|
||||||
|
|
||||||
seq = get_insns ();
|
|
||||||
end_sequence ();
|
|
||||||
|
|
||||||
emit_insn_before (seq, region->label);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
region->post_landing_pad = region->label;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ERT_CATCH:
|
case ERT_CATCH:
|
||||||
|
@ -2001,21 +1948,6 @@ sjlj_find_directly_reachable_regions (lp_info)
|
||||||
if (rc != RNL_NOT_CAUGHT)
|
if (rc != RNL_NOT_CAUGHT)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forced unwind exceptions aren't blocked. */
|
|
||||||
if (flag_forced_unwind_exceptions && rc == RNL_BLOCKED)
|
|
||||||
{
|
|
||||||
struct eh_region *r;
|
|
||||||
for (r = region->outer; r ; r = r->outer)
|
|
||||||
if (r->type == ERT_CLEANUP)
|
|
||||||
{
|
|
||||||
rc = RNL_MAYBE_CAUGHT;
|
|
||||||
if (! region->label)
|
|
||||||
region = r;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc == RNL_MAYBE_CAUGHT || rc == RNL_CAUGHT)
|
if (rc == RNL_MAYBE_CAUGHT || rc == RNL_CAUGHT)
|
||||||
{
|
{
|
||||||
lp_info[region->region_number].directly_reachable = 1;
|
lp_info[region->region_number].directly_reachable = 1;
|
||||||
|
@ -2854,21 +2786,7 @@ reachable_handlers (insn)
|
||||||
while (region)
|
while (region)
|
||||||
{
|
{
|
||||||
if (reachable_next_level (region, type_thrown, &info) >= RNL_CAUGHT)
|
if (reachable_next_level (region, type_thrown, &info) >= RNL_CAUGHT)
|
||||||
{
|
break;
|
||||||
/* Forced unwind exceptions are neither BLOCKED nor CAUGHT.
|
|
||||||
Make sure the cleanup regions are reachable. */
|
|
||||||
if (flag_forced_unwind_exceptions)
|
|
||||||
{
|
|
||||||
while ((region = region->outer) != NULL)
|
|
||||||
if (region->type == ERT_CLEANUP)
|
|
||||||
{
|
|
||||||
add_reachable_handler (&info, region, region);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we have processed one cleanup, there is no point in
|
/* If we have processed one cleanup, there is no point in
|
||||||
processing any more of them. Each cleanup will have an edge
|
processing any more of them. Each cleanup will have an edge
|
||||||
to the next outer cleanup region, so the flow graph will be
|
to the next outer cleanup region, so the flow graph will be
|
||||||
|
@ -2990,10 +2908,6 @@ can_throw_external (insn)
|
||||||
if (INTVAL (XEXP (note, 0)) <= 0)
|
if (INTVAL (XEXP (note, 0)) <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Forced unwind excptions are not catchable. */
|
|
||||||
if (flag_forced_unwind_exceptions && GET_CODE (insn) == CALL_INSN)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
region = cfun->eh->region_array[INTVAL (XEXP (note, 0))];
|
region = cfun->eh->region_array[INTVAL (XEXP (note, 0))];
|
||||||
|
|
||||||
type_thrown = NULL_TREE;
|
type_thrown = NULL_TREE;
|
||||||
|
@ -3348,26 +3262,12 @@ collect_one_action_chain (ar_hash, region)
|
||||||
{
|
{
|
||||||
if (c->u.catch.type_list == NULL)
|
if (c->u.catch.type_list == NULL)
|
||||||
{
|
{
|
||||||
int filter;
|
|
||||||
|
|
||||||
/* Forced exceptions run cleanups, always. Record them if
|
|
||||||
they exist. */
|
|
||||||
next = 0;
|
|
||||||
if (flag_forced_unwind_exceptions)
|
|
||||||
{
|
|
||||||
struct eh_region *r;
|
|
||||||
for (r = c->outer; r ; r = r->outer)
|
|
||||||
if (r->type == ERT_CLEANUP)
|
|
||||||
{
|
|
||||||
next = add_action_record (ar_hash, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Retrieve the filter from the head of the filter list
|
/* Retrieve the filter from the head of the filter list
|
||||||
where we have stored it (see assign_filter_values). */
|
where we have stored it (see assign_filter_values). */
|
||||||
filter = TREE_INT_CST_LOW (TREE_VALUE (c->u.catch.filter_list));
|
int filter
|
||||||
next = add_action_record (ar_hash, filter, next);
|
= TREE_INT_CST_LOW (TREE_VALUE (c->u.catch.filter_list));
|
||||||
|
|
||||||
|
next = add_action_record (ar_hash, filter, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3412,13 +3312,6 @@ collect_one_action_chain (ar_hash, region)
|
||||||
requires no call-site entry. Note that this differs from
|
requires no call-site entry. Note that this differs from
|
||||||
the no handler or cleanup case in that we do require an lsda
|
the no handler or cleanup case in that we do require an lsda
|
||||||
to be generated. Return a magic -2 value to record this. */
|
to be generated. Return a magic -2 value to record this. */
|
||||||
if (flag_forced_unwind_exceptions)
|
|
||||||
{
|
|
||||||
struct eh_region *r;
|
|
||||||
for (r = region->outer; r ; r = r->outer)
|
|
||||||
if (r->type == ERT_CLEANUP)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return -2;
|
return -2;
|
||||||
|
|
||||||
case ERT_CATCH:
|
case ERT_CATCH:
|
||||||
|
|
|
@ -475,10 +475,6 @@ extern int flag_unwind_tables;
|
||||||
|
|
||||||
extern int flag_asynchronous_unwind_tables;
|
extern int flag_asynchronous_unwind_tables;
|
||||||
|
|
||||||
/* Nonzero means allow for forced unwinding. */
|
|
||||||
|
|
||||||
extern int flag_forced_unwind_exceptions;
|
|
||||||
|
|
||||||
/* Nonzero means don't place uninitialized global data in common storage
|
/* Nonzero means don't place uninitialized global data in common storage
|
||||||
by default. */
|
by default. */
|
||||||
|
|
||||||
|
|
|
@ -181,6 +181,8 @@ GCC_3.3 {
|
||||||
_Unwind_FindEnclosingFunction
|
_Unwind_FindEnclosingFunction
|
||||||
_Unwind_GetCFA
|
_Unwind_GetCFA
|
||||||
_Unwind_Backtrace
|
_Unwind_Backtrace
|
||||||
|
_Unwind_Resume_or_Rethrow
|
||||||
|
_Unwind_SjLj_Resume_or_Rethrow
|
||||||
}
|
}
|
||||||
|
|
||||||
%inherit GCC_3.4 GCC_3.3
|
%inherit GCC_3.4 GCC_3.3
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
2003-05-07 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
PR c++/10570
|
||||||
|
* g++.dg/eh/forced1.C: Expect catch-all handlers to run.
|
||||||
|
Verify exception_cleanup not called for rethrows.
|
||||||
|
* g++.dg/eh/forced2.C: Test that exception_cleanup is called
|
||||||
|
when exiting catch block without rethrowing.
|
||||||
|
* g++.dg/eh/forced3.C: New.
|
||||||
|
* g++.dg/eh/forced4.C: New.
|
||||||
|
|
||||||
2003-05-07 Aldy Hernandez <aldyh@redhat.com>
|
2003-05-07 Aldy Hernandez <aldyh@redhat.com>
|
||||||
|
|
||||||
* gcc.dg/20030505.c: Fix triplet.
|
* gcc.dg/20030505.c: Fix triplet.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// { dg-do run }
|
// { dg-do run }
|
||||||
// { dg-options "-fforced-unwind-exceptions" }
|
|
||||||
|
|
||||||
// Test that forced unwinding runs all cleanups, and only cleanups.
|
// Test that forced unwinding runs all cleanups. Also tests that
|
||||||
|
// rethrowing doesn't call the exception object destructor.
|
||||||
|
|
||||||
#include <unwind.h>
|
#include <unwind.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -17,7 +17,7 @@ force_unwind_stop (int version, _Unwind_Action actions,
|
||||||
{
|
{
|
||||||
if (actions & _UA_END_OF_STACK)
|
if (actions & _UA_END_OF_STACK)
|
||||||
{
|
{
|
||||||
if (test != 5)
|
if (test != 15)
|
||||||
abort ();
|
abort ();
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
@ -25,18 +25,24 @@ force_unwind_stop (int version, _Unwind_Action actions,
|
||||||
return _URC_NO_REASON;
|
return _URC_NO_REASON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
force_unwind_cleanup (_Unwind_Reason_Code, struct _Unwind_Exception *)
|
||||||
|
{
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
static void force_unwind ()
|
static void force_unwind ()
|
||||||
{
|
{
|
||||||
_Unwind_Exception *exc = new _Unwind_Exception;
|
_Unwind_Exception *exc = new _Unwind_Exception;
|
||||||
exc->exception_class = 0;
|
exc->exception_class = 0;
|
||||||
exc->exception_cleanup = 0;
|
exc->exception_cleanup = force_unwind_cleanup;
|
||||||
|
|
||||||
#ifndef __USING_SJLJ_EXCEPTIONS__
|
#ifndef __USING_SJLJ_EXCEPTIONS__
|
||||||
_Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
_Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
#else
|
#else
|
||||||
_Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
|
_Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,18 +64,17 @@ static void doit ()
|
||||||
|
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
test |= 2;
|
test |= 2;
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
test |= 8;
|
test |= 8;
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
try {
|
doit ();
|
||||||
doit ();
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
// { dg-do run }
|
// { dg-do run }
|
||||||
// { dg-options "-fforced-unwind-exceptions" }
|
|
||||||
|
|
||||||
// Test that forced unwinding runs all cleanups, and only cleanups.
|
// Test that leaving the catch block without rethrowing
|
||||||
|
// does call the exception object destructor.
|
||||||
|
|
||||||
#include <unwind.h>
|
#include <unwind.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
static int test = 0;
|
|
||||||
|
|
||||||
static _Unwind_Reason_Code
|
static _Unwind_Reason_Code
|
||||||
force_unwind_stop (int version, _Unwind_Action actions,
|
force_unwind_stop (int version, _Unwind_Action actions,
|
||||||
_Unwind_Exception_Class exc_class,
|
_Unwind_Exception_Class exc_class,
|
||||||
|
@ -16,24 +14,22 @@ force_unwind_stop (int version, _Unwind_Action actions,
|
||||||
void *stop_parameter)
|
void *stop_parameter)
|
||||||
{
|
{
|
||||||
if (actions & _UA_END_OF_STACK)
|
if (actions & _UA_END_OF_STACK)
|
||||||
{
|
abort ();
|
||||||
if (test != 5)
|
|
||||||
abort ();
|
|
||||||
exit (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
return _URC_NO_REASON;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that neither the noreturn nor the nothrow specification
|
static void
|
||||||
// affects forced unwinding.
|
force_unwind_cleanup (_Unwind_Reason_Code, struct _Unwind_Exception *)
|
||||||
|
{
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
static void __attribute__((noreturn))
|
static void
|
||||||
force_unwind () throw()
|
force_unwind ()
|
||||||
{
|
{
|
||||||
_Unwind_Exception *exc = new _Unwind_Exception;
|
_Unwind_Exception *exc = new _Unwind_Exception;
|
||||||
exc->exception_class = 0;
|
exc->exception_class = 0;
|
||||||
exc->exception_cleanup = 0;
|
exc->exception_cleanup = force_unwind_cleanup;
|
||||||
|
|
||||||
#ifndef __USING_SJLJ_EXCEPTIONS__
|
#ifndef __USING_SJLJ_EXCEPTIONS__
|
||||||
_Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
_Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
|
@ -44,47 +40,10 @@ force_unwind () throw()
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct S
|
|
||||||
{
|
|
||||||
int bit;
|
|
||||||
S(int b) : bit(b) { }
|
|
||||||
~S() { test |= bit; }
|
|
||||||
};
|
|
||||||
|
|
||||||
static void doit_3 ()
|
|
||||||
{
|
|
||||||
S one(1);
|
|
||||||
force_unwind ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doit_2 ()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
doit_3 ();
|
|
||||||
} catch (...) {
|
|
||||||
test |= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doit_1 ()
|
|
||||||
{
|
|
||||||
S four(4);
|
|
||||||
doit_2 ();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doit ()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
doit_1 ();
|
|
||||||
} catch(...) {
|
|
||||||
test |= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
doit ();
|
force_unwind ();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
abort ();
|
abort ();
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
// { dg-do run }
|
||||||
|
|
||||||
|
// Test that forced unwinding calls std::unexpected going
|
||||||
|
// throw a nothrow function.
|
||||||
|
|
||||||
|
#include <unwind.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
static _Unwind_Reason_Code
|
||||||
|
force_unwind_stop (int version, _Unwind_Action actions,
|
||||||
|
_Unwind_Exception_Class exc_class,
|
||||||
|
struct _Unwind_Exception *exc_obj,
|
||||||
|
struct _Unwind_Context *context,
|
||||||
|
void *stop_parameter)
|
||||||
|
{
|
||||||
|
if (actions & _UA_END_OF_STACK)
|
||||||
|
abort ();
|
||||||
|
return _URC_NO_REASON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __attribute__((noreturn))
|
||||||
|
force_unwind ()
|
||||||
|
{
|
||||||
|
_Unwind_Exception *exc = new _Unwind_Exception;
|
||||||
|
exc->exception_class = 0;
|
||||||
|
exc->exception_cleanup = 0;
|
||||||
|
|
||||||
|
#ifndef __USING_SJLJ_EXCEPTIONS__
|
||||||
|
_Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
|
#else
|
||||||
|
_Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_unexpected ()
|
||||||
|
{
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
doit () throw()
|
||||||
|
{
|
||||||
|
force_unwind ();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::set_unexpected (handle_unexpected);
|
||||||
|
doit ();
|
||||||
|
abort ();
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
// { dg-do run }
|
||||||
|
|
||||||
|
// Test that forced unwinding does not call std::unexpected going
|
||||||
|
// throw a function with a non-empty exception spec.
|
||||||
|
|
||||||
|
#include <unwind.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static _Unwind_Reason_Code
|
||||||
|
force_unwind_stop (int version, _Unwind_Action actions,
|
||||||
|
_Unwind_Exception_Class exc_class,
|
||||||
|
struct _Unwind_Exception *exc_obj,
|
||||||
|
struct _Unwind_Context *context,
|
||||||
|
void *stop_parameter)
|
||||||
|
{
|
||||||
|
if (actions & _UA_END_OF_STACK)
|
||||||
|
abort ();
|
||||||
|
return _URC_NO_REASON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __attribute__((noreturn))
|
||||||
|
force_unwind ()
|
||||||
|
{
|
||||||
|
_Unwind_Exception *exc = new _Unwind_Exception;
|
||||||
|
exc->exception_class = 0;
|
||||||
|
exc->exception_cleanup = 0;
|
||||||
|
|
||||||
|
#ifndef __USING_SJLJ_EXCEPTIONS__
|
||||||
|
_Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
|
#else
|
||||||
|
_Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
doit () throw(int)
|
||||||
|
{
|
||||||
|
force_unwind ();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
doit ();
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -740,10 +740,6 @@ int flag_unwind_tables = 0;
|
||||||
|
|
||||||
int flag_asynchronous_unwind_tables = 0;
|
int flag_asynchronous_unwind_tables = 0;
|
||||||
|
|
||||||
/* Nonzero means allow for forced unwinding. */
|
|
||||||
|
|
||||||
int flag_forced_unwind_exceptions;
|
|
||||||
|
|
||||||
/* Nonzero means don't place uninitialized global data in common storage
|
/* Nonzero means don't place uninitialized global data in common storage
|
||||||
by default. */
|
by default. */
|
||||||
|
|
||||||
|
@ -1128,8 +1124,6 @@ static const lang_independent_options f_options[] =
|
||||||
N_("Generate unwind tables exact at each instruction boundary") },
|
N_("Generate unwind tables exact at each instruction boundary") },
|
||||||
{"non-call-exceptions", &flag_non_call_exceptions, 1,
|
{"non-call-exceptions", &flag_non_call_exceptions, 1,
|
||||||
N_("Support synchronous non-call exceptions") },
|
N_("Support synchronous non-call exceptions") },
|
||||||
{"forced-unwind-exceptions", &flag_forced_unwind_exceptions, 1,
|
|
||||||
N_("Support forced unwinding, e.g. for thread cancellation") },
|
|
||||||
{"profile-arcs", &profile_arc_flag, 1,
|
{"profile-arcs", &profile_arc_flag, 1,
|
||||||
N_("Insert arc based program profiling code") },
|
N_("Insert arc based program profiling code") },
|
||||||
{"test-coverage", &flag_test_coverage, 1,
|
{"test-coverage", &flag_test_coverage, 1,
|
||||||
|
|
|
@ -285,6 +285,7 @@ uw_identify_context (struct _Unwind_Context *context)
|
||||||
#define _Unwind_RaiseException _Unwind_SjLj_RaiseException
|
#define _Unwind_RaiseException _Unwind_SjLj_RaiseException
|
||||||
#define _Unwind_ForcedUnwind _Unwind_SjLj_ForcedUnwind
|
#define _Unwind_ForcedUnwind _Unwind_SjLj_ForcedUnwind
|
||||||
#define _Unwind_Resume _Unwind_SjLj_Resume
|
#define _Unwind_Resume _Unwind_SjLj_Resume
|
||||||
|
#define _Unwind_Resume_or_Rethrow _Unwind_SjLj_Resume_or_Rethrow
|
||||||
|
|
||||||
#include "unwind.inc"
|
#include "unwind.inc"
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,10 @@ extern void _Unwind_DeleteException (struct _Unwind_Exception *);
|
||||||
e.g. executing cleanup code, and not to implement rethrowing. */
|
e.g. executing cleanup code, and not to implement rethrowing. */
|
||||||
extern void _Unwind_Resume (struct _Unwind_Exception *);
|
extern void _Unwind_Resume (struct _Unwind_Exception *);
|
||||||
|
|
||||||
|
/* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow
|
||||||
|
a normal exception that was handled. */
|
||||||
|
extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *);
|
||||||
|
|
||||||
/* @@@ Use unwind data to perform a stack backtrace. The trace callback
|
/* @@@ Use unwind data to perform a stack backtrace. The trace callback
|
||||||
is called for every stack frame in the call chain, but no cleanup
|
is called for every stack frame in the call chain, but no cleanup
|
||||||
actions are performed. */
|
actions are performed. */
|
||||||
|
@ -184,6 +188,7 @@ extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException
|
||||||
extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind
|
extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind
|
||||||
(struct _Unwind_Exception *, _Unwind_Stop_Fn, void *);
|
(struct _Unwind_Exception *, _Unwind_Stop_Fn, void *);
|
||||||
extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *);
|
extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *);
|
||||||
|
extern _Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *);
|
||||||
|
|
||||||
/* @@@ The following provide access to the base addresses for text
|
/* @@@ The following provide access to the base addresses for text
|
||||||
and data-relative addressing in the LDSA. In order to stay link
|
and data-relative addressing in the LDSA. In order to stay link
|
||||||
|
|
|
@ -232,12 +232,40 @@ _Unwind_Resume (struct _Unwind_Exception *exc)
|
||||||
uw_install_context (&this_context, &cur_context);
|
uw_install_context (&this_context, &cur_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Resume propagation of an FORCE_UNWIND exception, or to rethrow
|
||||||
|
a normal exception that was handled. */
|
||||||
|
|
||||||
|
_Unwind_Reason_Code
|
||||||
|
_Unwind_Resume_or_Rethrow (struct _Unwind_Exception *exc)
|
||||||
|
{
|
||||||
|
struct _Unwind_Context this_context, cur_context;
|
||||||
|
_Unwind_Reason_Code code;
|
||||||
|
|
||||||
|
/* Choose between continuing to process _Unwind_RaiseException
|
||||||
|
or _Unwind_ForcedUnwind. */
|
||||||
|
if (exc->private_1 == 0)
|
||||||
|
return _Unwind_RaiseException (exc);
|
||||||
|
|
||||||
|
uw_init_context (&this_context);
|
||||||
|
cur_context = this_context;
|
||||||
|
|
||||||
|
code = _Unwind_ForcedUnwind_Phase2 (exc, &cur_context);
|
||||||
|
|
||||||
|
if (code != _URC_INSTALL_CONTEXT)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
uw_install_context (&this_context, &cur_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* A convenience function that calls the exception_cleanup field. */
|
/* A convenience function that calls the exception_cleanup field. */
|
||||||
|
|
||||||
void
|
void
|
||||||
_Unwind_DeleteException (struct _Unwind_Exception *exc)
|
_Unwind_DeleteException (struct _Unwind_Exception *exc)
|
||||||
{
|
{
|
||||||
(*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
|
if (exc->exception_cleanup)
|
||||||
|
(*exc->exception_cleanup) (_URC_FOREIGN_EXCEPTION_CAUGHT, exc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -274,4 +302,3 @@ _Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument)
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
2003-05-07 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
|
PR c++/10570
|
||||||
|
* libsupc++/eh_catch.cc (__cxa_begin_catch): Handle foreign exceptions.
|
||||||
|
(__cxa_end_catch): Likewise.
|
||||||
|
* libsupc++/eh_throw.cc (__cxa_rethrow): Likewise. Use
|
||||||
|
_Unwind_Resume_or_Rethrow.
|
||||||
|
* libsupc++/eh_personality.cc (empty_exception_spec): New.
|
||||||
|
(PERSONALITY_FUNCTION): Don't ignore terminate or catch-all
|
||||||
|
for _UA_FORCE_UNWIND. Honor empty filter spec for foreign
|
||||||
|
exceptions. Don't push terminate/unexpected to cxa functions.
|
||||||
|
(__cxa_call_unexpected): Remove foreign exception fixmes.
|
||||||
|
|
||||||
2003-05-07 Benjamin Kosnik <bkoz@redhat.com>
|
2003-05-07 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
|
|
||||||
* testsuite/27_io/ios_base/cons: New.
|
* testsuite/27_io/ios_base/cons: New.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- C++ -*- Exception handling routines for catching.
|
// -*- C++ -*- Exception handling routines for catching.
|
||||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
// Copyright (C) 2001, 2003 Free Software Foundation, Inc.
|
||||||
//
|
//
|
||||||
// This file is part of GNU CC.
|
// This file is part of GNU CC.
|
||||||
//
|
//
|
||||||
|
@ -39,15 +39,28 @@ __cxa_begin_catch (void *exc_obj_in)
|
||||||
{
|
{
|
||||||
_Unwind_Exception *exceptionObject
|
_Unwind_Exception *exceptionObject
|
||||||
= reinterpret_cast <_Unwind_Exception *>(exc_obj_in);
|
= reinterpret_cast <_Unwind_Exception *>(exc_obj_in);
|
||||||
|
|
||||||
// ??? Foreign exceptions can't be stacked here, and there doesn't
|
|
||||||
// appear to be any place to store for __cxa_end_catch to destroy.
|
|
||||||
|
|
||||||
__cxa_exception *header = __get_exception_header_from_ue (exceptionObject);
|
|
||||||
__cxa_eh_globals *globals = __cxa_get_globals ();
|
__cxa_eh_globals *globals = __cxa_get_globals ();
|
||||||
__cxa_exception *prev = globals->caughtExceptions;
|
__cxa_exception *prev = globals->caughtExceptions;
|
||||||
int count = header->handlerCount;
|
__cxa_exception *header = __get_exception_header_from_ue (exceptionObject);
|
||||||
|
|
||||||
|
// Foreign exceptions can't be stacked here. If the exception stack is
|
||||||
|
// empty, then fine. Otherwise we really have no choice but to terminate.
|
||||||
|
// Note that this use of "header" is a lie. It's fine so long as we only
|
||||||
|
// examine header->unwindHeader though.
|
||||||
|
if (header->unwindHeader.exception_class != __gxx_exception_class)
|
||||||
|
{
|
||||||
|
if (prev != 0)
|
||||||
|
std::terminate ();
|
||||||
|
|
||||||
|
// Remember for end_catch and rethrow.
|
||||||
|
globals->caughtExceptions = header;
|
||||||
|
|
||||||
|
// ??? No sensible value to return; we don't know what the
|
||||||
|
// object is, much less where it is in relation to the header.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = header->handlerCount;
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
// This exception was rethrown from an immediately enclosing region.
|
// This exception was rethrown from an immediately enclosing region.
|
||||||
count = -count + 1;
|
count = -count + 1;
|
||||||
|
@ -71,8 +84,22 @@ __cxa_end_catch ()
|
||||||
{
|
{
|
||||||
__cxa_eh_globals *globals = __cxa_get_globals_fast ();
|
__cxa_eh_globals *globals = __cxa_get_globals_fast ();
|
||||||
__cxa_exception *header = globals->caughtExceptions;
|
__cxa_exception *header = globals->caughtExceptions;
|
||||||
int count = header->handlerCount;
|
|
||||||
|
|
||||||
|
// A rethrow of a foreign exception will be removed from the
|
||||||
|
// the exception stack immediately by __cxa_rethrow.
|
||||||
|
if (!header)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// A foreign exception couldn't have been stacked (see above),
|
||||||
|
// so by definition processing must be complete.
|
||||||
|
if (header->unwindHeader.exception_class != __gxx_exception_class)
|
||||||
|
{
|
||||||
|
globals->caughtExceptions = 0;
|
||||||
|
_Unwind_DeleteException (&header->unwindHeader);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = header->handlerCount;
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
{
|
{
|
||||||
// This exception was rethrown. Decrement the (inverted) catch
|
// This exception was rethrown. Decrement the (inverted) catch
|
||||||
|
@ -92,7 +119,7 @@ __cxa_end_catch ()
|
||||||
}
|
}
|
||||||
else if (count < 0)
|
else if (count < 0)
|
||||||
// A bug in the exception handling library or compiler.
|
// A bug in the exception handling library or compiler.
|
||||||
std::abort ();
|
std::terminate ();
|
||||||
|
|
||||||
header->handlerCount = count;
|
header->handlerCount = count;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- C++ -*- The GNU C++ exception personality routine.
|
// -*- C++ -*- The GNU C++ exception personality routine.
|
||||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||||
//
|
//
|
||||||
// This file is part of GNU CC.
|
// This file is part of GNU CC.
|
||||||
//
|
//
|
||||||
|
@ -124,6 +124,8 @@ get_adjusted_ptr (const std::type_info *catch_type,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return true if THROW_TYPE matches one if the filter types.
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
check_exception_spec (lsda_header_info *info, const std::type_info *throw_type,
|
check_exception_spec (lsda_header_info *info, const std::type_info *throw_type,
|
||||||
void *thrown_ptr, _Unwind_Sword filter_value)
|
void *thrown_ptr, _Unwind_Sword filter_value)
|
||||||
|
@ -154,6 +156,18 @@ check_exception_spec (lsda_header_info *info, const std::type_info *throw_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return true if the filter spec is empty, ie throw().
|
||||||
|
|
||||||
|
static bool
|
||||||
|
empty_exception_spec (lsda_header_info *info, _Unwind_Sword filter_value)
|
||||||
|
{
|
||||||
|
const unsigned char *e = info->TType - filter_value - 1;
|
||||||
|
_Unwind_Word tmp;
|
||||||
|
|
||||||
|
e = read_uleb128 (e, &tmp);
|
||||||
|
return tmp == 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Using a different personality function name causes link failures
|
// Using a different personality function name causes link failures
|
||||||
// when trying to mix code using different exception handling models.
|
// when trying to mix code using different exception handling models.
|
||||||
#ifdef _GLIBCPP_SJLJ_EXCEPTIONS
|
#ifdef _GLIBCPP_SJLJ_EXCEPTIONS
|
||||||
|
@ -197,6 +211,7 @@ PERSONALITY_FUNCTION (int version,
|
||||||
&& exception_class == __gxx_exception_class)
|
&& exception_class == __gxx_exception_class)
|
||||||
{
|
{
|
||||||
handler_switch_value = xh->handlerSwitchValue;
|
handler_switch_value = xh->handlerSwitchValue;
|
||||||
|
language_specific_data = xh->languageSpecificData;
|
||||||
landing_pad = (_Unwind_Ptr) xh->catchTemp;
|
landing_pad = (_Unwind_Ptr) xh->catchTemp;
|
||||||
found_type = (landing_pad == 0 ? found_terminate : found_handler);
|
found_type = (landing_pad == 0 ? found_terminate : found_handler);
|
||||||
goto install_context;
|
goto install_context;
|
||||||
|
@ -275,7 +290,7 @@ PERSONALITY_FUNCTION (int version,
|
||||||
// If ip is not present in the table, call terminate. This is for
|
// If ip is not present in the table, call terminate. This is for
|
||||||
// a destructor inside a cleanup, or a library routine the compiler
|
// a destructor inside a cleanup, or a library routine the compiler
|
||||||
// was not expecting to throw.
|
// was not expecting to throw.
|
||||||
found_type = (actions & _UA_FORCE_UNWIND ? found_nothing : found_terminate);
|
found_type = found_terminate;
|
||||||
goto do_something;
|
goto do_something;
|
||||||
|
|
||||||
found_something:
|
found_something:
|
||||||
|
@ -327,23 +342,15 @@ PERSONALITY_FUNCTION (int version,
|
||||||
// Positive filter values are handlers.
|
// Positive filter values are handlers.
|
||||||
catch_type = get_ttype_entry (&info, ar_filter);
|
catch_type = get_ttype_entry (&info, ar_filter);
|
||||||
|
|
||||||
// Null catch type is a catch-all handler. We can catch
|
// Null catch type is a catch-all handler; we can catch foreign
|
||||||
// foreign exceptions with this.
|
// exceptions with this. Otherwise we must match types.
|
||||||
if (! catch_type)
|
if (! catch_type
|
||||||
|
|| (throw_type
|
||||||
|
&& get_adjusted_ptr (catch_type, throw_type,
|
||||||
|
&thrown_ptr)))
|
||||||
{
|
{
|
||||||
if (!(actions & _UA_FORCE_UNWIND))
|
saw_handler = true;
|
||||||
{
|
break;
|
||||||
saw_handler = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (throw_type)
|
|
||||||
{
|
|
||||||
if (get_adjusted_ptr (catch_type, throw_type, &thrown_ptr))
|
|
||||||
{
|
|
||||||
saw_handler = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -352,9 +359,12 @@ PERSONALITY_FUNCTION (int version,
|
||||||
// ??? How do foreign exceptions fit in? As far as I can
|
// ??? How do foreign exceptions fit in? As far as I can
|
||||||
// see we can't match because there's no __cxa_exception
|
// see we can't match because there's no __cxa_exception
|
||||||
// object to stuff bits in for __cxa_call_unexpected to use.
|
// object to stuff bits in for __cxa_call_unexpected to use.
|
||||||
|
// Allow them iff the exception spec is non-empty. I.e.
|
||||||
|
// a throw() specification results in __unexpected.
|
||||||
if (throw_type
|
if (throw_type
|
||||||
&& ! check_exception_spec (&info, throw_type, thrown_ptr,
|
? ! check_exception_spec (&info, throw_type, thrown_ptr,
|
||||||
ar_filter))
|
ar_filter)
|
||||||
|
: empty_exception_spec (&info, ar_filter))
|
||||||
{
|
{
|
||||||
saw_handler = true;
|
saw_handler = true;
|
||||||
break;
|
break;
|
||||||
|
@ -400,19 +410,37 @@ PERSONALITY_FUNCTION (int version,
|
||||||
}
|
}
|
||||||
|
|
||||||
install_context:
|
install_context:
|
||||||
if (found_type == found_terminate)
|
// We can't use any of the cxa routines with foreign exceptions,
|
||||||
|
// because they all expect ue_header to be a struct __cxa_exception.
|
||||||
|
// So in that case, call terminate or unexpected directly.
|
||||||
|
if ((actions & _UA_FORCE_UNWIND)
|
||||||
|
|| exception_class != __gxx_exception_class)
|
||||||
{
|
{
|
||||||
__cxa_begin_catch (&xh->unwindHeader);
|
if (found_type == found_terminate)
|
||||||
__terminate (xh->terminateHandler);
|
std::terminate ();
|
||||||
|
else if (handler_switch_value < 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{ std::unexpected (); }
|
||||||
|
catch(...)
|
||||||
|
{ std::terminate (); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// Cache the TType base value for __cxa_call_unexpected, as we won't
|
|
||||||
// have an _Unwind_Context then.
|
|
||||||
if (handler_switch_value < 0)
|
|
||||||
{
|
{
|
||||||
parse_lsda_header (context, xh->languageSpecificData, &info);
|
if (found_type == found_terminate)
|
||||||
xh->catchTemp = base_of_encoded_value (info.ttype_encoding,
|
{
|
||||||
context);
|
__cxa_begin_catch (&xh->unwindHeader);
|
||||||
|
__terminate (xh->terminateHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache the TType base value for __cxa_call_unexpected, as we won't
|
||||||
|
// have an _Unwind_Context then.
|
||||||
|
if (handler_switch_value < 0)
|
||||||
|
{
|
||||||
|
parse_lsda_header (context, language_specific_data, &info);
|
||||||
|
xh->catchTemp = base_of_encoded_value (info.ttype_encoding, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_Unwind_SetGR (context, __builtin_eh_return_data_regno (0),
|
_Unwind_SetGR (context, __builtin_eh_return_data_regno (0),
|
||||||
|
@ -457,20 +485,19 @@ __cxa_call_unexpected (void *exc_obj_in)
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
// Get the exception thrown from unexpected.
|
// Get the exception thrown from unexpected.
|
||||||
// ??? Foreign exceptions can't be stacked this way.
|
|
||||||
|
|
||||||
__cxa_eh_globals *globals = __cxa_get_globals_fast ();
|
__cxa_eh_globals *globals = __cxa_get_globals_fast ();
|
||||||
__cxa_exception *new_xh = globals->caughtExceptions;
|
__cxa_exception *new_xh = globals->caughtExceptions;
|
||||||
void *new_ptr = new_xh + 1;
|
void *new_ptr = new_xh + 1;
|
||||||
|
|
||||||
// We don't quite have enough stuff cached; re-parse the LSDA.
|
// We don't quite have enough stuff cached; re-parse the LSDA.
|
||||||
parse_lsda_header (0, xh_lsda, &info);
|
parse_lsda_header (0, xh_lsda, &info);
|
||||||
|
|
||||||
// If this new exception meets the exception spec, allow it.
|
// If this new exception meets the exception spec, allow it.
|
||||||
if (check_exception_spec (&info, new_xh->exceptionType,
|
if (check_exception_spec (&info, new_xh->exceptionType,
|
||||||
new_ptr, xh_switch_value))
|
new_ptr, xh_switch_value))
|
||||||
__throw_exception_again;
|
__throw_exception_again;
|
||||||
|
|
||||||
// If the exception spec allows std::bad_exception, throw that.
|
// If the exception spec allows std::bad_exception, throw that.
|
||||||
// We don't have a thrown object to compare against, but since
|
// We don't have a thrown object to compare against, but since
|
||||||
// bad_exception doesn't have virtual bases, that's OK; just pass 0.
|
// bad_exception doesn't have virtual bases, that's OK; just pass 0.
|
||||||
|
@ -479,6 +506,7 @@ __cxa_call_unexpected (void *exc_obj_in)
|
||||||
if (check_exception_spec (&info, &bad_exc, 0, xh_switch_value))
|
if (check_exception_spec (&info, &bad_exc, 0, xh_switch_value))
|
||||||
throw std::bad_exception();
|
throw std::bad_exception();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Otherwise, die.
|
// Otherwise, die.
|
||||||
__terminate (xh_terminate_handler);
|
__terminate (xh_terminate_handler);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// -*- C++ -*- Exception handling routines for throwing.
|
// -*- C++ -*- Exception handling routines for throwing.
|
||||||
// Copyright (C) 2001 Free Software Foundation, Inc.
|
// Copyright (C) 2001, 2003 Free Software Foundation, Inc.
|
||||||
//
|
//
|
||||||
// This file is part of GNU CC.
|
// This file is part of GNU CC.
|
||||||
//
|
//
|
||||||
|
@ -90,12 +90,15 @@ __cxa_rethrow ()
|
||||||
if (header)
|
if (header)
|
||||||
{
|
{
|
||||||
// Tell __cxa_end_catch this is a rethrow.
|
// Tell __cxa_end_catch this is a rethrow.
|
||||||
header->handlerCount = -header->handlerCount;
|
if (header->unwindHeader.exception_class != __gxx_exception_class)
|
||||||
|
globals->caughtExceptions = 0;
|
||||||
|
else
|
||||||
|
header->handlerCount = -header->handlerCount;
|
||||||
|
|
||||||
#ifdef _GLIBCPP_SJLJ_EXCEPTIONS
|
#ifdef _GLIBCPP_SJLJ_EXCEPTIONS
|
||||||
_Unwind_SjLj_RaiseException (&header->unwindHeader);
|
_Unwind_SjLj_Resume_or_Rethrow (&header->unwindHeader);
|
||||||
#else
|
#else
|
||||||
_Unwind_RaiseException (&header->unwindHeader);
|
_Unwind_Resume_or_Rethrow (&header->unwindHeader);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Some sort of unwinding error. Note that terminate is a handler.
|
// Some sort of unwinding error. Note that terminate is a handler.
|
||||||
|
|
Loading…
Reference in New Issue