[lto] fix ICE in int_mode_for_mode
Nathan Froyd
froydnj@codesourcery.com
Mon Nov 5 19:53:00 GMT 2007
The patch below fixes an ICE in int_mode_for_mode; the root of the
problem actually occurs in the LTO reader. When we're reading a
structure type, we might create copies of that type while reading fields
of that structure. While we're reading the fields of the structure, the
mode of the structure type is set to VOIDmode -- and so copies of the
structure are also marked with VOIDmode. After we're done reading the
fields, we layout the structure, which changes its mode to something
sane; its copies, however, remain in VOIDmode and if they get used for
something, they will cause the aforementioned ICE in int_mode_for_mode.
The fix is to use a record_layout_info and its associated functions to
properly layout the structure. With this, the TYPE_NEXT_VARIANTs
properly inherit the computed properties of their parent.
Committed to the LTO branch.
-Nathan
2007-11-05 Nathan Froyd <froydnj@codesourcery.com>
* lto.c (lto_read_structure_union_class_type_DIE): Use proper record
layout functions to compute information about the newly constructed
type.
Index: lto.c
===================================================================
--- lto.c (revision 129904)
+++ lto.c (working copy)
@@ -1636,6 +1636,7 @@ lto_read_structure_union_class_type_DIE
int i, n;
tree *fields_tail;
tree *methods_tail;
+ record_layout_info rli;
LTO_BEGIN_READ_ATTRS ()
{
@@ -1741,6 +1742,7 @@ lto_read_structure_union_class_type_DIE
n = VEC_length (tree, children);
fields_tail = &TYPE_FIELDS (type);
methods_tail = &TYPE_METHODS (type);
+ rli = start_record_layout (type);
for (i = 0; i < n; i++)
{
tree child = VEC_index (tree, children, i);
@@ -1811,20 +1813,17 @@ lto_read_structure_union_class_type_DIE
}
}
}
- }
- VEC_free (tree, heap, children);
- /* We might not have any information about how big the structure is. */
- if (size)
- {
- /* The type mode isn't encoded in the DWARF spec, either, so just
- recompute it from scratch. */
- compute_record_mode (type);
- if (GET_MODE_ALIGNMENT (TYPE_MODE (type)) > align)
- align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
- TYPE_ALIGN (type) = align;
+ if (TREE_CODE_CLASS (TREE_CODE (child)) == tcc_declaration)
+ place_field (rli, child);
}
+ /* We have all the information we need about this structure. */
+ finish_record_layout (rli, false);
+
+ VEC_free (tree, heap, children);
+ free (rli);
+
/* Finish debugging output for this type. */
if (!declaration)
rest_of_type_compilation (type, /*top_level=*/1);
More information about the Gcc-patches
mailing list