diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2023-09-26 15:00:43 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2023-09-26 15:00:43 +0300 |
commit | a37a2763383e6c204fe878e1416dd35e7711d3a9 (patch) | |
tree | c19810311ace0311b4cbefb1d73f98382cbc6477 | |
parent | Build: Fix underquoted AC_LANG_SOURCE. (diff) | |
download | xz-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.txt | 8 | ||||
-rw-r--r-- | configure.ac | 8 |
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__())) |