summaryrefslogtreecommitdiff
path: root/malloc/obstack.c
diff options
context:
space:
mode:
authorWill Newton <will.newton@linaro.org>2014-06-23 16:53:30 +0100
committerWill Newton <will.newton@linaro.org>2014-07-02 10:31:43 +0100
commitb100f9aa77027e4371154820ea8a0353bfd13223 (patch)
tree136a8b897904c7ee3689fa3138aa4cb56d5f0e71 /malloc/obstack.c
parentc4c4124473c187b5c4642611390897666c3d3970 (diff)
downloadglibc-b100f9aa77027e4371154820ea8a0353bfd13223.tar.gz
malloc/obstack: Merge from gnulib
Merge the latest version of the obstack.c and obstack.h files from gnulib. The majority of this change is coding style and cosmetic comment changes but it also fixes a -Wundef warning in the build as a side effect. 2014-07-02 Will Newton <will.newton@linaro.org> * malloc/obstack.c: Merge from gnulib master. [HAVE_CONFIG_H]: Remove conditional code. [!_LIBC]: Include config.h. [!ELIDE_CODE]: Don't include inttypes.h, include stdint.h unconditionally. (print_and_abort): Mark as _Noreturn. (_obstack_allocated_p): Mark as __attribute_pure__. (obstack_free): Rename to __obstack_free. [!__attribute__]: Remove conditional code. * malloc/obstack.h: Merge from gnulib master. [__cplusplus]: Move conditional down. [!__attribute_pure__]: Define __attribute_pure__ here if it is not already defined. (_obstack_memory_used): Mark as __attribute_pure__. [!__obstack_free]: Define as obstack_free. [__GNUC__]: Remove check for ancient NeXT gcc.
Diffstat (limited to 'malloc/obstack.c')
-rw-r--r--malloc/obstack.c135
1 files changed, 60 insertions, 75 deletions
diff --git a/malloc/obstack.c b/malloc/obstack.c
index 4064f61950..fa4fefc149 100644
--- a/malloc/obstack.c
+++ b/malloc/obstack.c
@@ -17,14 +17,11 @@
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#ifdef _LIBC
# include <obstack.h>
# include <shlib-compat.h>
#else
+# include <config.h>
# include "obstack.h"
#endif
@@ -39,7 +36,7 @@
C Library, but also included in many other GNU distributions. Compiling
and linking in this code is a waste when using the GNU C library
(especially if it is a shared library). Rather than having every GNU
- program understand `configure --with-gnu-libc' and omit the object
+ program understand 'configure --with-gnu-libc' and omit the object
files, it is simpler to just do this in the source for each such file. */
#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
@@ -55,12 +52,7 @@
#ifndef ELIDE_CODE
-# if HAVE_INTTYPES_H
-# include <inttypes.h>
-# endif
-# if HAVE_STDINT_H || defined _LIBC
-# include <stdint.h>
-# endif
+# include <stdint.h>
/* Determine default alignment. */
union fooround
@@ -85,23 +77,23 @@ enum
/* When we copy a long block of data, this is the unit to do it with.
On some machines, copying successive ints does not work;
- in such a case, redefine COPYING_UNIT to `long' (if that works)
- or `char' as a last resort. */
+ in such a case, redefine COPYING_UNIT to 'long' (if that works)
+ or 'char' as a last resort. */
# ifndef COPYING_UNIT
# define COPYING_UNIT int
# endif
-/* The functions allocating more room by calling `obstack_chunk_alloc'
- jump to the handler pointed to by `obstack_alloc_failed_handler'.
+/* The functions allocating more room by calling 'obstack_chunk_alloc'
+ jump to the handler pointed to by 'obstack_alloc_failed_handler'.
This can be set to a user defined function which should either
abort gracefully or use longjump - but shouldn't return. This
variable by default points to the internal function
- `print_and_abort'. */
-static void print_and_abort (void);
+ 'print_and_abort'. */
+static _Noreturn void print_and_abort (void);
void (*obstack_alloc_failed_handler) (void) = print_and_abort;
-/* Exit value used when `print_and_abort' is used. */
+/* Exit value used when 'print_and_abort' is used. */
# include <stdlib.h>
# ifdef _LIBC
int obstack_exit_failure = EXIT_FAILURE;
@@ -134,9 +126,9 @@ compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
# define CALL_FREEFUN(h, old_chunk) \
do { \
if ((h)->use_extra_arg) \
- (*(h)->freefun)((h)->extra_arg, (old_chunk)); \
+ (*(h)->freefun)((h)->extra_arg, (old_chunk)); \
else \
- (*(void (*)(void *))(h)->freefun)((old_chunk)); \
+ (*(void (*)(void *))(h)->freefun)((old_chunk)); \
} while (0)
@@ -150,44 +142,44 @@ compat_symbol (libc, _obstack_compat, _obstack, GLIBC_2_0);
int
_obstack_begin (struct obstack *h,
- int size, int alignment,
- void *(*chunkfun)(long),
- void (*freefun)(void *))
+ int size, int alignment,
+ void *(*chunkfun) (long),
+ void (*freefun) (void *))
{
struct _obstack_chunk *chunk; /* points to new chunk */
if (alignment == 0)
alignment = DEFAULT_ALIGNMENT;
if (size == 0)
- /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
{
/* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
- Use the values for range checking, because if range checking is off,
- the extra bytes won't be missed terribly, but if range checking is on
- and we used a larger request, a whole extra 4096 bytes would be
- allocated.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
- These number are irrelevant to the new GNU malloc. I suspect it is
- less sensitive to the size of the request. */
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
- + 4 + DEFAULT_ROUNDING - 1)
- & ~(DEFAULT_ROUNDING - 1));
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
size = 4096 - extra;
}
- h->chunkfun = (struct _obstack_chunk * (*)(void *, long))chunkfun;
- h->freefun = (void (*)(void *, struct _obstack_chunk *))freefun;
+ h->chunkfun = (struct _obstack_chunk * (*) (void *, long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
h->chunk_size = size;
h->alignment_mask = alignment - 1;
h->use_extra_arg = 0;
chunk = h->chunk = CALL_CHUNKFUN (h, h->chunk_size);
if (!chunk)
- (*obstack_alloc_failed_handler)();
+ (*obstack_alloc_failed_handler) ();
h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
- alignment - 1);
+ alignment - 1);
h->chunk_limit = chunk->limit
- = (char *) chunk + h->chunk_size;
+ = (char *) chunk + h->chunk_size;
chunk->prev = 0;
/* The initial chunk now contains no empty object. */
h->maybe_empty_object = 0;
@@ -197,33 +189,33 @@ _obstack_begin (struct obstack *h,
int
_obstack_begin_1 (struct obstack *h, int size, int alignment,
- void *(*chunkfun)(void *, long),
- void (*freefun)(void *, void *),
- void *arg)
+ void *(*chunkfun) (void *, long),
+ void (*freefun) (void *, void *),
+ void *arg)
{
struct _obstack_chunk *chunk; /* points to new chunk */
if (alignment == 0)
alignment = DEFAULT_ALIGNMENT;
if (size == 0)
- /* Default size is what GNU malloc can fit in a 4096-byte block. */
+ /* Default size is what GNU malloc can fit in a 4096-byte block. */
{
/* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
- Use the values for range checking, because if range checking is off,
- the extra bytes won't be missed terribly, but if range checking is on
- and we used a larger request, a whole extra 4096 bytes would be
- allocated.
+ Use the values for range checking, because if range checking is off,
+ the extra bytes won't be missed terribly, but if range checking is on
+ and we used a larger request, a whole extra 4096 bytes would be
+ allocated.
- These number are irrelevant to the new GNU malloc. I suspect it is
- less sensitive to the size of the request. */
+ These number are irrelevant to the new GNU malloc. I suspect it is
+ less sensitive to the size of the request. */
int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
- + 4 + DEFAULT_ROUNDING - 1)
- & ~(DEFAULT_ROUNDING - 1));
+ + 4 + DEFAULT_ROUNDING - 1)
+ & ~(DEFAULT_ROUNDING - 1));
size = 4096 - extra;
}
- h->chunkfun = (struct _obstack_chunk * (*)(void *, long))chunkfun;
- h->freefun = (void (*)(void *, struct _obstack_chunk *))freefun;
+ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
+ h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
h->chunk_size = size;
h->alignment_mask = alignment - 1;
h->extra_arg = arg;
@@ -231,11 +223,11 @@ _obstack_begin_1 (struct obstack *h, int size, int alignment,
chunk = h->chunk = CALL_CHUNKFUN (h, h->chunk_size);
if (!chunk)
- (*obstack_alloc_failed_handler)();
+ (*obstack_alloc_failed_handler) ();
h->next_free = h->object_base = __PTR_ALIGN ((char *) chunk, chunk->contents,
- alignment - 1);
+ alignment - 1);
h->chunk_limit = chunk->limit
- = (char *) chunk + h->chunk_size;
+ = (char *) chunk + h->chunk_size;
chunk->prev = 0;
/* The initial chunk now contains no empty object. */
h->maybe_empty_object = 0;
@@ -283,12 +275,12 @@ _obstack_newchunk (struct obstack *h, int length)
if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
{
for (i = obj_size / sizeof (COPYING_UNIT) - 1;
- i >= 0; i--)
- ((COPYING_UNIT *) object_base)[i]
- = ((COPYING_UNIT *) h->object_base)[i];
+ i >= 0; i--)
+ ((COPYING_UNIT *) object_base)[i]
+ = ((COPYING_UNIT *) h->object_base)[i];
/* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
- but that can cross a page boundary on a machine
- which does not do strict alignment for COPYING_UNITS. */
+ but that can cross a page boundary on a machine
+ which does not do strict alignment for COPYING_UNITS. */
already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
}
else
@@ -302,8 +294,8 @@ _obstack_newchunk (struct obstack *h, int length)
But not if that chunk might contain an empty object. */
if (!h->maybe_empty_object
&& (h->object_base
- == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
- h->alignment_mask)))
+ == __PTR_ALIGN ((char *) old_chunk, old_chunk->contents,
+ h->alignment_mask)))
{
new_chunk->prev = old_chunk->prev;
CALL_FREEFUN (h, old_chunk);
@@ -324,7 +316,7 @@ libc_hidden_def (_obstack_newchunk)
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
obstack.h because it is just for debugging. */
-int _obstack_allocated_p (struct obstack *h, void *obj);
+int _obstack_allocated_p (struct obstack *h, void *obj) __attribute_pure__;
int
_obstack_allocated_p (struct obstack *h, void *obj)
@@ -350,7 +342,7 @@ _obstack_allocated_p (struct obstack *h, void *obj)
# undef obstack_free
void
-obstack_free (struct obstack *h, void *obj)
+__obstack_free (struct obstack *h, void *obj)
{
struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
struct _obstack_chunk *plp; /* point to previous chunk if any */
@@ -365,7 +357,7 @@ obstack_free (struct obstack *h, void *obj)
CALL_FREEFUN (h, lp);
lp = plp;
/* If we switch chunks, we can't tell whether the new current
- chunk contains an empty object, so assume that it may. */
+ chunk contains an empty object, so assume that it may. */
h->maybe_empty_object = 1;
}
if (lp)
@@ -412,15 +404,7 @@ _obstack_memory_used (struct obstack *h)
# include <libio/iolibio.h>
# endif
-# ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later. */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-# define __attribute__(Spec) /* empty */
-# endif
-# endif
-
-static void
-__attribute__ ((noreturn))
+static _Noreturn void
print_and_abort (void)
{
/* Don't change any of these strings. Yes, it would be possible to add
@@ -429,10 +413,11 @@ print_and_abort (void)
like this and the translation should be reused instead of creating
a very similar string which requires a separate translation. */
# ifdef _LIBC
- (void) __fxprintf (NULL, "%s\n", _ ("memory exhausted"));
+ (void) __fxprintf (NULL, "%s\n", _("memory exhausted"));
# else
- fprintf (stderr, "%s\n", _ ("memory exhausted"));
+ fprintf (stderr, "%s\n", _("memory exhausted"));
# endif
exit (obstack_exit_failure);
}
+
#endif /* !ELIDE_CODE */