From bc2ba20ae8a5ae5c3bbd0f04c6ba4fa08602d22b Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 10 Jan 2014 13:32:35 -0800 Subject: ARM: Disable compat mcount code when unneeded. --- ChangeLog | 4 ++++ ports/ChangeLog.arm | 15 ++++++++++++++- ports/sysdeps/arm/arm-mcount.S | 35 ++++++++++++++++++++++++++++++----- ports/sysdeps/arm/gcc-compat.h | 35 +++++++++++++++++++++++++++++++++++ sysdeps/generic/gcc-compat.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 ports/sysdeps/arm/gcc-compat.h create mode 100644 sysdeps/generic/gcc-compat.h diff --git a/ChangeLog b/ChangeLog index 9a19fbf749..81421347a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2014-01-10 Roland McGrath + + * sysdeps/generic/gcc-compat.h: New file. + 2014-01-10 Siddhesh Poyarekar * benchtests/asin-inputs: Correct slow inputs. diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 313377401a..353c3d6444 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,14 @@ +2014-01-10 Roland McGrath + + * sysdeps/arm/arm-mcount.S: + #include and . + (_mcount): Renamed to __mcount_arm_compat. Made conditional on + [GCC_COMPAT (4, 3) || SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)]. + (_mcount, mcount): Define (as aliases) only under [GCC_COMPAT (4, 3)], + with compat_symbol under [SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)]. + + * sysdeps/arm/gcc-compat.h: New file. + 2014-01-01 Joseph Myers * sysdeps/arm/libm-test-ulps: Regenerated. @@ -7,7 +18,9 @@ * sysdeps/arm/fegetround.c (fegetround): Use libm_hidden_def. 2013-11-26 Ondřej Bílka - * sysdeps/unix/sysv/linux/arm/bits/shm.h: Use __glibc_reserved instead __unused. + + * sysdeps/unix/sysv/linux/arm/bits/shm.h: Use __glibc_reserved + instead of __unused. 2013-11-22 Roland McGrath diff --git a/ports/sysdeps/arm/arm-mcount.S b/ports/sysdeps/arm/arm-mcount.S index 8b8653c78e..7e433c6ff7 100644 --- a/ports/sysdeps/arm/arm-mcount.S +++ b/ports/sysdeps/arm/arm-mcount.S @@ -21,6 +21,7 @@ #include +#undef mcount #ifdef __thumb2__ .thumb @@ -65,10 +66,20 @@ ENTRY(__gnu_mcount_nc) END(__gnu_mcount_nc) +#include +#include + +/* The new __gnu_mcount_nc entry point was introduced in 4.4, so the + static library needs the old one only to support older compilers. + Even in a configuration that only cares about newer compilers, the + shared library might need it only for strict ABI compatibility. */ + +#if GCC_COMPAT (4, 3) || SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) + /* Provide old mcount for backwards compatibility. This requires code be compiled with APCS frame pointers. */ -ENTRY(_mcount) +ENTRY(__mcount_arm_compat) push {r0, r1, r2, r3, fp, lr} cfi_adjust_cfa_offset (24) cfi_rel_offset (r0, 0) @@ -83,7 +94,7 @@ ENTRY(_mcount) ldrne r0, [\B, #-4] movsne r1, lr blne __mcount_internal -#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__) +# if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__) pop {r0, r1, r2, r3, fp, lr} cfi_adjust_cfa_offset (-24) cfi_restore (r0) @@ -93,12 +104,26 @@ ENTRY(_mcount) cfi_restore (fp) cfi_restore (lr) bx lr -#else +# else pop {r0, r1, r2, r3, fp, pc} +# endif +END(__mcount_arm_compat) + #endif -END(_mcount) + +#if GCC_COMPAT (4, 3) + +strong_alias (__mcount_arm_compat, _mcount) /* The canonical name for the function is `_mcount' in both C and asm, but some old asm code might assume it's `mcount'. */ -#undef mcount weak_alias (_mcount, mcount) + +#elif SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) + +compat_symbol (libc, __mcount_arm_compat, _mcount, GLIBC_2_0) + +strong_alias (__mcount_arm_compat, __mcount_arm_compat_1) +compat_symbol (libc, __mcount_arm_compat_1, mcount, GLIBC_2_0) + +#endif diff --git a/ports/sysdeps/arm/gcc-compat.h b/ports/sysdeps/arm/gcc-compat.h new file mode 100644 index 0000000000..680f30e3a7 --- /dev/null +++ b/ports/sysdeps/arm/gcc-compat.h @@ -0,0 +1,35 @@ +/* Macros for checking required GCC compatibility. ARM version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _ARM_GCC_COMPAT_H +#define _ARM_GCC_COMPAT_H 1 + +#ifndef GCC_COMPAT_VERSION +# ifdef __ARM_PCS_VFP +/* The hard-float ABI was first supported in 4.5. */ +# define GCC_COMPAT_VERSION GCC_VERSION (4, 5) +# else +/* The EABI configurations (the only ones we handle) were first supported + in 4.1. */ +# define GCC_COMPAT_VERSION GCC_VERSION (4, 1) +# endif +#endif + +#include_next + +#endif diff --git a/sysdeps/generic/gcc-compat.h b/sysdeps/generic/gcc-compat.h new file mode 100644 index 0000000000..ac4fa1e95b --- /dev/null +++ b/sysdeps/generic/gcc-compat.h @@ -0,0 +1,42 @@ +/* Macros for checking required GCC compatibility. Generic version. + Copyright (C) 2014 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* This is the base file. More-specific sysdeps/.../gcc-compat.h files + can define GCC_COMPAT_VERSION and then #include_next this file. */ + +#ifndef _GENERIC_GCC_COMPAT_H +#define _GENERIC_GCC_COMPAT_H 1 + +/* This is the macro that gets used in #if tests in code: true iff + the library we build must be compatible with user code built by + GCC version MAJOR.MINOR. */ +#define GCC_COMPAT(major, minor) \ + (GCC_COMPAT_VERSION <= GCC_VERSION (major, minor)) + +/* This is how we compose an integer from major and minor version + numbers, for comparison. */ +#define GCC_VERSION(major, minor) \ + (((major) << 16) + (minor)) + +#ifndef GCC_COMPAT_VERSION +/* GCC 2.7.2 was current at the time of the glibc-2.0 release. + We assume nothing before that ever mattered. */ +# define GCC_COMPAT_VERSION GCC_VERSION (2, 7) +#endif + +#endif -- cgit 1.4.1