better error message for multiple prevailing defs

Submitted by Andi Kleen on July 11, 2010, 8:19 a.m.

Details

Message ID 20100711081923.GA7694@basil.fritz.box
State New
Headers show

Commit Message

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.

Comments

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 hide | download patch | download mbox

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