#include <stdio.h>
extern char *gc_malloc(), *gc_realloc();
extern void gc_free();
struct block_status
{
void *alloc_address;
int size;
};
#define align(size, data) ( (size) + sizeof(data) * \
!!( (size) % sizeof(data) ) \
- ( (size) % sizeof(data) ) )
static unsigned int testp = 0;
char *dump_malloc_data()
{
return "";
}
int report_leak(p, sz)
char *p;
int sz;
{
struct block_status *address;
int size;
/* Negative size ==> pointer-free (atomic) object */
/* sz is in words. */
if (sz < 0) sz = -sz;
size = sz<<2;
address = (struct block_status *)
((char *)(p + size - sizeof(struct block_status)));
gc_printf("Found unfreed block at address %#x, real_size %#x,"
"alloc. size %#x, allocated from address %#x.\n",
p, size, address->size,address->alloc_address);
return 0;
}
char *
malloc(unsigned size)
{
register int *who_called asm ("%i7");
struct block_status *save_addr;
int real_size = align(size + sizeof(struct block_status), int *);
char *p = gc_malloc(real_size);
if (p == (char *) (testp * 10))
printf("FOUND malloc!\n");
save_addr = (struct block_status *)
((char *)(p + real_size - sizeof(struct block_status)));
save_addr->alloc_address = who_called;
save_addr->size = size;
gc_printf("Allocated data at address %#x, size %#x,"
" real_size %#x, from address %#x.\n",
p, size, real_size, who_called);
return p;
}
void
free(char *p)
{
if (p == (char *)(testp*10))
printf("FOUND free!\n");
gc_free(p);
}
char *
calloc(unsigned a, unsigned b)
{
char *p;
register int *who_called asm ("%i7");
struct block_status *save_addr;
int real_size = align(a*b + sizeof(struct block_status), int *);
p = gc_malloc(real_size);
save_addr = (struct block_status *)
((char *)(p + real_size - sizeof(struct block_status)));
save_addr->alloc_address = who_called;
save_addr->size = a*b;
gc_printf("Allocated data at address %#x, size %#x,"
" real_size %#x, from address %#x.\n",
p, a*b, real_size, who_called);
return p;
}
char *
realloc(char *p, unsigned size)
{
char *p2;
register int *who_called asm ("%i7");
struct block_status *save_addr;
int real_size = align(size + sizeof(struct block_status), int *);
p2 = gc_realloc(real_size);
save_addr = (struct block_status *)
((char *)(p2 + real_size - sizeof(struct block_status)));
save_addr->alloc_address = who_called;
save_addr->size = size;
gc_printf("Rellocated data at address %#x to address %#x, size %#x,"
" real_size %#x, from address %#x.\n",
p2, p, size, real_size, who_called);
return p2;
}