| 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
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
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.