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.