summaryrefslogtreecommitdiff
path: root/src/gmalloc.c
diff options
context:
space:
mode:
authorWolfgang Jenkner <wjenkner@inode.at>2015-12-26 12:12:02 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2015-12-26 12:12:43 -0800
commit4b1436b702d56eedd27a0777fc7232cdfb7ac4f6 (patch)
tree0a92fb0417ed2eac4f5b0ef7165def7d194b0df0 /src/gmalloc.c
parent0191077d6a96d9ef8e43989fd5dc8a95e61806d5 (diff)
Always define gmalloc etc. in src/gmalloc.c
This is a work-around to prevent the compiler from using semantic knowledge about malloc for optimization purposes. E.g., gcc 5.2 with -O2 replaces most of calloc's definition by a call to calloc; see Bug#22085. * src/gmalloc.c [!HYBRID_MALLOC] (malloc, realloc, calloc) (aligned_alloc, free): Do not undef. Instead, define these as functions (perhaps renamed to gmalloc etc.) in terms of gmalloc etc.
Diffstat (limited to 'src/gmalloc.c')
-rw-r--r--src/gmalloc.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/gmalloc.c b/src/gmalloc.c
index a88f4ab75e0..90a52a1c728 100644
--- a/src/gmalloc.c
+++ b/src/gmalloc.c
@@ -60,7 +60,6 @@ extern void emacs_abort (void);
which HYBRID_MACRO is defined. Any other platform that wants to
define it will have to define the macros DUMPED and
ALLOCATED_BEFORE_DUMPING, defined below for Cygwin. */
-#ifdef HYBRID_MALLOC
#undef malloc
#undef realloc
#undef calloc
@@ -70,7 +69,6 @@ extern void emacs_abort (void);
#define calloc gcalloc
#define aligned_alloc galigned_alloc
#define free gfree
-#endif /* HYBRID_MALLOC */
#ifdef CYGWIN
extern void *bss_sbrk (ptrdiff_t size);
@@ -1711,13 +1709,13 @@ valloc (size_t size)
return aligned_alloc (pagesize, size);
}
-#ifdef HYBRID_MALLOC
#undef malloc
#undef realloc
#undef calloc
#undef aligned_alloc
#undef free
+#ifdef HYBRID_MALLOC
/* Declare system malloc and friends. */
extern void *malloc (size_t size);
extern void *realloc (void *ptr, size_t size);
@@ -1816,6 +1814,38 @@ hybrid_get_current_dir_name (void)
}
#endif
+#else /* ! HYBRID_MALLOC */
+
+void *
+malloc (size_t size)
+{
+ return gmalloc (size);
+}
+
+void *
+calloc (size_t nmemb, size_t size)
+{
+ return gcalloc (nmemb, size);
+}
+
+void
+free (void *ptr)
+{
+ gfree (ptr);
+}
+
+void *
+aligned_alloc (size_t alignment, size_t size)
+{
+ return galigned_alloc (alignment, size);
+}
+
+void *
+realloc (void *ptr, size_t size)
+{
+ return grealloc (ptr, size);
+}
+
#endif /* HYBRID_MALLOC */
#ifdef GC_MCHECK