aboutsummaryrefslogtreecommitdiff
path: root/src/debug_alloc.h
blob: 37cc6869e5e6b4bbe365fc192ae2424d27ec4f56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* debug_alloc.h
 *
 * Some macros which can report on malloc results.
 *
 * Enable with "-D DEBUG_ALLOC"
 */

#ifndef DEBUG_ALLOC_H
#define DEBUG_ALLOC_H

#include <stdio.h>

// Debug calls

#ifdef CORTEX_M4
extern char *__heap_end;
register char *sp asm("sp");
#endif

#if defined(__EMBEDDED__)
extern void *codec2_malloc(size_t size);
extern void *codec2_calloc(size_t nmemb, size_t size);
extern void codec2_free(void *ptr);
#else
#define codec2_malloc(size) (malloc(size))
#define codec2_calloc(nmemb, size) (calloc(nmemb, size))
#define codec2_free(ptr) (free(ptr))
#endif  // defined(__EMBEDDED__)

static inline void *DEBUG_MALLOC(const char *func, size_t size) {
  void *ptr = codec2_malloc(size);
  fprintf(stderr, "MALLOC: %s %p %d", func, ptr, (int)size);
#ifdef CORTEX_M4

  fprintf(stderr, " : sp %p ", sp);
#endif
  if (!ptr) fprintf(stderr, " ** FAILED **");
  fprintf(stderr, "\n");
  return (ptr);
}

static inline void *DEBUG_CALLOC(const char *func, size_t nmemb, size_t size) {
  void *ptr = codec2_calloc(nmemb, size);
  fprintf(stderr, "CALLOC: %s %p %d %d", func, ptr, (int)nmemb, (int)size);
#ifdef CORTEX_M4
  fprintf(stderr, " : sp %p ", sp);
#endif
  if (!ptr) fprintf(stderr, " ** FAILED **");
  fprintf(stderr, "\n");
  return (ptr);
}
static inline void DEBUG_FREE(const char *func, void *ptr) {
  codec2_free(ptr);
  fprintf(stderr, "FREE: %s %p\n", func, ptr);
}

#ifdef DEBUG_ALLOC
#define MALLOC(size) DEBUG_MALLOC(__func__, size)
#define CALLOC(nmemb, size) DEBUG_CALLOC(__func__, nmemb, size)
#define FREE(ptr) DEBUG_FREE(__func__, ptr)
#else  // DEBUG_ALLOC
// Default to normal calls
#define MALLOC(size) codec2_malloc(size)

#define CALLOC(nmemb, size) codec2_calloc(nmemb, size)

#define FREE(ptr) codec2_free(ptr)

#endif  // DEBUG_ALLOC

#endif  // DEBUG_ALLOC_H