This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 0/5] Move x86 __cpu_features to rtld_global


On Wed, Aug 5, 2015 at 10:07 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Here is a set of 5 patches to move x86 __cpu_features to
> _dl_x86_cpu_features in rtld_global.
>
> One drawback of the current x86 struct cpu_features initialization is
> we don't know if it is available when it is used.  IFUNC selectors have
> to check __cpu_features and call __init_cpu_features before using
> __cpu_features, which leads to code duplication.  It is also expensive
> for ia32 since it has to save and restore EBX for function call via PLT.
>
> This set of patches add _dl_x86_cpu_features to rtld_global and
> initialize it early before __libc_start_main is called so that
> cpu_features is always available when it is used and we can avoid
> calling __init_cpu_features in IFUNC selectors.
>
> H.J. Lu (5):
>   Add _dl_x86_cpu_features to rtld_global
>   Update x86_64 multiarch functions for <cpu-features.h>
>   Update i686 multiarch functions for <cpu-features.h>
>   Update libmvec multiarch functions for <cpu-features.h>
>   Update x86 elision-conf.c for <cpu-features.h>
>
>  math/Makefile                                      |   2 +-
>  sysdeps/i386/dl-machine.h                          |   3 +
>  sysdeps/i386/dl-procinfo.c                         |  16 ++
>  sysdeps/i386/i686/cacheinfo.c                      |   1 -
>  sysdeps/i386/i686/fpu/multiarch/e_expf.c           |   8 +-
>  sysdeps/i386/i686/fpu/multiarch/s_cosf.c           |   2 +-
>  sysdeps/i386/i686/fpu/multiarch/s_sincosf.c        |   3 +-
>  sysdeps/i386/i686/fpu/multiarch/s_sinf.c           |   2 +-
>  sysdeps/i386/i686/multiarch/Makefile               |   1 -
>  sysdeps/i386/i686/multiarch/Versions               |   5 -
>  sysdeps/i386/i686/multiarch/bcopy.S                |  45 +---
>  sysdeps/i386/i686/multiarch/bzero.S                |  39 +---
>  sysdeps/i386/i686/multiarch/ifunc-defines.sym      |   1 -
>  sysdeps/i386/i686/multiarch/ifunc-impl-list.c      | 199 ++++++++++-------
>  sysdeps/i386/i686/multiarch/memchr.S               |  36 +---
>  sysdeps/i386/i686/multiarch/memcmp.S               |  39 +---
>  sysdeps/i386/i686/multiarch/memcpy.S               |  29 +--
>  sysdeps/i386/i686/multiarch/memcpy_chk.S           |  29 +--
>  sysdeps/i386/i686/multiarch/memmove.S              |  60 ++----
>  sysdeps/i386/i686/multiarch/memmove_chk.S          |  50 +----
>  sysdeps/i386/i686/multiarch/mempcpy.S              |  29 +--
>  sysdeps/i386/i686/multiarch/mempcpy_chk.S          |  29 +--
>  sysdeps/i386/i686/multiarch/memrchr.S              |  36 +---
>  sysdeps/i386/i686/multiarch/memset.S               |  39 +---
>  sysdeps/i386/i686/multiarch/memset_chk.S           |  40 +---
>  sysdeps/i386/i686/multiarch/rawmemchr.S            |  36 +---
>  sysdeps/i386/i686/multiarch/s_fma.c                |   3 +-
>  sysdeps/i386/i686/multiarch/s_fmaf.c               |   3 +-
>  sysdeps/i386/i686/multiarch/strcasecmp.S           |  43 +---
>  sysdeps/i386/i686/multiarch/strcat.S               |  44 +---
>  sysdeps/i386/i686/multiarch/strchr.S               |  23 +-
>  sysdeps/i386/i686/multiarch/strcmp.S               |  43 +---
>  sysdeps/i386/i686/multiarch/strcpy.S               |  44 +---
>  sysdeps/i386/i686/multiarch/strcspn.S              |  32 +--
>  sysdeps/i386/i686/multiarch/strlen.S               |  23 +-
>  sysdeps/i386/i686/multiarch/strncase.S             |  43 +---
>  sysdeps/i386/i686/multiarch/strnlen.S              |  19 +-
>  sysdeps/i386/i686/multiarch/strrchr.S              |  23 +-
>  sysdeps/i386/i686/multiarch/strspn.S               |  32 +--
>  sysdeps/i386/i686/multiarch/wcschr.S               |  19 +-
>  sysdeps/i386/i686/multiarch/wcscmp.S               |  19 +-
>  sysdeps/i386/i686/multiarch/wcscpy.S               |  19 +-
>  sysdeps/i386/i686/multiarch/wcslen.S               |  19 +-
>  sysdeps/i386/i686/multiarch/wcsrchr.S              |  19 +-
>  sysdeps/i386/i686/multiarch/wmemcmp.S              |  23 +-
>  sysdeps/i386/ldsodefs.h                            |   1 +
>  sysdeps/unix/sysv/linux/x86/Makefile               |   1 -
>  sysdeps/unix/sysv/linux/x86/elision-conf.c         |   4 +-
>  sysdeps/unix/sysv/linux/x86_64/dl-procinfo.c       |   2 +-
>  sysdeps/x86/Makefile                               |  11 +
>  sysdeps/x86/Versions                               |   5 +
>  sysdeps/x86/cpu-features-offsets.sym               |   7 +
>  sysdeps/x86/cpu-features.c                         | 202 +++++++++++++++++
>  sysdeps/x86/cpu-features.h                         | 240 +++++++++++++++++++++
>  sysdeps/x86/dl-get-cpu-features.c                  |  27 +++
>  sysdeps/x86/libc-start.c                           |  41 ++++
>  sysdeps/x86/rtld-global-offsets.sym                |   7 +
>  sysdeps/x86/tst-get-cpu-features-static.c          |   1 +
>  sysdeps/x86/tst-get-cpu-features.c                 |  31 +++
>  sysdeps/x86_64/cacheinfo.c                         | 137 ++----------
>  sysdeps/x86_64/dl-machine.h                        |   3 +
>  sysdeps/x86_64/dl-procinfo.c                       |  57 +++++
>  sysdeps/x86_64/fpu/math-tests-arch.h               |  42 +---
>  sysdeps/x86_64/fpu/multiarch/e_asin.c              |   8 +-
>  sysdeps/x86_64/fpu/multiarch/e_atan2.c             |   9 +-
>  sysdeps/x86_64/fpu/multiarch/e_exp.c               |   9 +-
>  sysdeps/x86_64/fpu/multiarch/e_log.c               |   9 +-
>  sysdeps/x86_64/fpu/multiarch/e_pow.c               |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_atan.c              |   9 +-
>  sysdeps/x86_64/fpu/multiarch/s_ceil.S              |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_ceilf.S             |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_floor.S             |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_floorf.S            |   4 +-
>  sysdeps/x86_64/fpu/multiarch/s_fma.c               |   9 +-
>  sysdeps/x86_64/fpu/multiarch/s_fmaf.c              |   9 +-
>  sysdeps/x86_64/fpu/multiarch/s_nearbyint.S         |   4 +-
>  sysdeps/x86_64/fpu/multiarch/s_nearbyintf.S        |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_rint.S              |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_rintf.S             |   5 +-
>  sysdeps/x86_64/fpu/multiarch/s_sin.c               |  14 +-
>  sysdeps/x86_64/fpu/multiarch/s_tan.c               |   9 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_cos2_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_cos4_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_cos8_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_exp2_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_exp4_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_exp8_core.S    |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_log2_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_log4_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_log8_core.S    |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_pow2_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_pow4_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_pow8_core.S    |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_sin2_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_sin4_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_sin8_core.S    |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_sincos2_core.S |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_sincos4_core.S |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_d_sincos8_core.S |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_cosf16_core.S  |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_cosf4_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_cosf8_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_expf16_core.S  |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_expf4_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_expf8_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_logf16_core.S  |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_logf4_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_logf8_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_powf16_core.S  |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_powf4_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_powf8_core.S   |   8 +-
>  .../x86_64/fpu/multiarch/svml_s_sincosf16_core.S   |  10 +-
>  .../x86_64/fpu/multiarch/svml_s_sincosf4_core.S    |   8 +-
>  .../x86_64/fpu/multiarch/svml_s_sincosf8_core.S    |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_sinf16_core.S  |  10 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_sinf4_core.S   |   8 +-
>  sysdeps/x86_64/fpu/multiarch/svml_s_sinf8_core.S   |   6 +-
>  sysdeps/x86_64/ldsodefs.h                          |   1 +
>  sysdeps/x86_64/multiarch/Makefile                  |   1 -
>  sysdeps/x86_64/multiarch/Versions                  |   5 -
>  sysdeps/x86_64/multiarch/cacheinfo.c               |   2 -
>  sysdeps/x86_64/multiarch/ifunc-defines.sym         |   1 -
>  sysdeps/x86_64/multiarch/ifunc-impl-list.c         | 139 +++++++-----
>  sysdeps/x86_64/multiarch/init-arch.c               | 223 -------------------
>  sysdeps/x86_64/multiarch/init-arch.h               | 194 +----------------
>  sysdeps/x86_64/multiarch/memcmp.S                  |   9 +-
>  sysdeps/x86_64/multiarch/memcpy.S                  |  12 +-
>  sysdeps/x86_64/multiarch/memcpy_chk.S              |  12 +-
>  sysdeps/x86_64/multiarch/memmove.c                 |   6 +-
>  sysdeps/x86_64/multiarch/memmove_chk.c             |   6 +-
>  sysdeps/x86_64/multiarch/mempcpy.S                 |  12 +-
>  sysdeps/x86_64/multiarch/mempcpy_chk.S             |  12 +-
>  sysdeps/x86_64/multiarch/memset.S                  |   8 +-
>  sysdeps/x86_64/multiarch/memset_chk.S              |   8 +-
>  sysdeps/x86_64/multiarch/sched_cpucount.c          |   2 +-
>  sysdeps/x86_64/multiarch/strcat.S                  |  10 +-
>  sysdeps/x86_64/multiarch/strchr.S                  |   8 +-
>  sysdeps/x86_64/multiarch/strcmp.S                  |  42 ++--
>  sysdeps/x86_64/multiarch/strcpy.S                  |  10 +-
>  sysdeps/x86_64/multiarch/strcspn.S                 |   8 +-
>  sysdeps/x86_64/multiarch/strspn.S                  |   8 +-
>  sysdeps/x86_64/multiarch/strstr.c                  |   5 +-
>  sysdeps/x86_64/multiarch/test-multiarch.c          |  18 +-
>  sysdeps/x86_64/multiarch/wcscpy.S                  |   7 +-
>  sysdeps/x86_64/multiarch/wmemcmp.S                 |   9 +-
>  145 files changed, 1400 insertions(+), 1905 deletions(-)
>  delete mode 100644 sysdeps/i386/i686/multiarch/Versions
>  create mode 100644 sysdeps/x86/Versions
>  create mode 100644 sysdeps/x86/cpu-features-offsets.sym
>  create mode 100644 sysdeps/x86/cpu-features.c
>  create mode 100644 sysdeps/x86/cpu-features.h
>  create mode 100644 sysdeps/x86/dl-get-cpu-features.c
>  create mode 100644 sysdeps/x86/libc-start.c
>  create mode 100644 sysdeps/x86/rtld-global-offsets.sym
>  create mode 100644 sysdeps/x86/tst-get-cpu-features-static.c
>  create mode 100644 sysdeps/x86/tst-get-cpu-features.c
>  create mode 100644 sysdeps/x86_64/dl-procinfo.c
>  delete mode 100644 sysdeps/x86_64/multiarch/Versions
>  delete mode 100644 sysdeps/x86_64/multiarch/cacheinfo.c
>  delete mode 100644 sysdeps/x86_64/multiarch/init-arch.c
>

I will check it in this Thursday if I don't hear any objections.


-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]