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
This commit is contained in:
parent
ebef4e8ca7
commit
0f490a2bde
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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
|
||||
|
10
gcc/testsuite/g++.dg/other/big-struct.C
Normal file
10
gcc/testsuite/g++.dg/other/big-struct.C
Normal file
@ -0,0 +1,10 @@
|
||||
// { dg-do compile { target i?86-*-* } }
|
||||
|
||||
struct A
|
||||
{
|
||||
};
|
||||
|
||||
struct B : public A
|
||||
{
|
||||
char b[0x20000000];
|
||||
} e;
|
Loading…
Reference in New Issue
Block a user