From ca3e35a1bcef5d17ca0ca9ec702aa4e91e0c7d44 Mon Sep 17 00:00:00 2001 From: rguenth Date: Sat, 22 May 2010 12:56:53 +0000 Subject: 2010-05-22 Richard Guenther * gimple.c (gimple_types_compatible_p): Check type qualifications before merging pointer to complete and pointer to incomplete type. * lto-symtab.c (lto_symtab_resolve_symbols): For commons make sure we use our own resolution algorithm. The gold linker plugin doesn't do the job we want it to do here. lto/ * lto.c (read_cgraph_and_symbols): Do not collect. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159696 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/gimple.c | 11 ++++++++++- gcc/lto-symtab.c | 8 +++++++- gcc/lto/ChangeLog | 4 ++++ gcc/lto/lto.c | 3 ++- 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6b987672dd..d6caa0c10fa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-05-22 Richard Guenther + + * gimple.c (gimple_types_compatible_p): Check type qualifications + before merging pointer to complete and pointer to incomplete type. + * lto-symtab.c (lto_symtab_resolve_symbols): For commons make sure + we use our own resolution algorithm. The gold linker plugin + doesn't do the job we want it to do here. + 2010-05-22 Anatoly Sokolov * config/sparc/sparc.h (GO_IF_MODE_DEPENDENT_ADDRESS): Remove. diff --git a/gcc/gimple.c b/gcc/gimple.c index 1ff9b3a63f6..e5dc184d460 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -3481,11 +3481,20 @@ gimple_types_compatible_p (tree t1, tree t2) && RECORD_OR_UNION_TYPE_P (TREE_TYPE (t1)) && (!COMPLETE_TYPE_P (TREE_TYPE (t1)) || !COMPLETE_TYPE_P (TREE_TYPE (t2))) + && TYPE_QUALS (TREE_TYPE (t1)) == TYPE_QUALS (TREE_TYPE (t2)) && compare_type_names_p (TYPE_MAIN_VARIANT (TREE_TYPE (t1)), TYPE_MAIN_VARIANT (TREE_TYPE (t2)), true)) { /* Replace the pointed-to incomplete type with the - complete one. */ + complete one. + ??? This simple name-based merging causes at least some + of the ICEs in canonicalizing FIELD_DECLs during stmt + read. For example in GCC we have two different struct deps + and we mismatch the use in struct cpp_reader in sched-int.h + vs. mkdeps.c. Of course the whole exercise is for TBAA + with structs which contain pointers to incomplete types + in one unit and to complete ones in another. So we + probably should merge these types only with more context. */ if (COMPLETE_TYPE_P (TREE_TYPE (t2))) TREE_TYPE (t1) = TREE_TYPE (t2); else diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index 28e9aa3eebd..f02824d1f45 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -463,7 +463,13 @@ lto_symtab_resolve_symbols (void **slot) if (TREE_CODE (e->decl) == FUNCTION_DECL) e->node = cgraph_get_node (e->decl); else if (TREE_CODE (e->decl) == VAR_DECL) - e->vnode = varpool_get_node (e->decl); + { + e->vnode = varpool_get_node (e->decl); + /* The LTO plugin for gold doesn't handle common symbols + properly. Let us choose manually. */ + if (DECL_COMMON (e->decl)) + e->resolution = LDPR_UNKNOWN; + } } e = (lto_symtab_entry_t) *slot; diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 492cd6152dc..83cfe3e3e90 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2010-05-22 Richard Guenther + + * lto.c (read_cgraph_and_symbols): Do not collect. + 2010-05-20 Jan Hubicka * lto.c (promote_var, promote_fn): New functions. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 92fa4dd5a38..d1ccc5a9adf 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1633,7 +1633,8 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames) lto_obj_file_close (current_lto_file); current_lto_file = NULL; - ggc_collect (); + /* ??? We'd want but can't ggc_collect () here as the type merging + code in gimple.c uses hashtables that are not ggc aware. */ } if (resolution_file_name) -- cgit v1.2.1