diff options
author | iains <iains@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-18 11:28:46 +0000 |
---|---|---|
committer | iains <iains@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-18 11:28:46 +0000 |
commit | a654f093326756413e19f38e2e79f7b09a9a266a (patch) | |
tree | d9eecc4792d7fa400b89788724c58a79b13bb089 /gcc/objc | |
parent | c18172943c7e323d322943df71affcf799ebfaa6 (diff) | |
download | gcc-a654f093326756413e19f38e2e79f7b09a9a266a.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168020 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 50 |
2 files changed, 42 insertions, 16 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index f079cb5cb80..15af19d06c4 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -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. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 131ce5524e4..f05ab192bf3 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -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 body) 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_expr) { 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) { |