about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-03-25 08:58:03 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2024-04-17 16:12:40 -0300
commit6272e416053443fcb4b2220f4c8779286d6c60fe (patch)
treef414bb0b1b9b1916fc842f9a838a9dd2086bf67a
parent8eb85e1f8ac6ec5544e681d3d1e880e442b37310 (diff)
downloadglibc-6272e416053443fcb4b2220f4c8779286d6c60fe.tar.gz
glibc-6272e416053443fcb4b2220f4c8779286d6c60fe.tar.xz
glibc-6272e416053443fcb4b2220f4c8779286d6c60fe.zip
Use check tests with trampolines iff compiler supports it
-rwxr-xr-xconfigure33
-rw-r--r--configure.ac20
-rw-r--r--elf/Makefile10
-rw-r--r--nptl/Makefile8
4 files changed, 64 insertions, 7 deletions
diff --git a/configure b/configure
index 252b4373c0..1ff91a6810 100755
--- a/configure
+++ b/configure
@@ -7454,6 +7454,39 @@ if test $libc_cv_cc_loop_to_function = yes; then
 fi
 
 
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC has support for trampolines" >&5
+printf %s "checking if $CC has support for trampolines... " >&6; }
+if test ${libc_cv_cc_trampoline+y}
+then :
+  printf %s "(cached) " >&6
+else $as_nop
+  cat > conftest.c <<EOF
+void bar (void (*callback) (void));
+int foo (void)
+{
+  int var = 0;
+  void callback (void) { var = 1; }
+  bar (callback);
+  return var;
+}
+EOF
+libc_cv_cc_trampoline=no
+if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -Werror -c conftest.c'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+then
+  libc_cv_cc_trampoline=yes
+fi
+rm -f conftest*
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_trampoline" >&5
+printf "%s\n" "$libc_cv_cc_trampoline" >&6; }
+config_vars="$config_vars
+have-cc-trampoline = $libc_cv_cc_trampoline"
+
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgd" >&5
 printf %s "checking for libgd... " >&6; }
 if test "$with_gd" != "no"; then
diff --git a/configure.ac b/configure.ac
index 2f90025a1a..99a0ea1bbb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1526,6 +1526,26 @@ if test $libc_cv_cc_loop_to_function = yes; then
 fi
 AC_SUBST(libc_cv_cc_loop_to_function)
 
+AC_CACHE_CHECK(if $CC has support for trampolines, libc_cv_cc_trampoline, [dnl
+cat > conftest.c <<EOF
+void bar (void (*callback) (void));
+int foo (void)
+{
+  int var = 0;
+  void callback (void) { var = 1; }
+  bar (callback);
+  return var;
+}
+EOF
+libc_cv_cc_trampoline=no
+if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Werror -c conftest.c])
+then
+  libc_cv_cc_trampoline=yes
+fi
+rm -f conftest*])
+LIBC_CONFIG_VAR([have-cc-trampoline],
+		[$libc_cv_cc_trampoline])
+
 dnl Check whether we have the gd library available.
 AC_MSG_CHECKING(for libgd)
 if test "$with_gd" != "no"; then
diff --git a/elf/Makefile b/elf/Makefile
index ec1516ca3d..42450f9453 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -537,7 +537,7 @@ endif
 selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
 
 ifneq ($(selinux-enabled),1)
-tests-execstack-yes = \
+tests-execstack-yesyes = \
   tst-execstack \
   tst-execstack-needed \
   tst-execstack-prog \
@@ -628,7 +628,7 @@ $(objpfx)tst-rtld-does-not-exist.out: tst-rtld-does-not-exist.sh $(objpfx)ld.so
 	$(SHELL) $< $(objpfx)ld.so > $@; \
 	$(evaluate-test)
 
-tests += $(tests-execstack-$(have-z-execstack))
+tests += $(tests-execstack-$(have-z-execstack)$(have-cc-trampoline))
 ifeq ($(run-built-tests),yes)
 tests-special += \
   $(objpfx)noload-mem.out \
@@ -992,7 +992,7 @@ modules-names-cxx = \
 
 modules-names += \
   $(if $(CXX),$(modules-names-cxx)) \
-  $(modules-execstack-$(have-z-execstack)) \
+  $(modules-execstack-$(have-z-execstack)$(have-cc-trampoline)) \
   $(tlsmod17a-modules) \
   $(tlsmod18a-modules) \
   $(tst-tls-many-dynamic-modules) \
@@ -1041,7 +1041,7 @@ tests-pie += vismain
 CFLAGS-vismain.c += $(PIE-ccflag)
 endif
 endif
-modules-execstack-yes = tst-execstack-mod
+modules-execstack-yesyes = tst-execstack-mod
 extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
 
 # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special
@@ -1833,7 +1833,7 @@ $(objpfx)unload8.out: $(objpfx)unload8mod1.so $(objpfx)unload8mod1x.so
 
 $(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so
 
-ifeq ($(have-z-execstack),yes)
+ifeq ($(have-z-execstack)$(have-cc-trampoline),yesyes)
 $(objpfx)tst-execstack.out: $(objpfx)tst-execstack-mod.so
 CPPFLAGS-tst-execstack.c += -DUSE_PTHREADS=0
 LDFLAGS-tst-execstack = -Wl,-z,noexecstack
diff --git a/nptl/Makefile b/nptl/Makefile
index b3f8af2e1c..a13a8ea455 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -466,7 +466,7 @@ tests-internal += \
   tst-tls3-malloc \
   tst-tls5 \
   # tests-internal
-ifeq ($(have-z-execstack),yes)
+ifeq ($(have-z-execstack)$(have-cc-trampoline),yesyes)
 tests += tst-execstack-threads
 endif
 endif
@@ -475,7 +475,6 @@ modules-names = \
   tst-audit-threads-mod1 \
   tst-audit-threads-mod2 \
   tst-compat-forwarder-mod \
-  tst-execstack-threads-mod \
   tst-stack4mod \
   tst-tls3mod \
   tst-tls5mod \
@@ -486,6 +485,11 @@ modules-names = \
   tst-tls5mode \
   tst-tls5modf \
   # modules-names
+ifeq ($(have-z-execstack)$(have-cc-trampoline),yesyes)
+modules-names += \
+  tst-execstack-threads-mod \
+  # modules-names
+endif
 extra-test-objs += \
   $(addsuffix .os,$(strip $(modules-names))) \
   tst-cleanup4aux.o \