Commit eda14d6a by Marc Glisse Committed by Marc Glisse

re PR tree-optimization/58689 ([meta-bug] __attribute__((returns_nonnull)) enhancements)

2013-10-29  Marc Glisse  <marc.glisse@inria.fr>

	PR tree-optimization/58689
include/
	* ansidecl.h (ATTRIBUTE_RETURNS_NONNULL): New macro.
	* libiberty.h (basename, lbasename, dos_lbasename, unix_lbasename,
	concat_copy): Mark with attributes nonnull(1) and returns_nonnull.
	(concat, reconcat, concat_copy2, choose_temp_base, xstrerror,
	xmalloc, xrealloc, xcalloc, xstrdup, xstrndup, xmemdup, pex_init):
	Mark with attribute returns_nonnull.

libiberty/
	* concat.c: Remove note about xmalloc.

From-SVN: r204159
parent 8e9055ae
2013-10-29 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/58689
* ansidecl.h (ATTRIBUTE_RETURNS_NONNULL): New macro.
* libiberty.h (basename, lbasename, dos_lbasename, unix_lbasename,
concat_copy): Mark with attributes nonnull(1) and returns_nonnull.
(concat, reconcat, concat_copy2, choose_temp_base, xstrerror,
xmalloc, xrealloc, xcalloc, xstrdup, xstrndup, xmemdup, pex_init):
Mark with attribute returns_nonnull.
2013-10-22 Sterling Augustine <saugustine@google.com> 2013-10-22 Sterling Augustine <saugustine@google.com>
* gdb/gdb-index.h: Merge from gdb tree. * gdb/gdb-index.h: Merge from gdb tree.
......
...@@ -311,6 +311,15 @@ So instead we use the macro below and test it against specific values. */ ...@@ -311,6 +311,15 @@ So instead we use the macro below and test it against specific values. */
# endif /* GNUC >= 3.3 */ # endif /* GNUC >= 3.3 */
#endif /* ATTRIBUTE_NONNULL */ #endif /* ATTRIBUTE_NONNULL */
/* Attribute `returns_nonnull' was valid as of gcc 4.9. */
#ifndef ATTRIBUTE_RETURNS_NONNULL
# if (GCC_VERSION >= 4009)
# define ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
# else
# define ATTRIBUTE_RETURNS_NONNULL
# endif /* GNUC >= 4.9 */
#endif /* ATTRIBUTE_RETURNS_NONNULL */
/* Attribute `pure' was valid as of gcc 3.0. */ /* Attribute `pure' was valid as of gcc 3.0. */
#ifndef ATTRIBUTE_PURE #ifndef ATTRIBUTE_PURE
# if (GCC_VERSION >= 3000) # if (GCC_VERSION >= 3000)
......
...@@ -107,7 +107,7 @@ extern int countargv (char**); ...@@ -107,7 +107,7 @@ extern int countargv (char**);
is 1, we found it so don't provide any declaration at all. */ is 1, we found it so don't provide any declaration at all. */
#if !HAVE_DECL_BASENAME #if !HAVE_DECL_BASENAME
#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME) #if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME)
extern char *basename (const char *); extern char *basename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
#else #else
/* Do not allow basename to be used if there is no prototype seen. We /* Do not allow basename to be used if there is no prototype seen. We
either need to use the above prototype or have one from either need to use the above prototype or have one from
...@@ -118,18 +118,18 @@ extern char *basename (const char *); ...@@ -118,18 +118,18 @@ extern char *basename (const char *);
/* A well-defined basename () that is always compiled in. */ /* A well-defined basename () that is always compiled in. */
extern const char *lbasename (const char *); extern const char *lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
/* Same, but assumes DOS semantics (drive name, backslash is also a /* Same, but assumes DOS semantics (drive name, backslash is also a
dir separator) regardless of host. */ dir separator) regardless of host. */
extern const char *dos_lbasename (const char *); extern const char *dos_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
/* Same, but assumes Unix semantics (absolute paths always start with /* Same, but assumes Unix semantics (absolute paths always start with
a slash, only forward slash is accepted as dir separator) a slash, only forward slash is accepted as dir separator)
regardless of host. */ regardless of host. */
extern const char *unix_lbasename (const char *); extern const char *unix_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
/* A well-defined realpath () that is always compiled in. */ /* A well-defined realpath () that is always compiled in. */
...@@ -139,7 +139,7 @@ extern char *lrealpath (const char *); ...@@ -139,7 +139,7 @@ extern char *lrealpath (const char *);
the last argument of this function, to terminate the list of the last argument of this function, to terminate the list of
strings. Allocates memory using xmalloc. */ strings. Allocates memory using xmalloc. */
extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL;
/* Concatenate an arbitrary number of strings. You must pass NULL as /* Concatenate an arbitrary number of strings. You must pass NULL as
the last argument of this function, to terminate the list of the last argument of this function, to terminate the list of
...@@ -148,7 +148,7 @@ extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; ...@@ -148,7 +148,7 @@ extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL;
pointer to be freed after the new string is created, similar to the pointer to be freed after the new string is created, similar to the
way xrealloc works. */ way xrealloc works. */
extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL;
/* Determine the length of concatenating an arbitrary number of /* Determine the length of concatenating an arbitrary number of
strings. You must pass NULL as the last argument of this function, strings. You must pass NULL as the last argument of this function,
...@@ -161,14 +161,14 @@ extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL; ...@@ -161,14 +161,14 @@ extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL;
to terminate the list of strings. The supplied memory is assumed to terminate the list of strings. The supplied memory is assumed
to be large enough. */ to be large enough. */
extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_SENTINEL; extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
/* Concatenate an arbitrary number of strings into a GLOBAL area of /* Concatenate an arbitrary number of strings into a GLOBAL area of
memory. You must pass NULL as the last argument of this function, memory. You must pass NULL as the last argument of this function,
to terminate the list of strings. The supplied memory is assumed to terminate the list of strings. The supplied memory is assumed
to be large enough. */ to be large enough. */
extern char *concat_copy2 (const char *, ...) ATTRIBUTE_SENTINEL; extern char *concat_copy2 (const char *, ...) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL;
/* This is the global area used by concat_copy2. */ /* This is the global area used by concat_copy2. */
...@@ -226,7 +226,7 @@ extern char *make_relative_prefix_ignore_links (const char *, const char *, ...@@ -226,7 +226,7 @@ extern char *make_relative_prefix_ignore_links (const char *, const char *,
/* Choose a temporary directory to use for scratch files. */ /* Choose a temporary directory to use for scratch files. */
extern char *choose_temp_base (void) ATTRIBUTE_MALLOC; extern char *choose_temp_base (void) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
/* Return a temporary file name or NULL if unable to create one. */ /* Return a temporary file name or NULL if unable to create one. */
...@@ -256,7 +256,7 @@ extern int strtoerrno (const char *); ...@@ -256,7 +256,7 @@ extern int strtoerrno (const char *);
/* ANSI's strerror(), but more robust. */ /* ANSI's strerror(), but more robust. */
extern char *xstrerror (int); extern char *xstrerror (int) ATTRIBUTE_RETURNS_NONNULL;
/* Return the maximum signal number for which strsignal will return a /* Return the maximum signal number for which strsignal will return a
string. */ string. */
...@@ -298,30 +298,30 @@ extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN; ...@@ -298,30 +298,30 @@ extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN;
message to stderr (using the name set by xmalloc_set_program_name, message to stderr (using the name set by xmalloc_set_program_name,
if any) and then call xexit. */ if any) and then call xexit. */
extern void *xmalloc (size_t) ATTRIBUTE_MALLOC; extern void *xmalloc (size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
/* Reallocate memory without fail. This works like xmalloc. Note, /* Reallocate memory without fail. This works like xmalloc. Note,
realloc type functions are not suitable for attribute malloc since realloc type functions are not suitable for attribute malloc since
they may return the same address across multiple calls. */ they may return the same address across multiple calls. */
extern void *xrealloc (void *, size_t); extern void *xrealloc (void *, size_t) ATTRIBUTE_RETURNS_NONNULL;
/* Allocate memory without fail and set it to zero. This works like /* Allocate memory without fail and set it to zero. This works like
xmalloc. */ xmalloc. */
extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC; extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
/* Copy a string into a memory buffer without fail. */ /* Copy a string into a memory buffer without fail. */
extern char *xstrdup (const char *) ATTRIBUTE_MALLOC; extern char *xstrdup (const char *) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
/* Copy at most N characters from string into a buffer without fail. */ /* Copy at most N characters from string into a buffer without fail. */
extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC; extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
/* Copy an existing memory buffer to a new memory buffer without fail. */ /* Copy an existing memory buffer to a new memory buffer without fail. */
extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC; extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
/* Physical memory routines. Return values are in BYTES. */ /* Physical memory routines. Return values are in BYTES. */
extern double physmem_total (void); extern double physmem_total (void);
...@@ -399,7 +399,7 @@ extern void hex_init (void); ...@@ -399,7 +399,7 @@ extern void hex_init (void);
Returns NULL on error. */ Returns NULL on error. */
extern struct pex_obj *pex_init (int flags, const char *pname, extern struct pex_obj *pex_init (int flags, const char *pname,
const char *tempbase); const char *tempbase) ATTRIBUTE_RETURNS_NONNULL;
/* Flags for pex_run. These are bits to be or'ed together. */ /* Flags for pex_run. These are bits to be or'ed together. */
......
2013-10-29 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/58689
* concat.c: Remove note about xmalloc.
2013-10-27 Gerald Pfeifer <gerald@pfeifer.com> 2013-10-27 Gerald Pfeifer <gerald@pfeifer.com>
* testsuite/test-demangle.c: Include unistd.h. * testsuite/test-demangle.c: Include unistd.h.
......
...@@ -25,23 +25,11 @@ Boston, MA 02110-1301, USA. */ ...@@ -25,23 +25,11 @@ Boston, MA 02110-1301, USA. */
@dots{}, @code{NULL}) @dots{}, @code{NULL})
Concatenate zero or more of strings and return the result in freshly Concatenate zero or more of strings and return the result in freshly
@code{xmalloc}ed memory. Returns @code{NULL} if insufficient memory is @code{xmalloc}ed memory. The argument list is terminated by the first
available. The argument list is terminated by the first @code{NULL} @code{NULL} pointer encountered. Pointers to empty strings are ignored.
pointer encountered. Pointers to empty strings are ignored.
@end deftypefn @end deftypefn
NOTES
This function uses xmalloc() which is expected to be a front end
function to malloc() that deals with low memory situations. In
typical use, if malloc() returns NULL then xmalloc() diverts to an
error handler routine which never returns, and thus xmalloc will
never return a NULL pointer. If the client application wishes to
deal with low memory situations itself, it should supply an xmalloc
that just directly invokes malloc and blindly returns whatever
malloc returns.
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment