http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43157

Dave Korn <davek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |davek at gcc dot gnu.org

--- Comment #7 from Dave Korn <davek at gcc dot gnu.org> 2010-12-10 06:57:54 
UTC ---
I can't reproduce any segfault, but this slightly-modified version of the
testcase fails on i686-pc-cygwin, which is a target where __USER_LABEL_PREFIX
is an underscore:

ad...@ubik /gnu/gcc/obj-lto/gcc
$ cat pr43157.c
/* { dg-do link } */
/* { dg-require-effective-target lto } */
/* { dg-options "-O1 -flto -fuse-linker-plugin" } */

#define LABEL3(pfx, x) # pfx x
#define LABEL2(pfx, x) LABEL3(pfx, x)
#define LABEL(x) LABEL2(__USER_LABEL_PREFIX__, x)

unsigned int factorial_ (unsigned int) __asm__ (LABEL ("factorial"));

unsigned int factorial (unsigned int i)
{
  return i > 1 ? i * factorial_ (i - 1) : 1;
}

int main (void)
{
  return factorial (5);
}

ad...@ubik /gnu/gcc/obj-lto/gcc
$ ./xgcc.exe -B. -O1 -flto -fuse-linker-plugin pr43157.c -o pr43157.exe
/win/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccroMaGc.ltrans0.ltrans.o:ccroMaGc.ltrans
0.o:(.text.startup+0x16): undefined reference to `_factorial'
collect2: ld returned 1 exit status


Looking at the lto symtab in the generated .o file:

ad...@ubik /gnu/gcc/obj-lto/gcc
$ nm --plugin /gnu/gcc/obj-asm-mangle/gcc/cyglto_plugin-0.dll pr43157.o
         U _factorial
00000000 T factorial
00000000 T main

... you can see it's gotten confused about c-level vs. asm-level symbols, this
reflects in the generated resolution file:

ad...@ubik /gnu/gcc/obj-lto/gcc
$ ./xgcc.exe -B. -O1 -flto -fuse-linker-plugin pr43157.c -o pr43157.exe --save-
temps
[Leaving LTRANS /win/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccU0cpRH.args]
[Leaving LTRANS pr43157.exe.ltrans.out]
[Leaving LTRANS /win/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccGUCoPM.args]
[Leaving LTRANS pr43157.exe.ltrans0.o]
pr43157.exe.ltrans0.ltrans.o:pr43157.exe.ltrans0.o:(.text.startup+0x16):
undefin
ed reference to `_factorial'
collect2: ld returned 1 exit status

ad...@ubik /gnu/gcc/obj-lto/gcc
$ cat pr43157.res
1
pr43157.o 3
75 d804d237 PREVAILING_DEF_IRONLY _factorial
84 d804d237 PREVAILING_DEF _main
87 d804d237 UNDEF __factorial

With my patch for asm name mangling in lto symtabs, it works fine.  The
generated lto symtab contains asm-level symbols only:

ad...@ubik /gnu/gcc/obj-asm-mangle/gcc
$ ./xgcc.exe -B. -O1 -flto -fuse-linker-plugin -c pr43157.c -o pr43157.o

ad...@ubik /gnu/gcc/obj-asm-mangle/gcc
$ nm --plugin /gnu/gcc/obj-asm-mangle/gcc/cyglto_plugin-0.dll pr43157.o
00000000 T _factorial
00000000 T _main

ad...@ubik /gnu/gcc/obj-asm-mangle/gcc
$ ./xgcc.exe -B. -O1 -flto -fuse-linker-plugin pr43157.c -o pr43157.exe --save-
temps
[Leaving LTRANS /win/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccBfa3cb.args]
[Leaving LTRANS pr43157.exe.ltrans.out]
[Leaving LTRANS /win/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccmkGBnN.args]
[Leaving LTRANS pr43157.exe.ltrans0.o]

ad...@ubik /gnu/gcc/obj-asm-mangle/gcc
$ cat pr43157.res
1
pr43157.o 2
75 f3900364 PREVAILING_DEF_IRONLY _factorial
84 f3900364 PREVAILING_DEF _main

ad...@ubik /gnu/gcc/obj-asm-mangle/gcc

... and so the resolution file comes out correct.

Reply via email to