From 34dcb2fb8181f38c6471c563dcc50f7cc7860dfc Mon Sep 17 00:00:00 2001
From: pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sun, 14 Aug 2005 02:01:52 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103073 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/testsuite/ChangeLog                       |  6 +++
 .../objc/execute/exceptions/finally-1.m       | 45 +++++++++++++++++++
 libobjc/ChangeLog                             |  6 +++
 libobjc/exception.c                           | 12 ++++-
 4 files changed, 67 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/objc/execute/exceptions/finally-1.m

diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5169ef64fdea..dff225171e74 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-08-13  Marcin Koziej  <creep@desk.pl>
+            Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR libobjc/22492
+	* execute/exceptions/finally-1.m: New test.
+
 2005-08-13  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	* objc.dg/nested-func-1.m: Move to ...
diff --git a/gcc/testsuite/objc/execute/exceptions/finally-1.m b/gcc/testsuite/objc/execute/exceptions/finally-1.m
new file mode 100644
index 000000000000..9d4c396393e5
--- /dev/null
+++ b/gcc/testsuite/objc/execute/exceptions/finally-1.m
@@ -0,0 +1,45 @@
+#include <objc/Object.h>
+
+int
+thrower_try_body()
+{
+        printf("Thrower try body\n");
+        return (0);
+}
+
+int
+finally_body()
+{
+        printf("Finally body\n");
+        return (0);
+}
+
+int
+thrower()
+{
+        @try
+        {
+                thrower_try_body();
+                @throw [Object new];
+        }
+        @finally
+        {
+                finally_body();
+        }       // <----- program aborts here.
+        return 0;
+}
+
+
+int 
+main(int ac, char *av[])
+{
+        @try
+        {
+                thrower();
+        }
+        @catch (id exc)
+        {
+                printf("Got exception of class %s\n", [[exc class] name]);
+                [exc free];
+        }
+}
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index ecd56859a85d..9f623b820817 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
 2005-08-13  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	* Makefile.in (extra_ldflags_libobjc): New.
diff --git a/libobjc/exception.c b/libobjc/exception.c
index cfce70c51e32..e34f34b4342c 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);
-- 
GitLab