On 09/20/2017 12:01 PM, Joseph Myers wrote:
On Wed, 20 Sep 2017, Martin Sebor wrote:

I'm not intimately familiar with the Glibc ifunc infrastructure
to suggest a good solution here, so assuming this works my only
idea is to suppress the warning for these builds.

Joseph, do you have a better suggestion?

Is the warning because of a declaration of memmove as aliasing
__libc_memmove being compared with the type of the __libc_memmove_ifunc
declaration (asm name __libc_memmove) rather than the __libc_memmove
declaration?  If so, maybe in the non-HAVE_GCC_IFUNC case the alias should
be declared with a different type?  Or should be defined inside asm in
this case (presumably with new ifunc-related macros)?

The warning is because in the declaration:

  extern __typeof (__libc_memmove)
  memmove __attribute__ ((alias ("__libc_memmove")));

__typeof (__libc_memmove) is the same as the type of memmove
as it should be but the type of the alias ("__libc_memmove") is
that of __libc_memmove_ifunc, presumably because of the following:

  __typeof (__libc_memmove)*
  __libc_memmove_ifunc (void) __asm__ ("__libc_memmove");

I think this is because the type of "__libc_memmove" in the alias
is looked up "late" after the asm above has associated its type
with __libc_memmove_ifunc.

Besides suppressing the warning using a pragma it can also be
suppressed by declaring memove with no prototype (which would
mean changing the definition of the strong_alias macro for this
kind of builds as you suggest).  But this would just paper over
the type mismatch.  I'm afraid I don't know enough about this
machinery to tell what might be an appropriate fix (i.e., what
would declare memove as an alias for __libc_memmove_ifunc but
with the correct type), or even if there is one.

Martin

Reply via email to