aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2023-09-26 15:00:43 +0300
committerLasse Collin <lasse.collin@tukaani.org>2023-09-26 15:00:43 +0300
commita37a2763383e6c204fe878e1416dd35e7711d3a9 (patch)
treec19810311ace0311b4cbefb1d73f98382cbc6477
parentBuild: Fix underquoted AC_LANG_SOURCE. (diff)
downloadxz-a37a2763383e6c204fe878e1416dd35e7711d3a9.tar.xz
Build: Fix __attribute__((ifunc(...))) detection with clang -Wall.
Now if user-supplied CFLAGS contains -Wall -Wextra -Wpedantic the two checks that need -Werror will still work. At CMake side there is add_compile_options(-Wall -Wextra) but it didn't affect the -Werror tests. So with both Autotools and CMake only user-supplied CFLAGS could make the checks fail when they shouldn't. This is not a full fix as things like -Wunused-macros in user-supplied CFLAGS will still cause problems with both GCC and Clang.
Diffstat (limited to '')
-rw-r--r--CMakeLists.txt8
-rw-r--r--configure.ac8
2 files changed, 16 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9baa314e..c8d52f2d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -790,6 +790,14 @@ if(ALLOW_ATTR_IFUNC)
void func_ifunc(void)
__attribute__((__ifunc__(\"resolve_func\")));
int main(void) { return 0; }
+ /*
+ * 'clang -Wall' incorrectly warns that resolve_func is
+ * unused (-Wunused-function). Correct assembly output is
+ * still produced. This problem exists at least in Clang
+ * versions 4 to 17. The following silences the bogus warning:
+ */
+ void make_clang_quiet(void);
+ void make_clang_quiet(void) { resolve_func()(); }
"
HAVE_FUNC_ATTRIBUTE_IFUNC)
cmake_pop_check_state()
diff --git a/configure.ac b/configure.ac
index d83b148a..cf34c739 100644
--- a/configure.ac
+++ b/configure.ac
@@ -882,6 +882,14 @@ if test "x$enable_ifunc" = xyes ; then
static void (*resolve_func (void)) (void) { return func; }
void func_ifunc (void)
__attribute__((__ifunc__("resolve_func")));
+ /*
+ * 'clang -Wall' incorrectly warns that resolve_func is
+ * unused (-Wunused-function). Correct assembly output is
+ * still produced. This problem exists at least in Clang
+ * versions 4 to 17. The following silences the bogus warning:
+ */
+ void make_clang_quiet(void);
+ void make_clang_quiet(void) { resolve_func()(); }
]])], [
AC_DEFINE([HAVE_FUNC_ATTRIBUTE_IFUNC], [1],
[Define to 1 if __attribute__((__ifunc__()))