Account for alloca size rounding in extend_alloca
This commit is contained in:
parent
d91a8b93aa
commit
647776f663
|
@ -1,5 +1,11 @@
|
||||||
2011-11-01 Andreas Schwab <schwab@linux-m68k.org>
|
2011-11-01 Andreas Schwab <schwab@linux-m68k.org>
|
||||||
|
|
||||||
|
* include/alloca.h (stackinfo_alloca_round): Define.
|
||||||
|
(extend_alloca): Use it.
|
||||||
|
[_STACK_GROWS_UP]: Correct check for adjacent allocation.
|
||||||
|
* elf/dl-deps.c (_dl_map_object_deps): Don't round alloca size
|
||||||
|
here.
|
||||||
|
|
||||||
* scripts/check-local-headers.sh: Ignore libaudit.h.
|
* scripts/check-local-headers.sh: Ignore libaudit.h.
|
||||||
|
|
||||||
* nscd/Makefile (extra-objs): Make recursively expanded.
|
* nscd/Makefile (extra-objs): Make recursively expanded.
|
||||||
|
|
|
@ -221,15 +221,11 @@ _dl_map_object_deps (struct link_map *map,
|
||||||
if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL
|
if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL
|
||||||
&& l != map && l->l_ldnum > 0)
|
&& l != map && l->l_ldnum > 0)
|
||||||
{
|
{
|
||||||
/* 16-align so extend_alloca has a chance to re-use the space.
|
size_t new_size = l->l_ldnum * sizeof (struct link_map *);
|
||||||
Note that extend_alloca is broken for recent versions of GCC
|
|
||||||
on x86: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50938 */
|
|
||||||
size_t new_size
|
|
||||||
= (l->l_ldnum * sizeof (struct link_map *) + 15) & ~15;
|
|
||||||
|
|
||||||
if (new_size > needed_space_bytes)
|
if (new_size > needed_space_bytes)
|
||||||
needed_space
|
needed_space
|
||||||
= extend_alloca (needed_space, needed_space_bytes, new_size);
|
= extend_alloca (needed_space, needed_space_bytes, new_size);
|
||||||
|
|
||||||
needed = needed_space;
|
needed = needed_space;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,13 @@ libc_hidden_proto (__libc_alloca_cutoff)
|
||||||
|
|
||||||
#include <allocalim.h>
|
#include <allocalim.h>
|
||||||
|
|
||||||
|
#ifndef stackinfo_alloca_round
|
||||||
|
# define stackinfo_alloca_round(l) (((l) + 15) & -16)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if _STACK_GROWS_DOWN
|
#if _STACK_GROWS_DOWN
|
||||||
# define extend_alloca(buf, len, newlen) \
|
# define extend_alloca(buf, len, newlen) \
|
||||||
(__typeof (buf)) ({ size_t __newlen = (newlen); \
|
(__typeof (buf)) ({ size_t __newlen = stackinfo_alloca_round (newlen); \
|
||||||
char *__newbuf = __alloca (__newlen); \
|
char *__newbuf = __alloca (__newlen); \
|
||||||
if (__newbuf + __newlen == (char *) buf) \
|
if (__newbuf + __newlen == (char *) buf) \
|
||||||
len += __newlen; \
|
len += __newlen; \
|
||||||
|
@ -31,10 +35,10 @@ libc_hidden_proto (__libc_alloca_cutoff)
|
||||||
__newbuf; })
|
__newbuf; })
|
||||||
#elif _STACK_GROWS_UP
|
#elif _STACK_GROWS_UP
|
||||||
# define extend_alloca(buf, len, newlen) \
|
# define extend_alloca(buf, len, newlen) \
|
||||||
(__typeof (buf)) ({ size_t __newlen = (newlen); \
|
(__typeof (buf)) ({ size_t __newlen = stackinfo_alloca_round (newlen); \
|
||||||
char *__newbuf = __alloca (__newlen); \
|
char *__newbuf = __alloca (__newlen); \
|
||||||
char *__buf = (buf); \
|
char *__buf = (buf); \
|
||||||
if (__buf + __newlen == __newbuf) \
|
if (__buf + len == __newbuf) \
|
||||||
{ \
|
{ \
|
||||||
len += __newlen; \
|
len += __newlen; \
|
||||||
__newbuf = __buf; \
|
__newbuf = __buf; \
|
||||||
|
|
Loading…
Reference in a new issue