diff options
author | Marcin Koziej <creep@desk.pl> | 2005-08-14 04:01:52 +0200 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2005-08-13 19:01:52 -0700 |
commit | ee1658f34360cd994f12c0bc525b714b2efe7bb8 (patch) | |
tree | 3986954b339cf4c36b639fae792976b61051eda5 /libobjc/exception.c | |
parent | 65045c09038446c48783fe7e30134d72c131a0b1 (diff) | |
download | gcc-ee1658f34360cd994f12c0bc525b714b2efe7bb8.tar.gz |
re PR libobjc/22492 ([PATCH] Abort after @finally: libobjc passing exception value instead of exception.)
libobjc/ChangeLog:
2005-08-13 Marcin Koziej <creep@desk.pl>
Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/22492
* exception.c (PERSONALITY_FUNCTION): Fix the PC with finally.
testsuite/ChangeLog:
2005-08-13 Marcin Koziej <creep@desk.pl>
Andrew Pinski <pinskia@physics.uc.edu>
PR libobjc/22492
* execute/exceptions/finally-1.m: New test.
Co-Authored-By: Andrew Pinski <pinskia@physics.uc.edu>
From-SVN: r103073
Diffstat (limited to 'libobjc/exception.c')
-rw-r--r-- | libobjc/exception.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libobjc/exception.c b/libobjc/exception.c index cfce70c51e3..e34f34b4342 100644 --- a/libobjc/exception.c +++ b/libobjc/exception.c @@ -165,7 +165,8 @@ PERSONALITY_FUNCTION (int version, const unsigned char *p; _Unwind_Ptr landing_pad, ip; int handler_switch_value; - int saw_cleanup, saw_handler; + int saw_cleanup = 0, saw_handler; + void *return_object; /* Interface version check. */ if (version != 1) @@ -334,8 +335,15 @@ PERSONALITY_FUNCTION (int version, } install_context: + if (saw_cleanup == 0) + { + return_object = xh->value; + if (!(actions & _UA_SEARCH_PHASE)) + _Unwind_DeleteException(&xh->base); + } + _Unwind_SetGR (context, __builtin_eh_return_data_regno (0), - __builtin_extend_pointer (xh->value)); + __builtin_extend_pointer (saw_cleanup ? xh : return_object)); _Unwind_SetGR (context, __builtin_eh_return_data_regno (1), handler_switch_value); _Unwind_SetIP (context, landing_pad); |