Patchwork [ObjC] fix objc.dg/exceptions2.m linkage error.

login
register
mail settings
Submitter IainS
Date Dec. 18, 2010, 11:35 a.m.
Message ID <0772A5AF-C08B-43B6-B3A9-2B1864CC208E@sandoe-acoustics.co.uk>
Download mbox | patch
Permalink /patch/76061/
State New
Headers show

Comments

IainS - Dec. 18, 2010, 11:35 a.m.
Hi Nicola,

On 17 Dec 2010, at 20:53, Mike Stump wrote:

> On Dec 17, 2010, at 6:34 AM, IainS <developer@sandoe- 
> acoustics.co.uk> wrote:
>> The NeXT runtime library names its m64 personality routine  
>> "___objc_personality_v0"
>>
>> So, in addition to the change to switch off sjlj exceptions (which  
>> causes linkage errors for the absent sjlj routines),
>> we also need to generate the right name for the eh personality...
>>
>> OK?
>
> Ok.  If you want to do once per unit, that's fine too.

Hm. I tried the simple approach, with not-very-useful results.

e.g:

   @try {   <<< no error....
     number++;
     @throw o;  <<< error here...
   }


=== (2)

  @throw o;
   @try {
     number++;
     @throw o;  <<< error here...
   }

  when I check the locus on entry to objc_build_throw_stmt () in (2)  
it seems a bit odd.

I've made the desideratum a "TODO" since it looked like we would have  
to stray out of objc-act to fix it.

... although, perhaps, Nicola since you were last amongst this - maybe  
the issue will be obvious to you ;-)

FWIW;

I also corrected the syntax in the dg-error statements for the testcase.

(they would give an error like
   FAIL -fnext-runtime is required to enable Objective-C exception  
syntax - which is very confusing)

cheers
Iain

r168020;

Patch

Index: gcc/objc/objc-act.c
===================================================================
--- gcc/objc/objc-act.c	(revision 168019)
+++ gcc/objc/objc-act.c	(working copy)
@@ -5028,11 +5028,42 @@  tree
 objc_eh_personality (void)
 {
   if (!flag_objc_sjlj_exceptions && !objc_eh_personality_decl)
-    objc_eh_personality_decl = build_personality_function ("gnu_objc");
+    objc_eh_personality_decl = build_personality_function 
+				(flag_next_runtime
+						? "objc"
+						: "gnu_objc");
   return objc_eh_personality_decl;
 }
 #endif
 
+static void
+objc_init_exceptions (location_t loc)
+{
+  static bool done = false;
+
+  /* -fobjc-exceptions is required to enable Objective-C exceptions.
+     For example, on Darwin, ObjC exceptions require a sufficiently
+     recent version of the runtime, so the user must ask for them
+     explicitly.  On other platforms, at the moment -fobjc-exceptions
+     triggers -fexceptions which again is required for exceptions to
+     work.
+  */
+  /* TODO: we only really need one error message when the flag is missing.  */
+  if (!flag_objc_exceptions)
+    {
+      error_at (loc, "%<-fobjc-exceptions%> is required to enable Objective-C exception syntax");
+    }
+
+  if (done)
+    return;
+  done = true;
+
+#ifndef OBJCPLUS
+  if (!flag_objc_sjlj_exceptions)
+    using_eh_for_cleanups ();
+#endif
+}
+
 /* Build __builtin_eh_pointer, or the moral equivalent.  In the case
    of Darwin, we'll arrange for it to be initialized (and associated
    with a binding) later.  */
@@ -5334,17 +5365,7 @@  objc_begin_try_stmt (location_t try_locus, tree bo
   c->end_try_locus = input_location;
   cur_try_context = c;
 
-  /* -fobjc-exceptions is required to enable Objective-C exceptions.
-     For example, on Darwin, ObjC exceptions require a sufficiently
-     recent version of the runtime, so the user must ask for them
-     explicitly.  On other platforms, at the moment -fobjc-exceptions
-     triggers -fexceptions which again is required for exceptions to
-     work.
-  */
-  if (!flag_objc_exceptions)
-    {
-      error_at (try_locus, "%<-fobjc-exceptions%> is required to enable Objective-C exception syntax");
-    }
+  objc_init_exceptions (try_locus);
 
   /* Collect the list of local variables.  We'll mark them as volatile
      at the end of compilation of this function to prevent them being
@@ -5552,10 +5573,7 @@  objc_build_throw_stmt (location_t loc, tree throw_
 {
   tree args;
 
-  if (!flag_objc_exceptions)
-    {
-      error_at (loc, "%<-fobjc-exceptions%> is required to enable Objective-C exception syntax");
-    }
+  objc_init_exceptions (loc); 
 
   if (throw_expr == NULL)
     {
Index: gcc/objc/ChangeLog
===================================================================
--- gcc/objc/ChangeLog	(revision 168019)
+++ gcc/objc/ChangeLog	(working copy)
@@ -1,3 +1,11 @@ 
+2010-12-18  Iain Sandoe  <iains@gcc.gnu.org>
+
+	* objc/objc-act.c (objc_eh_personality): Select personality name on
+	runtime.
+	(objc_init_exceptions): New.
+	(objc_begin_try_stmt): Use objc_init_exceptions.
+	(objc_build_throw_stmt): Likewise.
+
 2010-12-10  Nicola Pero  <nicola.pero@meta-innovation.com>
 
 	* objc-act.c (objc_in_class_extension): New.
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(revision 168019)
+++ gcc/testsuite/ChangeLog	(working copy)
@@ -1,3 +1,7 @@ 
+2010-12-18  Iain Sandoe  <iains@gcc.gnu.org>
+
+	* fobjc-exceptions.m: Update dg-error syntax.
+
 2010-12-18  Kai Tietz  <kai.tietz@onevision.com>
 
 	PR target/36834
Index: gcc/testsuite/objc.dg/fobjc-exceptions.m
===================================================================
--- gcc/testsuite/objc.dg/fobjc-exceptions.m	(revision 168019)
+++ gcc/testsuite/objc.dg/fobjc-exceptions.m	(working copy)
@@ -5,25 +5,24 @@ 
 
 int dummy (int number, Object *o)
 {
-  @try {            /* { dg-error "fobjc-exceptions" "is required to enable Objective-C exception syntax" } */
+  @try {            /* { dg-error ".-fobjc-exceptions. is required to enable Objective-C exception syntax" } */
     number++;
-    @throw o;     /* { dg-error "fobjc-exceptions" "is required to enable Objective-C exception syntax" } */
+    @throw o;     /* { dg-error ".-fobjc-exceptions. is required to enable Objective-C exception syntax" } */
   }
   @catch (id object)
     {
       number++;
-      @throw;       /* { dg-error "fobjc-exceptions" "is required to enable Objective-C exception syntax" } */
+      @throw;       /* { dg-error ".-fobjc-exceptions. is required to enable Objective-C exception syntax" } */
     }
   @finally
     {
       number++;
     }
   
-  @synchronized (o) /* { dg-error "fobjc-exceptions" "is required to enable Objective-C exception syntax" } */
+  @synchronized (o) /* { dg-error ".-fobjc-exceptions. is required to enable Objective-C exception syntax" } */
     {
       number++;
     }
   
   return number;
 }
-