From 89ef1046347b12a5e4a989650dbcb8cbcbd6ef1f Mon Sep 17 00:00:00 2001 From: Richard Stallman Date: Sun, 1 Aug 1993 05:53:52 +0000 Subject: [PATCH] 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 --- gcc/objc/objc-act.c | 189 ++++++++++++++++++++++++++++---------------- 1 file changed, 123 insertions(+), 66 deletions(-) diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 645a4dd38b7..3b08b9d8585 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -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)))); + + initlist = tree_cons (NULLT, init_def_list (TREE_TYPE (field)), + initlist); + } - return build_nt (CONSTRUCTOR, NULLT, nreverse (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_ = { ... }; */ @@ -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), -- 2.30.2