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:
parent
9c42f93693
commit
a37a276338
|
@ -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()
|
||||||
|
|
|
@ -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__()))
|
||||||
|
|
Loading…
Reference in New Issue