Supply malloc and alloc_size attributes for extern allocators.
This documents the C API, and helps GCC generate a bit better code. * conf_post.h (ATTRIBUTE_MALLOC, ATTRIBUTE_ALLOC_SIZE) (ATTRIBUTE_MALLOC_SIZE): New macros. * gmalloc.c (malloc, realloc, calloc): * gtkutil.h (malloc_widget_value): * lisp.h (ralloc, r_re_alloc, xmalloc, xzalloc, xrealloc, xnmalloc) (xnrealloc, xstrdup, xlispstrdup, record_xmalloc): Use them.
This commit is contained in:
parent
bbd03f131a
commit
74fde0f44f
5 changed files with 41 additions and 14 deletions
|
|
@ -1,3 +1,15 @@
|
|||
2014-05-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Supply malloc and alloc_size attributes for extern allocators.
|
||||
This documents the C API, and helps GCC generate a bit better code.
|
||||
* conf_post.h (ATTRIBUTE_MALLOC, ATTRIBUTE_ALLOC_SIZE)
|
||||
(ATTRIBUTE_MALLOC_SIZE): New macros.
|
||||
* gmalloc.c (malloc, realloc, calloc):
|
||||
* gtkutil.h (malloc_widget_value):
|
||||
* lisp.h (ralloc, r_re_alloc, xmalloc, xzalloc, xrealloc, xnmalloc)
|
||||
(xnrealloc, xstrdup, xlispstrdup, record_xmalloc):
|
||||
Use them.
|
||||
|
||||
2014-05-21 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Don't assume that ImageMagick uses a 16-bit quantum (Bug#17519).
|
||||
|
|
|
|||
|
|
@ -225,6 +225,20 @@ extern void _DebPrint (const char *fmt, ...);
|
|||
|
||||
#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
|
||||
|
||||
#if 3 <= __GNUC__
|
||||
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
|
||||
#else
|
||||
# define ATTRIBUTE_MALLOC
|
||||
#endif
|
||||
|
||||
#if 4 < __GNUC__ + (3 <= __GNUC_MINOR__)
|
||||
# define ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
|
||||
#else
|
||||
# define ATTRIBUTE_ALLOC_SIZE(args)
|
||||
#endif
|
||||
|
||||
#define ATTRIBUTE_MALLOC_SIZE(args) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE (args)
|
||||
|
||||
/* Work around GCC bug 59600: when a function is inlined, the inlined
|
||||
code may have its addresses sanitized even if the function has the
|
||||
no_sanitize_address attribute. This bug is fixed in GCC 4.9.0 and
|
||||
|
|
|
|||
|
|
@ -51,12 +51,12 @@ extern "C"
|
|||
|
||||
|
||||
/* Allocate SIZE bytes of memory. */
|
||||
extern void *malloc (size_t size);
|
||||
extern void *malloc (size_t size) ATTRIBUTE_MALLOC_SIZE ((1));
|
||||
/* Re-allocate the previously allocated block
|
||||
in ptr, making the new block SIZE bytes long. */
|
||||
extern void *realloc (void *ptr, size_t size);
|
||||
extern void *realloc (void *ptr, size_t size) ATTRIBUTE_ALLOC_SIZE ((2));
|
||||
/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
|
||||
extern void *calloc (size_t nmemb, size_t size);
|
||||
extern void *calloc (size_t nmemb, size_t size) ATTRIBUTE_MALLOC_SIZE ((1,2));
|
||||
/* Free a block allocated by `malloc', `realloc' or `calloc'. */
|
||||
extern void free (void *ptr);
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ typedef struct xg_menu_item_cb_data_
|
|||
|
||||
} xg_menu_item_cb_data;
|
||||
|
||||
extern struct _widget_value *malloc_widget_value (void);
|
||||
extern struct _widget_value *malloc_widget_value (void) ATTRIBUTE_MALLOC;
|
||||
extern void free_widget_value (struct _widget_value *);
|
||||
|
||||
extern bool xg_uses_old_file_dialog (void) ATTRIBUTE_CONST;
|
||||
|
|
|
|||
21
src/lisp.h
21
src/lisp.h
|
|
@ -3755,9 +3755,9 @@ INLINE void (check_cons_list) (void) { lisp_h_check_cons_list (); }
|
|||
|
||||
#ifdef REL_ALLOC
|
||||
/* Defined in ralloc.c. */
|
||||
extern void *r_alloc (void **, size_t);
|
||||
extern void *r_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
|
||||
extern void r_alloc_free (void **);
|
||||
extern void *r_re_alloc (void **, size_t);
|
||||
extern void *r_re_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
|
||||
extern void r_alloc_reset_variable (void **, void **);
|
||||
extern void r_alloc_inhibit_buffer_relocation (int);
|
||||
#endif
|
||||
|
|
@ -4391,16 +4391,17 @@ extern bool initialized;
|
|||
/* True means ^G can quit instantly. */
|
||||
extern bool immediate_quit;
|
||||
|
||||
extern void *xmalloc (size_t);
|
||||
extern void *xzalloc (size_t);
|
||||
extern void *xrealloc (void *, size_t);
|
||||
extern void *xmalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
|
||||
extern void *xzalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
|
||||
extern void *xrealloc (void *, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
|
||||
extern void xfree (void *);
|
||||
extern void *xnmalloc (ptrdiff_t, ptrdiff_t);
|
||||
extern void *xnrealloc (void *, ptrdiff_t, ptrdiff_t);
|
||||
extern void *xnmalloc (ptrdiff_t, ptrdiff_t) ATTRIBUTE_MALLOC_SIZE ((1,2));
|
||||
extern void *xnrealloc (void *, ptrdiff_t, ptrdiff_t)
|
||||
ATTRIBUTE_ALLOC_SIZE ((2,3));
|
||||
extern void *xpalloc (void *, ptrdiff_t *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
|
||||
|
||||
extern char *xstrdup (const char *);
|
||||
extern char *xlispstrdup (Lisp_Object);
|
||||
extern char *xstrdup (const char *) ATTRIBUTE_MALLOC;
|
||||
extern char *xlispstrdup (Lisp_Object) ATTRIBUTE_MALLOC;
|
||||
extern void dupstring (char **, char const *);
|
||||
extern void xputenv (const char *);
|
||||
|
||||
|
|
@ -4432,7 +4433,7 @@ extern void init_system_name (void);
|
|||
|
||||
enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
|
||||
|
||||
extern void *record_xmalloc (size_t);
|
||||
extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
|
||||
|
||||
#define USE_SAFE_ALLOCA \
|
||||
ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = false
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue