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.
This commit is contained in:
Lasse Collin 2023-09-26 15:00:43 +03:00
parent 9c42f93693
commit a37a276338
2 changed files with 16 additions and 0 deletions

View File

@ -790,6 +790,14 @@ if(ALLOW_ATTR_IFUNC)
void func_ifunc(void) void func_ifunc(void)
__attribute__((__ifunc__(\"resolve_func\"))); __attribute__((__ifunc__(\"resolve_func\")));
int main(void) { return 0; } 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) HAVE_FUNC_ATTRIBUTE_IFUNC)
cmake_pop_check_state() cmake_pop_check_state()

View File

@ -882,6 +882,14 @@ if test "x$enable_ifunc" = xyes ; then
static void (*resolve_func (void)) (void) { return func; } static void (*resolve_func (void)) (void) { return func; }
void func_ifunc (void) void func_ifunc (void)
__attribute__((__ifunc__("resolve_func"))); __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], AC_DEFINE([HAVE_FUNC_ATTRIBUTE_IFUNC], [1],
[Define to 1 if __attribute__((__ifunc__())) [Define to 1 if __attribute__((__ifunc__()))