Skip to content

Commit b81be1e

Browse files
committed
platform: Fix C++ allocation wrappers for GCC compilation
Fix the caller address logging on the GCC compilation too. Previously the code logged the caller address as C++ wrapper, not the actual caller of the C++ operator new or delete.
1 parent 1cf5c45 commit b81be1e

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

platform/mbed_alloc_wrappers.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,18 @@ extern "C" {
8181
void * __real__realloc_r(struct _reent * r, void * ptr, size_t size);
8282
void __real__free_r(struct _reent * r, void * ptr);
8383
void* __real__calloc_r(struct _reent * r, size_t nmemb, size_t size);
84+
void* malloc_wrapper(struct _reent * r, size_t size, void * caller);
85+
void free_wrapper(struct _reent * r, void * ptr, void* caller);
8486
}
8587

8688
// TODO: memory tracing doesn't work with uVisor enabled.
8789
#if !defined(FEATURE_UVISOR)
8890

8991
extern "C" void * __wrap__malloc_r(struct _reent * r, size_t size) {
92+
return malloc_wrapper(r, size, MBED_CALLER_ADDR());
93+
}
94+
95+
extern "C" void * malloc_wrapper(struct _reent * r, size_t size, void * caller) {
9096
void *ptr = NULL;
9197
#ifdef MBED_MEM_TRACING_ENABLED
9298
mbed_mem_trace_lock();
@@ -111,7 +117,7 @@ extern "C" void * __wrap__malloc_r(struct _reent * r, size_t size) {
111117
ptr = __real__malloc_r(r, size);
112118
#endif // #ifdef MBED_HEAP_STATS_ENABLED
113119
#ifdef MBED_MEM_TRACING_ENABLED
114-
mbed_mem_trace_malloc(ptr, size, MBED_CALLER_ADDR());
120+
mbed_mem_trace_malloc(ptr, size, caller);
115121
mbed_mem_trace_unlock();
116122
#endif // #ifdef MBED_MEM_TRACING_ENABLED
117123
return ptr;
@@ -160,6 +166,10 @@ extern "C" void * __wrap__realloc_r(struct _reent * r, void * ptr, size_t size)
160166
}
161167

162168
extern "C" void __wrap__free_r(struct _reent * r, void * ptr) {
169+
free_wrapper(r, ptr, MBED_CALLER_ADDR());
170+
}
171+
172+
extern "C" void free_wrapper(struct _reent * r, void * ptr, void * caller) {
163173
#ifdef MBED_MEM_TRACING_ENABLED
164174
mbed_mem_trace_lock();
165175
#endif
@@ -177,7 +187,7 @@ extern "C" void __wrap__free_r(struct _reent * r, void * ptr) {
177187
__real__free_r(r, ptr);
178188
#endif // #ifdef MBED_HEAP_STATS_ENABLED
179189
#ifdef MBED_MEM_TRACING_ENABLED
180-
mbed_mem_trace_free(ptr, MBED_CALLER_ADDR());
190+
mbed_mem_trace_free(ptr, caller);
181191
mbed_mem_trace_unlock();
182192
#endif // #ifdef MBED_MEM_TRACING_ENABLED
183193
}

platform/mbed_retarget.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,53 @@ void operator delete[](void *ptr)
10681068
free_wrapper(ptr, MBED_CALLER_ADDR());
10691069
}
10701070

1071+
#elif defined(MBED_MEM_TRACING_ENABLED) && defined(__GNUC__)
1072+
1073+
#include <reent.h>
1074+
1075+
extern "C" void* malloc_wrapper(struct _reent * r, size_t size, void * caller);
1076+
extern "C" void free_wrapper(struct _reent * r, void * ptr, void * caller);
1077+
1078+
void *operator new(std::size_t count)
1079+
{
1080+
void *buffer = malloc_wrapper(_REENT, count, MBED_CALLER_ADDR());
1081+
if (NULL == buffer) {
1082+
error("Operator new out of memory\r\n");
1083+
}
1084+
return buffer;
1085+
}
1086+
1087+
void *operator new[](std::size_t count)
1088+
{
1089+
void *buffer = malloc_wrapper(_REENT, count, MBED_CALLER_ADDR());
1090+
if (NULL == buffer) {
1091+
error("Operator new[] out of memory\r\n");
1092+
}
1093+
return buffer;
1094+
}
1095+
1096+
void *operator new(std::size_t count, const std::nothrow_t& tag)
1097+
{
1098+
return malloc_wrapper(_REENT, count, MBED_CALLER_ADDR());
1099+
}
1100+
1101+
void *operator new[](std::size_t count, const std::nothrow_t& tag)
1102+
{
1103+
return malloc_wrapper(_REENT, count, MBED_CALLER_ADDR());
1104+
}
1105+
1106+
void operator delete(void *ptr)
1107+
{
1108+
free_wrapper(_REENT, ptr, MBED_CALLER_ADDR());
1109+
}
1110+
1111+
void operator delete[](void *ptr)
1112+
{
1113+
free_wrapper(_REENT, ptr, MBED_CALLER_ADDR());
1114+
}
1115+
10711116
#else
1117+
10721118
void *operator new(std::size_t count)
10731119
{
10741120
void *buffer = malloc(count);

0 commit comments

Comments
 (0)