Call default_conversion for NAME.
authorRichard Stallman <rms@gnu.org>
Sun, 1 Aug 1993 05:53:52 +0000 (05:53 +0000)
committerRichard Stallman <rms@gnu.org>
Sun, 1 Aug 1993 05:53:52 +0000 (05:53 +0000)
(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

index 645a4dd38b73724223b5c22ae8f12c3715b0b1c0..3b08b9d8585c2d59d36e9e54a0a10052e1a69cb2 100644 (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;
 }
 \f
 /* 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);
 }
 \f
 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... */
 \f
@@ -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),