From: Richard Henderson Date: Fri, 25 May 2012 17:30:42 +0000 (-0700) Subject: ppc: Pass hwcap to ifuncs. X-Git-Tag: upstream/2.20~3802 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a386f1cc229e7de02740bef18bdd5d272d1e7537;p=platform%2Fupstream%2Flinaro-glibc.git ppc: Pass hwcap to ifuncs. * sysdeps/powerpc/powerpc32/dl-irel.h (elf_ifunc_invoke): Pass dl_hwcap to ifunc resolver. * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Use elf_ifunc_invoke. * sysdeps/powerpc/powerpc64/dl-irel.h (elf_ifunc_invoke): Pass dl_hwcap to ifunc resolver. * sysdeps/powerpc/powerpc64/dl-machine.h (resolve_ifunc): Likewise. --- diff --git a/ChangeLog b/ChangeLog index ceb3f5a..2f6a533 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-05-25 Richard Henderson + + * sysdeps/powerpc/powerpc32/dl-irel.h (elf_ifunc_invoke): Pass + dl_hwcap to ifunc resolver. + * sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela): Use + elf_ifunc_invoke. + * sysdeps/powerpc/powerpc64/dl-irel.h (elf_ifunc_invoke): Pass + dl_hwcap to ifunc resolver. + * sysdeps/powerpc/powerpc64/dl-machine.h (resolve_ifunc): Likewise. + 2012-05-24 Joseph Myers [BZ #14153] diff --git a/sysdeps/powerpc/powerpc32/dl-irel.h b/sysdeps/powerpc/powerpc32/dl-irel.h index c8e50ee..ebaf44a 100644 --- a/sysdeps/powerpc/powerpc32/dl-irel.h +++ b/sysdeps/powerpc/powerpc32/dl-irel.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF indirect relocation inline functions. PowerPC version. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -29,7 +29,7 @@ static inline Elf32_Addr __attribute ((always_inline)) elf_ifunc_invoke (Elf32_Addr addr) { - return ((Elf32_Addr (*) (void)) (addr)) (); + return ((Elf32_Addr (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap)); } static inline void diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h index 45868f5..3ae27a4 100644 --- a/sysdeps/powerpc/powerpc32/dl-machine.h +++ b/sysdeps/powerpc/powerpc32/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. PowerPC version. - Copyright (C) 1995-2003, 2005, 2006, 2011 Free Software Foundation, Inc. + Copyright (C) 1995-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,6 +23,7 @@ #include #include +#include /* Translate a processor specific dynamic tag to the index in l_info array. */ @@ -308,7 +309,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1) && __builtin_expect (!skip_ifunc, 1)) - value = ((Elf32_Addr (*) (void)) value) (); + value = elf_ifunc_invoke (value); /* A small amount of code is duplicated here for speed. In libc, more than 90% of the relocs are R_PPC_RELATIVE; in the X11 shared diff --git a/sysdeps/powerpc/powerpc64/dl-irel.h b/sysdeps/powerpc/powerpc64/dl-irel.h index 7270275..ced0f3f 100644 --- a/sysdeps/powerpc/powerpc64/dl-irel.h +++ b/sysdeps/powerpc/powerpc64/dl-irel.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF indirect relocation inline functions. PowerPC64 version. - Copyright (C) 2009, 2011 Free Software Foundation, Inc. + Copyright (C) 2009-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -31,7 +31,7 @@ static inline Elf64_Addr __attribute ((always_inline)) elf_ifunc_invoke (Elf64_Addr addr) { - return ((Elf64_Addr (*) (void)) (addr)) (); + return ((Elf64_Addr (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap)); } static inline void diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index a964a29..7c7d768 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -545,7 +545,7 @@ resolve_ifunc (Elf64_Addr value, value = (Elf64_Addr) &opd; } #endif - return ((Elf64_Addr (*) (void)) value) (); + return ((Elf64_Addr (*) (unsigned long int)) value) (GLRO(dl_hwcap)); } /* Perform the relocation specified by RELOC and SYM (which is fully