Fix -Wundef warning on PAGE_COPY_THRESHOLD

The PAGE_COPY_THRESHOLD macro is meant to be overridden by
architecture-specific pagecopy.h, but it is currently done only by
mach; all other architectures use the default.  Check to see if the
macro is defined in addition to whether it is set to a non-zero value.
This commit is contained in:
Siddhesh Poyarekar 2014-07-03 01:28:45 +05:30
parent bc8ea38590
commit 99f8dc9220
9 changed files with 62 additions and 53 deletions

View File

@ -1,3 +1,15 @@
2014-07-02 Siddhesh Poyarekar <siddhesh@redhat.com>
* debug/memcpy_chk.c: Don't include pagecopy.h.
* debug/mempcpy_chk.c: Likewise.
* string/memcpy.c: Likewise.
* string/memmove.c: Likewise.
* sysdeps/powerpc/memmove.c: Likewise.
* sysdeps/generic/memcopy.h: Include pagecopy.h. Move
definition of PAGE_COPY_FWD_MAYBE here...
* sysdeps/generic/pagecopy.h: ... from here.
* sysdeps/mach/pagecopy.h: Don't include generic pagecopy.h.
2014-07-02 Vidya Ranganathan <vidya@linux.vnet.ibm.com>
Adhemerval Zanella <azanella@linux.vnet.ibm.com>

View File

@ -20,7 +20,6 @@
#include <string.h>
#include <memcopy.h>
#include <pagecopy.h>
void *
__memcpy_chk (dstpp, srcpp, len, dstlen)

View File

@ -21,7 +21,6 @@
#include <string.h>
#include <memcopy.h>
#include <pagecopy.h>
void *
__mempcpy_chk (dstpp, srcpp, len, dstlen)

View File

@ -20,7 +20,6 @@
#include <string.h>
#include <memcopy.h>
#include <pagecopy.h>
#undef memcpy

View File

@ -20,7 +20,6 @@
#include <string.h>
#include <memcopy.h>
#include <pagecopy.h>
/* All this is so that bcopy.c can #include
this file after defining some things. */

View File

@ -40,6 +40,7 @@
#include <sys/cdefs.h>
#include <endian.h>
#include <pagecopy.h>
/* The macros defined in this file are:
@ -144,6 +145,47 @@ extern void _wordcopy_bwd_dest_aligned (long int, long int, size_t) __THROW;
(nbytes_left) = (nbytes) % OPSIZ; \
} while (0)
/* The macro PAGE_COPY_FWD_MAYBE (dstp, srcp, nbytes_left, nbytes) is invoked
like WORD_COPY_FWD et al. The pointers should be at least word aligned.
This will check if virtual copying by pages can and should be done and do it
if so. The pointers will be aligned to PAGE_SIZE bytes. The macro requires
that pagecopy.h defines at least PAGE_COPY_THRESHOLD to 0. If
PAGE_COPY_THRESHOLD is non-zero, the header must also define PAGE_COPY_FWD
and PAGE_SIZE.
*/
#if PAGE_COPY_THRESHOLD
# include <assert.h>
# define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) \
do \
{ \
if ((nbytes) >= PAGE_COPY_THRESHOLD && \
PAGE_OFFSET ((dstp) - (srcp)) == 0) \
{ \
/* The amount to copy is past the threshold for copying \
pages virtually with kernel VM operations, and the \
source and destination addresses have the same alignment. */ \
size_t nbytes_before = PAGE_OFFSET (-(dstp)); \
if (nbytes_before != 0) \
{ \
/* First copy the words before the first page boundary. */ \
WORD_COPY_FWD (dstp, srcp, nbytes_left, nbytes_before); \
assert (nbytes_left == 0); \
nbytes -= nbytes_before; \
} \
PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes); \
} \
} while (0)
/* The page size is always a power of two, so we can avoid modulo division. */
# define PAGE_OFFSET(n) ((n) & (PAGE_SIZE - 1))
#else
# define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) /* nada */
#endif
/* Threshold value for when to enter the unrolled loops. */
#define OP_T_THRES 16

View File

@ -1,4 +1,4 @@
/* Macros for copying by pages; used in memcpy, memmove. Generic macros.
/* Macros for copying by pages; used in memcpy, memmove.
Copyright (C) 1995-2014 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -16,19 +16,15 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* This file defines the macro:
/* The macro PAGE_COPY_FWD_MAYBE defined in memcopy.h is used in memmove if the
PAGE_COPY_THRESHOLD macro is set to a non-zero value. The default is 0,
that is copying by pages is not implemented.
PAGE_COPY_FWD_MAYBE (dstp, srcp, nbytes_left, nbytes)
which is invoked like WORD_COPY_FWD et al. The pointers should be at
least word aligned. This will check if virtual copying by pages can and
should be done and do it if so.
System-specific pagecopy.h files should define these macros and then
#include this file:
System-specific pagecopy.h files that want to support page copying should
define these macros:
PAGE_COPY_THRESHOLD
-- Minimum size for which virtual copying by pages is worthwhile.
-- A non-zero minimum size for which virtual copying by pages is worthwhile.
PAGE_SIZE
-- Size of a page.
@ -38,37 +34,4 @@
The pointers will be aligned to PAGE_SIZE bytes.
*/
#if PAGE_COPY_THRESHOLD
#include <assert.h>
#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) \
do \
{ \
if ((nbytes) >= PAGE_COPY_THRESHOLD && \
PAGE_OFFSET ((dstp) - (srcp)) == 0) \
{ \
/* The amount to copy is past the threshold for copying \
pages virtually with kernel VM operations, and the \
source and destination addresses have the same alignment. */ \
size_t nbytes_before = PAGE_OFFSET (-(dstp)); \
if (nbytes_before != 0) \
{ \
/* First copy the words before the first page boundary. */ \
WORD_COPY_FWD (dstp, srcp, nbytes_left, nbytes_before); \
assert (nbytes_left == 0); \
nbytes -= nbytes_before; \
} \
PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes); \
} \
} while (0)
/* The page size is always a power of two, so we can avoid modulo division. */
#define PAGE_OFFSET(n) ((n) & (PAGE_SIZE - 1))
#else
#define PAGE_COPY_FWD_MAYBE(dstp, srcp, nbytes_left, nbytes) /* nada */
#endif
#define PAGE_COPY_THRESHOLD 0

View File

@ -30,6 +30,3 @@
(vm_address_t) dstp) == KERN_SUCCESS \
? trunc_page (nbytes) \
: 0)))
/* Get the generic macro. */
#include <sysdeps/generic/pagecopy.h>

View File

@ -20,7 +20,6 @@
#include <string.h>
#include <memcopy.h>
#include <pagecopy.h>
/* All this is so that bcopy.c can #include
this file after defining some things. */