diff mbox series

[5/7] elf: Suppress unused function clang for __ifunc_resolver

Message ID 20241231182649.1811734-6-adhemerval.zanella@linaro.org
State New
Headers show
Series More fixes for building tests with clang | expand

Commit Message

Adhemerval Zanella Netto Dec. 31, 2024, 6:26 p.m. UTC
The __ifunc_resolver macro expands to:

  extern __typeof (__redirect_name) name __attribute__ ((ifunc ("iname_ifunc")));
  static __typeof (__redirect_name) *name_ifunc (void) { [...] };

And although NAME_IFUNC is and alias for NAME, clang still emits
an 'unused function 'name_ifunc' [-Werror,-Wunused-function]'
warning.  The static is used to avoid name pollution on static
linkage.
---
 elf/ifuncmain9.c           | 4 ++++
 elf/tst-ifunc-fault-lazy.c | 4 ++++
 include/libc-symbols.h     | 6 +++++-
 3 files changed, 13 insertions(+), 1 deletion(-)

Comments

H.J. Lu Dec. 31, 2024, 9:01 p.m. UTC | #1
On Wed, Jan 1, 2025 at 2:27 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The __ifunc_resolver macro expands to:
>
>   extern __typeof (__redirect_name) name __attribute__ ((ifunc ("iname_ifunc")));
>   static __typeof (__redirect_name) *name_ifunc (void) { [...] };
>
> And although NAME_IFUNC is and alias for NAME, clang still emits
> an 'unused function 'name_ifunc' [-Werror,-Wunused-function]'

Why didn't I see it on x86-64 with non-fortify build?

> warning.  The static is used to avoid name pollution on static
> linkage.
> ---
>  elf/ifuncmain9.c           | 4 ++++
>  elf/tst-ifunc-fault-lazy.c | 4 ++++
>  include/libc-symbols.h     | 6 +++++-
>  3 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/elf/ifuncmain9.c b/elf/ifuncmain9.c
> index 654beeadfe..f102b140bd 100644
> --- a/elf/ifuncmain9.c
> +++ b/elf/ifuncmain9.c
> @@ -22,6 +22,7 @@
>
>  #include <stdbool.h>
>  #include <stdio.h>
> +#include <libc-diag.h>
>
>  #if __GNUC_PREREQ (5, 5)
>  /* Do not use the test framework, so that the process setup is not
> @@ -41,6 +42,8 @@ implementation (void)
>    return random_constant;
>  }
>
> +DIAG_PUSH_NEEDS_COMMENT_CLANG;
> +DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
>  static __typeof__ (implementation) *
>  inhibit_stack_protector
>  resolver (void)
> @@ -50,6 +53,7 @@ resolver (void)
>  }
>
>  static int magic (void) __attribute__ ((ifunc ("resolver")));
> +DIAG_POP_NEEDS_COMMENT_CLANG;
>
>  int
>  main (void)
> diff --git a/elf/tst-ifunc-fault-lazy.c b/elf/tst-ifunc-fault-lazy.c
> index 5157c6cc6c..04448b2b15 100644
> --- a/elf/tst-ifunc-fault-lazy.c
> +++ b/elf/tst-ifunc-fault-lazy.c
> @@ -21,6 +21,7 @@
>     relocations.  */
>
>  #include <config.h>
> +#include <libc-diag.h>
>
>  #ifdef HAVE_GCC_IFUNC
>
> @@ -34,6 +35,8 @@ implementation (void)
>    *p = 0;
>  }
>
> +DIAG_PUSH_NEEDS_COMMENT_CLANG;
> +DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
>  static __typeof__ (implementation) *
>  resolver (void)
>  {
> @@ -42,6 +45,7 @@ resolver (void)
>    *p = 0;
>    return implementation;
>  }
> +DIAG_POP_NEEDS_COMMENT_CLANG;
>
>  static void magic (void) __attribute__ ((ifunc ("resolver")));
>
> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
> index 56ae61015d..9fe047f4d3 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -86,6 +86,7 @@
>
>  /* Obtain the definition of symbol_version_reference.  */
>  #include <libc-symver.h>
> +#include <libc-diag.h>
>
>  /* When PIC is defined and SHARED isn't defined, we are building PIE
>     by default.  */
> @@ -671,7 +672,10 @@ for linking")
>  # define __ifunc_args(type_name, name, expr, init, ...)                        \
>    extern __typeof (type_name) name __attribute__                       \
>                               ((ifunc (#name "_ifunc")));               \
> -  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__)
> +  DIAG_PUSH_NEEDS_COMMENT_CLANG;                                       \
> +  DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");           \
> +  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__); \
> +  DIAG_POP_NEEDS_COMMENT_CLANG;
>
>  # define __ifunc_args_hidden(type_name, name, expr, init, ...)         \
>    __ifunc_args (type_name, name, expr, init, __VA_ARGS__)
> --
> 2.43.0
>
Adhemerval Zanella Netto Jan. 2, 2025, 6:58 p.m. UTC | #2
On 31/12/24 18:01, H.J. Lu wrote:
> On Wed, Jan 1, 2025 at 2:27 AM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>> The __ifunc_resolver macro expands to:
>>
>>   extern __typeof (__redirect_name) name __attribute__ ((ifunc ("iname_ifunc")));
>>   static __typeof (__redirect_name) *name_ifunc (void) { [...] };
>>
>> And although NAME_IFUNC is and alias for NAME, clang still emits
>> an 'unused function 'name_ifunc' [-Werror,-Wunused-function]'
> 
> Why didn't I see it on x86-64 with non-fortify build?

I am not sure, from your cover letter to initially support clang as testing
compiler you aimed to support clang-19; while for this patchset I tried with
a clang-18 provided by ubuntu-24. I will check if this related to clang
version.

> 
>> warning.  The static is used to avoid name pollution on static
>> linkage.
>> ---
>>  elf/ifuncmain9.c           | 4 ++++
>>  elf/tst-ifunc-fault-lazy.c | 4 ++++
>>  include/libc-symbols.h     | 6 +++++-
>>  3 files changed, 13 insertions(+), 1 deletion(-)
>>
>> diff --git a/elf/ifuncmain9.c b/elf/ifuncmain9.c
>> index 654beeadfe..f102b140bd 100644
>> --- a/elf/ifuncmain9.c
>> +++ b/elf/ifuncmain9.c
>> @@ -22,6 +22,7 @@
>>
>>  #include <stdbool.h>
>>  #include <stdio.h>
>> +#include <libc-diag.h>
>>
>>  #if __GNUC_PREREQ (5, 5)
>>  /* Do not use the test framework, so that the process setup is not
>> @@ -41,6 +42,8 @@ implementation (void)
>>    return random_constant;
>>  }
>>
>> +DIAG_PUSH_NEEDS_COMMENT_CLANG;
>> +DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
>>  static __typeof__ (implementation) *
>>  inhibit_stack_protector
>>  resolver (void)
>> @@ -50,6 +53,7 @@ resolver (void)
>>  }
>>
>>  static int magic (void) __attribute__ ((ifunc ("resolver")));
>> +DIAG_POP_NEEDS_COMMENT_CLANG;
>>
>>  int
>>  main (void)
>> diff --git a/elf/tst-ifunc-fault-lazy.c b/elf/tst-ifunc-fault-lazy.c
>> index 5157c6cc6c..04448b2b15 100644
>> --- a/elf/tst-ifunc-fault-lazy.c
>> +++ b/elf/tst-ifunc-fault-lazy.c
>> @@ -21,6 +21,7 @@
>>     relocations.  */
>>
>>  #include <config.h>
>> +#include <libc-diag.h>
>>
>>  #ifdef HAVE_GCC_IFUNC
>>
>> @@ -34,6 +35,8 @@ implementation (void)
>>    *p = 0;
>>  }
>>
>> +DIAG_PUSH_NEEDS_COMMENT_CLANG;
>> +DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
>>  static __typeof__ (implementation) *
>>  resolver (void)
>>  {
>> @@ -42,6 +45,7 @@ resolver (void)
>>    *p = 0;
>>    return implementation;
>>  }
>> +DIAG_POP_NEEDS_COMMENT_CLANG;
>>
>>  static void magic (void) __attribute__ ((ifunc ("resolver")));
>>
>> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
>> index 56ae61015d..9fe047f4d3 100644
>> --- a/include/libc-symbols.h
>> +++ b/include/libc-symbols.h
>> @@ -86,6 +86,7 @@
>>
>>  /* Obtain the definition of symbol_version_reference.  */
>>  #include <libc-symver.h>
>> +#include <libc-diag.h>
>>
>>  /* When PIC is defined and SHARED isn't defined, we are building PIE
>>     by default.  */
>> @@ -671,7 +672,10 @@ for linking")
>>  # define __ifunc_args(type_name, name, expr, init, ...)                        \
>>    extern __typeof (type_name) name __attribute__                       \
>>                               ((ifunc (#name "_ifunc")));               \
>> -  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__)
>> +  DIAG_PUSH_NEEDS_COMMENT_CLANG;                                       \
>> +  DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");           \
>> +  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__); \
>> +  DIAG_POP_NEEDS_COMMENT_CLANG;
>>
>>  # define __ifunc_args_hidden(type_name, name, expr, init, ...)         \
>>    __ifunc_args (type_name, name, expr, init, __VA_ARGS__)
>> --
>> 2.43.0
>>
> 
>
H.J. Lu Jan. 3, 2025, 1:31 a.m. UTC | #3
On Wed, Jan 1, 2025 at 2:27 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The __ifunc_resolver macro expands to:
>
>   extern __typeof (__redirect_name) name __attribute__ ((ifunc ("iname_ifunc")));
>   static __typeof (__redirect_name) *name_ifunc (void) { [...] };
>
> And although NAME_IFUNC is and alias for NAME, clang still emits
> an 'unused function 'name_ifunc' [-Werror,-Wunused-function]'
> warning.  The static is used to avoid name pollution on static
> linkage.
> ---
>  elf/ifuncmain9.c           | 4 ++++
>  elf/tst-ifunc-fault-lazy.c | 4 ++++
>  include/libc-symbols.h     | 6 +++++-
>  3 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/elf/ifuncmain9.c b/elf/ifuncmain9.c
> index 654beeadfe..f102b140bd 100644
> --- a/elf/ifuncmain9.c
> +++ b/elf/ifuncmain9.c
> @@ -22,6 +22,7 @@
>
>  #include <stdbool.h>
>  #include <stdio.h>
> +#include <libc-diag.h>
>
>  #if __GNUC_PREREQ (5, 5)
>  /* Do not use the test framework, so that the process setup is not
> @@ -41,6 +42,8 @@ implementation (void)
>    return random_constant;
>  }
>
> +DIAG_PUSH_NEEDS_COMMENT_CLANG;
> +DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");

These are needed for Clang 18.

>  static __typeof__ (implementation) *
>  inhibit_stack_protector
>  resolver (void)
> @@ -50,6 +53,7 @@ resolver (void)
>  }
>
>  static int magic (void) __attribute__ ((ifunc ("resolver")));
> +DIAG_POP_NEEDS_COMMENT_CLANG;
>
>  int
>  main (void)
> diff --git a/elf/tst-ifunc-fault-lazy.c b/elf/tst-ifunc-fault-lazy.c
> index 5157c6cc6c..04448b2b15 100644
> --- a/elf/tst-ifunc-fault-lazy.c
> +++ b/elf/tst-ifunc-fault-lazy.c
> @@ -21,6 +21,7 @@
>     relocations.  */
>
>  #include <config.h>
> +#include <libc-diag.h>
>
>  #ifdef HAVE_GCC_IFUNC
>
> @@ -34,6 +35,8 @@ implementation (void)
>    *p = 0;
>  }
>
> +DIAG_PUSH_NEEDS_COMMENT_CLANG;
> +DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
>  static __typeof__ (implementation) *
>  resolver (void)
>  {
> @@ -42,6 +45,7 @@ resolver (void)
>    *p = 0;
>    return implementation;
>  }
> +DIAG_POP_NEEDS_COMMENT_CLANG;
>
>  static void magic (void) __attribute__ ((ifunc ("resolver")));
>
> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
> index 56ae61015d..9fe047f4d3 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -86,6 +86,7 @@
>
>  /* Obtain the definition of symbol_version_reference.  */
>  #include <libc-symver.h>
> +#include <libc-diag.h>
>
>  /* When PIC is defined and SHARED isn't defined, we are building PIE
>     by default.  */
> @@ -671,7 +672,10 @@ for linking")
>  # define __ifunc_args(type_name, name, expr, init, ...)                        \
>    extern __typeof (type_name) name __attribute__                       \
>                               ((ifunc (#name "_ifunc")));               \
> -  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__)
> +  DIAG_PUSH_NEEDS_COMMENT_CLANG;                                       \
> +  DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");           \
> +  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__); \
> +  DIAG_POP_NEEDS_COMMENT_CLANG;

Drop ths.  It isn't needed for glibc testing.

>  # define __ifunc_args_hidden(type_name, name, expr, init, ...)         \
>    __ifunc_args (type_name, name, expr, init, __VA_ARGS__)
> --
> 2.43.0
>
diff mbox series

Patch

diff --git a/elf/ifuncmain9.c b/elf/ifuncmain9.c
index 654beeadfe..f102b140bd 100644
--- a/elf/ifuncmain9.c
+++ b/elf/ifuncmain9.c
@@ -22,6 +22,7 @@ 
 
 #include <stdbool.h>
 #include <stdio.h>
+#include <libc-diag.h>
 
 #if __GNUC_PREREQ (5, 5)
 /* Do not use the test framework, so that the process setup is not
@@ -41,6 +42,8 @@  implementation (void)
   return random_constant;
 }
 
+DIAG_PUSH_NEEDS_COMMENT_CLANG;
+DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
 static __typeof__ (implementation) *
 inhibit_stack_protector
 resolver (void)
@@ -50,6 +53,7 @@  resolver (void)
 }
 
 static int magic (void) __attribute__ ((ifunc ("resolver")));
+DIAG_POP_NEEDS_COMMENT_CLANG;
 
 int
 main (void)
diff --git a/elf/tst-ifunc-fault-lazy.c b/elf/tst-ifunc-fault-lazy.c
index 5157c6cc6c..04448b2b15 100644
--- a/elf/tst-ifunc-fault-lazy.c
+++ b/elf/tst-ifunc-fault-lazy.c
@@ -21,6 +21,7 @@ 
    relocations.  */
 
 #include <config.h>
+#include <libc-diag.h>
 
 #ifdef HAVE_GCC_IFUNC
 
@@ -34,6 +35,8 @@  implementation (void)
   *p = 0;
 }
 
+DIAG_PUSH_NEEDS_COMMENT_CLANG;
+DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");
 static __typeof__ (implementation) *
 resolver (void)
 {
@@ -42,6 +45,7 @@  resolver (void)
   *p = 0;
   return implementation;
 }
+DIAG_POP_NEEDS_COMMENT_CLANG;
 
 static void magic (void) __attribute__ ((ifunc ("resolver")));
 
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 56ae61015d..9fe047f4d3 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -86,6 +86,7 @@ 
 
 /* Obtain the definition of symbol_version_reference.  */
 #include <libc-symver.h>
+#include <libc-diag.h>
 
 /* When PIC is defined and SHARED isn't defined, we are building PIE
    by default.  */
@@ -671,7 +672,10 @@  for linking")
 # define __ifunc_args(type_name, name, expr, init, ...)			\
   extern __typeof (type_name) name __attribute__			\
 			      ((ifunc (#name "_ifunc")));		\
-  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__)
+  DIAG_PUSH_NEEDS_COMMENT_CLANG;					\
+  DIAG_IGNORE_NEEDS_COMMENT_CLANG (13, "-Wunused-function");		\
+  __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__);	\
+  DIAG_POP_NEEDS_COMMENT_CLANG;
 
 # define __ifunc_args_hidden(type_name, name, expr, init, ...)		\
   __ifunc_args (type_name, name, expr, init, __VA_ARGS__)