This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix error recovery issue with alias


Hi,

this fixes a segfault on a malformed alias declaration, which is correctly 
flagged as an error by handle_alias_pairs:

error: 'Linker_Alias.Var' aliased to undefined symbol 'var2'

but is nevertheless later processed as a valid alias by the cgraph machinery.

Bootstrapped/regtested on x86_64-suse-linux, OK for the mainline?


2013-06-25  Eric Botcazou  <ebotcazou@adacore.com>

	* cgraphunit.c (handle_alias_pairs): Reset the alias flag after the
	error message is issued for an alias to an undefined symbol.


2013-06-25  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/specs/linker_alias.ads: New test.


-- 
Eric Botcazou
Index: cgraphunit.c
===================================================================
--- cgraphunit.c	(revision 200350)
+++ cgraphunit.c	(working copy)
@@ -1001,7 +1001,7 @@ analyze_functions (void)
 
 /* Translate the ugly representation of aliases as alias pairs into nice
    representation in callgraph.  We don't handle all cases yet,
-   unforutnately.  */
+   unfortunately.  */
 
 static void
 handle_alias_pairs (void)
@@ -1013,10 +1013,11 @@ handle_alias_pairs (void)
     {
       symtab_node target_node = symtab_node_for_asm (p->target);
 
-      /* Weakrefs with target not defined in current unit are easy to handle; they
-	 behave just as external variables except we need to note the alias flag
-	 to later output the weakref pseudo op into asm file.  */
-      if (!target_node && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)) != NULL)
+      /* Weakrefs with target not defined in current unit are easy to handle:
+	 they behave just as external variables except we need to note the
+	 alias flag to later output the weakref pseudo op into asm file.  */
+      if (!target_node
+	  && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)) != NULL)
 	{
 	  symtab_node node = symtab_get_node (p->decl);
 	  if (node)
@@ -1031,6 +1032,9 @@ handle_alias_pairs (void)
       else if (!target_node)
 	{
 	  error ("%q+D aliased to undefined symbol %qE", p->decl, p->target);
+	  symtab_node node = symtab_get_node (p->decl);
+	  if (node)
+	    node->symbol.alias = false;
 	  alias_pairs->unordered_remove (i);
 	  continue;
 	}
-- { dg-do compile }

package Linker_Alias is

   Var : Integer;  -- { dg-error "aliased to undefined symbol" }
   pragma Export (C, Var, "my_var");
   pragma Linker_Alias (Var, "var2");

end Linker_Alias;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]