diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2005-10-06 19:38:00 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2005-10-06 19:38:00 +0000 |
commit | 6c11790df95634c3911e7990770c6dac72eb8961 (patch) | |
tree | 35204d303db0ac31ddd4180b2a397aabddc209d8 /gcc/tree-ssa-structalias.c | |
parent | 5597a350f4143b458bbc4c9a558d5bac43c141c5 (diff) | |
download | gcc-6c11790df95634c3911e7990770c6dac72eb8961.zip gcc-6c11790df95634c3911e7990770c6dac72eb8961.tar.gz gcc-6c11790df95634c3911e7990770c6dac72eb8961.tar.bz2 |
re PR c++/22488 (C++ frontend generates RECORD_TYPEs with overlapping FIELD_DECLs)
2005-10-06 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/22488
* tree-ssa-structalias.c (check_for_overlaps): New function.
(create_variable_info_for): Use it.
From-SVN: r105052
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 890006a..f6ac3ca 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3020,6 +3020,26 @@ make_constraint_to_anything (varinfo_t vi) process_constraint (new_constraint (lhs, rhs)); } + +/* Return true if FIELDSTACK contains fields that overlap. + FIELDSTACK is assumed to be sorted by offset. */ + +static bool +check_for_overlaps (VEC (fieldoff_s,heap) *fieldstack) +{ + fieldoff_s *fo = NULL; + unsigned int i; + unsigned int lastoffset = ~0; + + for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++) + { + if (fo->offset == lastoffset) + return true; + lastoffset = fo->offset; + } + return false; +} + /* Create a varinfo structure for NAME and DECL, and add it to VARMAP. This will also create any varinfo structures necessary for fields of DECL. */ @@ -3104,8 +3124,16 @@ create_variable_info_for (tree decl, const char *name) which will make notokay = true. In that case, we are going to return without creating varinfos for the fields anyway, so sorting them is a waste to boot. */ - if (!notokay) - sort_fieldstack (fieldstack); + if (!notokay) + { + sort_fieldstack (fieldstack); + /* Due to some C++ FE issues, like PR 22488, we might end up + what appear to be overlapping fields even though they, + in reality, do not overlap. Until the C++ FE is fixed, + we will simply disable field-sensitivity for these cases. */ + notokay = check_for_overlaps (fieldstack); + } + if (VEC_length (fieldoff_s, fieldstack) != 0) fo = VEC_index (fieldoff_s, fieldstack, 0); |