From 2185ed0d8d707b310fc289fb4ce263157480b615 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Tue, 13 Jan 2015 09:57:29 +0100
Subject: [PATCH] Autoconf check for ifunc support.

---
 ChangeLog    |  6 ++++++
 aclocal.m4   | 35 +++++++++++++++++++++++++++++++++++
 configure.ac |  2 ++
 3 files changed, 43 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 291b97d0..8c706595 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-01-13  Niels Möller  <nisse@lysator.liu.se>
+
+	* aclocal.m4 (NETTLE_CHECK_IFUNC): New macro, checking for ifunc
+	and settting HAVE_LINK_IFUNC if working.
+	* configure.ac: Use it.
+
 2015-01-12  Niels Möller  <nisse@lysator.liu.se>
 
 	* asm.m4 (DECLARE_FUNC): New macro, extracted from PROLOGUE.
diff --git a/aclocal.m4 b/aclocal.m4
index b6846cae..e534f55b 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -643,6 +643,41 @@ foo:
 fi
 ])
 
+dnl NETTLE_CHECK_IFUNC
+dnl ------------------
+dnl Check if __attribute__ ((ifunc(...))) works
+AC_DEFUN([NETTLE_CHECK_IFUNC],
+[AC_REQUIRE([AC_PROG_CC])
+AC_CACHE_CHECK([for ifunc support],
+  nettle_cv_link_ifunc,
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([
+static int
+foo_imp(int x)
+{
+  return 1;
+}
+
+typedef void void_func (void);
+
+static void_func *
+foo_resolv(void)
+{
+  return (void_func *) foo_imp;
+}
+
+int foo (int x) __attribute__ ((ifunc("foo_resolv")));
+],[
+  return foo(0);
+
+])],
+[nettle_cv_link_ifunc=yes],
+[nettle_cv_link_ifunc=no]))
+AH_TEMPLATE([HAVE_LINK_IFUNC], [Define if compiler and linker supports __attribute__ ifunc])
+if test "x$nettle_cv_link_ifunc" = xyes ; then
+  AC_DEFINE(HAVE_LINK_IFUNC)
+fi 
+])
+
 dnl @synopsis AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEADERS-TO-CHECK])]
 dnl
 dnl the "ISO C9X: 7.18 Integer types <stdint.h>" section requires the
diff --git a/configure.ac b/configure.ac
index 80fdd79f..49c52f6d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -95,6 +95,8 @@ LSH_RPATH_INIT([`echo $with_lib_path | sed 's/:/ /g'` \
 # Checks for programs.
 AC_PROG_CC
 
+NETTLE_CHECK_IFUNC
+
 # When $CC foo.c -o foo creates both foo and foo.exe, autoconf picks
 # up the foo.exe and sets exeext to .exe. That is correct for cygwin,
 # which has some kind of magic link from foo to foo.exe, but not for
-- 
GitLab