rtti.c (tinfo_base_init): Use build_constructor instead of build_constructor_from_list.
authorNathan Froyd <froydnj@codesourcery.com>
Mon, 24 May 2010 17:17:57 +0000 (17:17 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Mon, 24 May 2010 17:17:57 +0000 (17:17 +0000)
* rtti.c (tinfo_base_init): Use build_constructor instead of
build_constructor_from_list.  Don't cons a tree node for
returning.
(generic_initializer): Use build_constructor_single instead of
build_constructor_from_list.
(ptr_initializer): Use build_constructor instead of
build_constructor_from_list
(ptm_initializer): Likewise.
(class_initializer): Likewise.  Take varargs instead of TRAIL.
(get_pseudo_ti_init): Adjust calls to class_initializer.  Use
build_constructor instead of build_constructor_from_list.

From-SVN: r159788

gcc/cp/ChangeLog
gcc/cp/rtti.c

index 7acd4132c14df20ff5a42d030532d44f08a29024..b0454e67070850e06e24d1ea90704e9181ef8ecc 100644 (file)
@@ -1,3 +1,17 @@
+2010-05-24  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * rtti.c (tinfo_base_init): Use build_constructor instead of
+       build_constructor_from_list.  Don't cons a tree node for
+       returning.
+       (generic_initializer): Use build_constructor_single instead of
+       build_constructor_from_list.
+       (ptr_initializer): Use build_constructor instead of
+       build_constructor_from_list
+       (ptm_initializer): Likewise.
+       (class_initializer): Likewise.  Take varargs instead of TRAIL.
+       (get_pseudo_ti_init): Adjust calls to class_initializer.  Use
+       build_constructor instead of build_constructor_from_list.
+
 2010-05-22  Steven Bosscher  <steven@gcc.gnu.org>
 
        * semantics.c: Include bitmap.h.
index 9d300d7f6eeda82325a225646d339577c8cbab60..3ffd097946a217bffdd0c567ff96f9e9a6459f79 100644 (file)
@@ -116,7 +116,7 @@ static tree tinfo_base_init (tinfo_s *, tree);
 static tree generic_initializer (tinfo_s *, tree);
 static tree ptr_initializer (tinfo_s *, tree);
 static tree ptm_initializer (tinfo_s *, tree);
-static tree class_initializer (tinfo_s *, tree, tree);
+static tree class_initializer (tinfo_s *, tree, unsigned, ...);
 static void create_pseudo_type_info (int, const char *, ...);
 static tree get_pseudo_ti_init (tree, unsigned);
 static unsigned get_pseudo_ti_index (tree);
@@ -862,9 +862,10 @@ involves_incomplete_p (tree type)
 static tree
 tinfo_base_init (tinfo_s *ti, tree target)
 {
-  tree init = NULL_TREE;
+  tree init;
   tree name_decl;
   tree vtable_ptr;
+  VEC(constructor_elt,gc) *v;
 
   {
     tree name_name, name_string;
@@ -927,14 +928,13 @@ tinfo_base_init (tinfo_s *ti, tree target)
       ti->vtable = vtable_ptr;
     }
 
-  init = tree_cons (NULL_TREE, vtable_ptr, init);
+  v = VEC_alloc (constructor_elt, gc, 2);
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, vtable_ptr);
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, decay_conversion (name_decl));
 
-  init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
-
-  init = build_constructor_from_list (init_list_type_node, nreverse (init));
+  init = build_constructor (init_list_type_node, v);
   TREE_CONSTANT (init) = 1;
   TREE_STATIC (init) = 1;
-  init = tree_cons (NULL_TREE, init, NULL_TREE);
 
   return init;
 }
@@ -948,7 +948,7 @@ generic_initializer (tinfo_s *ti, tree target)
 {
   tree init = tinfo_base_init (ti, target);
 
-  init = build_constructor_from_list (init_list_type_node, init);
+  init = build_constructor_single (init_list_type_node, NULL_TREE, init);
   TREE_CONSTANT (init) = 1;
   TREE_STATIC (init) = 1;
   return init;
@@ -965,15 +965,16 @@ ptr_initializer (tinfo_s *ti, tree target)
   tree to = TREE_TYPE (target);
   int flags = qualifier_flags (to);
   bool incomplete = target_incomplete_p (to);
+  VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 3);
 
   if (incomplete)
     flags |= 8;
-  init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
-  init = tree_cons (NULL_TREE,
-                   get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
-                   init);
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
+                          get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
 
-  init = build_constructor_from_list (init_list_type_node, nreverse (init));
+  init = build_constructor (init_list_type_node, v);
   TREE_CONSTANT (init) = 1;
   TREE_STATIC (init) = 1;
   return init;
@@ -992,20 +993,19 @@ ptm_initializer (tinfo_s *ti, tree target)
   tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
   int flags = qualifier_flags (to);
   bool incomplete = target_incomplete_p (to);
+  VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 4);
 
   if (incomplete)
     flags |= 0x8;
   if (!COMPLETE_TYPE_P (klass))
     flags |= 0x10;
-  init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
-  init = tree_cons (NULL_TREE,
-                   get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
-                   init);
-  init = tree_cons (NULL_TREE,
-                   get_tinfo_ptr (klass),
-                   init);
-
-  init = build_constructor_from_list (init_list_type_node, nreverse (init));
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
+                          get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, get_tinfo_ptr (klass));
+
+  init = build_constructor (init_list_type_node, v);
   TREE_CONSTANT (init) = 1;
   TREE_STATIC (init) = 1;
   return init;
@@ -1013,15 +1013,23 @@ ptm_initializer (tinfo_s *ti, tree target)
 
 /* Return the CONSTRUCTOR expr for a type_info of class TYPE.
    TI provides information about the particular __class_type_info derivation,
-   which adds hint flags and TRAIL initializers to the type_info base.  */
+   which adds hint flags and N extra initializers to the type_info base.  */
 
 static tree
-class_initializer (tinfo_s *ti, tree target, tree trail)
+class_initializer (tinfo_s *ti, tree target, unsigned n, ...)
 {
   tree init = tinfo_base_init (ti, target);
+  va_list extra_inits;
+  unsigned i;
+  VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, n+1);
+
+  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
+  va_start (extra_inits, n);
+  for (i = 0; i < n; i++)
+    CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, va_arg (extra_inits, tree));
+  va_end (extra_inits);
 
-  TREE_CHAIN (init) = trail;
-  init = build_constructor_from_list (init_list_type_node, init);
+  init = build_constructor (init_list_type_node, v);
   TREE_CONSTANT (init) = 1;
   TREE_STATIC (init) = 1;
   return init;
@@ -1082,17 +1090,16 @@ get_pseudo_ti_init (tree type, unsigned tk_index)
       return generic_initializer (ti, type);
 
     case TK_CLASS_TYPE:
-      return class_initializer (ti, type, NULL_TREE);
+      return class_initializer (ti, type, 0);
 
     case TK_SI_CLASS_TYPE:
       {
        tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
        tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
-       tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
 
        /* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
        ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
-       return class_initializer (ti, type, base_inits);
+       return class_initializer (ti, type, 1, tinfo);
       }
 
     default:
@@ -1105,17 +1112,21 @@ get_pseudo_ti_init (tree type, unsigned tk_index)
        tree offset_type = integer_types[itk_long];
        tree base_inits = NULL_TREE;
        int ix;
+       VEC(constructor_elt,gc) *init_vec = NULL;
+       constructor_elt *e;
 
        gcc_assert (tk_index >= TK_FIXED);
 
+       VEC_safe_grow (constructor_elt, gc, init_vec, nbases);
        /* Generate the base information initializer.  */
        for (ix = nbases; ix--;)
          {
            tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
-           tree base_init = NULL_TREE;
+           tree base_init;
            int flags = 0;
            tree tinfo;
            tree offset;
+           VEC(constructor_elt,gc) *v;
 
            if (VEC_index (tree, base_accesses, ix) == access_public_node)
              flags |= 2;
@@ -1138,25 +1149,22 @@ get_pseudo_ti_init (tree type, unsigned tk_index)
            offset = fold_build2_loc (input_location,
                                  BIT_IOR_EXPR, offset_type, offset,
                                  build_int_cst (offset_type, flags));
-           base_init = tree_cons (NULL_TREE, offset, base_init);
-           base_init = tree_cons (NULL_TREE, tinfo, base_init);
-           base_init = build_constructor_from_list (init_list_type_node, base_init);
-           base_inits = tree_cons (NULL_TREE, base_init, base_inits);
+           v = VEC_alloc (constructor_elt, gc, 2);
+           CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tinfo);
+           CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, offset);
+           base_init = build_constructor (init_list_type_node, v);
+           e = VEC_index (constructor_elt, init_vec, ix);
+           e->index = NULL_TREE;
+           e->value = base_init;
          }
-       base_inits = build_constructor_from_list (init_list_type_node, base_inits);
-       base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
-       /* Prepend the number of bases.  */
-       base_inits = tree_cons (NULL_TREE,
-                               build_int_cst (NULL_TREE, nbases),
-                               base_inits);
-       /* Prepend the hint flags.  */
-       base_inits = tree_cons (NULL_TREE,
-                               build_int_cst (NULL_TREE, hint),
-                               base_inits);
+       base_inits = build_constructor (init_list_type_node, init_vec);
 
        /* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
        ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
-       return class_initializer (ti, type, base_inits);
+       return class_initializer (ti, type, 3,
+                                 build_int_cst (NULL_TREE, hint),
+                                 build_int_cst (NULL_TREE, nbases),
+                                 base_inits);
       }
     }
 }