unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: caiyinyu <caiyinyu@loongson.cn>
To: Xi Ruoyao <xry111@xry111.site>, libc-alpha@sourceware.org
Cc: adhemerval.zanella@linaro.org
Subject: Re: [PATCH] LoongArch: Add glibc.cpu.hwcap support.
Date: Wed, 20 Sep 2023 18:51:58 +0800	[thread overview]
Message-ID: <311e000d-ec04-9a73-8474-06f7c96a4791@loongson.cn> (raw)
In-Reply-To: <eeec18fe2bb65ad3d5d47882e4bad92305752552.camel@xry111.site>


在 2023/9/19 下午6:11, Xi Ruoyao 写道:
> By the way, GCC maintainers told me there may be future CPU models with
> LSX/LASX but without UAL.
Yes.
> And if I read our string functions correctly,
> the LSX/LASX ifuncs require UAL as well.
Yes.
> So we should only enable LSX
> and LASX if UAL is also available, or make these string functions depend
> on both LSX (LASX) and UAL.  Is this properly implemented now?

All lasx/lsx str/mem functions currently have only one assembly 
implementation.

Therefore, when you enable lasx/lsx, there is only one lasx/lsx option 
available, regardless of whether UAL is enabled or not.

However, we do not rule out the possibility of future alternative 
implementations for lasx/lsx.

At that time, a combination of other features may be required.

For example, both lasx and UAL would need to be enabled to select this 
new implementation.

We hope to meet the selection criteria for different function 
implementations through various combinations of these options.

>
> On Sun, 2023-09-17 at 17:48 +0800, caiyinyu wrote:
>> Key Points:
>> 1. On lasx & lsx platforms, We must use _dl_runtime_{profile, resolve}_{lsx, lasx}
>>     to save vector registers.
>> 2. Via "tunables", users can choose str/mem_{lasx,lsx,unaligned} functions with
>>     `export GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,...`.
>>     Note: glibc.cpu.hwcaps doesn't affect _dl_runtime_{profile, resolve}_{lsx, lasx}
>>     selection.
>>
>> Usage Notes:
>> 1. Only valid inputs: LASX, LSX, UAL. Case-sensitive, comma-separated, no spaces.
>> 2. Example: `export GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,UAL` turns on LASX & UAL.
>>     Unmentioned features turn off. With default ifunc: lasx > lsx > unaligned >
>>     aligned > generic, effect is: lasx > unaligned > aligned > generic; lsx off.
>> 3. Incorrect GLIBC_TUNABLES settings will show error messages.
>>     For example: On lsx platforms, you cannot enable lasx features. If you do
>>     that, you will get error messages.
>> 4. Valid input examples:
>>     - GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX: lasx > aligned > generic.
>>     - GLIBC_TUNABLES=glibc.cpu.hwcaps=LSX,UAL: lsx > unaligned > aligned > generic.
>>     - GLIBC_TUNABLES=glibc.cpu.hwcaps=LASX,UAL,LASX,UAL,LSX,LASX,UAL: Repetitions
>>       allowed but not recommended. Results in: lasx > lsx > unaligned > aligned >
>>       generic.
>> ---
>>   sysdeps/loongarch/Makefile                    |  4 +
>>   sysdeps/loongarch/Versions                    |  5 ++
>>   sysdeps/loongarch/cpu-tunables.c              | 89 +++++++++++++++++++
>>   sysdeps/loongarch/dl-get-cpu-features.c       | 25 ++++++
>>   sysdeps/loongarch/dl-machine.h                | 27 +++++-
>>   sysdeps/loongarch/dl-tunables.list            | 25 ++++++
>>   .../unix/sysv/linux/loongarch/cpu-features.c  | 29 ++++++
>>   .../unix/sysv/linux/loongarch/cpu-features.h  | 18 +++-
>>   .../unix/sysv/linux/loongarch/dl-procinfo.c   | 60 +++++++++++++
>>   sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c | 21 +++++
>>   .../unix/sysv/linux/loongarch/libc-start.c    | 34 +++++++
>>   11 files changed, 329 insertions(+), 8 deletions(-)
>>   create mode 100644 sysdeps/loongarch/Versions
>>   create mode 100644 sysdeps/loongarch/cpu-tunables.c
>>   create mode 100644 sysdeps/loongarch/dl-get-cpu-features.c
>>   create mode 100644 sysdeps/loongarch/dl-tunables.list
>>   create mode 100644 sysdeps/unix/sysv/linux/loongarch/cpu-features.c
>>   create mode 100644 sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c
>>   create mode 100644 sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c
>>   create mode 100644 sysdeps/unix/sysv/linux/loongarch/libc-start.c
>>
>> diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile
>> index 43d2f583cd..30a1f4a802 100644
>> --- a/sysdeps/loongarch/Makefile
>> +++ b/sysdeps/loongarch/Makefile
>> @@ -6,6 +6,10 @@ ifeq ($(subdir),elf)
>>   gen-as-const-headers += dl-link.sym
>>   endif
>>   
>> +ifeq ($(subdir),elf)
>> +  sysdep-dl-routines += dl-get-cpu-features
>> +endif
>> +
>>   # LoongArch's assembler also needs to know about PIC as it changes the
>>   # definition of some assembler macros.
>>   ASFLAGS-.os += $(pic-ccflag)
>> diff --git a/sysdeps/loongarch/Versions b/sysdeps/loongarch/Versions
>> new file mode 100644
>> index 0000000000..33ae2cc079
>> --- /dev/null
>> +++ b/sysdeps/loongarch/Versions
>> @@ -0,0 +1,5 @@
>> +ld {
>> +  GLIBC_PRIVATE {
>> +    _dl_larch_get_cpu_features;
>> +  }
>> +}
>> diff --git a/sysdeps/loongarch/cpu-tunables.c b/sysdeps/loongarch/cpu-tunables.c
>> new file mode 100644
>> index 0000000000..8e9fab938b
>> --- /dev/null
>> +++ b/sysdeps/loongarch/cpu-tunables.c
>> @@ -0,0 +1,89 @@
>> +/* LoongArch CPU feature tuning.
>> +   This file is part of the GNU C Library.
>> +   Copyright (C) 2023 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/>.  */
>> +
>> +# include <stdbool.h>
>> +# include <stdint.h>
>> +# include <unistd.h>		/* Get STDOUT_FILENO for _dl_printf.  */
>> +# include <elf/dl-tunables.h>
>> +# include <string.h>
>> +# include <cpu-features.h>
>> +# include <ldsodefs.h>
>> +# include <sys/auxv.h>
>> +
>> +# define HWCAP_LOONGARCH_IFUNC \
>> +  (HWCAP_LOONGARCH_UAL | HWCAP_LOONGARCH_LSX | HWCAP_LOONGARCH_LASX)
>> +
>> +# define CHECK_GLIBC_IFUNC_CPU_OFF(f, name, len)			\
>> +  _Static_assert (sizeof (#name) - 1 == len, #name " != " #len);	\
>> +  if (!memcmp (f, #name, len) &&					\
>> +      (GLRO (dl_hwcap) & HWCAP_LOONGARCH_##name))			\
>> +    {									\
>> +      hwcap |= (HWCAP_LOONGARCH_##name | (~HWCAP_LOONGARCH_IFUNC));	\
>> +      break;								\
>> +    }									\
>> +
>> +attribute_hidden
>> +void
>> +TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *valp)
>> +{
>> +  const char *p = valp->strval;
>> +  size_t len;
>> +  unsigned long hwcap = 0;
>> +  const char *c;
>> +
>> +  do {
>> +      for (c = p; *c != ','; c++)
>> +	if (*c == '\0')
>> +	  break;
>> +
>> +      len = c - p;
>> +
>> +      switch(len)
>> +      {
>> +	default:
>> +	  _dl_fatal_printf (
>> +	    "The valid values of glibc.cpu.hwcaps is UAL, LASX, LSX!!\n"
>> +			    );
>> +	  break;
>> +	case 3:
>> +	  {
>> +	    CHECK_GLIBC_IFUNC_CPU_OFF (p, LSX, 3);
>> +	    CHECK_GLIBC_IFUNC_CPU_OFF (p, UAL, 3);
>> +	    _dl_fatal_printf (
>> +		"Some features are invalid or not supported on this machine!!\n"
>> +		"The valid values of glibc.cpu.hwcaps is UAL, LASX, LSX!!\n"
>> +                       );
>> +	  }
>> +	  break;
>> +	case 4:
>> +	  {
>> +	    CHECK_GLIBC_IFUNC_CPU_OFF (p, LASX, 4);
>> +	    _dl_fatal_printf (
>> +		"Some features are invalid or not supported on this machine!!\n"
>> +		"The valid values of glibc.cpu.hwcaps is UAL, LASX, LSX!!\n"
>> +                       );
>> +	  }
>> +	  break;
>> +      }
>> +
>> +      p += len + 1;
>> +    }
>> +  while (*c != '\0');
>> +
>> +  GLRO (dl_larch_cpu_features).hwcap &= hwcap;
>> +}
>> diff --git a/sysdeps/loongarch/dl-get-cpu-features.c b/sysdeps/loongarch/dl-get-cpu-features.c
>> new file mode 100644
>> index 0000000000..7cd9bc15c3
>> --- /dev/null
>> +++ b/sysdeps/loongarch/dl-get-cpu-features.c
>> @@ -0,0 +1,25 @@
>> +/* Define _dl_larch_get_cpu_features.
>> +   Copyright (C) 2023 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
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +
>> +#include <ldsodefs.h>
>> +
>> +const struct cpu_features *
>> +_dl_larch_get_cpu_features (void)
>> +{
>> +  return &GLRO(dl_larch_cpu_features);
>> +}
>> diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
>> index 57913cefaa..b395a9283e 100644
>> --- a/sysdeps/loongarch/dl-machine.h
>> +++ b/sysdeps/loongarch/dl-machine.h
>> @@ -29,6 +29,8 @@
>>   #include <dl-static-tls.h>
>>   #include <dl-machine-rel.h>
>>   
>> +#include <cpu-features.c>
>> +
>>   #ifndef _RTLD_PROLOGUE
>>   # define _RTLD_PROLOGUE(entry)					\
>>   	".globl\t" __STRING (entry) "\n\t"			\
>> @@ -53,6 +55,23 @@
>>   #define ELF_MACHINE_NO_REL 1
>>   #define ELF_MACHINE_NO_RELA 0
>>   
>> +#define DL_PLATFORM_INIT dl_platform_init ()
>> +
>> +static inline void __attribute__ ((unused))
>> +dl_platform_init (void)
>> +{
>> +  if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
>> +    /* Avoid an empty string which would disturb us.  */
>> +    GLRO(dl_platform) = NULL;
>> +
>> +#ifdef SHARED
>> +  /* init_cpu_features has been called early from __libc_start_main in
>> +     static executable.  */
>> +  init_cpu_features (&GLRO(dl_larch_cpu_features));
>> +#endif
>> +}
>> +
>> +
>>   /* Return nonzero iff ELF header is compatible with the running host.  */
>>   static inline int
>>   elf_machine_matches_host (const ElfW (Ehdr) *ehdr)
>> @@ -290,9 +309,9 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>>         if (profile != 0)
>>   	{
>>   #if !defined __loongarch_soft_float
>> -	  if (SUPPORT_LASX)
>> +	  if (RTLD_SUPPORT_LASX)
>>   	    gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lasx;
>> -	  else if (SUPPORT_LSX)
>> +	  else if (RTLD_SUPPORT_LSX)
>>   	    gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lsx;
>>   	  else
>>   #endif
>> @@ -310,9 +329,9 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
>>   	     indicated by the offset on the stack, and then jump to
>>   	     the resolved address.  */
>>   #if !defined __loongarch_soft_float
>> -	  if (SUPPORT_LASX)
>> +	  if (RTLD_SUPPORT_LASX)
>>   	    gotplt[0] = (ElfW(Addr)) &_dl_runtime_resolve_lasx;
>> -	  else if (SUPPORT_LSX)
>> +	  else if (RTLD_SUPPORT_LSX)
>>   	    gotplt[0] = (ElfW(Addr)) &_dl_runtime_resolve_lsx;
>>   	  else
>>   #endif
>> diff --git a/sysdeps/loongarch/dl-tunables.list b/sysdeps/loongarch/dl-tunables.list
>> new file mode 100644
>> index 0000000000..66b3427516
>> --- /dev/null
>> +++ b/sysdeps/loongarch/dl-tunables.list
>> @@ -0,0 +1,25 @@
>> +# LoongArch specific tunables.
>> +# Copyright (C) 2023 Free Software Foundation, Inc.
>> +# This file is part of the GNU C Library.
>> +
>> +# 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/>.
>> +
>> +glibc {
>> +  cpu {
>> +    hwcaps {
>> +      type: STRING
>> +    }
>> +  }
>> +}
>> diff --git a/sysdeps/unix/sysv/linux/loongarch/cpu-features.c b/sysdeps/unix/sysv/linux/loongarch/cpu-features.c
>> new file mode 100644
>> index 0000000000..1290c4ce9f
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/loongarch/cpu-features.c
>> @@ -0,0 +1,29 @@
>> +/* Initialize CPU feature data.  LoongArch64 version.
>> +   This file is part of the GNU C Library.
>> +   Copyright (C) 2023 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/>.  */
>> +
>> +#include <cpu-features.h>
>> +#include <elf/dl-hwcaps.h>
>> +#include <elf/dl-tunables.h>
>> +extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *) attribute_hidden;
>> +
>> +static inline void
>> +init_cpu_features (struct cpu_features *cpu_features)
>> +{
>> +    GLRO (dl_larch_cpu_features).hwcap = GLRO (dl_hwcap);
>> +    TUNABLE_GET (glibc, cpu, hwcaps, tunable_val_t *, TUNABLE_CALLBACK (set_hwcaps));
>> +}
>> diff --git a/sysdeps/unix/sysv/linux/loongarch/cpu-features.h b/sysdeps/unix/sysv/linux/loongarch/cpu-features.h
>> index d1a280a5ee..450963cebc 100644
>> --- a/sysdeps/unix/sysv/linux/loongarch/cpu-features.h
>> +++ b/sysdeps/unix/sysv/linux/loongarch/cpu-features.h
>> @@ -19,13 +19,23 @@
>>   #ifndef _CPU_FEATURES_LOONGARCH64_H
>>   #define _CPU_FEATURES_LOONGARCH64_H
>>   
>> +#include <stdint.h>
>>   #include <sys/auxv.h>
>>   
>> -#define SUPPORT_UAL (GLRO (dl_hwcap) & HWCAP_LOONGARCH_UAL)
>> -#define SUPPORT_LSX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LSX)
>> -#define SUPPORT_LASX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LASX)
>> +struct cpu_features
>> + {
>> +    uint64_t hwcap;
>> + };
>>   
>> +/* Get a pointer to the CPU features structure.  */
>> +extern const struct cpu_features *_dl_larch_get_cpu_features (void)
>> +     __attribute__ ((pure));
>> +
>> +#define SUPPORT_UAL (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_UAL)
>> +#define SUPPORT_LSX (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_LSX)
>> +#define SUPPORT_LASX (GLRO (dl_larch_cpu_features).hwcap & HWCAP_LOONGARCH_LASX)
>> +#define RTLD_SUPPORT_LSX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LSX)
>> +#define RTLD_SUPPORT_LASX (GLRO (dl_hwcap) & HWCAP_LOONGARCH_LASX)
>>   #define INIT_ARCH()
>>   
>>   #endif /* _CPU_FEATURES_LOONGARCH64_H  */
>> -
>> diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c b/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c
>> new file mode 100644
>> index 0000000000..6217fda983
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/loongarch/dl-procinfo.c
>> @@ -0,0 +1,60 @@
>> +/* Data for LoongArch64 version of processor capability information.
>> +   Linux version.
>> +   Copyright (C) 2023 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   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/>.  */
>> +
>> +/* If anything should be added here check whether the size of each string
>> +   is still ok with the given array size.
>> +
>> +   All the #ifdefs in the definitions are quite irritating but
>> +   necessary if we want to avoid duplicating the information.  There
>> +   are three different modes:
>> +
>> +   - PROCINFO_DECL is defined.  This means we are only interested in
>> +     declarations.
>> +
>> +   - PROCINFO_DECL is not defined:
>> +
>> +     + if SHARED is defined the file is included in an array
>> +       initializer.  The .element = { ... } syntax is needed.
>> +
>> +     + if SHARED is not defined a normal array initialization is
>> +       needed.
>> +  */
>> +
>> +#ifndef PROCINFO_CLASS
>> +# define PROCINFO_CLASS
>> +#endif
>> +
>> +#if !IS_IN (ldconfig)
>> +# if !defined PROCINFO_DECL && defined SHARED
>> +  ._dl_larch_cpu_features
>> +# else
>> +PROCINFO_CLASS struct cpu_features _dl_larch_cpu_features
>> +# endif
>> +# ifndef PROCINFO_DECL
>> += { }
>> +# endif
>> +# if !defined SHARED || defined PROCINFO_DECL
>> +;
>> +# else
>> +,
>> +# endif
>> +#endif
>> +
>> +#undef PROCINFO_DECL
>> +#undef PROCINFO_CLASS
>> diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c b/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c
>> new file mode 100644
>> index 0000000000..455fd71abc
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/loongarch/dl-sysdep.c
>> @@ -0,0 +1,21 @@
>> +/* Operating system support for run-time dynamic linker.  LoongArch version.
>> +   Copyright (C) 2023 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   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/>.  */
>> +
>> +#include <config.h>
>> +#include <sysdeps/loongarch/cpu-tunables.c>
>> +#include <sysdeps/unix/sysv/linux/dl-sysdep.c>
>> diff --git a/sysdeps/unix/sysv/linux/loongarch/libc-start.c b/sysdeps/unix/sysv/linux/loongarch/libc-start.c
>> new file mode 100644
>> index 0000000000..f1346ece0a
>> --- /dev/null
>> +++ b/sysdeps/unix/sysv/linux/loongarch/libc-start.c
>> @@ -0,0 +1,34 @@
>> +/* Override csu/libc-start.c on LoongArch64.
>> +   Copyright (C) 2023 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   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/>.  */
>> +
>> +#ifndef SHARED
>> +
>> +/* Mark symbols hidden in static PIE for early self relocation to work.  */
>> +# if BUILD_PIE_DEFAULT
>> +#  pragma GCC visibility push(hidden)
>> +# endif
>> +
>> +# include <ldsodefs.h>
>> +# include <cpu-features.c>
>> +
>> +extern struct cpu_features _dl_larch_cpu_features;
>> +
>> +# define ARCH_INIT_CPU_FEATURES() init_cpu_features (&_dl_larch_cpu_features)
>> +
>> +#endif
>> +#include <csu/libc-start.c>


  reply	other threads:[~2023-09-20 10:52 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-17  9:48 [PATCH] LoongArch: Add glibc.cpu.hwcap support caiyinyu
2023-09-19  9:33 ` Adhemerval Zanella Netto
2023-09-20 10:15   ` caiyinyu
2023-09-20 12:49     ` Adhemerval Zanella Netto
2023-09-20 13:20       ` caiyinyu
2023-09-19 10:11 ` Xi Ruoyao
2023-09-20 10:51   ` caiyinyu [this message]
2023-09-20 11:53     ` caiyinyu
  -- strict thread matches above, loose matches on Subject: below --
2024-04-23 12:48 caiyinyu
2024-04-23 20:10 ` Adhemerval Zanella Netto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=311e000d-ec04-9a73-8474-06f7c96a4791@loongson.cn \
    --to=caiyinyu@loongson.cn \
    --cc=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.org \
    --cc=xry111@xry111.site \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).