https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112563
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Ah, I see, the problem is that the sanitizers use (both in GCC and Clang)
-fno-builtin option, which makes it not work unless user uses just memcpy.
Short testcase:
extern "C" void *memcpy (void *, const void *, decltype (sizeof 0)) __asm
("__sanitizer_internal_memcpy");
extern "C" void *memmove (void *, const void *, decltype (sizeof 0)) __asm
("__sanitizer_internal_memmove");
extern "C" void *memset (void *, int, decltype (sizeof 0)) __asm
("__sanitizer_internal_memset");
struct S { char s[512]; };
void
foo (S *p, S *q)
{
*p = *q;
}
void
bar (int, void *r, void *s)
{
memcpy (r, s, 512);
}
void
baz (int, int, void *t, void *u)
{
__builtin_memcpy (t, u, 512);
}
On x86_64 -O2 -mstringop-strategy=libcall vs. that + -fno-builtin, on sparc
without -mstringop-strategy=libcall.