Commit 660820d1 by Nicola Pero Committed by Nicola Pero

[multiple changes]

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.

From-SVN: r165732
parent 1e335ae2
2010-10-20 Nicola Pero <nicola.pero@meta-innovation.com> 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-lang.c (finish_file): Removed.
* objc-act.c (objc_finish_file): Renamed to * objc-act.c (objc_finish_file): Renamed to
objc_write_global_declarations. Do not try to instantiate C++ objc_write_global_declarations. Do not try to instantiate C++
......
...@@ -211,6 +211,14 @@ static const char *synth_id_with_class_suffix (const char *, tree); ...@@ -211,6 +211,14 @@ static const char *synth_id_with_class_suffix (const char *, tree);
hash *nst_method_hash_list = 0; hash *nst_method_hash_list = 0;
hash *cls_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 hash hash_lookup (hash *, tree);
static tree lookup_method (tree, tree); static tree lookup_method (tree, tree);
static tree lookup_method_static (tree, tree, int); static tree lookup_method_static (tree, tree, int);
...@@ -3586,7 +3594,8 @@ objc_declare_alias (tree alias_ident, tree class_ident) ...@@ -3586,7 +3594,8 @@ objc_declare_alias (tree alias_ident, tree class_ident)
#ifdef OBJCPLUS #ifdef OBJCPLUS
pop_lang_context (); pop_lang_context ();
#endif #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) ...@@ -3628,7 +3637,7 @@ objc_declare_class (tree ident_list)
record = xref_tag (RECORD_TYPE, ident); record = xref_tag (RECORD_TYPE, ident);
INIT_TYPE_OBJC_INFO (record); INIT_TYPE_OBJC_INFO (record);
TYPE_OBJC_INTERFACE (record) = ident; 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) ...@@ -3636,7 +3645,7 @@ objc_declare_class (tree ident_list)
tree tree
objc_is_class_name (tree ident) objc_is_class_name (tree ident)
{ {
tree chain; hash target;
if (ident && TREE_CODE (ident) == IDENTIFIER_NODE if (ident && TREE_CODE (ident) == IDENTIFIER_NODE
&& identifier_global_value (ident)) && identifier_global_value (ident))
...@@ -3661,16 +3670,15 @@ objc_is_class_name (tree ident) ...@@ -3661,16 +3670,15 @@ objc_is_class_name (tree ident)
if (lookup_interface (ident)) if (lookup_interface (ident))
return ident; return ident;
for (chain = class_chain; chain; chain = TREE_CHAIN (chain)) target = hash_class_name_lookup (cls_name_hash_list, ident);
{ if (target)
if (ident == TREE_VALUE (chain)) return target->key;
return ident;
}
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)) gcc_assert (target->list && target->list->value);
return TREE_PURPOSE (chain); return target->list->value;
} }
return 0; return 0;
...@@ -7483,11 +7491,62 @@ hash_init (void) ...@@ -7483,11 +7491,62 @@ hash_init (void)
nst_method_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE); nst_method_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
cls_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. */ /* Initialize the hash table used to hold the constant string objects. */
string_htab = htab_create_ggc (31, string_hash, string_htab = htab_create_ggc (31, string_hash,
string_eq, NULL); 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 /* WARNING!!!! hash_enter is called with a method, and will peek
inside to find its selector! But hash_lookup is given a selector inside to find its selector! But hash_lookup is given a selector
directly, and looks for the selector that's inside the found directly, and looks for the selector that's inside the found
......
...@@ -156,6 +156,9 @@ struct GTY(()) hashed_entry { ...@@ -156,6 +156,9 @@ struct GTY(()) hashed_entry {
extern GTY ((length ("SIZEHASHTABLE"))) hash *nst_method_hash_list; extern GTY ((length ("SIZEHASHTABLE"))) hash *nst_method_hash_list;
extern GTY ((length ("SIZEHASHTABLE"))) hash *cls_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 #define SIZEHASHTABLE 257
/* Objective-C/Objective-C++ @implementation list. */ /* Objective-C/Objective-C++ @implementation list. */
...@@ -200,8 +203,6 @@ enum objc_tree_index ...@@ -200,8 +203,6 @@ enum objc_tree_index
OCTI_NST_TYPE, OCTI_NST_TYPE,
OCTI_PROTO_TYPE, OCTI_PROTO_TYPE,
OCTI_CLS_CHAIN,
OCTI_ALIAS_CHAIN,
OCTI_INTF_CHAIN, OCTI_INTF_CHAIN,
OCTI_PROTO_CHAIN, OCTI_PROTO_CHAIN,
OCTI_IMPL_CHAIN, OCTI_IMPL_CHAIN,
...@@ -338,8 +339,6 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; ...@@ -338,8 +339,6 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
(TREE_CODE (TYPE) == POINTER_TYPE \ (TREE_CODE (TYPE) == POINTER_TYPE \
&& TREE_TYPE (TYPE) == objc_super_template) && 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 interface_chain objc_global_trees[OCTI_INTF_CHAIN]
#define protocol_chain objc_global_trees[OCTI_PROTO_CHAIN] #define protocol_chain objc_global_trees[OCTI_PROTO_CHAIN]
#define implemented_classes objc_global_trees[OCTI_IMPL_CHAIN] #define implemented_classes objc_global_trees[OCTI_IMPL_CHAIN]
......
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