From 0f490a2bdebeae8a982559b8ee190ffee7ac03df Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sun, 14 Apr 2002 22:55:48 +0200 Subject: [PATCH] class.c (layout_virtual_bases): Do all dsize computation on trees. * class.c (layout_virtual_bases): Do all dsize computation on trees. * g++.dg/other/big-struct.C: New test. From-SVN: r52304 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/class.c | 27 +++++++++++++------------ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/other/big-struct.C | 10 +++++++++ 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/big-struct.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d7755fda9ff..2f37e2548b8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2002-04-14 Jakub Jelinek + + * class.c (layout_virtual_bases): Do all dsize computation on trees. + 2002-04-14 Jason Merrill * typeck.c (get_member_function_from_ptrfunc): Don't do diff --git a/gcc/cp/class.c b/gcc/cp/class.c index ba28e849554..c8627fb36fd 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a6a46bc5682..39ed2193402 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-04-14 Jakub Jelinek + + * g++.dg/other/big-struct.C: New test. + 2002-04-14 David Billinghurst * 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 index 00000000000..b00683135f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/big-struct.C @@ -0,0 +1,10 @@ +// { dg-do compile { target i?86-*-* } } + +struct A +{ +}; + +struct B : public A +{ + char b[0x20000000]; +} e;