Hi,
This is first bug noticed by the type consistency checks I added.
gcov_info_type is a structure that contains function pointer to itself. While
building it we first build a structure w/o size and fields, then we build a
function type that produces a qualified variant of the structure (not sure why
that legwork is needed). Then we add fields via finish_builtin_struct.
It sets the fields to structure but not its variant and then does layout_type
that actually copies size to all variants. So we end up with TYPE_COMPLETE_P
variant
that has size but no fields. This is quite obviously wrong.
Fixed thus. Bootstrapped, lto-bootstrapped and regtested x86_64-linux, comitted.
* stor-layout.c (finish_builtin_struct): Copy fields into
the variants.
Index: stor-layout.c
===================================================================
--- stor-layout.c (revision 212098)
+++ stor-layout.c (working copy)
@@ -2065,7 +2065,7 @@ void
finish_builtin_struct (tree type, const char *name, tree fields,
tree align_type)
{
- tree tail, next;
+ tree tail, next, variant;
for (tail = NULL_TREE; fields; tail = fields, fields = next)
{
@@ -2074,6 +2074,10 @@ finish_builtin_struct (tree type, const
DECL_CHAIN (fields) = tail;
}
TYPE_FIELDS (type) = tail;
+ for (variant = TYPE_MAIN_VARIANT (type);
+ variant != 0;
+ variant = TYPE_NEXT_VARIANT (variant))
+ TYPE_FIELDS (variant) = tail;
if (align_type)
{