X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=libiberty%2Fxmalloc.c;h=85826c1e10f2e64bbf4c3c60cd23c8bf780f0dff;hb=76deb9291dfc4a20492b9a1093123f6389d6253d;hp=1083790789d566df2aa34e1c64e576533ae49bf8;hpb=dc9e099fc0eced486ae2b49455c9da113c11f4ff;p=deliverable%2Fbinutils-gdb.git diff --git a/libiberty/xmalloc.c b/libiberty/xmalloc.c index 1083790789..85826c1e10 100644 --- a/libiberty/xmalloc.c +++ b/libiberty/xmalloc.c @@ -1,5 +1,5 @@ /* memory allocation routines with error checking. - Copyright 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. + Copyright (C) 1989-2021 Free Software Foundation, Inc. This file is part of the libiberty library. Libiberty is free software; you can redistribute it and/or @@ -14,60 +14,131 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ +/* + +@deftypefn Replacement void* xmalloc (size_t) + +Allocate memory without fail. If @code{malloc} fails, this will print +a message to @code{stderr} (using the name set by +@code{xmalloc_set_program_name}, +if any) and then call @code{xexit}. Note that it is therefore safe for +a program to contain @code{#define malloc xmalloc} in its source. + +@end deftypefn + +@deftypefn Replacement void* xrealloc (void *@var{ptr}, size_t @var{size}) +Reallocate memory without fail. This routine functions like @code{realloc}, +but will behave the same as @code{xmalloc} if memory cannot be found. + +@end deftypefn + +@deftypefn Replacement void* xcalloc (size_t @var{nelem}, size_t @var{elsize}) + +Allocate memory without fail, and set it to zero. This routine functions +like @code{calloc}, but will behave the same as @code{xmalloc} if memory +cannot be found. + +@end deftypefn + +@deftypefn Replacement void xmalloc_set_program_name (const char *@var{name}) + +You can use this to set the name of the program used by +@code{xmalloc_failed} when printing a failure message. + +@end deftypefn + +@deftypefn Replacement void xmalloc_failed (size_t) + +This function is not meant to be called by client code, and is listed +here for completeness only. If any of the allocation routines fail, this +function will be called to print an error message and terminate execution. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "ansidecl.h" #include "libiberty.h" +#include "environ.h" #include -#ifdef __STDC__ #include -#else -#define size_t unsigned long -#define ptrdiff_t long -#endif #if VMS #include #include #else /* For systems with larger pointers than ints, these must be declared. */ -PTR malloc PARAMS ((size_t)); -PTR realloc PARAMS ((PTR, size_t)); -PTR calloc PARAMS ((size_t, size_t)); -PTR sbrk PARAMS ((ptrdiff_t)); -#endif +# if HAVE_STDLIB_H && HAVE_UNISTD_H && HAVE_DECL_MALLOC \ + && HAVE_DECL_REALLOC && HAVE_DECL_CALLOC && HAVE_DECL_SBRK +# include +# include +# else +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ +void *malloc (size_t); +void *realloc (void *, size_t); +void *calloc (size_t, size_t); +void *sbrk (ptrdiff_t); +# ifdef __cplusplus +} +# endif /* __cplusplus */ +# endif /* HAVE_STDLIB_H ... */ +#endif /* VMS */ /* The program name if set. */ static const char *name = ""; -#if !defined (__CYGWIN__) && defined (__CYGWIN32__) -#define __CYGWIN__ 1 -#endif - -#if ! defined (_WIN32) || defined (__CYGWIN__) || defined (__UWIN__) +#ifdef HAVE_SBRK /* The initial sbrk, set when the program name is set. Not used for win32 ports other than cygwin32. */ static char *first_break = NULL; -#endif /* ! _WIN32 || __CYGWIN __ || __UWIN__ */ +#endif /* HAVE_SBRK */ void -xmalloc_set_program_name (s) - const char *s; +xmalloc_set_program_name (const char *s) { name = s; -#if ! defined (_WIN32) || defined (__CYGWIN__) || defined (__UWIN__) +#ifdef HAVE_SBRK /* Win32 ports other than cygwin32 don't have brk() */ if (first_break == NULL) first_break = (char *) sbrk (0); -#endif /* ! _WIN32 || __CYGWIN __ || __UWIN__ */ +#endif /* HAVE_SBRK */ } +void +xmalloc_failed (size_t size) +{ +#ifdef HAVE_SBRK + size_t allocated; + + if (first_break != NULL) + allocated = (char *) sbrk (0) - first_break; + else + allocated = (char *) sbrk (0) - (char *) &environ; + fprintf (stderr, + "\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n", + name, *name ? ": " : "", + (unsigned long) size, (unsigned long) allocated); +#else /* HAVE_SBRK */ + fprintf (stderr, + "\n%s%sout of memory allocating %lu bytes\n", + name, *name ? ": " : "", + (unsigned long) size); +#endif /* HAVE_SBRK */ + xexit (1); +} + PTR -xmalloc (size) - size_t size; +xmalloc (size_t size) { PTR newmem; @@ -75,33 +146,13 @@ xmalloc (size) size = 1; newmem = malloc (size); if (!newmem) - { -#if ! defined (_WIN32) || defined (__CYGWIN__) || defined (__UWIN__) - extern char **environ; - size_t allocated; - - if (first_break != NULL) - allocated = (char *) sbrk (0) - first_break; - else - allocated = (char *) sbrk (0) - (char *) &environ; - fprintf (stderr, - "\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) size, (unsigned long) allocated); -#else - fprintf (stderr, - "\n%s%sCan not allocate %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) size); -#endif /* ! _WIN32 || __CYGWIN __ || __UWIN__ */ - xexit (1); - } + xmalloc_failed (size); + return (newmem); } PTR -xcalloc (nelem, elsize) - size_t nelem, elsize; +xcalloc (size_t nelem, size_t elsize) { PTR newmem; @@ -110,34 +161,13 @@ xcalloc (nelem, elsize) newmem = calloc (nelem, elsize); if (!newmem) - { -#if ! defined (_WIN32) || defined (__CYGWIN__) - extern char **environ; - size_t allocated; - - if (first_break != NULL) - allocated = (char *) sbrk (0) - first_break; - else - allocated = (char *) sbrk (0) - (char *) &environ; - fprintf (stderr, - "\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) (nelem * elsize), (unsigned long) allocated); -#else - fprintf (stderr, - "\n%s%sCan not allocate %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) (nelem * elsize)); -#endif /* ! _WIN32 || __CYGWIN __ */ - xexit (1); - } + xmalloc_failed (nelem * elsize); + return (newmem); } PTR -xrealloc (oldmem, size) - PTR oldmem; - size_t size; +xrealloc (PTR oldmem, size_t size) { PTR newmem; @@ -148,26 +178,7 @@ xrealloc (oldmem, size) else newmem = realloc (oldmem, size); if (!newmem) - { -#ifndef __MINGW32__ - extern char **environ; - size_t allocated; - - if (first_break != NULL) - allocated = (char *) sbrk (0) - first_break; - else - allocated = (char *) sbrk (0) - (char *) &environ; - fprintf (stderr, - "\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) size, (unsigned long) allocated); -#else - fprintf (stderr, - "\n%s%sCan not reallocate %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) size); -#endif /* __MINGW32__ */ - xexit (1); - } + xmalloc_failed (size); + return (newmem); }