On Tue, Jul 29, 2025 at 1:44 AM Tamar Christina <tamar.christ...@arm.com> wrote:
>
> Hi Yury,
>
> > -----Original Message-----
> > From: Yury Khrustalev <yury.khrusta...@arm.com>
> > Sent: Wednesday, July 23, 2025 9:45 AM
> > To: gcc-patches@gcc.gnu.org
> > Cc: Andrew Pinski <pins...@gmail.com>; Richard Sandiford
> > <richard.sandif...@arm.com>; Tamar Christina <tamar.christ...@arm.com>;
> > Alfie Richards <alfie.richa...@arm.com>; Alice Carlotti 
> > <alice.carlo...@arm.com>;
> > Victor Do Nascimento <victor.donascime...@arm.com>
> > Subject: [PATCH v2 2/3] testsuite: Add tests for 
> > __init_cpu_features_constructor
> >
> > Add tests that would call __init_cpu_features_resolver() directly
> > from an ifunc resolver that would in tern call the function under
> > test __init_cpu_features_constructor() using synthetic parameters
> > for different sizes of the 2nd argument.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.target/aarch64/ifunc-resolver.in: add core test functions.
> >       * gcc.target/aarch64/ifunc-resolver-0.c: new test.
> >       * gcc.target/aarch64/ifunc-resolver-1.c: ditto.
> >       * gcc.target/aarch64/ifunc-resolver-2.c: ditto.
> >       * gcc.target/aarch64/ifunc-resolver-3.c: ditto.
> >       * gcc.target/aarch64/ifunc-resolver-4.c: as above.
> > ---
> >  .../gcc.target/aarch64/ifunc-resolver-0.c     | 11 +++++
> >  .../gcc.target/aarch64/ifunc-resolver-1.c     | 12 +++++
> >  .../gcc.target/aarch64/ifunc-resolver-2.c     | 13 +++++
> >  .../gcc.target/aarch64/ifunc-resolver-3.c     | 14 ++++++
> >  .../gcc.target/aarch64/ifunc-resolver-4.c     | 15 ++++++
> >  .../gcc.target/aarch64/ifunc-resolver.in      | 48 +++++++++++++++++++
> >  6 files changed, 113 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.target/aarch64/ifunc-resolver-0.c
> >  create mode 100644 gcc/testsuite/gcc.target/aarch64/ifunc-resolver-1.c
> >  create mode 100644 gcc/testsuite/gcc.target/aarch64/ifunc-resolver-2.c
> >  create mode 100644 gcc/testsuite/gcc.target/aarch64/ifunc-resolver-3.c
> >  create mode 100644 gcc/testsuite/gcc.target/aarch64/ifunc-resolver-4.c
> >  create mode 100644 gcc/testsuite/gcc.target/aarch64/ifunc-resolver.in
> >
> > diff --git a/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-0.c
> > b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-0.c
> > new file mode 100644
> > index 00000000000..4e2c67068a1
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-0.c
> > @@ -0,0 +1,11 @@
> > +/* { dg-do run }  */
> > +/* { dg-require-ifunc "" } */
> > +/* { dg-options "-Wno-experimental-fmv-target" } */
> > +
> > +#include <stdint.h>
> > +
> > +typedef struct {
> > +  uint64_t size;
> > +} ifunc_arg_t;
> > +
> > +#include "ifunc-resolver.in"
>
> Possibly silly question, but do we only support ifuncs on platforms
> with mmap support? I'm wondering if these tests shouldn't also
> require { dg-require-effective-target mmap } */

I think currently ifunc is only supported on targets that also have mmap
but I don't think we should depend on that so yes adding
dg-require-effective-target here is a good idea.

Thanks,
Andrew


>
> Thanks,
> Tamar
>
> > diff --git a/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-1.c
> > b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-1.c
> > new file mode 100644
> > index 00000000000..c19be8f30df
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-1.c
> > @@ -0,0 +1,12 @@
> > +/* { dg-do run }  */
> > +/* { dg-require-ifunc "" } */
> > +/* { dg-options "-Wno-experimental-fmv-target" } */
> > +
> > +#include <stdint.h>
> > +
> > +typedef struct {
> > +  uint64_t size;
> > +  uint64_t hwcap;
> > +} ifunc_arg_t;
> > +
> > +#include "ifunc-resolver.in"
> > diff --git a/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-2.c
> > b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-2.c
> > new file mode 100644
> > index 00000000000..f43e812bd1c
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-2.c
> > @@ -0,0 +1,13 @@
> > +/* { dg-do run }  */
> > +/* { dg-require-ifunc "" } */
> > +/* { dg-options "-Wno-experimental-fmv-target" } */
> > +
> > +#include <stdint.h>
> > +
> > +typedef struct {
> > +  uint64_t size;
> > +  uint64_t hwcap;
> > +  uint64_t hwcap2;
> > +} ifunc_arg_t;
> > +
> > +#include "ifunc-resolver.in"
> > diff --git a/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-3.c
> > b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-3.c
> > new file mode 100644
> > index 00000000000..274eb255cf3
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-3.c
> > @@ -0,0 +1,14 @@
> > +/* { dg-do run }  */
> > +/* { dg-require-ifunc "" } */
> > +/* { dg-options "-Wno-experimental-fmv-target" } */
> > +
> > +#include <stdint.h>
> > +
> > +typedef struct {
> > +  uint64_t size;
> > +  uint64_t hwcap;
> > +  uint64_t hwcap2;
> > +  uint64_t hwcap3;
> > +} ifunc_arg_t;
> > +
> > +#include "ifunc-resolver.in"
> > diff --git a/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-4.c
> > b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-4.c
> > new file mode 100644
> > index 00000000000..6c18a3d770a
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver-4.c
> > @@ -0,0 +1,15 @@
> > +/* { dg-do run }  */
> > +/* { dg-require-ifunc "" } */
> > +/* { dg-options "-Wno-experimental-fmv-target" } */
> > +
> > +#include <stdint.h>
> > +
> > +typedef struct {
> > +  uint64_t size;
> > +  uint64_t hwcap;
> > +  uint64_t hwcap2;
> > +  uint64_t hwcap3;
> > +  uint64_t hwcap4;
> > +} ifunc_arg_t;
> > +
> > +#include "ifunc-resolver.in"
> > diff --git a/gcc/testsuite/gcc.target/aarch64/ifunc-resolver.in
> > b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver.in
> > new file mode 100644
> > index 00000000000..ada0b337f39
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/ifunc-resolver.in
> > @@ -0,0 +1,48 @@
> > +#include <unistd.h>
> > +#include <string.h>
> > +#include <sys/mman.h>
> > +
> > +/* Allocate memory buffer of size LEN with a protected page
> > +   following right after the buffer end so that any memory
> > +   accesses past the end of the buffer would trigger SEGFAUL.  */
> > +void *allocate_mem (size_t len)
> > +{
> > +  size_t pagesize = sysconf (_SC_PAGESIZE);
> > +  char *m = mmap (NULL, pagesize * 2,
> > +               PROT_READ | PROT_WRITE,
> > +               MAP_PRIVATE | MAP_ANONYMOUS,
> > +               -1, 0);
> > +  mprotect (m + pagesize, pagesize, PROT_NONE);
> > +  m = m + pagesize - len;
> > +  memset(m, 0, len);
> > +  return m;
> > +}
> > +
> > +int impl ()
> > +{
> > +  return 0;
> > +}
> > +
> > +#ifndef _IFUNC_ARG_HWCAP
> > +#define _IFUNC_ARG_HWCAP (1ULL << 62)
> > +#endif
> > +
> > +void
> > +__init_cpu_features_resolver (unsigned long hwcap, const void *arg);
> > +
> > +static void *
> > +fun_resolver (uint64_t a0, const uint64_t *a1)
> > +{
> > +  ifunc_arg_t *arg = allocate_mem (sizeof (ifunc_arg_t));
> > +  arg->size = sizeof (ifunc_arg_t);
> > +  /* Call this function with synthetic ifunc_arg_t arg.  */
> > +  __init_cpu_features_resolver (_IFUNC_ARG_HWCAP, arg);
> > +  return (void *)(uintptr_t)impl;
> > +}
> > +
> > +int fun (void) __attribute__ ((ifunc ("fun_resolver")));
> > +
> > +int main (int argc, char *argv[])
> > +{
> > +  return fun ();
> > +}
> > --
> > 2.39.5
>

Reply via email to