Patchwork better error message for multiple prevailing defs

login
register
mail settings
Submitter Andi Kleen
Date July 11, 2010, 8:19 a.m.
Message ID <20100711081923.GA7694@basil.fritz.box>
Download mbox | patch
Permalink /patch/58512/
State New
Headers show

Comments

Andi Kleen - July 11, 2010, 8:19 a.m.
I have some trouble with the linker providing multiple prevailing
definitions for a single LTO symbol. Right now it's difficult 
to find out which symbol this even is, can be only done with the 
debugger. Fix the error message to print out the symbol.

I have no svn account, so someone would need to commit it for me.

-Andi
 
2010-07-11  Andi Kleen  <ak@linux.intel.com>
    
	* lto-symtab.c (lto_symtab_merge_decls_1): Use internal_error
    	instead of gcc_assert to print better error message for multiple
    	prevailing defs.
Richard Guenther - July 11, 2010, 9:59 a.m.
On Sun, Jul 11, 2010 at 10:19 AM, Andi Kleen <andi@firstfloor.org> wrote:
> I have some trouble with the linker providing multiple prevailing
> definitions for a single LTO symbol. Right now it's difficult
> to find out which symbol this even is, can be only done with the
> debugger. Fix the error message to print out the symbol.
>
> I have no svn account, so someone would need to commit it for me.
>
> -Andi
>
> 2010-07-11  Andi Kleen  <ak@linux.intel.com>
>
>        * lto-symtab.c (lto_symtab_merge_decls_1): Use internal_error
>        instead of gcc_assert to print better error message for multiple
>        prevailing defs.
>
> diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c
> index d101449..c907723 100644
> --- a/gcc/lto-symtab.c
> +++ b/gcc/lto-symtab.c
> @@ -648,9 +648,13 @@ lto_symtab_merge_decls_1 (void **slot, void *data ATTRIBUTE_UNUSED)
>
>   /* Assert it's the only one.  */
>   if (prevailing)
> -    for (e = prevailing->next; e; e = e->next)
> -      gcc_assert (e->resolution != LDPR_PREVAILING_DEF_IRONLY
> -                 && e->resolution != LDPR_PREVAILING_DEF);
> +      for (e = prevailing->next; e; e = e->next)
> +       {
> +         if (e->resolution != LDPR_PREVAILING_DEF_IRONLY
> +             && e->resolution != LDPR_PREVAILING_DEF)
> +           internal_error ("multiple prevailing defs for %qE",
> +                           DECL_NAME (prevailing->decl));

I'd say using fatal_error () here is more appropriate.

Richard.

> +       }
>
>   /* If there's not a prevailing symbol yet it's an external reference.
>      Happens a lot during ltrans.  Choose the first symbol with a
>

Patch

diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c
index d101449..c907723 100644
--- a/gcc/lto-symtab.c
+++ b/gcc/lto-symtab.c
@@ -648,9 +648,13 @@  lto_symtab_merge_decls_1 (void **slot, void *data ATTRIBUTE_UNUSED)
 
   /* Assert it's the only one.  */
   if (prevailing)
-    for (e = prevailing->next; e; e = e->next)
-      gcc_assert (e->resolution != LDPR_PREVAILING_DEF_IRONLY
-		  && e->resolution != LDPR_PREVAILING_DEF);
+      for (e = prevailing->next; e; e = e->next)
+	{
+	  if (e->resolution != LDPR_PREVAILING_DEF_IRONLY
+	      && e->resolution != LDPR_PREVAILING_DEF)
+	    internal_error ("multiple prevailing defs for %qE", 
+			    DECL_NAME (prevailing->decl));
+	}
 
   /* If there's not a prevailing symbol yet it's an external reference.
      Happens a lot during ltrans.  Choose the first symbol with a