summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/c.h27
-rw-r--r--include/xalloc.h8
2 files changed, 32 insertions, 3 deletions
diff --git a/include/c.h b/include/c.h
index 02c29e960..f50a338c9 100644
--- a/include/c.h
+++ b/include/c.h
@@ -10,6 +10,15 @@
/*
* Compiler specific stuff
*/
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
#ifdef __GNUC__
/* &a[0] degrades to a pointer: a different type from an array */
@@ -24,6 +33,24 @@
# define ignore_result(x) ((void) (x))
#endif /* !__GNUC__ */
+/*
+ * Function attributes
+ */
+#ifndef __ul_alloc_size
+# if __GNUC_PREREQ (3, 0)
+# define __ul_alloc_size(s) __attribute__((alloc_size(s)))
+# else
+# define __ul_alloc_size(s)
+# endif
+#endif
+
+#ifndef __ul_calloc_size
+# if __GNUC_PREREQ (3, 0)
+# define __ul_calloc_size(n, s) __attribute__((alloc_size(n, s)))
+# else
+# define __ul_calloc_size(n, s)
+# endif
+#endif
/* Force a compilation error if condition is true, but also produce a
* result (of value 0 and type size_t), so the expression can be used
diff --git a/include/xalloc.h b/include/xalloc.h
index fc2f886dd..27efa30c5 100644
--- a/include/xalloc.h
+++ b/include/xalloc.h
@@ -13,11 +13,13 @@
#include <stdlib.h>
#include <err.h>
+#include "c.h"
+
#ifndef XALLOC_EXIT_CODE
# define XALLOC_EXIT_CODE EXIT_FAILURE
#endif
-static inline __attribute__((alloc_size(1)))
+static inline __ul_alloc_size(1)
void *xmalloc(const size_t size)
{
void *ret = malloc(size);
@@ -27,7 +29,7 @@ void *xmalloc(const size_t size)
return ret;
}
-static inline __attribute__((alloc_size(2)))
+static inline __ul_alloc_size(2)
void *xrealloc(void *ptr, const size_t size)
{
void *ret = realloc(ptr, size);
@@ -37,7 +39,7 @@ void *xrealloc(void *ptr, const size_t size)
return ret;
}
-static inline __attribute__((alloc_size(1,2)))
+static inline __ul_calloc_size(1, 2)
void *xcalloc(const size_t nelems, const size_t size)
{
void *ret = calloc(nelems, size);