* symtab.c: Include calls.h
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Jul 2014 19:53:36 +0000 (19:53 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Jul 2014 19:53:36 +0000 (19:53 +0000)
(symtab_nonoverwritable_alias_1): Check sanity of the local
alias.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212337 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/symtab.c

index 8eec932..1e06ded 100644 (file)
@@ -1,3 +1,9 @@
+2014-07-07  Jan Hubicka  <hubicka@ucw.cz>
+
+       * symtab.c: Include calls.h
+       (symtab_nonoverwritable_alias_1): Check sanity of the local
+       alias.
+
 2014-07-07  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * config/rs6000/rs6000.c (output_vec_const_move): Handle
index 80ea94a..deb317d 100644 (file)
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "lto-streamer.h"
 #include "output.h"
 #include "ipa-utils.h"
+#include "calls.h"
 
 static const char *ipa_ref_use_name[] = {"read","write","addr","alias"};
 
@@ -1727,6 +1728,19 @@ symtab_nonoverwritable_alias_1 (symtab_node *node, void *data)
 {
   if (decl_binds_to_current_def_p (node->decl))
     {
+      symtab_node *fn = symtab_alias_ultimate_target (node);
+
+      /* Ensure that the alias is well formed this may not be the case
+        of user defined aliases and currently it is not always the case
+        of C++ same body aliases (that is a bug).  */
+      if (TREE_TYPE (node->decl) != TREE_TYPE (fn->decl)
+         || DECL_CONTEXT (node->decl) != DECL_CONTEXT (fn->decl)
+         || (TREE_CODE (node->decl) == FUNCTION_DECL
+             && flags_from_decl_or_type (node->decl)
+                != flags_from_decl_or_type (fn->decl))
+         || DECL_ATTRIBUTES (node->decl) != DECL_ATTRIBUTES (fn->decl))
+       return false;
+
       *(symtab_node **)data = node;
       return true;
     }