diff mbox series

[testsuite] introduce strndup effective target

Message ID orzftudm9l.fsf@lxoliva.fsfla.org
State New
Headers show
Series [testsuite] introduce strndup effective target | expand

Commit Message

Alexandre Oliva April 16, 2024, 3:22 a.m. UTC
A number of tests that call strndup fail on vxworks, where there's no
strndup.  Some of them already had workarounds to skip the strndup
parts of the tests on platforms that don't offer it.  I've changed
them to rely on a strndup effective target instead, and extended the
logic to other tests that were otherwise skipped entirely.

Regstrapped on x86_64-linux-gnu.  Also tested with gcc-13 on arm-,
aarch64-, x86- and x86_64-vxworks7r2.  Ok to install?


for  gcc/ChangeLog

	* doc/sourcebuild.texi (strndup): Add effective target.

for  gcc/testsuite/ChangeLog

	* lib/target-supports.exp (check_effective_target_strndup): New.
	* gcc.dg/builtin-dynamic-object-size-0.c: Skip strndup tests
	when the function is not available.
	* gcc.dg/builtin-dynamic-object-size-1.c: Likewise.
	* gcc.dg/builtin-dynamic-object-size-2.c: Likewise.
	* gcc.dg/builtin-dynamic-object-size-3.c: Likewise.
	* gcc.dg/builtin-dynamic-object-size-4.c: Likewise.
	* gcc.dg/builtin-object-size-1.c: Likewise.
	* gcc.dg/builtin-object-size-2.c: Likewise.
	* gcc.dg/builtin-object-size-3.c: Likewise.
	* gcc.dg/builtin-object-size-4.c: Likewise.
---
 gcc/doc/sourcebuild.texi                           |    3 +++
 .../gcc.dg/builtin-dynamic-object-size-0.c         |   10 +++++++++-
 gcc/testsuite/gcc.dg/builtin-object-size-1.c       |    7 ++++---
 gcc/testsuite/gcc.dg/builtin-object-size-2.c       |    7 ++++---
 gcc/testsuite/gcc.dg/builtin-object-size-3.c       |    7 ++++---
 gcc/testsuite/gcc.dg/builtin-object-size-4.c       |    7 ++++---
 gcc/testsuite/lib/target-supports.exp              |   11 +++++++++++
 7 files changed, 39 insertions(+), 13 deletions(-)

Comments

Richard Biener April 16, 2024, 7:10 a.m. UTC | #1
On Tue, Apr 16, 2024 at 5:23 AM Alexandre Oliva <oliva@adacore.com> wrote:
>
>
> A number of tests that call strndup fail on vxworks, where there's no
> strndup.  Some of them already had workarounds to skip the strndup
> parts of the tests on platforms that don't offer it.  I've changed
> them to rely on a strndup effective target instead, and extended the
> logic to other tests that were otherwise skipped entirely.
>
> Regstrapped on x86_64-linux-gnu.  Also tested with gcc-13 on arm-,
> aarch64-, x86- and x86_64-vxworks7r2.  Ok to install?

OK

>
> for  gcc/ChangeLog
>
>         * doc/sourcebuild.texi (strndup): Add effective target.
>
> for  gcc/testsuite/ChangeLog
>
>         * lib/target-supports.exp (check_effective_target_strndup): New.
>         * gcc.dg/builtin-dynamic-object-size-0.c: Skip strndup tests
>         when the function is not available.
>         * gcc.dg/builtin-dynamic-object-size-1.c: Likewise.
>         * gcc.dg/builtin-dynamic-object-size-2.c: Likewise.
>         * gcc.dg/builtin-dynamic-object-size-3.c: Likewise.
>         * gcc.dg/builtin-dynamic-object-size-4.c: Likewise.
>         * gcc.dg/builtin-object-size-1.c: Likewise.
>         * gcc.dg/builtin-object-size-2.c: Likewise.
>         * gcc.dg/builtin-object-size-3.c: Likewise.
>         * gcc.dg/builtin-object-size-4.c: Likewise.
> ---
>  gcc/doc/sourcebuild.texi                           |    3 +++
>  .../gcc.dg/builtin-dynamic-object-size-0.c         |   10 +++++++++-
>  gcc/testsuite/gcc.dg/builtin-object-size-1.c       |    7 ++++---
>  gcc/testsuite/gcc.dg/builtin-object-size-2.c       |    7 ++++---
>  gcc/testsuite/gcc.dg/builtin-object-size-3.c       |    7 ++++---
>  gcc/testsuite/gcc.dg/builtin-object-size-4.c       |    7 ++++---
>  gcc/testsuite/lib/target-supports.exp              |   11 +++++++++++
>  7 files changed, 39 insertions(+), 13 deletions(-)
>
> diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
> index 7c0df90e82236..8e4e59ac44c74 100644
> --- a/gcc/doc/sourcebuild.texi
> +++ b/gcc/doc/sourcebuild.texi
> @@ -2837,6 +2837,9 @@ can be included without error when @option{-mbig-endian} is passed.
>  @item stpcpy
>  Target provides @code{stpcpy} function.
>
> +@item strndup
> +Target provides @code{strndup} function.
> +
>  @item sysconf
>  Target supports @code{sysconf}.
>
> diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
> index 173e7c755f4c9..d02e37f79d95f 100644
> --- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
> +++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
> @@ -1,7 +1,7 @@
>  /* { dg-do run } */
>  /* { dg-options "-O2" } */
>  /* { dg-require-effective-target size20plus } */
> -/* { dg-skip-if "no strndup" { hppa*-*-hpux* } } */
> +/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
>
>  #include "builtin-object-size-common.h"
>
> @@ -567,6 +567,7 @@ test_strdup (const char *in)
>    return sz;
>  }
>
> +#ifndef SKIP_STRNDUP
>  size_t
>  __attribute__ ((noinline))
>  test_strndup (const char *in, size_t bound)
> @@ -577,6 +578,7 @@ test_strndup (const char *in, size_t bound)
>    __builtin_free (res);
>    return sz;
>  }
> +#endif
>
>  size_t
>  __attribute__ ((noinline))
> @@ -589,6 +591,7 @@ test_strdup_min (const char *in)
>    return sz;
>  }
>
> +#ifndef SKIP_STRNDUP
>  size_t
>  __attribute__ ((noinline))
>  test_strndup_min (const char *in, size_t bound)
> @@ -599,6 +602,7 @@ test_strndup_min (const char *in, size_t bound)
>    __builtin_free (res);
>    return sz;
>  }
> +#endif
>
>  /* Other tests.  */
>
> @@ -788,12 +792,16 @@ main (int argc, char **argv)
>    const char *str = "hello world";
>    if (test_strdup (str) != __builtin_strlen (str) + 1)
>      FAIL ();
> +#ifndef SKIP_STRNDUP
>    if (test_strndup (str, 4) != 5)
>      FAIL ();
> +#endif
>    if (test_strdup_min (str) != __builtin_strlen (str) + 1)
>      FAIL ();
> +#ifndef SKIP_STRNDUP
>    if (test_strndup_min (str, 4) != 1)
>      FAIL ();
> +#endif
>
>    DONE ();
>  }
> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-1.c b/gcc/testsuite/gcc.dg/builtin-object-size-1.c
> index 4f7d4c0b370f5..d6d13c5ef7a29 100644
> --- a/gcc/testsuite/gcc.dg/builtin-object-size-1.c
> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-1.c
> @@ -1,6 +1,7 @@
>  /* { dg-do run } */
>  /* { dg-options "-O2 -Wno-stringop-overread" } */
>  /* { dg-require-effective-target alloca } */
> +/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
>
>  #include "builtin-object-size-common.h"
>
> @@ -621,7 +622,7 @@ test10 (void)
>      }
>  }
>
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>  /* Tests for strdup/strndup.  */
>  size_t
>  __attribute__ ((noinline))
> @@ -709,7 +710,7 @@ test11 (void)
>      FAIL ();
>    free (res);
>  }
> -#endif /* avr */
> +#endif
>
>  int
>  main (void)
> @@ -726,7 +727,7 @@ main (void)
>    test8 ();
>    test9 (1);
>    test10 ();
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>    test11 ();
>  #endif
>    DONE ();
> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-2.c b/gcc/testsuite/gcc.dg/builtin-object-size-2.c
> index 37d3dcc6f5689..c28d72eee9bfe 100644
> --- a/gcc/testsuite/gcc.dg/builtin-object-size-2.c
> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-2.c
> @@ -1,6 +1,7 @@
>  /* { dg-do run } */
>  /* { dg-options "-O2 -Wno-stringop-overread" } */
>  /* { dg-require-effective-target alloca } */
> +/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
>
>  #include "builtin-object-size-common.h"
>
> @@ -536,7 +537,7 @@ test8 (unsigned cond)
>  #endif
>  }
>
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>  /* Tests for strdup/strndup.  */
>  size_t
>  __attribute__ ((noinline))
> @@ -624,7 +625,7 @@ test9 (void)
>      FAIL ();
>    free (res);
>  }
> -#endif /* avr */
> +#endif
>
>  int
>  main (void)
> @@ -639,7 +640,7 @@ main (void)
>    test6 ();
>    test7 ();
>    test8 (1);
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>    test9 ();
>  #endif
>    DONE ();
> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-3.c b/gcc/testsuite/gcc.dg/builtin-object-size-3.c
> index f4d1ebf7027bf..3f58da3d500cd 100644
> --- a/gcc/testsuite/gcc.dg/builtin-object-size-3.c
> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-3.c
> @@ -1,6 +1,7 @@
>  /* { dg-do run } */
>  /* { dg-options "-O2 -Wno-stringop-overread" } */
>  /* { dg-require-effective-target alloca } */
> +/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
>
>  #include "builtin-object-size-common.h"
>
> @@ -628,7 +629,7 @@ test10 (void)
>      }
>  }
>
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>  /* Tests for strdup/strndup.  */
>  size_t
>  __attribute__ ((noinline))
> @@ -717,7 +718,7 @@ test11 (void)
>      FAIL ();
>    free (res);
>  }
> -#endif /* avr */
> +#endif
>
>  int
>  main (void)
> @@ -734,7 +735,7 @@ main (void)
>    test8 ();
>    test9 (1);
>    test10 ();
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>    test11 ();
>  #endif
>    DONE ();
> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-object-size-4.c
> index 2887dd150423b..b3eb36efb744d 100644
> --- a/gcc/testsuite/gcc.dg/builtin-object-size-4.c
> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-4.c
> @@ -1,6 +1,7 @@
>  /* { dg-do run } */
>  /* { dg-options "-O2 -Wno-stringop-overread" } */
>  /* { dg-require-effective-target alloca } */
> +/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
>
>  #include "builtin-object-size-common.h"
>
> @@ -509,7 +510,7 @@ test8 (unsigned cond)
>  #endif
>  }
>
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>  /* Tests for strdup/strndup.  */
>  size_t
>  __attribute__ ((noinline))
> @@ -597,7 +598,7 @@ test9 (void)
>      FAIL ();
>    free (res);
>  }
> -#endif /* avr */
> +#endif
>
>  int
>  main (void)
> @@ -612,7 +613,7 @@ main (void)
>    test6 ();
>    test7 ();
>    test8 (1);
> -#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
> +#ifndef SKIP_STRNDUP
>    test9 ();
>  #endif
>    DONE ();
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> index edce672c0e21a..17c8382adf143 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -11580,6 +11580,17 @@ proc check_effective_target_stpcpy {} {
>      return [check_function_available "stpcpy"]
>  }
>
> +# Returns 1 if "strndup" is available on the target system.
> +
> +proc check_effective_target_strndup {} {
> +    if { [istarget *-*-vxworks*] } {
> +       # VxWorks doesn't have strndup but our way to test fails
> +       # to detect as we're doing partial links for kernel modules.
> +       return 0
> +    }
> +    return [check_function_available "strndup"]
> +}
> +
>  # Returns 1 if "sigsetjmp" is available on the target system.
>  # Also check if "__sigsetjmp" is defined since that's what glibc
>  # uses.
>
> --
> Alexandre Oliva, happy hacker            https://FSFLA.org/blogs/lxo/
>    Free Software Activist                   GNU Toolchain Engineer
> More tolerance and less prejudice are key for inclusion and diversity
> Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Alexandre Oliva April 18, 2024, 11:32 a.m. UTC | #2
On Apr 16, 2024, Alexandre Oliva <oliva@adacore.com> wrote:

> 	* gcc.dg/builtin-dynamic-object-size-1.c: Likewise.
> 	* gcc.dg/builtin-dynamic-object-size-2.c: Likewise.
> 	* gcc.dg/builtin-dynamic-object-size-3.c: Likewise.
> 	* gcc.dg/builtin-dynamic-object-size-4.c: Likewise.

These hunks were missing from the patch I posted, sorry.  I goofed when
resolving the conflicts because the tests had been modified after
gcc-13.  I hope the intent was clear from the ChangeLog entry.
Here they are.

diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c
index ffa59985024f5..76b4f704fed9c 100644
--- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-1.c
@@ -1,7 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
-/* { dg-skip-if "no strndup" { hppa*-*-hpux* } } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #define __builtin_object_size __builtin_dynamic_object_size
 #include "builtin-object-size-1.c"
diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c
index fff32da7aea14..cb757a8d699cf 100644
--- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-2.c
@@ -1,7 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
-/* { dg-skip-if "no strndup" { hppa*-*-hpux* } } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #define __builtin_object_size __builtin_dynamic_object_size
 #include "builtin-object-size-2.c"
diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c
index ac223d67b10a4..8a12f023f27bc 100644
--- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-3.c
@@ -1,7 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
-/* { dg-skip-if "no strndup" { hppa*-*-hpux* } } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #define __builtin_object_size __builtin_dynamic_object_size
 #include "builtin-object-size-3.c"
diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c
index fdf4284ae1158..0efc2d9858422 100644
--- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-4.c
@@ -1,7 +1,7 @@
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
-/* { dg-skip-if "no strndup" { hppa*-*-hpux* } } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #define __builtin_object_size __builtin_dynamic_object_size
 #include "builtin-object-size-4.c"
Mike Stump April 18, 2024, 3:06 p.m. UTC | #3
On Apr 18, 2024, at 4:32 AM, Alexandre Oliva <oliva@adacore.com> wrote:
> 
> On Apr 16, 2024, Alexandre Oliva <oliva@adacore.com> wrote:
> 
>> 	* gcc.dg/builtin-dynamic-object-size-1.c: Likewise.
>> 	* gcc.dg/builtin-dynamic-object-size-2.c: Likewise.
>> 	* gcc.dg/builtin-dynamic-object-size-3.c: Likewise.
>> 	* gcc.dg/builtin-dynamic-object-size-4.c: Likewise.
> 
> These hunks were missing from the patch I posted

No worries, thanks for all the hard work.
diff mbox series

Patch

diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index 7c0df90e82236..8e4e59ac44c74 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -2837,6 +2837,9 @@  can be included without error when @option{-mbig-endian} is passed.
 @item stpcpy
 Target provides @code{stpcpy} function.
 
+@item strndup
+Target provides @code{strndup} function.
+
 @item sysconf
 Target supports @code{sysconf}.
 
diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
index 173e7c755f4c9..d02e37f79d95f 100644
--- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
@@ -1,7 +1,7 @@ 
 /* { dg-do run } */
 /* { dg-options "-O2" } */
 /* { dg-require-effective-target size20plus } */
-/* { dg-skip-if "no strndup" { hppa*-*-hpux* } } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #include "builtin-object-size-common.h"
 
@@ -567,6 +567,7 @@  test_strdup (const char *in)
   return sz;
 }
 
+#ifndef SKIP_STRNDUP
 size_t
 __attribute__ ((noinline))
 test_strndup (const char *in, size_t bound)
@@ -577,6 +578,7 @@  test_strndup (const char *in, size_t bound)
   __builtin_free (res);
   return sz;
 }
+#endif
 
 size_t
 __attribute__ ((noinline))
@@ -589,6 +591,7 @@  test_strdup_min (const char *in)
   return sz;
 }
 
+#ifndef SKIP_STRNDUP
 size_t
 __attribute__ ((noinline))
 test_strndup_min (const char *in, size_t bound)
@@ -599,6 +602,7 @@  test_strndup_min (const char *in, size_t bound)
   __builtin_free (res);
   return sz;
 }
+#endif
 
 /* Other tests.  */
 
@@ -788,12 +792,16 @@  main (int argc, char **argv)
   const char *str = "hello world";
   if (test_strdup (str) != __builtin_strlen (str) + 1)
     FAIL ();
+#ifndef SKIP_STRNDUP
   if (test_strndup (str, 4) != 5)
     FAIL ();
+#endif
   if (test_strdup_min (str) != __builtin_strlen (str) + 1)
     FAIL ();
+#ifndef SKIP_STRNDUP
   if (test_strndup_min (str, 4) != 1)
     FAIL ();
+#endif
 
   DONE ();
 }
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-1.c b/gcc/testsuite/gcc.dg/builtin-object-size-1.c
index 4f7d4c0b370f5..d6d13c5ef7a29 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-1.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-1.c
@@ -1,6 +1,7 @@ 
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #include "builtin-object-size-common.h"
 
@@ -621,7 +622,7 @@  test10 (void)
     }
 }
 
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
 /* Tests for strdup/strndup.  */
 size_t
 __attribute__ ((noinline))
@@ -709,7 +710,7 @@  test11 (void)
     FAIL ();
   free (res);
 }
-#endif /* avr */
+#endif
 
 int
 main (void)
@@ -726,7 +727,7 @@  main (void)
   test8 ();
   test9 (1);
   test10 ();
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
   test11 ();
 #endif
   DONE ();
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-2.c b/gcc/testsuite/gcc.dg/builtin-object-size-2.c
index 37d3dcc6f5689..c28d72eee9bfe 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-2.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-2.c
@@ -1,6 +1,7 @@ 
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #include "builtin-object-size-common.h"
 
@@ -536,7 +537,7 @@  test8 (unsigned cond)
 #endif
 }
 
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
 /* Tests for strdup/strndup.  */
 size_t
 __attribute__ ((noinline))
@@ -624,7 +625,7 @@  test9 (void)
     FAIL ();
   free (res);
 }
-#endif /* avr */
+#endif
 
 int
 main (void)
@@ -639,7 +640,7 @@  main (void)
   test6 ();
   test7 ();
   test8 (1);
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
   test9 ();
 #endif
   DONE ();
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-3.c b/gcc/testsuite/gcc.dg/builtin-object-size-3.c
index f4d1ebf7027bf..3f58da3d500cd 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-3.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-3.c
@@ -1,6 +1,7 @@ 
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #include "builtin-object-size-common.h"
 
@@ -628,7 +629,7 @@  test10 (void)
     }
 }
 
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
 /* Tests for strdup/strndup.  */
 size_t
 __attribute__ ((noinline))
@@ -717,7 +718,7 @@  test11 (void)
     FAIL ();
   free (res);
 }
-#endif /* avr */
+#endif
 
 int
 main (void)
@@ -734,7 +735,7 @@  main (void)
   test8 ();
   test9 (1);
   test10 ();
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
   test11 ();
 #endif
   DONE ();
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-object-size-4.c
index 2887dd150423b..b3eb36efb744d 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-4.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-4.c
@@ -1,6 +1,7 @@ 
 /* { dg-do run } */
 /* { dg-options "-O2 -Wno-stringop-overread" } */
 /* { dg-require-effective-target alloca } */
+/* { dg-additional-options "-DSKIP_STRNDUP" { target { ! strndup } } } */
 
 #include "builtin-object-size-common.h"
 
@@ -509,7 +510,7 @@  test8 (unsigned cond)
 #endif
 }
 
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
 /* Tests for strdup/strndup.  */
 size_t
 __attribute__ ((noinline))
@@ -597,7 +598,7 @@  test9 (void)
     FAIL ();
   free (res);
 }
-#endif /* avr */
+#endif
 
 int
 main (void)
@@ -612,7 +613,7 @@  main (void)
   test6 ();
   test7 ();
   test8 (1);
-#if !defined(__AVR__) && !defined(__hpux__) /* avr and hpux have no strndup */
+#ifndef SKIP_STRNDUP
   test9 ();
 #endif
   DONE ();
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index edce672c0e21a..17c8382adf143 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -11580,6 +11580,17 @@  proc check_effective_target_stpcpy {} {
     return [check_function_available "stpcpy"]
 }
 
+# Returns 1 if "strndup" is available on the target system.
+
+proc check_effective_target_strndup {} {
+    if { [istarget *-*-vxworks*] } {
+	# VxWorks doesn't have strndup but our way to test fails
+	# to detect as we're doing partial links for kernel modules.
+	return 0
+    }
+    return [check_function_available "strndup"]
+}
+
 # Returns 1 if "sigsetjmp" is available on the target system.
 # Also check if "__sigsetjmp" is defined since that's what glibc
 # uses.