re PR c/26774 (Out of memory compiling 9-line Delta-reduced Linux kernel driver msp3400.c)

gcc/

2006-04-19  Carlos O'Donell  <carlos@codesourcery.com>
	    Nathan Sidwell  <nathan@codesourcery.com>

	PR c/26774
	* stor-layout.c (update_alignment_for_field): Do not align 
	ERROR_MARK nodes.
	(place_union_field): Place union field at the start of the union.
	(place_field): Move ERROR_MARK check later, and use the current
	allocation position to maintain monotonicity.

gcc/testsuite/

2006-04-19  Carlos O'Donell  <carlos@codesourcery.com>

	PR c/26774
	* gcc.dg/struct-parse-1.c: New test case.


Co-Authored-By: Nathan Sidwell <nathan@codesourcery.com>

From-SVN: r113107
This commit is contained in:
Carlos O'Donell 2006-04-20 00:21:51 +00:00 committed by Carlos O'Donell
parent 4fc1015b1d
commit 9dfb66b9fe
4 changed files with 46 additions and 11 deletions

View File

@ -1,3 +1,13 @@
2006-04-19 Carlos O'Donell <carlos@codesourcery.com>
Nathan Sidwell <nathan@codesourcery.com>
PR c/26774
* stor-layout.c (update_alignment_for_field): Do not align
ERROR_MARK nodes.
(place_union_field): Place union field at the start of the union.
(place_field): Move ERROR_MARK check later, and use the current
allocation position to maintain monotonicity.
2006-04-19 Zdenek Dvorak <dvorakz@suse.cz>
* dominance.c: Include timevar.h.

View File

@ -663,6 +663,10 @@ update_alignment_for_field (record_layout_info rli, tree field,
bool user_align;
bool is_bitfield;
/* Do not attempt to align an ERROR_MARK node */
if (TREE_CODE (type) == ERROR_MARK)
return 0;
/* Lay out the field so we know what alignment it needs. */
layout_decl (field, known_align);
desired_align = DECL_ALIGN (field);
@ -775,6 +779,12 @@ place_union_field (record_layout_info rli, tree field)
DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node;
SET_DECL_OFFSET_ALIGN (field, BIGGEST_ALIGNMENT);
/* If this is an ERROR_MARK return *after* having set the
field at the start of the union. This helps when parsing
invalid fields. */
if (TREE_CODE (TREE_TYPE (field)) == ERROR_MARK)
return;
/* We assume the union's size will be a multiple of a byte so we don't
bother with BITPOS. */
if (TREE_CODE (rli->t) == UNION_TYPE)
@ -823,17 +833,6 @@ place_field (record_layout_info rli, tree field)
gcc_assert (TREE_CODE (field) != ERROR_MARK);
if (TREE_CODE (type) == ERROR_MARK)
{
if (TREE_CODE (field) == FIELD_DECL)
{
DECL_FIELD_OFFSET (field) = size_int (0);
DECL_FIELD_BIT_OFFSET (field) = bitsize_int (0);
}
return;
}
/* If FIELD is static, then treat it like a separate variable, not
really like a structure field. If it is a FUNCTION_DECL, it's a
method. In both cases, all we do is lay out the decl, and we do
@ -858,6 +857,16 @@ place_field (record_layout_info rli, tree field)
return;
}
else if (TREE_CODE (type) == ERROR_MARK)
{
/* Place this field at the current allocation position, so we
maintain monotonicity. */
DECL_FIELD_OFFSET (field) = rli->offset;
DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
SET_DECL_OFFSET_ALIGN (field, rli->offset_align);
return;
}
/* Work out the known alignment so far. Note that A & (-A) is the
value of the least-significant bit in A that is one. */
if (! integer_zerop (rli->bitpos))

View File

@ -1,3 +1,8 @@
2006-04-19 Carlos O'Donell <carlos@codesourcery.com>
PR c/26774
* gcc.dg/struct-parse-1.c: New test case.
2006-04-19 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/26558

View File

@ -0,0 +1,11 @@
/* Copyright (C) 2006 Free Software Foundation, Inc. */
/* Contributed by Carlos O'Donell on 2006-03-31 */
/* This code caused the C frontend to loop
forever exhausting all system memory, or ICE */
/* Origin: Carlos O'Donell <carlos@codesourcery.com> */
/* { dg-options "-std=c99" } */
struct s { int a; int b; struct t c; }; /* { dg-error "error: field 'c' has incomplete type" } */
struct s d = { .b = 0 };