aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/objc/ChangeLog18
-rw-r--r--gcc/objc/objc-act.c81
-rw-r--r--gcc/objc/objc-act.h7
3 files changed, 91 insertions, 15 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index b3881ae..1bc94a2 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,5 +1,23 @@
2010-10-20 Nicola Pero <nicola.pero@meta-innovation.com>
+ Merge from 'apple/trunk' branch on FSF servers. Obvious updates
+ to gcc_alloc_xxx calls in hash_init and hash_class_name_enter to
+ get it to compile in the current trunk.
+
+ 2006-01-27 Fariborz Jahanian <fjahanian@apple.com>
+
+ Radar 4345837
+ * objc/objc-act.c (hash_class_name_enter): New.
+ (hash_class_name_lookup): New.
+ (objc_declare_alias): Enter alias name into hash table.
+ (objc_declare_class): Enter class name into hash table.
+ (objc_is_class_name): Do a hash look up of class name.
+ (hash_init): Initialize the two new hash tables.
+ * objc-act.h: Added cls_name_hash_list and als_name_hash_list
+ declarations, removed class_chain and alias_chain.
+
+2010-10-20 Nicola Pero <nicola.pero@meta-innovation.com>
+
* objc-lang.c (finish_file): Removed.
* objc-act.c (objc_finish_file): Renamed to
objc_write_global_declarations. Do not try to instantiate C++
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 2d5a905..219b80e 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -211,6 +211,14 @@ static const char *synth_id_with_class_suffix (const char *, tree);
hash *nst_method_hash_list = 0;
hash *cls_method_hash_list = 0;
+/* Hash tables to manage the global pool of class names. */
+
+hash *cls_name_hash_list = 0;
+hash *als_name_hash_list = 0;
+
+static void hash_class_name_enter (hash *, tree, tree);
+static hash hash_class_name_lookup (hash *, tree);
+
static hash hash_lookup (hash *, tree);
static tree lookup_method (tree, tree);
static tree lookup_method_static (tree, tree, int);
@@ -3586,7 +3594,8 @@ objc_declare_alias (tree alias_ident, tree class_ident)
#ifdef OBJCPLUS
pop_lang_context ();
#endif
- alias_chain = tree_cons (underlying_class, alias_ident, alias_chain);
+ hash_class_name_enter (als_name_hash_list, alias_ident,
+ underlying_class);
}
}
@@ -3628,7 +3637,7 @@ objc_declare_class (tree ident_list)
record = xref_tag (RECORD_TYPE, ident);
INIT_TYPE_OBJC_INFO (record);
TYPE_OBJC_INTERFACE (record) = ident;
- class_chain = tree_cons (NULL_TREE, ident, class_chain);
+ hash_class_name_enter (cls_name_hash_list, ident, NULL_TREE);
}
}
}
@@ -3636,7 +3645,7 @@ objc_declare_class (tree ident_list)
tree
objc_is_class_name (tree ident)
{
- tree chain;
+ hash target;
if (ident && TREE_CODE (ident) == IDENTIFIER_NODE
&& identifier_global_value (ident))
@@ -3661,16 +3670,15 @@ objc_is_class_name (tree ident)
if (lookup_interface (ident))
return ident;
- for (chain = class_chain; chain; chain = TREE_CHAIN (chain))
- {
- if (ident == TREE_VALUE (chain))
- return ident;
- }
+ target = hash_class_name_lookup (cls_name_hash_list, ident);
+ if (target)
+ return target->key;
- for (chain = alias_chain; chain; chain = TREE_CHAIN (chain))
+ target = hash_class_name_lookup (als_name_hash_list, ident);
+ if (target)
{
- if (ident == TREE_VALUE (chain))
- return TREE_PURPOSE (chain);
+ gcc_assert (target->list && target->list->value);
+ return target->list->value;
}
return 0;
@@ -7483,11 +7491,62 @@ hash_init (void)
nst_method_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
cls_method_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
+ cls_name_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
+ als_name_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
+
/* Initialize the hash table used to hold the constant string objects. */
string_htab = htab_create_ggc (31, string_hash,
string_eq, NULL);
}
+/* This routine adds sel_name to the hash list. sel_name is a class or alias
+ name for the class. If alias name, then value is its underlying class.
+ If class, the value is NULL_TREE. */
+
+static void
+hash_class_name_enter (hash *hashlist, tree sel_name, tree value)
+{
+ hash obj;
+ int slot = hash_func (sel_name) % SIZEHASHTABLE;
+
+ obj = ggc_alloc_hashed_entry ();
+ if (value != NULL_TREE)
+ {
+ /* Save the underlying class for the 'alias' in the hash table */
+ attr obj_attr = ggc_alloc_hashed_attribute ();
+ obj_attr->value = value;
+ obj->list = obj_attr;
+ }
+ else
+ obj->list = 0;
+ obj->next = hashlist[slot];
+ obj->key = sel_name;
+
+ hashlist[slot] = obj; /* append to front */
+
+}
+
+/*
+ Searches in the hash table looking for a match for class or alias name.
+*/
+
+static hash
+hash_class_name_lookup (hash *hashlist, tree sel_name)
+{
+ hash target;
+
+ target = hashlist[hash_func (sel_name) % SIZEHASHTABLE];
+
+ while (target)
+ {
+ if (sel_name == target->key)
+ return target;
+
+ target = target->next;
+ }
+ return 0;
+}
+
/* WARNING!!!! hash_enter is called with a method, and will peek
inside to find its selector! But hash_lookup is given a selector
directly, and looks for the selector that's inside the found
diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h
index b7bb6f2..6c7204b 100644
--- a/gcc/objc/objc-act.h
+++ b/gcc/objc/objc-act.h
@@ -156,6 +156,9 @@ struct GTY(()) hashed_entry {
extern GTY ((length ("SIZEHASHTABLE"))) hash *nst_method_hash_list;
extern GTY ((length ("SIZEHASHTABLE"))) hash *cls_method_hash_list;
+extern GTY ((length ("SIZEHASHTABLE"))) hash *cls_name_hash_list;
+extern GTY ((length ("SIZEHASHTABLE"))) hash *als_name_hash_list;
+
#define SIZEHASHTABLE 257
/* Objective-C/Objective-C++ @implementation list. */
@@ -200,8 +203,6 @@ enum objc_tree_index
OCTI_NST_TYPE,
OCTI_PROTO_TYPE,
- OCTI_CLS_CHAIN,
- OCTI_ALIAS_CHAIN,
OCTI_INTF_CHAIN,
OCTI_PROTO_CHAIN,
OCTI_IMPL_CHAIN,
@@ -338,8 +339,6 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
(TREE_CODE (TYPE) == POINTER_TYPE \
&& TREE_TYPE (TYPE) == objc_super_template)
-#define class_chain objc_global_trees[OCTI_CLS_CHAIN]
-#define alias_chain objc_global_trees[OCTI_ALIAS_CHAIN]
#define interface_chain objc_global_trees[OCTI_INTF_CHAIN]
#define protocol_chain objc_global_trees[OCTI_PROTO_CHAIN]
#define implemented_classes objc_global_trees[OCTI_IMPL_CHAIN]