This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Types with power-of-two size in ggc-page.c extra_order_size_table[]
- From: oliver dot kellogg at t-online dot de (Oliver Kellogg)
- To: gcc at gcc dot gnu dot org
- Date: Wed, 16 Sep 2009 00:39:00 +0200
- Subject: Types with power-of-two size in ggc-page.c extra_order_size_table[]
- Reply-to: okellogg at users dot sourceforge dot net
Hi,
Looking at ggc-page.c:175ff.,
static const size_t extra_order_size_table[] = {
sizeof (struct var_ann_d),
sizeof (struct tree_decl_non_common),
sizeof (struct tree_field_decl),
sizeof (struct tree_parm_decl),
sizeof (struct tree_var_decl),
sizeof (struct tree_list),
sizeof (struct tree_ssa_name),
sizeof (struct function),
sizeof (struct basic_block_def),
sizeof (bitmap_element),
sizeof (bitmap_head),
TREE_EXP_SIZE (2),
RTL_SIZE (2), /* MEM, PLUS, etc. */
RTL_SIZE (9), /* INSN */
};
On my openSuSE-11.1 i686-pc-linux-gnu, sizeof (struct basic_block_def)
is 64 and sizeof (bitmap_head) is 16.
Why are these types entered into extra_order_size_table?
ggc-page.c (init_ggc):1567ff.
for (order = HOST_BITS_PER_PTR; order < NUM_ORDERS; ++order)
{
int o;
int i;
i = OBJECT_SIZE (order);
if (i >= NUM_SIZE_LOOKUP)
continue;
for (o = size_lookup[i]; o == size_lookup [i]; --i)
size_lookup[i] = order;
}
At order 42, OBJECT_SIZE returns 16 (from extra_order_size_table[10])
and size_lookup[16] down to [9] is changed to 42.
That seems strange to me, given the documentation of size_lookup[],
/* This table provides a fast way to determine ceil(log_2(size)) for
allocation requests. The minimum allocation size is eight bytes. */
Thanks,
Oliver