summaryrefslogtreecommitdiff
path: root/gcc/objc
diff options
context:
space:
mode:
authorzlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4>2005-07-01 01:44:12 +0000
committerzlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4>2005-07-01 01:44:12 +0000
commit4dfa7ebc6f20f3a753a6da36efaada673ec23523 (patch)
tree7f58bf31af2f4788ebcce144ba3eb984936a0960 /gcc/objc
parentf27cea3abf8ded22456f5f46a812cc3915969815 (diff)
downloadgcc-4dfa7ebc6f20f3a753a6da36efaada673ec23523.tar.gz
[gcc/objc/ChangeLog]
2005-06-30 Ziemowit Laski <zlaski@apple.com> * objc-act.c (objc_build_volatilized_type): New function. (objc_volatilize_decl): Call objc_build_volatilized_type() instead of build_qualified_type(). [gcc/testsuite/ChangeLog] 2005-06-30 Ziemowit Laski <zlaski@apple.com> * obj-c++.dg/try-catch-11.mm: New. * objc.dg/try-catch-10.m: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101493 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc')
-rw-r--r--gcc/objc/ChangeLog6
-rw-r--r--gcc/objc/objc-act.c39
2 files changed, 43 insertions, 2 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index a11966ea7af..6963c53160a 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,3 +1,9 @@
+2005-06-30 Ziemowit Laski <zlaski@apple.com>
+
+ * objc-act.c (objc_build_volatilized_type): New function.
+ (objc_volatilize_decl): Call objc_build_volatilized_type()
+ instead of build_qualified_type().
+
2005-06-29 Ziemowit Laski <zlaski@apple.com>
* objc-act.c (objc_build_internal_const_str_type): New function.
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index b522b8ddba6..e44f8b0fbd9 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -185,6 +185,7 @@ static tree build_protocol_initializer (tree, tree, tree, tree, tree);
static tree get_class_ivars (tree, bool);
static tree generate_protocol_list (tree);
static void build_protocol_reference (tree);
+static tree objc_build_volatilized_type (tree);
#ifdef OBJCPLUS
static void objc_generate_cxx_cdtors (void);
@@ -868,6 +869,41 @@ objc_build_struct (tree name, tree fields, tree super_name)
return s;
}
+/* Build a type differing from TYPE only in that TYPE_VOLATILE is set.
+ Unlike tree.c:build_qualified_type(), preserve TYPE_LANG_SPECIFIC in the
+ process. */
+static tree
+objc_build_volatilized_type (tree type)
+{
+ tree t;
+
+ /* Check if we have not constructed the desired variant already. */
+ for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
+ {
+ /* The type qualifiers must (obviously) match up. */
+ if (!TYPE_VOLATILE (t)
+ || (TYPE_READONLY (t) != TYPE_READONLY (type))
+ || (TYPE_RESTRICT (t) != TYPE_RESTRICT (type)))
+ continue;
+
+ /* For pointer types, the pointees (and hence their TYPE_LANG_SPECIFIC
+ info, if any) must match up. */
+ if (POINTER_TYPE_P (t)
+ && (TREE_TYPE (t) != TREE_TYPE (type)))
+ continue;
+
+ /* Everything matches up! */
+ return t;
+ }
+
+ /* Ok, we could not re-use any of the pre-existing variants. Create
+ a new one. */
+ t = build_variant_type_copy (type);
+ TYPE_VOLATILE (t) = 1;
+
+ return t;
+}
+
/* Mark DECL as being 'volatile' for purposes of Darwin
_setjmp()/_longjmp() exception handling. Called from
objc_mark_locals_volatile(). */
@@ -884,8 +920,7 @@ objc_volatilize_decl (tree decl)
struct volatilized_type key;
void **loc;
- t = build_qualified_type (t, (TYPE_QUALS (t)
- | TYPE_QUAL_VOLATILE));
+ t = objc_build_volatilized_type (t);
key.type = t;
loc = htab_find_slot (volatilized_htab, &key, INSERT);