re PR objc/24867 (many N^2 loops in objc frontend)
PR objc/24867 * objc-act.c (build_sized_array_type): New function. (add_objc_string): Use it. (generate_protocol_list): Likewise. (generate_objc_image_info): Likewise. (add_field_decl): New function. (objc_build_struct): Use a VEC rather than building a TREE_LIST. (generate_struct_by_value_array): Use add_field_decl. (build_objc_symtab_template): Likewise. (build_module_descriptor): Likewise. (build_objc_exception_stuff): Likewise. (build_protocol_template): Likewise. (build_method_prototype_list_template): Likewise. (build_method_prototype_template): Likewise. (build_category_template): Likewise. (build_selector_template): Likewise. (build_class_template): Likewise. (build_super_template): Likewise. (build_ivar_template): Likewise. (build_ivar_list_template): Likewise. (build_method_list_template): Likewise. (build_method_template): Likewise. From-SVN: r161777
This commit is contained in:
parent
7c4f0041b0
commit
3e78185c79
@ -1,3 +1,28 @@
|
||||
2010-07-03 Nathan Froyd <froydnj@codesourcery.com>
|
||||
|
||||
PR objc/24867
|
||||
* objc-act.c (build_sized_array_type): New function.
|
||||
(add_objc_string): Use it.
|
||||
(generate_protocol_list): Likewise.
|
||||
(generate_objc_image_info): Likewise.
|
||||
(add_field_decl): New function.
|
||||
(objc_build_struct): Use a VEC rather than building a TREE_LIST.
|
||||
(generate_struct_by_value_array): Use add_field_decl.
|
||||
(build_objc_symtab_template): Likewise.
|
||||
(build_module_descriptor): Likewise.
|
||||
(build_objc_exception_stuff): Likewise.
|
||||
(build_protocol_template): Likewise.
|
||||
(build_method_prototype_list_template): Likewise.
|
||||
(build_method_prototype_template): Likewise.
|
||||
(build_category_template): Likewise.
|
||||
(build_selector_template): Likewise.
|
||||
(build_class_template): Likewise.
|
||||
(build_super_template): Likewise.
|
||||
(build_ivar_template): Likewise.
|
||||
(build_ivar_list_template): Likewise.
|
||||
(build_method_list_template): Likewise.
|
||||
(build_method_template): Likewise.
|
||||
|
||||
2010-06-28 Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
||||
* objc-act.c: Do not include except.h.
|
||||
|
@ -442,6 +442,25 @@ objc_finish_struct (tree type, tree fieldlist)
|
||||
objc_struct_info);
|
||||
}
|
||||
|
||||
static tree
|
||||
build_sized_array_type (tree base_type, int size)
|
||||
{
|
||||
tree index_type = build_index_type (build_int_cst (NULL_TREE, size - 1));
|
||||
return build_array_type (base_type, index_type);
|
||||
}
|
||||
|
||||
static tree
|
||||
add_field_decl (tree type, const char *name, tree **chain)
|
||||
{
|
||||
tree field = create_field_decl (type, name);
|
||||
|
||||
if (*chain != NULL)
|
||||
**chain = field;
|
||||
*chain = &TREE_CHAIN (field);
|
||||
|
||||
return field;
|
||||
}
|
||||
|
||||
/* Some platforms pass small structures through registers versus
|
||||
through an invisible pointer. Determine at what size structure is
|
||||
the transition point between the two possibilities. */
|
||||
@ -450,7 +469,7 @@ static void
|
||||
generate_struct_by_value_array (void)
|
||||
{
|
||||
tree type;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls;
|
||||
int i, j;
|
||||
int aggregate_in_mem[32];
|
||||
int found = 0;
|
||||
@ -459,23 +478,20 @@ generate_struct_by_value_array (void)
|
||||
for (i = 1; i < 32; i++)
|
||||
{
|
||||
char buffer[5];
|
||||
tree *chain = NULL;
|
||||
|
||||
/* Create an unnamed struct that has `i' character components */
|
||||
type = objc_start_struct (NULL_TREE);
|
||||
|
||||
strcpy (buffer, "c1");
|
||||
field_decl = create_field_decl (char_type_node,
|
||||
buffer);
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (char_type_node, buffer, &chain);
|
||||
|
||||
for (j = 1; j < i; j++)
|
||||
{
|
||||
sprintf (buffer, "c%d", j + 1);
|
||||
field_decl = create_field_decl (char_type_node,
|
||||
buffer);
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (char_type_node, buffer, &chain);
|
||||
}
|
||||
objc_finish_struct (type, field_decl_chain);
|
||||
objc_finish_struct (type, decls);
|
||||
|
||||
aggregate_in_mem[i] = aggregate_value_p (type, 0);
|
||||
if (!aggregate_in_mem[i])
|
||||
@ -824,7 +840,9 @@ objc_build_struct (tree klass, tree fields, tree super_name)
|
||||
tree name = CLASS_NAME (klass);
|
||||
tree s = objc_start_struct (name);
|
||||
tree super = (super_name ? xref_tag (RECORD_TYPE, super_name) : NULL_TREE);
|
||||
tree t, objc_info = NULL_TREE;
|
||||
tree t;
|
||||
VEC(tree,heap) *objc_info = NULL;
|
||||
int i;
|
||||
|
||||
if (super)
|
||||
{
|
||||
@ -882,9 +900,7 @@ objc_build_struct (tree klass, tree fields, tree super_name)
|
||||
INIT_TYPE_OBJC_INFO (t);
|
||||
TYPE_OBJC_INTERFACE (t) = klass;
|
||||
}
|
||||
objc_info
|
||||
= chainon (objc_info,
|
||||
build_tree_list (NULL_TREE, TYPE_OBJC_INFO (t)));
|
||||
VEC_safe_push (tree, heap, objc_info, TYPE_OBJC_INFO (t));
|
||||
}
|
||||
|
||||
/* Point the struct at its related Objective-C class. */
|
||||
@ -893,13 +909,13 @@ objc_build_struct (tree klass, tree fields, tree super_name)
|
||||
|
||||
s = objc_finish_struct (s, fields);
|
||||
|
||||
for (t = TYPE_NEXT_VARIANT (s); t;
|
||||
t = TYPE_NEXT_VARIANT (t), objc_info = TREE_CHAIN (objc_info))
|
||||
for (i = 0, t = TYPE_NEXT_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t), i++)
|
||||
{
|
||||
TYPE_OBJC_INFO (t) = TREE_VALUE (objc_info);
|
||||
TYPE_OBJC_INFO (t) = VEC_index (tree, objc_info, i);
|
||||
/* Replace the IDENTIFIER_NODE with an actual @interface. */
|
||||
TYPE_OBJC_INTERFACE (t) = klass;
|
||||
}
|
||||
VEC_free (tree, heap, objc_info);
|
||||
|
||||
/* Use TYPE_BINFO structures to point at the super class, if any. */
|
||||
objc_xref_basetypes (s, super);
|
||||
@ -2105,43 +2121,32 @@ objc_build_constructor (tree type, VEC(constructor_elt,gc) *elts)
|
||||
static void
|
||||
build_objc_symtab_template (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree fields, *chain = NULL;
|
||||
|
||||
objc_symtab_template = objc_start_struct (get_identifier (UTAG_SYMTAB));
|
||||
|
||||
/* long sel_ref_cnt; */
|
||||
field_decl = create_field_decl (long_integer_type_node, "sel_ref_cnt");
|
||||
field_decl_chain = field_decl;
|
||||
fields = add_field_decl (long_integer_type_node, "sel_ref_cnt", &chain);
|
||||
|
||||
/* SEL *refs; */
|
||||
field_decl = create_field_decl (build_pointer_type (objc_selector_type),
|
||||
"refs");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (objc_selector_type), "refs", &chain);
|
||||
|
||||
/* short cls_def_cnt; */
|
||||
field_decl = create_field_decl (short_integer_type_node, "cls_def_cnt");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (short_integer_type_node, "cls_def_cnt", &chain);
|
||||
|
||||
/* short cat_def_cnt; */
|
||||
field_decl = create_field_decl (short_integer_type_node,
|
||||
"cat_def_cnt");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (short_integer_type_node, "cat_def_cnt", &chain);
|
||||
|
||||
if (imp_count || cat_count || !flag_next_runtime)
|
||||
{
|
||||
/* void *defs[imp_count + cat_count (+ 1)]; */
|
||||
/* NB: The index is one less than the size of the array. */
|
||||
int index = imp_count + cat_count
|
||||
+ (flag_next_runtime? -1: 0);
|
||||
field_decl = create_field_decl
|
||||
(build_array_type
|
||||
(ptr_type_node,
|
||||
build_index_type (build_int_cst (NULL_TREE, index))),
|
||||
"defs");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
int index = imp_count + cat_count + (flag_next_runtime ? -1: 0);
|
||||
tree array_type = build_sized_array_type (ptr_type_node, index + 1);
|
||||
add_field_decl (array_type, "defs", &chain);
|
||||
}
|
||||
|
||||
objc_finish_struct (objc_symtab_template, field_decl_chain);
|
||||
objc_finish_struct (objc_symtab_template, fields);
|
||||
}
|
||||
|
||||
/* Create the initial value for the `defs' field of _objc_symtab.
|
||||
@ -2336,7 +2341,7 @@ init_module_descriptor (tree type)
|
||||
static void
|
||||
build_module_descriptor (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls, *chain = NULL;
|
||||
|
||||
#ifdef OBJCPLUS
|
||||
push_lang_context (lang_name_c); /* extern "C" */
|
||||
@ -2345,26 +2350,20 @@ build_module_descriptor (void)
|
||||
objc_module_template = objc_start_struct (get_identifier (UTAG_MODULE));
|
||||
|
||||
/* long version; */
|
||||
field_decl = create_field_decl (long_integer_type_node, "version");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (long_integer_type_node, "version", &chain);
|
||||
|
||||
/* long size; */
|
||||
field_decl = create_field_decl (long_integer_type_node, "size");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (long_integer_type_node, "size", &chain);
|
||||
|
||||
/* char *name; */
|
||||
field_decl = create_field_decl (string_type_node, "name");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "name", &chain);
|
||||
|
||||
/* struct _objc_symtab *symtab; */
|
||||
field_decl
|
||||
= create_field_decl (build_pointer_type
|
||||
(xref_tag (RECORD_TYPE,
|
||||
get_identifier (UTAG_SYMTAB))),
|
||||
"symtab");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (xref_tag (RECORD_TYPE,
|
||||
get_identifier (UTAG_SYMTAB))),
|
||||
"symtab", &chain);
|
||||
|
||||
objc_finish_struct (objc_module_template, field_decl_chain);
|
||||
objc_finish_struct (objc_module_template, decls);
|
||||
|
||||
/* Create an instance of "_objc_module". */
|
||||
UOBJC_MODULES_decl = start_var_decl (objc_module_template, "_OBJC_MODULES");
|
||||
@ -2881,11 +2880,7 @@ add_objc_string (tree ident, enum string_section section)
|
||||
|
||||
decl = build_objc_string_decl (section);
|
||||
|
||||
type = build_array_type
|
||||
(char_type_node,
|
||||
build_index_type
|
||||
(build_int_cst (NULL_TREE,
|
||||
IDENTIFIER_LENGTH (ident))));
|
||||
type = build_sized_array_type (char_type_node, IDENTIFIER_LENGTH (ident) + 1);
|
||||
decl = start_var_decl (type, IDENTIFIER_POINTER (DECL_NAME (decl)));
|
||||
string_expr = my_build_string (IDENTIFIER_LENGTH (ident) + 1,
|
||||
IDENTIFIER_POINTER (ident));
|
||||
@ -4067,26 +4062,22 @@ objc_build_synchronized (location_t start_locus, tree mutex, tree body)
|
||||
static void
|
||||
build_next_objc_exception_stuff (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain, index, temp_type;
|
||||
tree decls, temp_type, *chain = NULL;
|
||||
|
||||
objc_exception_data_template
|
||||
= objc_start_struct (get_identifier (UTAG_EXCDATA));
|
||||
|
||||
/* int buf[OBJC_JBLEN]; */
|
||||
|
||||
index = build_index_type (build_int_cst (NULL_TREE, OBJC_JBLEN - 1));
|
||||
field_decl = create_field_decl (build_array_type (integer_type_node, index),
|
||||
"buf");
|
||||
field_decl_chain = field_decl;
|
||||
temp_type = build_sized_array_type (integer_type_node, OBJC_JBLEN);
|
||||
decls = add_field_decl (temp_type, "buf", &chain);
|
||||
|
||||
/* void *pointers[4]; */
|
||||
|
||||
index = build_index_type (build_int_cst (NULL_TREE, 4 - 1));
|
||||
field_decl = create_field_decl (build_array_type (ptr_type_node, index),
|
||||
"pointers");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
temp_type = build_sized_array_type (ptr_type_node, 4);
|
||||
add_field_decl (temp_type, "pointers", &chain);
|
||||
|
||||
objc_finish_struct (objc_exception_data_template, field_decl_chain);
|
||||
objc_finish_struct (objc_exception_data_template, decls);
|
||||
|
||||
/* int _setjmp(...); */
|
||||
/* If the user includes <setjmp.h>, this shall be superseded by
|
||||
@ -4225,39 +4216,29 @@ build_private_template (tree klass)
|
||||
static void
|
||||
build_protocol_template (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree ptype, decls, *chain = NULL;
|
||||
|
||||
objc_protocol_template = objc_start_struct (get_identifier (UTAG_PROTOCOL));
|
||||
|
||||
/* struct _objc_class *isa; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(xref_tag (RECORD_TYPE,
|
||||
get_identifier (UTAG_CLASS))),
|
||||
"isa");
|
||||
field_decl_chain = field_decl;
|
||||
ptype = build_pointer_type (xref_tag (RECORD_TYPE,
|
||||
get_identifier (UTAG_CLASS)));
|
||||
decls = add_field_decl (ptype, "isa", &chain);
|
||||
|
||||
/* char *protocol_name; */
|
||||
field_decl = create_field_decl (string_type_node, "protocol_name");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "protocol_name", &chain);
|
||||
|
||||
/* struct _objc_protocol **protocol_list; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(build_pointer_type
|
||||
(objc_protocol_template)),
|
||||
"protocol_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type (build_pointer_type (objc_protocol_template));
|
||||
add_field_decl (ptype, "protocol_list", &chain);
|
||||
|
||||
/* struct _objc__method_prototype_list *instance_methods; */
|
||||
field_decl = create_field_decl (objc_method_proto_list_ptr,
|
||||
"instance_methods");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (objc_method_proto_list_ptr, "instance_methods", &chain);
|
||||
|
||||
/* struct _objc__method_prototype_list *class_methods; */
|
||||
field_decl = create_field_decl (objc_method_proto_list_ptr,
|
||||
"class_methods");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (objc_method_proto_list_ptr, "class_methods", &chain);
|
||||
|
||||
objc_finish_struct (objc_protocol_template, field_decl_chain);
|
||||
objc_finish_struct (objc_protocol_template, decls);
|
||||
}
|
||||
|
||||
static tree
|
||||
@ -4297,25 +4278,20 @@ static tree
|
||||
build_method_prototype_list_template (tree list_type, int size)
|
||||
{
|
||||
tree objc_ivar_list_record;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree array_type, decls, *chain = NULL;
|
||||
|
||||
/* Generate an unnamed struct definition. */
|
||||
|
||||
objc_ivar_list_record = objc_start_struct (NULL_TREE);
|
||||
|
||||
/* int method_count; */
|
||||
field_decl = create_field_decl (integer_type_node, "method_count");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (integer_type_node, "method_count", &chain);
|
||||
|
||||
/* struct objc_method method_list[]; */
|
||||
field_decl = create_field_decl (build_array_type
|
||||
(list_type,
|
||||
build_index_type
|
||||
(build_int_cst (NULL_TREE, size - 1))),
|
||||
"method_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
array_type = build_sized_array_type (list_type, size);
|
||||
add_field_decl (array_type, "method_list", &chain);
|
||||
|
||||
objc_finish_struct (objc_ivar_list_record, field_decl_chain);
|
||||
objc_finish_struct (objc_ivar_list_record, decls);
|
||||
|
||||
return objc_ivar_list_record;
|
||||
}
|
||||
@ -4324,19 +4300,17 @@ static tree
|
||||
build_method_prototype_template (void)
|
||||
{
|
||||
tree proto_record;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls, *chain = NULL;
|
||||
|
||||
proto_record = objc_start_struct (get_identifier (UTAG_METHOD_PROTOTYPE));
|
||||
|
||||
/* SEL _cmd; */
|
||||
field_decl = create_field_decl (objc_selector_type, "_cmd");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (objc_selector_type, "_cmd", &chain);
|
||||
|
||||
/* char *method_types; */
|
||||
field_decl = create_field_decl (string_type_node, "method_types");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "method_types", &chain);
|
||||
|
||||
objc_finish_struct (proto_record, field_decl_chain);
|
||||
objc_finish_struct (proto_record, decls);
|
||||
|
||||
return proto_record;
|
||||
}
|
||||
@ -4821,36 +4795,27 @@ build_protocol_initializer (tree type, tree protocol_name,
|
||||
static void
|
||||
build_category_template (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree ptype, decls, *chain = NULL;
|
||||
|
||||
objc_category_template = objc_start_struct (get_identifier (UTAG_CATEGORY));
|
||||
|
||||
/* char *category_name; */
|
||||
field_decl = create_field_decl (string_type_node, "category_name");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (string_type_node, "category_name", &chain);
|
||||
|
||||
/* char *class_name; */
|
||||
field_decl = create_field_decl (string_type_node, "class_name");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "class_name", &chain);
|
||||
|
||||
/* struct _objc_method_list *instance_methods; */
|
||||
field_decl = create_field_decl (objc_method_list_ptr,
|
||||
"instance_methods");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (objc_method_list_ptr, "instance_methods", &chain);
|
||||
|
||||
/* struct _objc_method_list *class_methods; */
|
||||
field_decl = create_field_decl (objc_method_list_ptr,
|
||||
"class_methods");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (objc_method_list_ptr, "class_methods", &chain);
|
||||
|
||||
/* struct _objc_protocol **protocol_list; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(build_pointer_type
|
||||
(objc_protocol_template)),
|
||||
"protocol_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type (build_pointer_type (objc_protocol_template));
|
||||
add_field_decl (ptype, "protocol_list", &chain);
|
||||
|
||||
objc_finish_struct (objc_category_template, field_decl_chain);
|
||||
objc_finish_struct (objc_category_template, decls);
|
||||
}
|
||||
|
||||
/* struct _objc_selector {
|
||||
@ -4861,19 +4826,17 @@ build_category_template (void)
|
||||
static void
|
||||
build_selector_template (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls, *chain = NULL;
|
||||
|
||||
objc_selector_template = objc_start_struct (get_identifier (UTAG_SELECTOR));
|
||||
|
||||
/* SEL sel_id; */
|
||||
field_decl = create_field_decl (objc_selector_type, "sel_id");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (objc_selector_type, "sel_id", &chain);
|
||||
|
||||
/* char *sel_type; */
|
||||
field_decl = create_field_decl (string_type_node, "sel_type");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "sel_type", &chain);
|
||||
|
||||
objc_finish_struct (objc_selector_template, field_decl_chain);
|
||||
objc_finish_struct (objc_selector_template, decls);
|
||||
}
|
||||
|
||||
/* struct _objc_class {
|
||||
@ -4907,102 +4870,76 @@ build_selector_template (void)
|
||||
static void
|
||||
build_class_template (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree ptype, decls, *chain = NULL;
|
||||
|
||||
objc_class_template = objc_start_struct (get_identifier (UTAG_CLASS));
|
||||
|
||||
/* struct _objc_class *isa; */
|
||||
field_decl = create_field_decl (build_pointer_type (objc_class_template),
|
||||
"isa");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (build_pointer_type (objc_class_template),
|
||||
"isa", &chain);
|
||||
|
||||
/* struct _objc_class *super_class; */
|
||||
field_decl = create_field_decl (build_pointer_type (objc_class_template),
|
||||
"super_class");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (objc_class_template),
|
||||
"super_class", &chain);
|
||||
|
||||
/* char *name; */
|
||||
field_decl = create_field_decl (string_type_node, "name");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "name", &chain);
|
||||
|
||||
/* long version; */
|
||||
field_decl = create_field_decl (long_integer_type_node, "version");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (long_integer_type_node, "version", &chain);
|
||||
|
||||
/* long info; */
|
||||
field_decl = create_field_decl (long_integer_type_node, "info");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (long_integer_type_node, "info", &chain);
|
||||
|
||||
/* long instance_size; */
|
||||
field_decl = create_field_decl (long_integer_type_node, "instance_size");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (long_integer_type_node, "instance_size", &chain);
|
||||
|
||||
/* struct _objc_ivar_list *ivars; */
|
||||
field_decl = create_field_decl (objc_ivar_list_ptr,
|
||||
"ivars");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (objc_ivar_list_ptr,"ivars", &chain);
|
||||
|
||||
/* struct _objc_method_list *methods; */
|
||||
field_decl = create_field_decl (objc_method_list_ptr,
|
||||
"methods");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (objc_method_list_ptr, "methods", &chain);
|
||||
|
||||
if (flag_next_runtime)
|
||||
{
|
||||
/* struct objc_cache *cache; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(xref_tag (RECORD_TYPE,
|
||||
get_identifier
|
||||
("objc_cache"))),
|
||||
"cache");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type (xref_tag (RECORD_TYPE,
|
||||
get_identifier ("objc_cache")));
|
||||
add_field_decl (ptype, "cache", &chain);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* struct sarray *dtable; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(xref_tag (RECORD_TYPE,
|
||||
get_identifier
|
||||
("sarray"))),
|
||||
"dtable");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type(xref_tag (RECORD_TYPE,
|
||||
get_identifier ("sarray")));
|
||||
add_field_decl (ptype, "dtable", &chain);
|
||||
|
||||
/* struct objc_class *subclass_list; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(objc_class_template),
|
||||
"subclass_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type (objc_class_template);
|
||||
add_field_decl (ptype, "subclass_list", &chain);
|
||||
|
||||
/* struct objc_class *sibling_class; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(objc_class_template),
|
||||
"sibling_class");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type (objc_class_template);
|
||||
add_field_decl (ptype, "sibling_class", &chain);
|
||||
}
|
||||
|
||||
/* struct _objc_protocol **protocol_list; */
|
||||
field_decl = create_field_decl (build_pointer_type
|
||||
(build_pointer_type
|
||||
(xref_tag (RECORD_TYPE,
|
||||
get_identifier
|
||||
(UTAG_PROTOCOL)))),
|
||||
"protocol_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
ptype = build_pointer_type (build_pointer_type
|
||||
(xref_tag (RECORD_TYPE,
|
||||
get_identifier (UTAG_PROTOCOL))));
|
||||
add_field_decl (ptype, "protocol_list", &chain);
|
||||
|
||||
if (flag_next_runtime)
|
||||
{
|
||||
/* void *sel_id; */
|
||||
field_decl = create_field_decl (build_pointer_type (void_type_node),
|
||||
"sel_id");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (void_type_node), "sel_id", &chain);
|
||||
}
|
||||
|
||||
/* void *gc_object_type; */
|
||||
field_decl = create_field_decl (build_pointer_type (void_type_node),
|
||||
"gc_object_type");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (void_type_node),
|
||||
"gc_object_type", &chain);
|
||||
|
||||
objc_finish_struct (objc_class_template, field_decl_chain);
|
||||
objc_finish_struct (objc_class_template, decls);
|
||||
}
|
||||
|
||||
/* Generate appropriate forward declarations for an implementation. */
|
||||
@ -5101,20 +5038,18 @@ check_ivars (tree inter, tree imp)
|
||||
static void
|
||||
build_super_template (void)
|
||||
{
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls, *chain = NULL;
|
||||
|
||||
objc_super_template = objc_start_struct (get_identifier (UTAG_SUPER));
|
||||
|
||||
/* struct _objc_object *self; */
|
||||
field_decl = create_field_decl (objc_object_type, "self");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (objc_object_type, "self", &chain);
|
||||
|
||||
/* struct _objc_class *super_class; */
|
||||
field_decl = create_field_decl (build_pointer_type (objc_class_template),
|
||||
"super_class");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (objc_class_template),
|
||||
"super_class", &chain);
|
||||
|
||||
objc_finish_struct (objc_super_template, field_decl_chain);
|
||||
objc_finish_struct (objc_super_template, decls);
|
||||
}
|
||||
|
||||
/* struct _objc_ivar {
|
||||
@ -5127,24 +5062,21 @@ static tree
|
||||
build_ivar_template (void)
|
||||
{
|
||||
tree objc_ivar_id, objc_ivar_record;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls, *chain = NULL;
|
||||
|
||||
objc_ivar_id = get_identifier (UTAG_IVAR);
|
||||
objc_ivar_record = objc_start_struct (objc_ivar_id);
|
||||
|
||||
/* char *ivar_name; */
|
||||
field_decl = create_field_decl (string_type_node, "ivar_name");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (string_type_node, "ivar_name", &chain);
|
||||
|
||||
/* char *ivar_type; */
|
||||
field_decl = create_field_decl (string_type_node, "ivar_type");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "ivar_type", &chain);
|
||||
|
||||
/* int ivar_offset; */
|
||||
field_decl = create_field_decl (integer_type_node, "ivar_offset");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (integer_type_node, "ivar_offset", &chain);
|
||||
|
||||
objc_finish_struct (objc_ivar_record, field_decl_chain);
|
||||
objc_finish_struct (objc_ivar_record, decls);
|
||||
|
||||
return objc_ivar_record;
|
||||
}
|
||||
@ -5158,23 +5090,18 @@ static tree
|
||||
build_ivar_list_template (tree list_type, int size)
|
||||
{
|
||||
tree objc_ivar_list_record;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree array_type, decls, *chain = NULL;
|
||||
|
||||
objc_ivar_list_record = objc_start_struct (NULL_TREE);
|
||||
|
||||
/* int ivar_count; */
|
||||
field_decl = create_field_decl (integer_type_node, "ivar_count");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (integer_type_node, "ivar_count", &chain);
|
||||
|
||||
/* struct objc_ivar ivar_list[]; */
|
||||
field_decl = create_field_decl (build_array_type
|
||||
(list_type,
|
||||
build_index_type
|
||||
(build_int_cst (NULL_TREE, size - 1))),
|
||||
"ivar_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
array_type = build_sized_array_type (list_type, size);
|
||||
add_field_decl (array_type, "ivar_list", &chain);
|
||||
|
||||
objc_finish_struct (objc_ivar_list_record, field_decl_chain);
|
||||
objc_finish_struct (objc_ivar_list_record, decls);
|
||||
|
||||
return objc_ivar_list_record;
|
||||
}
|
||||
@ -5189,28 +5116,21 @@ static tree
|
||||
build_method_list_template (tree list_type, int size)
|
||||
{
|
||||
tree objc_ivar_list_record;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree array_type, decls, *chain = NULL;
|
||||
|
||||
objc_ivar_list_record = objc_start_struct (NULL_TREE);
|
||||
|
||||
/* struct _objc__method_prototype_list *method_next; */
|
||||
field_decl = create_field_decl (objc_method_proto_list_ptr,
|
||||
"method_next");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (objc_method_proto_list_ptr, "method_next", &chain);
|
||||
|
||||
/* int method_count; */
|
||||
field_decl = create_field_decl (integer_type_node, "method_count");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (integer_type_node, "method_count", &chain);
|
||||
|
||||
/* struct objc_method method_list[]; */
|
||||
field_decl = create_field_decl (build_array_type
|
||||
(list_type,
|
||||
build_index_type
|
||||
(build_int_cst (NULL_TREE, size - 1))),
|
||||
"method_list");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
array_type = build_sized_array_type (list_type, size);
|
||||
add_field_decl (array_type, "method_list", &chain);
|
||||
|
||||
objc_finish_struct (objc_ivar_list_record, field_decl_chain);
|
||||
objc_finish_struct (objc_ivar_list_record, decls);
|
||||
|
||||
return objc_ivar_list_record;
|
||||
}
|
||||
@ -5386,24 +5306,20 @@ static tree
|
||||
build_method_template (void)
|
||||
{
|
||||
tree _SLT_record;
|
||||
tree field_decl, field_decl_chain;
|
||||
tree decls, *chain = NULL;
|
||||
|
||||
_SLT_record = objc_start_struct (get_identifier (UTAG_METHOD));
|
||||
|
||||
/* SEL _cmd; */
|
||||
field_decl = create_field_decl (objc_selector_type, "_cmd");
|
||||
field_decl_chain = field_decl;
|
||||
decls = add_field_decl (objc_selector_type, "_cmd", &chain);
|
||||
|
||||
/* char *method_types; */
|
||||
field_decl = create_field_decl (string_type_node, "method_types");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (string_type_node, "method_types", &chain);
|
||||
|
||||
/* void *_imp; */
|
||||
field_decl = create_field_decl (build_pointer_type (void_type_node),
|
||||
"_imp");
|
||||
chainon (field_decl_chain, field_decl);
|
||||
add_field_decl (build_pointer_type (void_type_node), "_imp", &chain);
|
||||
|
||||
objc_finish_struct (_SLT_record, field_decl_chain);
|
||||
objc_finish_struct (_SLT_record, decls);
|
||||
|
||||
return _SLT_record;
|
||||
}
|
||||
@ -5511,7 +5427,7 @@ generate_dispatch_tables (void)
|
||||
static tree
|
||||
generate_protocol_list (tree i_or_p)
|
||||
{
|
||||
tree refs_decl, lproto, e, plist;
|
||||
tree array_type, ptype, refs_decl, lproto, e, plist;
|
||||
int size = 0;
|
||||
const char *ref_name;
|
||||
VEC(constructor_elt,gc) *v = NULL;
|
||||
@ -5559,11 +5475,9 @@ generate_protocol_list (tree i_or_p)
|
||||
else
|
||||
abort ();
|
||||
|
||||
refs_decl = start_var_decl
|
||||
(build_array_type
|
||||
(build_pointer_type (objc_protocol_template),
|
||||
build_index_type (build_int_cst (NULL_TREE, size + 2))),
|
||||
ref_name);
|
||||
ptype = build_pointer_type (objc_protocol_template);
|
||||
array_type = build_sized_array_type (ptype, size + 3);
|
||||
refs_decl = start_var_decl (array_type, ref_name);
|
||||
|
||||
finish_var_decl (refs_decl,
|
||||
objc_build_constructor (TREE_TYPE (refs_decl), v));
|
||||
@ -9495,11 +9409,9 @@ generate_objc_image_info (void)
|
||||
= ((flag_replace_objc_classes && imp_list ? 1 : 0)
|
||||
| (flag_objc_gc ? 2 : 0));
|
||||
VEC(constructor_elt,gc) *v = NULL;
|
||||
tree array_type = build_sized_array_type (integer_type_node, 2);
|
||||
|
||||
decl = start_var_decl (build_array_type
|
||||
(integer_type_node,
|
||||
build_index_type (build_int_cst (NULL_TREE, 2 - 1))),
|
||||
"_OBJC_IMAGE_INFO");
|
||||
decl = start_var_decl (array_type, "_OBJC_IMAGE_INFO");
|
||||
|
||||
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, 0));
|
||||
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
|
||||
|
Loading…
Reference in New Issue
Block a user