diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-10-28 15:45:03 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-10-28 15:45:03 +0100 |
commit | a1c6569544feb45d1fffff211a7970a8069d8c34 (patch) | |
tree | e0feaa9d7b18ec6d15d20b0f9b34f2eed1395296 /gcc | |
parent | f46835f5ad524deb0ad74cefb74b0494544f59c2 (diff) | |
download | gcc-a1c6569544feb45d1fffff211a7970a8069d8c34.zip gcc-a1c6569544feb45d1fffff211a7970a8069d8c34.tar.gz gcc-a1c6569544feb45d1fffff211a7970a8069d8c34.tar.bz2 |
re PR middle-end/41837 (Using '-O -fipa-struct-reorg -fwhole-program -fprofile-generate' gives 'internal compiler error: Segmentation fault')
PR middle-end/41837
* ipa-struct-reorg.c (find_field_in_struct_1): Return NULL if
fields don't have DECL_NAME.
* gcc.dg/pr41837.c: New test.
From-SVN: r153670
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/ipa-struct-reorg.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr41837.c | 38 |
4 files changed, 55 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dccf36f..e43a077 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -4,6 +4,10 @@ vt_expand_loc unnecessarily when location is not a register nor memory. + PR middle-end/41837 + * ipa-struct-reorg.c (find_field_in_struct_1): Return NULL if + fields don't have DECL_NAME. + PR debug/41801 * builtins.c (get_builtin_sync_mem): Expand loc in ptr_mode, call convert_memory_address on addr. diff --git a/gcc/ipa-struct-reorg.c b/gcc/ipa-struct-reorg.c index bc84eee..7b05bf6 100644 --- a/gcc/ipa-struct-reorg.c +++ b/gcc/ipa-struct-reorg.c @@ -258,15 +258,21 @@ find_field_in_struct_1 (tree str_type, tree field) { tree str_field; + if (!DECL_NAME (field)) + return NULL; + for (str_field = TYPE_FIELDS (str_type); str_field; str_field = TREE_CHAIN (str_field)) { - const char * str_field_name; - const char * field_name; + const char *str_field_name; + const char *field_name; + + if (!DECL_NAME (str_field)) + continue; str_field_name = IDENTIFIER_POINTER (DECL_NAME (str_field)); field_name = IDENTIFIER_POINTER (DECL_NAME (field)); - + gcc_assert (str_field_name); gcc_assert (field_name); @@ -274,7 +280,7 @@ find_field_in_struct_1 (tree str_type, tree field) { /* Check field types. */ if (is_equal_types (TREE_TYPE (str_field), TREE_TYPE (field))) - return str_field; + return str_field; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 747c81b..9f06387 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-10-28 Jakub Jelinek <jakub@redhat.com> + PR middle-end/41837 + * gcc.dg/pr41837.c: New test. + PR debug/41801 * g++.dg/ext/sync-3.C: New test. diff --git a/gcc/testsuite/gcc.dg/pr41837.c b/gcc/testsuite/gcc.dg/pr41837.c new file mode 100644 index 0000000..f96c347 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr41837.c @@ -0,0 +1,38 @@ +/* PR middle-end/41837 */ +/* { dg-do compile } */ +/* { dg-options "-fipa-struct-reorg -O -fwhole-program -fprofile-generate" } */ + +typedef struct { int a, b; } T1; +typedef struct S1 *T2; +typedef struct S2 *T3; +typedef struct S3 *T4; +typedef struct S4 *T5; +struct S4 { union { int c; } d; }; +struct S2 { int e; T2 f; int g; }; +typedef struct { T3 h; } T6; +typedef struct { int i; } *T7; +struct S3 { T6 j; T7 k; }; + +void +f1 (T4 x) +{ + if (!x->j.h->e) + f5 (x); +} + +void +f2 (void) +{ + f6 (f1); +} + +void +f3 (T5 x, T1 *y) +{ +} + +void +f4 (void) +{ + f7 (f3); +} |