Silence clang -Wignored-attributes when building with clang

Message ID 20260727145429.2804004-1-mattst88@gmail.com (mailing list archive)
State New
Headers
Series Silence clang -Wignored-attributes when building with clang |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Test passed

Commit Message

Matt Turner July 27, 2026, 2:54 p.m. UTC
  Building glibc with clang trips -Wignored-attributes on the alias
redirections glibc uses intentionally, e.g. the long_double_symbol
machinery where a public name aliases a weak alias of an internal
symbol.

These warnings are harmless: the alias attribute still generates
the correct ELF symbol table entries, and the GNU linker resolves
indirect alias chains at link time.  Clang warns that attributes
on the intermediate alias target won't be inherited by the outer
alias, but that attribute propagation is neither expected nor
needed here -- the aliasing semantics themselves are unaffected.

Detect whether CC is clang (cc-clang) and add -Wno-ignored-attributes
to the warning flags.
---
 Makeconfig   |  4 ++++
 configure    | 29 +++++++++++++++++++++++++++++
 configure.ac |  9 +++++++++
 3 files changed, 42 insertions(+)
  

Comments

Adhemerval Zanella Netto July 29, 2026, 5:04 p.m. UTC | #1
On 27/07/26 11:54, Matt Turner wrote:
> Building glibc with clang trips -Wignored-attributes on the alias
> redirections glibc uses intentionally, e.g. the long_double_symbol
> machinery where a public name aliases a weak alias of an internal
> symbol.
> 
> These warnings are harmless: the alias attribute still generates
> the correct ELF symbol table entries, and the GNU linker resolves
> indirect alias chains at link time.  Clang warns that attributes
> on the intermediate alias target won't be inherited by the outer
> alias, but that attribute propagation is neither expected nor
> needed here -- the aliasing semantics themselves are unaffected.
> 
> Detect whether CC is clang (cc-clang) and add -Wno-ignored-attributes
> to the warning flags.

I could avoid add this flag by reworking how the weak alias were done
for some routines (check 6b7067460f0ad8eb591735d21c60bcf3b52023df). It
does work for x86_64 and aarch64 for clang 18 through 22 (I haven't
tested 23 yet).

Which ABI are you targeting?

> ---
>  Makeconfig   |  4 ++++
>  configure    | 29 +++++++++++++++++++++++++++++
>  configure.ac |  9 +++++++++
>  3 files changed, 42 insertions(+)
> 
> diff --git ./Makeconfig ./Makeconfig
> index 8fe7217dd7..4c34e59aed 100644
> --- ./Makeconfig
> +++ ./Makeconfig
> @@ -908,6 +908,10 @@ endif
>  ifeq ($(enable-werror),yes)
>  +gccwarn += -Werror
>  endif
> +# Clang warns on the intentional alias redirections (e.g. long_double_symbol).
> +ifeq ($(cc-clang),yes)
> ++gccwarn += -Wno-ignored-attributes
> +endif
>  +gccwarn-c = -Wstrict-prototypes -Wold-style-definition \
>    $(cc-option-wfree-labels) $(cc-option-wmissing-parameter-name)
>  
> diff --git ./configure ./configure
> index 90c4b4f858..fbe8e4ac30 100755
> --- ./configure
> +++ ./configure
> @@ -6031,6 +6031,35 @@ config_vars="$config_vars
>  have-test-clang = $libc_cv_test_clang"
>  
>  
> +cat > conftest.c <<EOF
> +$conftest_code
> +EOF
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether CC is clang" >&5
> +printf %s "checking whether CC is clang... " >&6; }
> +if test ${libc_cv_cc_clang+y}
> +then :
> +  printf %s "(cached) " >&6
> +else case e in #(
> +  e)   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c -o conftest 1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +  then
> +    libc_cv_cc_clang=yes
> +  else
> +    libc_cv_cc_clang=no
> +  fi ;;
> +esac
> +fi
> +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_clang" >&5
> +printf "%s\n" "$libc_cv_cc_clang" >&6; }
> +rm -f conftest*
> +config_vars="$config_vars
> +cc-clang = $libc_cv_cc_clang"
> +
> +
>  cat > conftest.cc <<EOF
>  $conftest_code
>  EOF
> diff --git ./configure.ac ./configure.ac
> index 2a788c13b7..0d81a6e7a0 100644
> --- ./configure.ac
> +++ ./configure.ac
> @@ -651,6 +651,15 @@ LIBC_TRY_TEST_CC_COMMAND([for clang],
>  )
>  LIBC_CONFIG_VAR([have-test-clang], [$libc_cv_test_clang])
>  
> +dnl Check whether the library itself is built with clang (CC).
> +LIBC_TRY_CC_COMMAND([whether CC is clang],
> +  [$conftest_code],
> +  [-c],
> +  libc_cv_cc_clang,
> +  [libc_cv_cc_clang=yes], [libc_cv_cc_clang=no],
> +)
> +LIBC_CONFIG_VAR([cc-clang], [$libc_cv_cc_clang])
> +
>  dnl Check if clang++ is used to test glibc.
>  LIBC_TRY_TEST_CXX_COMMAND([for clang++],
>    [$conftest_code],
  
Matt Turner Aug. 4, 2026, 2:24 p.m. UTC | #2
On Wed, Jul 29, 2026 at 1:04 PM Adhemerval Zanella Netto
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 27/07/26 11:54, Matt Turner wrote:
> > Building glibc with clang trips -Wignored-attributes on the alias
> > redirections glibc uses intentionally, e.g. the long_double_symbol
> > machinery where a public name aliases a weak alias of an internal
> > symbol.
> >
> > These warnings are harmless: the alias attribute still generates
> > the correct ELF symbol table entries, and the GNU linker resolves
> > indirect alias chains at link time.  Clang warns that attributes
> > on the intermediate alias target won't be inherited by the outer
> > alias, but that attribute propagation is neither expected nor
> > needed here -- the aliasing semantics themselves are unaffected.
> >
> > Detect whether CC is clang (cc-clang) and add -Wno-ignored-attributes
> > to the warning flags.
>
> I could avoid add this flag by reworking how the weak alias were done
> for some routines (check 6b7067460f0ad8eb591735d21c60bcf3b52023df). It
> does work for x86_64 and aarch64 for clang 18 through 22 (I haven't
> tested 23 yet).
>
> Which ABI are you targeting?

I came across this while building an Alpha backend for LLVM/clang.
  

Patch

diff --git ./Makeconfig ./Makeconfig
index 8fe7217dd7..4c34e59aed 100644
--- ./Makeconfig
+++ ./Makeconfig
@@ -908,6 +908,10 @@  endif
 ifeq ($(enable-werror),yes)
 +gccwarn += -Werror
 endif
+# Clang warns on the intentional alias redirections (e.g. long_double_symbol).
+ifeq ($(cc-clang),yes)
++gccwarn += -Wno-ignored-attributes
+endif
 +gccwarn-c = -Wstrict-prototypes -Wold-style-definition \
   $(cc-option-wfree-labels) $(cc-option-wmissing-parameter-name)
 
diff --git ./configure ./configure
index 90c4b4f858..fbe8e4ac30 100755
--- ./configure
+++ ./configure
@@ -6031,6 +6031,35 @@  config_vars="$config_vars
 have-test-clang = $libc_cv_test_clang"
 
 
+cat > conftest.c <<EOF
+$conftest_code
+EOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether CC is clang" >&5
+printf %s "checking whether CC is clang... " >&6; }
+if test ${libc_cv_cc_clang+y}
+then :
+  printf %s "(cached) " >&6
+else case e in #(
+  e)   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c -o conftest 1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+  then
+    libc_cv_cc_clang=yes
+  else
+    libc_cv_cc_clang=no
+  fi ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_clang" >&5
+printf "%s\n" "$libc_cv_cc_clang" >&6; }
+rm -f conftest*
+config_vars="$config_vars
+cc-clang = $libc_cv_cc_clang"
+
+
 cat > conftest.cc <<EOF
 $conftest_code
 EOF
diff --git ./configure.ac ./configure.ac
index 2a788c13b7..0d81a6e7a0 100644
--- ./configure.ac
+++ ./configure.ac
@@ -651,6 +651,15 @@  LIBC_TRY_TEST_CC_COMMAND([for clang],
 )
 LIBC_CONFIG_VAR([have-test-clang], [$libc_cv_test_clang])
 
+dnl Check whether the library itself is built with clang (CC).
+LIBC_TRY_CC_COMMAND([whether CC is clang],
+  [$conftest_code],
+  [-c],
+  libc_cv_cc_clang,
+  [libc_cv_cc_clang=yes], [libc_cv_cc_clang=no],
+)
+LIBC_CONFIG_VAR([cc-clang], [$libc_cv_cc_clang])
+
 dnl Check if clang++ is used to test glibc.
 LIBC_TRY_TEST_CXX_COMMAND([for clang++],
   [$conftest_code],