cheney_c89: valgrind
This commit is contained in:
parent
b41e2100c2
commit
2effa0f98c
6
Makefile
6
Makefile
|
@ -3,11 +3,15 @@
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
.SUFFIXES: .c .o .test
|
.SUFFIXES: .c .o .test
|
||||||
CC=cc
|
CC=cc
|
||||||
|
TEST_WRAPPER=valgrind --exit-on-first-error=yes
|
||||||
|
|
||||||
CFLAGS=-Wall -std=c89 -Werror -pedantic -fPIC -g -Iinclude -I.
|
CFLAGS=-Wall -std=c89 -Werror -pedantic -fPIC -g -Iinclude -I. -Wno-unused-function -Wno-unused-variable ${EXTRACFLAGS}
|
||||||
|
|
||||||
tests: string_tests htable_tests
|
tests: string_tests htable_tests
|
||||||
|
|
||||||
|
with_valgrind:
|
||||||
|
make EXTRACFLAGS=-DUNS_VALGRIND
|
||||||
|
|
||||||
COMMON_OBJECTS=uns.o
|
COMMON_OBJECTS=uns.o
|
||||||
|
|
||||||
uns.o: uns.c include/uns.h
|
uns.o: uns.c include/uns.h
|
||||||
|
|
21
cheney_c89.c
21
cheney_c89.c
|
@ -16,6 +16,16 @@
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef UNS_VALGRIND
|
||||||
|
# include <valgrind/valgrind.h>
|
||||||
|
# define REDZONE 16
|
||||||
|
#else
|
||||||
|
# define REDZONE 0
|
||||||
|
# define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) (void)0
|
||||||
|
# define VALGRIND_DESTROY_MEMPOOL(pool) (void)0
|
||||||
|
# define VALGRIND_MEMPOOL_ALLOC(pool, ptr, siz) (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -186,7 +196,7 @@ static void hdr_write_direct(struct hdr *hdr, unsigned char *p)
|
||||||
*/
|
*/
|
||||||
static int enough_space(struct ctx *ctx, uns_sword bytes)
|
static int enough_space(struct ctx *ctx, uns_sword bytes)
|
||||||
{
|
{
|
||||||
return ctx->tospace_end - ctx->tospace_alloc >= bytes + HDR_LEN;
|
return ctx->tospace_end - ctx->tospace_alloc >= bytes + HDR_LEN + REDZONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate region without bounds checking.
|
/** Allocate region without bounds checking.
|
||||||
|
@ -215,8 +225,10 @@ static void *raw_alloc(struct ctx *ctx, uns_sword len, int is_record)
|
||||||
assert(enough_space(ctx, len));
|
assert(enough_space(ctx, len));
|
||||||
|
|
||||||
p = ctx->tospace_alloc;
|
p = ctx->tospace_alloc;
|
||||||
|
VALGRIND_MEMPOOL_ALLOC(ctx->tospace, p, len);
|
||||||
|
|
||||||
hdr_write_direct(&hdr, p);
|
hdr_write_direct(&hdr, p);
|
||||||
ctx->tospace_alloc += len;
|
ctx->tospace_alloc += len + REDZONE;
|
||||||
|
|
||||||
return p + HDR_LEN;
|
return p + HDR_LEN;
|
||||||
}
|
}
|
||||||
|
@ -342,7 +354,7 @@ static void relocate_everything(Uns_GC gc)
|
||||||
|
|
||||||
if (hdr.typ == RECORD)
|
if (hdr.typ == RECORD)
|
||||||
scan_record(ctx, scanptr, (size_t)hdr.len/sizeof(void*));
|
scan_record(ctx, scanptr, (size_t)hdr.len/sizeof(void*));
|
||||||
scanptr += hdr.len;
|
scanptr += hdr.len + REDZONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -363,6 +375,7 @@ int uns_cheney_c89_collect(Uns_GC gc)
|
||||||
*/
|
*/
|
||||||
assert(newlen >= fromspace_lim - fromspace);
|
assert(newlen >= fromspace_lim - fromspace);
|
||||||
ctx->tospace = malloc(newlen);
|
ctx->tospace = malloc(newlen);
|
||||||
|
VALGRIND_CREATE_MEMPOOL(ctx->tospace, REDZONE, 0);
|
||||||
if (!ctx->tospace) {
|
if (!ctx->tospace) {
|
||||||
ctx->tospace = fromspace;
|
ctx->tospace = fromspace;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -374,6 +387,7 @@ int uns_cheney_c89_collect(Uns_GC gc)
|
||||||
|
|
||||||
relocate_everything(gc);
|
relocate_everything(gc);
|
||||||
|
|
||||||
|
VALGRIND_DESTROY_MEMPOOL(fromspace);
|
||||||
free(fromspace);
|
free(fromspace);
|
||||||
|
|
||||||
ctx->stats.usage_after = ctx->tospace_alloc - ctx->tospace;
|
ctx->stats.usage_after = ctx->tospace_alloc - ctx->tospace;
|
||||||
|
@ -446,6 +460,7 @@ int uns_cheney_c89_init(Uns_GC gc, size_t heap_size)
|
||||||
|
|
||||||
uns_deinit(gc);
|
uns_deinit(gc);
|
||||||
ctx->tospace_alloc = ctx->tospace = malloc(heap_size);
|
ctx->tospace_alloc = ctx->tospace = malloc(heap_size);
|
||||||
|
VALGRIND_CREATE_MEMPOOL(ctx->tospace, REDZONE, 0);
|
||||||
if (!ctx->tospace) {
|
if (!ctx->tospace) {
|
||||||
free(ctx);
|
free(ctx);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -21,8 +21,8 @@ gen_test() { # test_name, collector_name, exec_deps, obj_file_deps
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
$TARGET: $DEPS
|
$TARGET: $DEPS
|
||||||
\${CC} \${LDFLAGS} $DEPS $TARGET
|
\${CC} \${TEST_LDFLAGS} $DEPS -o $TARGET
|
||||||
./valgrind ./$TARGET
|
\${TEST_WRAPPER} ./$TARGET
|
||||||
"
|
"
|
||||||
|
|
||||||
TEST_TARGETS="$TEST_TARGETS $TARGET"
|
TEST_TARGETS="$TEST_TARGETS $TARGET"
|
||||||
|
@ -72,7 +72,7 @@ gen_lisp_test() { #collector_name, exec_deps
|
||||||
$SHIM_OBJ: $OBJDEPS
|
$SHIM_OBJ: $OBJDEPS
|
||||||
|
|
||||||
$TARGET: $DEPS
|
$TARGET: $DEPS
|
||||||
\${CC} \${LDFLAGS} $DEPS -o $TARGET
|
\${CC} \${TEST_LDFLAGS} $DEPS -o $TARGET
|
||||||
"
|
"
|
||||||
|
|
||||||
TEST_TARGETS="$TEST_TARGETS $TARGET"
|
TEST_TARGETS="$TEST_TARGETS $TARGET"
|
||||||
|
|
Loading…
Reference in New Issue