[Bug tree-optimization/78529] [7 Regression] gcc.c-torture/execute/builtins/strcat-chk.c failed with lto/O2
jgreenhalgh at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 13 12:17:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78529
James Greenhalgh <jgreenhalgh at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jgreenhalgh at gcc dot gnu.org
--- Comment #19 from James Greenhalgh <jgreenhalgh at gcc dot gnu.org> ---
That this only happens for LTO builds is the key here.
gcc/testsuite/gcc.c-torture/execute/builtins/strcat-chk-lib.c includes
gcc/testsuite/gcc.c-torture/execute/builtins/lib/chk.c which defines a memset.
In an LTO build, that definition of memset is visible, here is what it looks
like after code generation:
memset:
sub x3, x2, #1
cbz x2, .L158
and w1, w1, 255
.p2align 2
.L159:
strb w1, [x0, x3]
sub x3, x3, #1
cmn x3, #1
bne .L159
.L158:
adr x1, .LANCHOR0
ldr w1, [x1, 2096]
ret
Clearly x4 is not going to be clobbered there, so ipa-ra can assume it isn't
used and is safe to clobber.
At final link time, on aarch64-none-elf builds with specs files that are
pulling in start-up and tear-down code which uses a library memset, the linker
may pull in the library memset before it sees the memset from lib/chk.c .
That would be an error:
/tmp/ccpefK3l.ltrans0.ltrans.o: In function `memset':
<artificial>:(.text+0x4a0): multiple definition of `memset'
.../aarch64-none-elf/lib/libc.a(lib_a-memset.o):
.../newlib/libc/machine/aarch64/memset.S:90: first defined here
Were it not for the flag added to resolve PR55994
-Wl,--allow-multiple-definition .
So, in my opinion, the testcase is broken and could always have failed in this
way. The combination of register allocation, LTO and order the linker sees
symbols explains why this is hard to reproduce.
More information about the Gcc-bugs
mailing list