Add support for reporting mallocs / frees to valgrind through client requests.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg@inf.u-szeged.hu
This commit is contained in:
@@ -41,15 +41,54 @@
|
||||
#ifdef JERRY_VALGRIND
|
||||
# include "memcheck.h"
|
||||
|
||||
# define VALGRIND_NOACCESS_SPACE(p, s) (void)VALGRIND_MAKE_MEM_NOACCESS((p), (s))
|
||||
# define VALGRIND_UNDEFINED_SPACE(p, s) (void)VALGRIND_MAKE_MEM_UNDEFINED((p), (s))
|
||||
# define VALGRIND_DEFINED_SPACE(p, s) (void)VALGRIND_MAKE_MEM_DEFINED((p), (s))
|
||||
# define VALGRIND_NOACCESS_SPACE(p, s) VALGRIND_MAKE_MEM_NOACCESS((p), (s))
|
||||
# define VALGRIND_UNDEFINED_SPACE(p, s) VALGRIND_MAKE_MEM_UNDEFINED((p), (s))
|
||||
# define VALGRIND_DEFINED_SPACE(p, s) VALGRIND_MAKE_MEM_DEFINED((p), (s))
|
||||
|
||||
#else /* JERRY_VALGRIND */
|
||||
# define VALGRIND_NOACCESS_SPACE(p, s)
|
||||
# define VALGRIND_UNDEFINED_SPACE(p, s)
|
||||
# define VALGRIND_DEFINED_SPACE(p, s)
|
||||
#endif /* JERRY_VALGRIND */
|
||||
|
||||
#ifdef JERRY_VALGRIND_FREYA
|
||||
# include "memcheck.h"
|
||||
|
||||
/**
|
||||
* Tells whether a pool manager allocator request is in progress.
|
||||
*/
|
||||
static bool valgrind_freya_mempool_request = false;
|
||||
|
||||
/**
|
||||
* Called by pool manager before a heap allocation or free.
|
||||
*/
|
||||
void mem_heap_valgrind_freya_mempool_request (void)
|
||||
{
|
||||
valgrind_freya_mempool_request = true;
|
||||
} /* mem_heap_valgrind_freya_mempool_request */
|
||||
|
||||
# define VALGRIND_FREYA_CHECK_MEMPOOL_REQUEST \
|
||||
bool mempool_request = valgrind_freya_mempool_request; \
|
||||
valgrind_freya_mempool_request = false
|
||||
|
||||
# define VALGRIND_FREYA_MALLOCLIKE_SPACE(p, s) \
|
||||
if (!mempool_request) \
|
||||
{ \
|
||||
VALGRIND_MALLOCLIKE_BLOCK((p), (s), 0, 0); \
|
||||
}
|
||||
|
||||
# define VALGRIND_FREYA_FREELIKE_SPACE(p) \
|
||||
if (!mempool_request) \
|
||||
{ \
|
||||
VALGRIND_FREELIKE_BLOCK((p), 0); \
|
||||
}
|
||||
|
||||
#else /* JERRY_VALGRIND_FREYA */
|
||||
# define VALGRIND_FREYA_CHECK_MEMPOOL_REQUEST
|
||||
# define VALGRIND_FREYA_MALLOCLIKE_SPACE(p, s)
|
||||
# define VALGRIND_FREYA_FREELIKE_SPACE(p)
|
||||
#endif /* JERRY_VALGRIND_FREYA */
|
||||
|
||||
/**
|
||||
* Length type of the block
|
||||
*/
|
||||
@@ -489,6 +528,8 @@ mem_heap_alloc_block_try_give_memory_back (size_t size_in_bytes, /**< size of re
|
||||
* (one-chunked or general) */
|
||||
mem_heap_alloc_term_t alloc_term) /**< expected allocation term */
|
||||
{
|
||||
VALGRIND_FREYA_CHECK_MEMPOOL_REQUEST;
|
||||
|
||||
#ifdef MEM_GC_BEFORE_EACH_ALLOC
|
||||
mem_run_try_to_give_memory_back_callbacks (MEM_TRY_GIVE_MEMORY_BACK_SEVERITY_CRITICAL);
|
||||
#endif /* MEM_GC_BEFORE_EACH_ALLOC */
|
||||
@@ -503,6 +544,7 @@ mem_heap_alloc_block_try_give_memory_back (size_t size_in_bytes, /**< size of re
|
||||
|
||||
if (likely (data_space_p != NULL))
|
||||
{
|
||||
VALGRIND_FREYA_MALLOCLIKE_SPACE (data_space_p, size_in_bytes);
|
||||
return data_space_p;
|
||||
}
|
||||
|
||||
@@ -516,6 +558,7 @@ mem_heap_alloc_block_try_give_memory_back (size_t size_in_bytes, /**< size of re
|
||||
|
||||
if (data_space_p != NULL)
|
||||
{
|
||||
VALGRIND_FREYA_MALLOCLIKE_SPACE (data_space_p, size_in_bytes);
|
||||
return data_space_p;
|
||||
}
|
||||
}
|
||||
@@ -580,6 +623,8 @@ mem_heap_alloc_chunked_block (mem_heap_alloc_term_t alloc_term) /**< expected al
|
||||
void
|
||||
mem_heap_free_block (void *ptr) /**< pointer to beginning of data space of the block */
|
||||
{
|
||||
VALGRIND_FREYA_CHECK_MEMPOOL_REQUEST;
|
||||
|
||||
uint8_t *uint8_ptr = (uint8_t*) ptr;
|
||||
|
||||
/* checking that uint8_ptr points to the heap */
|
||||
@@ -661,6 +706,7 @@ mem_heap_free_block (void *ptr) /**< pointer to beginning of data space of the b
|
||||
VALGRIND_CHECK_MEM_IS_ADDRESSABLE (ptr, mem_heap_allocated_bytes[chunk_index]);
|
||||
#endif /* JERRY_VALGRIND */
|
||||
|
||||
VALGRIND_FREYA_FREELIKE_SPACE (ptr);
|
||||
VALGRIND_NOACCESS_SPACE (ptr, chunks * MEM_HEAP_CHUNK_SIZE);
|
||||
|
||||
JERRY_ASSERT (mem_heap_allocated_chunks >= chunks);
|
||||
|
||||
Reference in New Issue
Block a user