mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 11:20:07 +00:00
tile: allow memcpy(p, p, n) without corrupting memory at "p"
Although this is not required by the definition of memcpy(), in practice this sort of thing does happen, and it's easy to make the code robust by doing nothing in this case. (Since structure copy causes the compiler to emit a memcpy, in the case where the target structure is the same as the destination, we were seeing corruption.)
This commit is contained in:
parent
cbf92fc466
commit
575298fcd2
@ -1,3 +1,8 @@
|
||||
2012-05-12 Chris Metcalf <cmetcalf@tilera.com>
|
||||
|
||||
* sysdeps/tile/tilegx/memcpy.c: Allow memcpy(p, p, n)
|
||||
without corrupting memory at "p".
|
||||
|
||||
2012-05-12 Chris Metcalf <cmetcalf@tilera.com>
|
||||
|
||||
* sysdeps/tile/__tls_get_addr.S: Use __WORDSIZE, not _LP64.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2011-2012 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
|
||||
|
||||
@ -107,6 +107,17 @@ __memcpy (void *__restrict dstv, const void *__restrict srcv, size_t n)
|
||||
n -= sizeof (word_t))
|
||||
*dst8++ = *src8++;
|
||||
|
||||
/* If copying to self, return. The test is cheap enough
|
||||
that we do it despite the fact that the memcpy() contract
|
||||
doesn't require us to support overlapping dst and src.
|
||||
This is the most common case of overlap, and any close
|
||||
overlap will cause corruption due to the wh64 below.
|
||||
This case is particularly important since the compiler
|
||||
will emit memcpy() calls for aggregate copies even if it
|
||||
can't prove that src != dst. */
|
||||
if (__builtin_expect (dst8 == src8, 0))
|
||||
return dstv;
|
||||
|
||||
for (; n >= CHIP_L2_LINE_SIZE ();)
|
||||
{
|
||||
__insn_wh64 (dst8);
|
||||
|
Loading…
Reference in New Issue
Block a user