Add common ifunc-init.h header
This patch moves the generic definition from x86_64 init-arch to a common header ifunc-init.h. No functional changes is expected. Checked on a x86_64-linux-gnu build. * sysdeps/generic/ifunc-init.h: New file. * sysdeps/x86/init-arch.h: Use generic ifunc-init.h.
This commit is contained in:
parent
56a752ab6a
commit
4e17c78e4a
|
@ -1,3 +1,8 @@
|
||||||
|
2017-10-17 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||||
|
|
||||||
|
* sysdeps/generic/ifunc-init.h: New file.
|
||||||
|
* sysdeps/x86/init-arch.h: Use generic ifunc-init.h.
|
||||||
|
|
||||||
2017-10-17 Mike FABIAN <mfabian@redhat.com>
|
2017-10-17 Mike FABIAN <mfabian@redhat.com>
|
||||||
|
|
||||||
[BZ #22019]
|
[BZ #22019]
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/* IFUNC generic definitions.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Copyright (C) 2017 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* These macros are used to implement ifunc selection in C. To implement
|
||||||
|
an ifunc function, foo, which returns the address of __foo_impl1 or
|
||||||
|
__foo_impl2:
|
||||||
|
|
||||||
|
#define foo __redirect_foo
|
||||||
|
#include <foo.h>
|
||||||
|
#undef foo
|
||||||
|
#define SYMBOL_NAME foo
|
||||||
|
#include <ifunc-init.h>
|
||||||
|
|
||||||
|
extern __typeof (REDIRECT_NAME) OPTIMIZE (impl1) attribute_hidden;
|
||||||
|
extern __typeof (REDIRECT_NAME) OPTIMIZE (impl2) attribute_hidden;
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
foo_selector (void)
|
||||||
|
{
|
||||||
|
if (condition)
|
||||||
|
return OPTIMIZE (impl2);
|
||||||
|
|
||||||
|
return OPTIMIZE (impl1);
|
||||||
|
}
|
||||||
|
|
||||||
|
libc_ifunc_redirected (__redirect_foo, foo, IFUNC_SELECTOR ());
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PASTER1(x,y) x##_##y
|
||||||
|
#define EVALUATOR1(x,y) PASTER1 (x,y)
|
||||||
|
#define PASTER2(x,y) __##x##_##y
|
||||||
|
#define EVALUATOR2(x,y) PASTER2 (x,y)
|
||||||
|
|
||||||
|
/* Basically set '__redirect_<symbol>' to use as type definition,
|
||||||
|
'__<symbol>_<variant>' as the optimized implementation and
|
||||||
|
'<symbol>_ifunc_selector' as the IFUNC selector. */
|
||||||
|
#define REDIRECT_NAME EVALUATOR1 (__redirect, SYMBOL_NAME)
|
||||||
|
#define OPTIMIZE(name) EVALUATOR2 (SYMBOL_NAME, name)
|
||||||
|
#define IFUNC_SELECTOR EVALUATOR1 (SYMBOL_NAME, ifunc_selector)
|
|
@ -20,46 +20,7 @@
|
||||||
#else
|
#else
|
||||||
# include <ldsodefs.h>
|
# include <ldsodefs.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <ifunc-init.h>
|
||||||
/* These macros are used to implement ifunc selection in C. To implement
|
|
||||||
an ifunc function, foo, which returns the address of __foo_sse2 or
|
|
||||||
__foo_avx2:
|
|
||||||
|
|
||||||
#define foo __redirect_foo
|
|
||||||
#define __foo __redirect___foo
|
|
||||||
#include <foo.h>
|
|
||||||
#undef foo
|
|
||||||
#undef __foo
|
|
||||||
#define SYMBOL_NAME foo
|
|
||||||
#include <init-arch.h>
|
|
||||||
|
|
||||||
extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
|
|
||||||
extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
|
|
||||||
|
|
||||||
static inline void *
|
|
||||||
foo_selector (void)
|
|
||||||
{
|
|
||||||
if (use AVX2)
|
|
||||||
return OPTIMIZE (avx2);
|
|
||||||
|
|
||||||
return OPTIMIZE (sse2);
|
|
||||||
}
|
|
||||||
|
|
||||||
libc_ifunc_redirected (__redirect_foo, foo, foo_selector ());
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PASTER1(x,y) x##_##y
|
|
||||||
#define EVALUATOR1(x,y) PASTER1 (x,y)
|
|
||||||
#define PASTER2(x,y) __##x##_##y
|
|
||||||
#define EVALUATOR2(x,y) PASTER2 (x,y)
|
|
||||||
|
|
||||||
/* Basically set '__redirect_<symbol>' to use as type definition,
|
|
||||||
'__<symbol>_<variant>' as the optimized implementation and
|
|
||||||
'<symbol>_ifunc_selector' as the IFUNC selector. */
|
|
||||||
#define REDIRECT_NAME EVALUATOR1 (__redirect, SYMBOL_NAME)
|
|
||||||
#define OPTIMIZE(name) EVALUATOR2 (SYMBOL_NAME, name)
|
|
||||||
#define IFUNC_SELECTOR EVALUATOR1 (SYMBOL_NAME, ifunc_selector)
|
|
||||||
|
|
||||||
#ifndef __x86_64__
|
#ifndef __x86_64__
|
||||||
/* Due to the reordering and the other nifty extensions in i686, it is
|
/* Due to the reordering and the other nifty extensions in i686, it is
|
||||||
|
|
Loading…
Reference in New Issue