Call default_conversion for NAME.

(build_shared_structure_initializer):
Call default_conversion for NAME.
(add_objc_string): Make an ADDR_EXPR to return.
(init_objc_symtab): Make ADDR_EXPR for UOBJC_SELECTOR_TABLE_decl.

Build all CONSTRUCTORs with types.
(build_constructor): New function.  All CONSTRUCTOR builds changed.
(init_def_list, init_objc_symtab): New arg TYPE.
(init_module_descriptor): Likewise.
(init_objc_symtab): Pass TYPE arg to init_def_list.
(generate_objc_symtab_decl): Pass TYPE arg to init_objc_symtab.
(build_module_descriptor): Pass TYPE arg to init_module_descriptor.
(build_descriptor_table_initializer): New arg TYPE.
(generate_method_descriptors): Pass TYPE arg to
build_descriptor_table_initializer.
(generate_protocols): Pass TYPE arg to build_protocol_initializer.
(uild_protocol_initializer): New arg TYPE.
(build_ivar_list_initializer): New arg TYPE.
(generate_ivar_lists): Pass TYPE arg to build_ivar_list_initializer.
(build_dispatch_table_initializer): New arg TYPE.
(generate_dispatch_tables): Pass TYPE arg to
build_dispatch_table_initializer.
(build_category_initializer): New arg TYPE.
(build_shared_structure_initializer): New arg TYPE.
(generate_category): Pass TYPE arg to build_category_initializer.
(generate_shared_structures): Pass TYPE arg to
build_shared_structure_initializer.

From-SVN: r5049
This commit is contained in:
Richard Stallman 1993-08-01 05:53:52 +00:00
parent 61e215dd1f
commit 89ef104634
1 changed files with 123 additions and 66 deletions

View File

@ -145,8 +145,9 @@ static void finish_objc PROTO((void));
/* code generation */
static void synth_module_prologue PROTO((void));
static tree build_constructor PROTO((tree, tree));
static char *build_module_descriptor PROTO((void));
static tree init_module_descriptor PROTO((void));
static tree init_module_descriptor PROTO((tree));
static tree build_objc_method_call PROTO((int, tree, tree, tree, tree, tree));
static void generate_strings PROTO((void));
static void build_selector_translation_table PROTO((void));
@ -158,8 +159,8 @@ static tree build_private_template PROTO((tree));
static void build_class_template PROTO((void));
static void build_category_template PROTO((void));
static tree build_super_template PROTO((void));
static tree build_category_initializer PROTO((tree, tree, tree, tree, tree));
static tree build_protocol_initializer PROTO((tree, tree, tree, tree));
static tree build_category_initializer PROTO((tree, tree, tree, tree, tree, tree));
static tree build_protocol_initializer PROTO((tree, tree, tree, tree, tree));
static void synth_forward_declarations PROTO((void));
static void generate_ivar_lists PROTO((void));
@ -253,8 +254,8 @@ static tree lookup_protocol_in_reflist PROTO((tree, tree));
static tree create_builtin_decl PROTO((enum tree_code, tree, char *));
static tree my_build_string PROTO((int, char *));
static void build_objc_symtab_template PROTO((void));
static tree init_def_list PROTO((void));
static tree init_objc_symtab PROTO((void));
static tree init_def_list PROTO((tree));
static tree init_objc_symtab PROTO((tree));
static void forward_declare_categories PROTO((void));
static void generate_objc_symtab_decl PROTO((void));
static tree build_selector PROTO((tree));
@ -264,7 +265,7 @@ static tree build_class_reference_decl PROTO((tree));
static void add_class_reference PROTO((tree));
static tree objc_copy_list PROTO((tree, tree *));
static tree build_protocol_template PROTO((void));
static tree build_descriptor_table_initializer PROTO((tree, int *));
static tree build_descriptor_table_initializer PROTO((tree, tree, int *));
static tree build_method_prototype_list_template PROTO((tree, int));
static tree build_method_prototype_template PROTO((void));
static int forwarding_offset PROTO((tree));
@ -278,11 +279,11 @@ static void generate_protocols PROTO((void));
static void check_ivars PROTO((tree, tree));
static tree build_ivar_list_template PROTO((tree, int));
static tree build_method_list_template PROTO((tree, int));
static tree build_ivar_list_initializer PROTO((tree, int *));
static tree build_ivar_list_initializer PROTO((tree, tree, int *));
static tree generate_ivars_list PROTO((tree, char *, int, tree));
static tree build_dispatch_table_initializer PROTO((tree, int *));
static tree build_dispatch_table_initializer PROTO((tree, tree, int *));
static tree generate_dispatch_table PROTO((tree, char *, int, tree));
static tree build_shared_structure_initializer PROTO((tree, tree, tree, tree, int, tree, tree, tree));
static tree build_shared_structure_initializer PROTO((tree, tree, tree, tree, tree, int, tree, tree, tree));
static void generate_category PROTO((tree));
static int is_objc_type_qualifier PROTO((tree));
static tree adjust_type_for_id_default PROTO((tree));
@ -1171,13 +1172,26 @@ build_objc_string_object (strings)
initlist = tree_cons (NULLT, build_unary_op (ADDR_EXPR, string, 1),
initlist);
initlist = tree_cons (NULLT, build_int_2 (length, 0), initlist);
constructor = build (CONSTRUCTOR, constant_string_type, NULLT,
nreverse (initlist));
constructor = build_constructor (constant_string_type,
nreverse (initlist));
return build_unary_op (ADDR_EXPR, constructor, 1);
}
/* Build a static constant CONSTRUCTOR
with type TYPE and elements ELTS. */
static tree
build_constructor (type, elts)
tree type, elts;
{
tree constructor = build (CONSTRUCTOR, type, NULL_TREE, elts);
TREE_CONSTANT (constructor) = 1;
TREE_STATIC (constructor) = 1;
TREE_READONLY (constructor) = 1;
return build_unary_op (ADDR_EXPR, constructor, 1);
return constructor;
}
/* Take care of defining and initializing _OBJC_SYMBOLS. */
@ -1245,7 +1259,8 @@ build_objc_symtab_template ()
This is a CONSTRUCTOR. */
static tree
init_def_list ()
init_def_list (type)
tree type;
{
tree expr, initlist = NULLT;
struct imp_entry *impent;
@ -1269,13 +1284,14 @@ init_def_list ()
initlist = tree_cons (NULLT, expr, initlist);
}
}
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* Construct the initial value for all of _objc_symtab. */
static tree
init_objc_symtab ()
init_objc_symtab (type)
tree type;
{
tree initlist;
@ -1288,7 +1304,10 @@ init_objc_symtab ()
if (flag_next_runtime || ! sel_ref_chain)
initlist = tree_cons (NULLT, build_int_2 (0, 0), initlist);
else
initlist = tree_cons (NULLT, UOBJC_SELECTOR_TABLE_decl, initlist);
initlist = tree_cons (NULLT,
build_unary_op (ADDR_EXPR,
UOBJC_SELECTOR_TABLE_decl, 1),
initlist);
/* cls_def_cnt = { ..., 5, ... } */
@ -1301,9 +1320,15 @@ init_objc_symtab ()
/* cls_def = { ..., { &Foo, &Bar, ...}, ... } */
if (imp_count || cat_count)
initlist = tree_cons (NULLT, init_def_list (), initlist);
{
tree field = TYPE_FIELDS (type);
field = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (field))));
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
initlist = tree_cons (NULLT, init_def_list (TREE_TYPE (field)),
initlist);
}
return build_constructor (type, nreverse (initlist));
}
/* Push forward-declarations of all the categories
@ -1354,11 +1379,14 @@ generate_objc_symtab_decl ()
end_temporary_allocation (); /* start_decl trying to be smart about inits */
TREE_USED (UOBJC_SYMBOLS_decl) = 1;
DECL_IGNORED_P (UOBJC_SYMBOLS_decl) = 1;
finish_decl (UOBJC_SYMBOLS_decl, init_objc_symtab (), NULLT);
finish_decl (UOBJC_SYMBOLS_decl,
init_objc_symtab (TREE_TYPE (UOBJC_SYMBOLS_decl)),
NULLT);
}
static tree
init_module_descriptor ()
init_module_descriptor (type)
tree type;
{
tree initlist, expr;
@ -1385,7 +1413,7 @@ init_module_descriptor ()
expr = build_int_2 (0, 0);
initlist = tree_cons (NULLT, expr, initlist);
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* Write out the data structures to describe Objective C classes defined.
@ -1446,7 +1474,9 @@ build_module_descriptor ()
end_temporary_allocation (); /* start_decl trying to be smart about inits */
DECL_IGNORED_P (UOBJC_MODULES_decl) = 1;
finish_decl (UOBJC_MODULES_decl, init_module_descriptor (), NULLT);
finish_decl (UOBJC_MODULES_decl,
init_module_descriptor (TREE_TYPE (UOBJC_MODULES_decl)),
NULLT);
/* Mark the decl to avoid "defined but not used" warning. */
DECL_IN_SYSTEM_HEADER (UOBJC_MODULES_decl) = 1;
@ -1747,7 +1777,8 @@ build_selector_translation_table ()
/* NULL terminate the list and fix the decl for output. */
initlist = tree_cons (NULLT, build_int_2 (0, 0), initlist);
DECL_INITIAL (UOBJC_SELECTOR_TABLE_decl) = (tree) 1;
initlist = build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
initlist = build_constructor (TREE_TYPE (UOBJC_SELECTOR_TABLE_decl),
nreverse (initlist));
finish_decl (UOBJC_SELECTOR_TABLE_decl, initlist, NULLT);
}
}
@ -1910,7 +1941,7 @@ add_objc_string (ident, section)
while (*chain)
{
if (TREE_VALUE (*chain) == ident)
return TREE_PURPOSE (*chain);
return build_unary_op (ADDR_EXPR, TREE_PURPOSE (*chain), 1);
chain = &TREE_CHAIN (*chain);
}
@ -1919,7 +1950,7 @@ add_objc_string (ident, section)
*chain = perm_tree_cons (decl, ident, NULLT);
return decl;
return build_unary_op (ADDR_EXPR, decl, 1);
}
static tree
@ -2226,7 +2257,8 @@ build_protocol_template ()
}
static tree
build_descriptor_table_initializer (entries, size)
build_descriptor_table_initializer (type, entries, size)
tree type;
tree entries;
int *size;
{
@ -2243,7 +2275,7 @@ build_descriptor_table_initializer (entries, size)
}
while (entries);
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* struct objc_method_prototype_list {
@ -2456,7 +2488,8 @@ generate_descriptor_table (type, name, size, list, proto)
initlist = build_tree_list (NULLT, build_int_2 (size, 0));
initlist = tree_cons (NULLT, list, initlist);
finish_decl (decl, build_nt (CONSTRUCTOR, NULLT, nreverse (initlist)), NULLT);
finish_decl (decl, build_constructor (type, nreverse (initlist)),
NULLT);
return decl;
}
@ -2480,14 +2513,18 @@ generate_method_descriptors (protocol) /* generate_dispatch_tables */
chain = PROTOCOL_CLS_METHODS (protocol);
if (chain)
{
size = 0;
tree field;
initlist = build_descriptor_table_initializer (chain, &size);
size = 0;
method_list_template
= build_method_prototype_list_template (objc_method_prototype_template,
size);
field = TREE_CHAIN (TYPE_FIELDS (method_list_template));
initlist = build_descriptor_table_initializer (TREE_TYPE (field),
chain, &size);
UOBJC_CLASS_METHODS_decl
= generate_descriptor_table (method_list_template,
"_OBJC_PROTOCOL_CLASS_METHODS",
@ -2501,12 +2538,16 @@ generate_method_descriptors (protocol) /* generate_dispatch_tables */
chain = PROTOCOL_NST_METHODS (protocol);
if (chain)
{
tree field;
size = 0;
initlist = build_descriptor_table_initializer (chain, &size);
method_list_template
= build_method_prototype_list_template (objc_method_prototype_template,
size);
field = TREE_CHAIN (TYPE_FIELDS (method_list_template));
initlist = build_descriptor_table_initializer (TREE_TYPE (field),
chain, &size);
UOBJC_INSTANCE_METHODS_decl
= generate_descriptor_table (method_list_template,
@ -2691,7 +2732,8 @@ generate_protocols ()
/* UOBJC_INSTANCE_METHODS_decl/UOBJC_CLASS_METHODS_decl are set
by generate_method_descriptors, which is called above. */
initlist = build_protocol_initializer (protocol_name_expr, refs_expr,
initlist = build_protocol_initializer (TREE_TYPE (decl),
protocol_name_expr, refs_expr,
UOBJC_INSTANCE_METHODS_decl,
UOBJC_CLASS_METHODS_decl);
finish_decl (decl, initlist, NULLT);
@ -2702,8 +2744,9 @@ generate_protocols ()
}
static tree
build_protocol_initializer (protocol_name, protocol_list,
build_protocol_initializer (type, protocol_name, protocol_list,
instance_methods, class_methods)
tree type;
tree protocol_name;
tree protocol_list;
tree instance_methods;
@ -2743,7 +2786,7 @@ build_protocol_initializer (protocol_name, protocol_list,
expr = build_unary_op (ADDR_EXPR, class_methods, 0);
initlist = tree_cons (NULLT, expr, initlist);
}
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* end code generation for protocols... */
@ -3214,7 +3257,8 @@ build_method_list_template (list_type, size)
}
static tree
build_ivar_list_initializer (field_decl, size)
build_ivar_list_initializer (type, field_decl, size)
tree type;
tree field_decl;
int *size;
{
@ -3258,7 +3302,7 @@ build_ivar_list_initializer (field_decl, size)
}
while (field_decl);
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
static tree
@ -3280,7 +3324,9 @@ generate_ivars_list (type, name, size, list)
initlist = build_tree_list (NULLT, build_int_2 (size, 0));
initlist = tree_cons (NULLT, list, initlist);
finish_decl (decl, build_nt (CONSTRUCTOR, NULLT, nreverse (initlist)), NULLT);
finish_decl (decl,
build_constructor (TREE_TYPE (decl), nreverse (initlist)),
NULLT);
return decl;
}
@ -3311,13 +3357,13 @@ generate_ivar_lists ()
&& (chain = TYPE_FIELDS (objc_class_template)))
{
size = 0;
initlist = build_ivar_list_initializer (chain, &size);
ivar_list_template = build_ivar_list_template (objc_ivar_template, size);
initlist = build_ivar_list_initializer (ivar_list_template,
chain, &size);
UOBJC_CLASS_VARIABLES_decl =
generate_ivars_list (ivar_list_template, "_OBJC_CLASS_VARIABLES",
size, initlist);
UOBJC_CLASS_VARIABLES_decl
= generate_ivars_list (ivar_list_template, "_OBJC_CLASS_VARIABLES",
size, initlist);
/* cast! */
TREE_TYPE (UOBJC_CLASS_VARIABLES_decl) = variable_length_type;
}
@ -3328,13 +3374,13 @@ generate_ivar_lists ()
if (chain)
{
size = 0;
initlist = build_ivar_list_initializer (chain, &size);
ivar_list_template = build_ivar_list_template (objc_ivar_template, size);
initlist = build_ivar_list_initializer (ivar_list_template,
chain, &size);
UOBJC_INSTANCE_VARIABLES_decl =
generate_ivars_list (ivar_list_template, "_OBJC_INSTANCE_VARIABLES",
size, initlist);
UOBJC_INSTANCE_VARIABLES_decl
= generate_ivars_list (ivar_list_template, "_OBJC_INSTANCE_VARIABLES",
size, initlist);
/* cast! */
TREE_TYPE (UOBJC_INSTANCE_VARIABLES_decl) = variable_length_type;
}
@ -3345,7 +3391,8 @@ generate_ivar_lists ()
}
static tree
build_dispatch_table_initializer (entries, size)
build_dispatch_table_initializer (type, entries, size)
tree type;
tree entries;
int *size;
{
@ -3367,7 +3414,7 @@ build_dispatch_table_initializer (entries, size)
}
while (entries);
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* To accomplish method prototyping without generating all kinds of
@ -3441,7 +3488,9 @@ generate_dispatch_table (type, name, size, list)
initlist = tree_cons (NULLT, build_int_2 (size, 0), initlist);
initlist = tree_cons (NULLT, list, initlist);
finish_decl (decl, build_nt (CONSTRUCTOR, NULLT, nreverse (initlist)), NULLT);
finish_decl (decl,
build_constructor (TREE_TYPE (decl), nreverse (initlist)),
NULLT);
return decl;
}
@ -3467,10 +3516,11 @@ generate_dispatch_tables ()
if (chain)
{
size = 0;
initlist = build_dispatch_table_initializer (chain, &size);
method_list_template = build_method_list_template (objc_method_template,
size);
initlist = build_dispatch_table_initializer (method_list_template,
chain, &size);
UOBJC_CLASS_METHODS_decl
= generate_dispatch_table (method_list_template,
@ -3489,19 +3539,20 @@ generate_dispatch_tables ()
if (chain)
{
size = 0;
initlist = build_dispatch_table_initializer (chain, &size);
method_list_template = build_method_list_template (objc_method_template,
size);
initlist = build_dispatch_table_initializer (method_list_template,
chain, &size);
if (TREE_CODE (implementation_context) == CLASS_IMPLEMENTATION_TYPE)
UOBJC_INSTANCE_METHODS_decl =
generate_dispatch_table (method_list_template,
UOBJC_INSTANCE_METHODS_decl
= generate_dispatch_table (method_list_template,
"_OBJC_INSTANCE_METHODS",
size, initlist);
else
/* we have a category */
UOBJC_INSTANCE_METHODS_decl =
generate_dispatch_table (method_list_template,
UOBJC_INSTANCE_METHODS_decl
= generate_dispatch_table (method_list_template,
"_OBJC_CATEGORY_INSTANCE_METHODS",
size, initlist);
/* cast! */
@ -3590,15 +3641,17 @@ generate_protocol_list (i_or_p)
refs_decl = start_decl (expr_decl, decl_specs, 1);
end_temporary_allocation ();
finish_decl (refs_decl, build_nt (CONSTRUCTOR, NULLT,
nreverse (initlist)), NULLT);
finish_decl (refs_decl, build_constructor (TREE_TYPE (refs_decl),
nreverse (initlist)),
NULLT);
return refs_decl;
}
static tree
build_category_initializer (cat_name, class_name,
build_category_initializer (type, cat_name, class_name,
instance_methods, class_methods, protocol_list)
tree type;
tree cat_name;
tree class_name;
tree instance_methods;
@ -3647,7 +3700,7 @@ build_category_initializer (cat_name, class_name,
initlist = tree_cons (NULLT, expr, initlist);
}
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* struct objc_class {
@ -3670,8 +3723,9 @@ build_category_initializer (cat_name, class_name,
}; */
static tree
build_shared_structure_initializer (isa, super, name, size, status,
build_shared_structure_initializer (type, isa, super, name, size, status,
dispatch_table, ivar_list, protocol_list)
tree type;
tree isa;
tree super;
tree name;
@ -3690,7 +3744,7 @@ build_shared_structure_initializer (isa, super, name, size, status,
initlist = tree_cons (NULLT, super, initlist);
/* name = */
initlist = tree_cons (NULLT, name, initlist);
initlist = tree_cons (NULLT, default_conversion (name), initlist);
/* version = */
initlist = tree_cons (NULLT, build_int_2 (0, 0), initlist);
@ -3756,7 +3810,7 @@ build_shared_structure_initializer (isa, super, name, size, status,
initlist = tree_cons (NULLT, expr, initlist);
}
return build_nt (CONSTRUCTOR, NULLT, nreverse (initlist));
return build_constructor (type, nreverse (initlist));
}
/* static struct objc_category _OBJC_CATEGORY_<name> = { ... }; */
@ -3799,7 +3853,8 @@ generate_category (cat)
decl_specs, 1);
end_temporary_allocation ();
initlist = build_category_initializer (cat_name_expr, class_name_expr,
initlist = build_category_initializer (TREE_TYPE (decl),
cat_name_expr, class_name_expr,
UOBJC_INSTANCE_METHODS_decl,
UOBJC_CLASS_METHODS_decl,
protocol_decl);
@ -3882,7 +3937,8 @@ generate_shared_structures ()
initlist
= build_shared_structure_initializer
(root_expr, super_expr, name_expr,
(TREE_TYPE (decl),
root_expr, super_expr, name_expr,
build_int_2 ((TREE_INT_CST_LOW (TYPE_SIZE (objc_class_template))
/ BITS_PER_UNIT),
0),
@ -3900,7 +3956,8 @@ generate_shared_structures ()
initlist
= build_shared_structure_initializer
(build_unary_op (ADDR_EXPR, UOBJC_METACLASS_decl, 0),
(TREE_TYPE (decl),
build_unary_op (ADDR_EXPR, UOBJC_METACLASS_decl, 0),
super_expr, name_expr,
build_int_2 ((TREE_INT_CST_LOW (TYPE_SIZE (CLASS_STATIC_TEMPLATE (implementation_template)))
/ BITS_PER_UNIT),