[PATCH] record: Add wrappers for malloc() functions
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Sep 2 06:11:44 UTC 2019
On 02/09/2019 08:00, Chris Johns wrote:
>>> I do not see any upside adding this library or wrapping specific functions
>>> this way.
>> The benefits are:
>>
>> * Slightly more compact (the event indicates the function and the data can be
>> used for the caller address instead, the generic function entry/exit needs two
>> events for this).
> Could you please explain this, sorry I am not sure what this means? If the code
> is what needs to be generated then why not generate?
The record items is defined like this:
/**
* @brief The record data integer type.
*
* It is big enough to store 32-bit integers and pointers.
*/
typedef unsigned long rtems_record_data;
/**
* @brief The native record item.
*/
typedef struct __attribute__((__packed__)) {
uint32_t event;
rtems_record_data data;
} rtems_record_item;
The event member contains a 22-bit time stamp and a 10-bit event number.
The malloc entry/exit wrapper with a special event number looks like this:
void *__wrap_malloc( size_t size )
{
void *ptr;
rtems_record_produce_2(
RTEMS_RECORD_MALLOC_ENTRY,
(rtems_record_data) RTEMS_RETURN_ADDRESS(),
RTEMS_RECORD_ARG_0,
size
)
ptr = __real_malloc( size );
rtems_record_produce_2(
RTEMS_RECORD_MALLOC_EXIT,
(rtems_record_data) RTEMS_RETURN_ADDRESS(),
RTEMS_RECORD_RETURN_0,
(rtems_record_data) ptr
)
return ptr;
}
If you have to encode the function in the event data, then you need two
extra items:
void *__wrap_malloc( size_t size )
{
rtems_record_item items[ 3 ];
void *ptr;
items[ 0 ].event = RTEMS_RECORD_FUNCTION_ENTRY;
items[ 1 ].data = (rtems_record_data) __real_malloc;
items[ 1 ].event = RTEMS_RECORD_CALLER;
items[ 1 ].data = (rtems_record_data) RTEMS_RETURN_ADDRESS();
items[ 2 ].event = RTEMS_RECORD_ARG_0;
items[ 2 ].data = size;
rtems_record_produce_n( items, RTEMS_ARRAY_SIZE( items ) );
ptr = __real_malloc( size );
items[ 0 ].event = RTEMS_RECORD_FUNCTION_EXIT;
items[ 1 ].data = (rtems_record_data) __real_malloc;
items[ 1 ].event = RTEMS_RECORD_CALLER;
items[ 1 ].data = (rtems_record_data) RTEMS_RETURN_ADDRESS();
items[ 2 ].event = RTEMS_RECORD_RETURN_0;
items[ 2 ].data = (rtems_record_data) ptr;
rtems_record_produce_n( items, RTEMS_ARRAY_SIZE( items ) );
return ptr;
}
For this simple one argument function, this is a 50% increase.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list