Commit 5287cfd5 by Iain Sandoe

objc-act.c (objc_eh_personality): Select personality name on runtime.


gcc/objc:

	* 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.

gcc/testsuite:

	* fobjc-exceptions.m: Update dg-error syntax.

From-SVN: r168020
parent 628c4eee
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> 2010-12-10 Nicola Pero <nicola.pero@meta-innovation.com>
* objc-act.c (objc_in_class_extension): New. * objc-act.c (objc_in_class_extension): New.
......
...@@ -5028,11 +5028,42 @@ tree ...@@ -5028,11 +5028,42 @@ tree
objc_eh_personality (void) objc_eh_personality (void)
{ {
if (!flag_objc_sjlj_exceptions && !objc_eh_personality_decl) 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; return objc_eh_personality_decl;
} }
#endif #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 /* Build __builtin_eh_pointer, or the moral equivalent. In the case
of Darwin, we'll arrange for it to be initialized (and associated of Darwin, we'll arrange for it to be initialized (and associated
with a binding) later. */ with a binding) later. */
...@@ -5334,17 +5365,7 @@ objc_begin_try_stmt (location_t try_locus, tree body) ...@@ -5334,17 +5365,7 @@ objc_begin_try_stmt (location_t try_locus, tree body)
c->end_try_locus = input_location; c->end_try_locus = input_location;
cur_try_context = c; cur_try_context = c;
/* -fobjc-exceptions is required to enable Objective-C exceptions. objc_init_exceptions (try_locus);
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");
}
/* Collect the list of local variables. We'll mark them as volatile /* Collect the list of local variables. We'll mark them as volatile
at the end of compilation of this function to prevent them being 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_expr) ...@@ -5552,10 +5573,7 @@ objc_build_throw_stmt (location_t loc, tree throw_expr)
{ {
tree args; tree args;
if (!flag_objc_exceptions) objc_init_exceptions (loc);
{
error_at (loc, "%<-fobjc-exceptions%> is required to enable Objective-C exception syntax");
}
if (throw_expr == NULL) if (throw_expr == NULL)
{ {
......
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> 2010-12-18 Kai Tietz <kai.tietz@onevision.com>
PR target/36834 PR target/36834
......
...@@ -5,25 +5,24 @@ ...@@ -5,25 +5,24 @@
int dummy (int number, Object *o) 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++; 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) @catch (id object)
{ {
number++; 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 @finally
{ {
number++; 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++; number++;
} }
return number; return number;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment