OSDN Git Service

* class.c (layout_virtual_bases): Do all dsize computation on trees.
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 14 Apr 2002 20:55:48 +0000 (20:55 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 14 Apr 2002 20:55:48 +0000 (20:55 +0000)
* g++.dg/other/big-struct.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52304 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/big-struct.C [new file with mode: 0644]

index d7755fd..2f37e25 100644 (file)
@@ -1,3 +1,7 @@
+2002-04-14  Jakub Jelinek  <jakub@redhat.com>
+
+       * class.c (layout_virtual_bases): Do all dsize computation on trees.
+
 2002-04-14  Jason Merrill  <jason@redhat.com>
 
        * typeck.c (get_member_function_from_ptrfunc): Don't do
index ba28e84..c8627fb 100644 (file)
@@ -4642,8 +4642,7 @@ layout_virtual_bases (t, offsets)
      tree t;
      splay_tree offsets;
 {
-  tree vbases;
-  unsigned HOST_WIDE_INT dsize;
+  tree vbases, dsize;
   unsigned HOST_WIDE_INT eoc;
 
   if (CLASSTYPE_N_BASECLASSES (t) == 0)
@@ -4656,7 +4655,7 @@ layout_virtual_bases (t, offsets)
 #endif
 
   /* DSIZE is the size of the class without the virtual bases.  */
-  dsize = tree_low_cst (TYPE_SIZE (t), 1);
+  dsize = TYPE_SIZE (t);
 
   /* Make every class have alignment of at least one.  */
   TYPE_ALIGN (t) = MAX (TYPE_ALIGN (t), BITS_PER_UNIT);
@@ -4678,7 +4677,7 @@ layout_virtual_bases (t, offsets)
        {
          /* This virtual base is not a primary base of any class in the
             hierarchy, so we have to add space for it.  */
-         tree basetype;
+         tree basetype, usize;
          unsigned int desired_align;
 
          basetype = BINFO_TYPE (vbase);
@@ -4688,19 +4687,21 @@ layout_virtual_bases (t, offsets)
 
          /* Add padding so that we can put the virtual base class at an
             appropriately aligned offset.  */
-         dsize = CEIL (dsize, desired_align) * desired_align;
+         dsize = round_up (dsize, desired_align);
+
+         usize = size_binop (CEIL_DIV_EXPR, dsize, bitsize_unit_node);
 
          /* We try to squish empty virtual bases in just like
             ordinary empty bases.  */
          if (is_empty_class (basetype))
            layout_empty_base (vbase,
-                              size_int (CEIL (dsize, BITS_PER_UNIT)),
+                              convert (sizetype, usize),
                               offsets, t);
          else
            {
              tree offset;
 
-             offset = ssize_int (CEIL (dsize, BITS_PER_UNIT));
+             offset = convert (ssizetype, usize);
              offset = size_diffop (offset, 
                                    convert (ssizetype, 
                                             BINFO_OFFSET (vbase)));
@@ -4710,8 +4711,9 @@ layout_virtual_bases (t, offsets)
              /* Every virtual baseclass takes a least a UNIT, so that
                 we can take it's address and get something different
                 for each base.  */
-             dsize += MAX (BITS_PER_UNIT,
-                           tree_low_cst (CLASSTYPE_SIZE (basetype), 0));
+             dsize = size_binop (PLUS_EXPR, dsize,
+                                 size_binop (MAX_EXPR, bitsize_unit_node,
+                                             CLASSTYPE_SIZE (basetype)));
            }
 
          /* Keep track of the offsets assigned to this virtual base.  */
@@ -4733,13 +4735,12 @@ layout_virtual_bases (t, offsets)
      class, we didn't update DSIZE above; we were hoping to overlay
      multiple such bases at the same location.  */
   eoc = end_of_class (t, /*include_virtuals_p=*/1);
-  if (eoc * BITS_PER_UNIT > dsize)
-    dsize = eoc * BITS_PER_UNIT;
+  dsize = size_binop (MAX_EXPR, dsize, bitsize_int (eoc * BITS_PER_UNIT));
 
   /* Now, make sure that the total size of the type is a multiple of
      its alignment.  */
-  dsize = CEIL (dsize, TYPE_ALIGN (t)) * TYPE_ALIGN (t);
-  TYPE_SIZE (t) = bitsize_int (dsize);
+  dsize = round_up (dsize, TYPE_ALIGN (t));
+  TYPE_SIZE (t) = dsize;
   TYPE_SIZE_UNIT (t) = convert (sizetype,
                                size_binop (CEIL_DIV_EXPR, TYPE_SIZE (t),
                                            bitsize_unit_node));
index a6a46bc..39ed219 100644 (file)
@@ -1,3 +1,7 @@
+2002-04-14  Jakub Jelinek  <jakub@redhat.com>
+
+       * g++.dg/other/big-struct.C: New test.
+
 2002-04-14  David Billinghurst <David.Billinghurst@riotinto.com>
 
        * g77.dg/f77-edit-i-in.f: Use internal buffer in place
diff --git a/gcc/testsuite/g++.dg/other/big-struct.C b/gcc/testsuite/g++.dg/other/big-struct.C
new file mode 100644 (file)
index 0000000..b006831
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do compile { target i?86-*-* } }
+
+struct A
+{
+};
+
+struct B : public A
+{
+  char b[0x20000000];
+} e;