This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
RE: [PATCH] Inline mempcpy
- From: "Wilco Dijkstra" <wdijkstr at arm dot com>
- To: "'Joseph Myers'" <joseph at codesourcery dot com>
- Cc: 'Ondřej Bílka' <neleai at seznam dot cz>, <libc-alpha at sourceware dot org>
- Date: Mon, 18 May 2015 16:40:15 +0100
- Subject: RE: [PATCH] Inline mempcpy
- Authentication-results: sourceware.org; auth=none
- References: <A610E03AD50BFC4D95529A36D37FA55E769A83F7F7 at GEORGE dot Emea dot Arm dot com> <000201d0915f$87bb15d0$97314170$ at com> <alpine dot DEB dot 2 dot 10 dot 1505181152420 dot 4225 at digraph dot polyomino dot org dot uk>
> Joseph Myers wrote:
> On Mon, 18 May 2015, Wilco Dijkstra wrote:
>
> > #if defined __USE_GNU && !defined TARGET_HAS_OPTIMIZED_MEMPCPY
>
> TARGET_HAS_OPTIMIZED_MEMPCPY is in the user's namespace. Use the existing
> _HAVE_STRING_ARCH_mempcpy (or something like that in the implementation
> namespace, anyway, defined based on consensus for each architecture).
>
> > #undef mempcpy
> > #undef __mempcpy
> > #define mempcpy(dest, src, n) __mempcpy_inline(dest, src, n)
> > #define __mempcpy(dest, src, n) __mempcpy_inline(dest, src, n)
>
> Bad formatting of function calls.
>
> > __attribute__((__always_inline__)) inline void *
>
> __extern_always_inline (and you need to condition things on defined
> __extern_always_inline, and I'm not sure it this will reliably work with
> GCC versions predating the always_inline attribute, or if you need
> __GNUC_PREREQ (3,2) as well ... maybe the __extern_always_inline
> definition should be conditional on that). I'm also doubtful of using
> such inlines when not optimizing.
OK, so we only inline with __OPTIMIZE__ and __extern_always_inline defined
(this limits inlining to modern GCCs but that's not an issue).
We also need to check _FORCE_INLINES to ensure string/string-inlines.c doesn't
report errors. So:
#if defined __USE_GNU && defined __OPTIMIZE__ && defined __extern_always_inline
# if !defined _FORCE_INLINES && !defined _HAVE_STRING_ARCH_mempcpy
#undef mempcpy
#undef __mempcpy
#define mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
#define __mempcpy(dest, src, n) __mempcpy_inline (dest, src, n)
__extern_always_inline void *
__mempcpy_inline (void *__restrict __dest,
const void *__restrict __src, size_t __n)
{
return (char *) memcpy (__dest, __src, __n) + __n;
}
# endif
#endif
Wilco