GC: improve backtrace info for 'interior pointers

This commit is contained in:
Matthew Flatt 2016-04-19 05:25:07 -06:00
parent 84bffd41af
commit ddd4190edf
2 changed files with 18 additions and 1 deletions

View File

@ -50,6 +50,7 @@ static void *print_out_pointer(const char *prefix, void *p,
GC_print_tagged_value_proc print_tagged_value, GC_print_tagged_value_proc print_tagged_value,
int *_kind) int *_kind)
{ {
void *orig_p;
trace_page_t *page; trace_page_t *page;
const char *what; const char *what;
@ -58,10 +59,13 @@ static void *print_out_pointer(const char *prefix, void *p,
GCPRINT(GCOUTF, "%s%s %p\n", prefix, trace_source_kind(*_kind), p); GCPRINT(GCOUTF, "%s%s %p\n", prefix, trace_source_kind(*_kind), p);
return NULL; return NULL;
} }
orig_p = p;
p = trace_pointer_start(page, p); p = trace_pointer_start(page, p);
if ((trace_page_type(page) == TRACE_PAGE_TAGGED) if ((trace_page_type(page) == TRACE_PAGE_TAGGED)
|| (trace_page_type(page) == TRACE_PAGE_PAIR)) { || (trace_page_type(page) == TRACE_PAGE_PAIR)
|| ((trace_page_type(page) == TRACE_PAGE_MED_NONATOMIC)
&& (OBJPTR_TO_OBJHEAD(p)->type == PAGE_TAGGED))) {
Type_Tag tag; Type_Tag tag;
tag = *(Type_Tag *)p; tag = *(Type_Tag *)p;
if ((tag >= 0) && get_type_name && get_type_name(tag)) { if ((tag >= 0) && get_type_name && get_type_name(tag)) {
@ -72,8 +76,19 @@ static void *print_out_pointer(const char *prefix, void *p,
what = NULL; what = NULL;
} else if (trace_page_type(page) == TRACE_PAGE_ARRAY) { } else if (trace_page_type(page) == TRACE_PAGE_ARRAY) {
what = "ARRAY"; what = "ARRAY";
} else if ((trace_page_type(page) == TRACE_PAGE_MED_NONATOMIC)
&& (OBJPTR_TO_OBJHEAD(p)->type == PAGE_ARRAY)) {
what = "MED_ARRAY";
if (p != orig_p) {
GCPRINT(GCOUTF, "%s%s %p as %p\n", prefix, what, p, orig_p);
what = NULL;
}
} else if (trace_page_type(page) == TRACE_PAGE_ATOMIC) { } else if (trace_page_type(page) == TRACE_PAGE_ATOMIC) {
what = "ATOMIC"; what = "ATOMIC";
} else if (trace_page_type(page) == TRACE_PAGE_MED_ATOMIC) {
what = "MED_ATOMIC";
} else if (trace_page_type(page) == TRACE_PAGE_MED_NONATOMIC) {
what = "MED_NONATOMIC";
} else if (trace_page_type(page) == TRACE_PAGE_MALLOCFREE) { } else if (trace_page_type(page) == TRACE_PAGE_MALLOCFREE) {
what = "MALLOCED"; what = "MALLOCED";
} else { } else {

View File

@ -5883,6 +5883,8 @@ static void *trace_pointer_start(mpage *page, void *p) {
# define TRACE_PAGE_ATOMIC PAGE_ATOMIC # define TRACE_PAGE_ATOMIC PAGE_ATOMIC
# define TRACE_PAGE_PAIR PAGE_PAIR # define TRACE_PAGE_PAIR PAGE_PAIR
# define TRACE_PAGE_MALLOCFREE PAGE_TYPES # define TRACE_PAGE_MALLOCFREE PAGE_TYPES
# define TRACE_PAGE_MED_ATOMIC PAGE_MED_ATOMIC
# define TRACE_PAGE_MED_NONATOMIC PAGE_MED_NONATOMIC
# define TRACE_PAGE_BAD PAGE_TYPES # define TRACE_PAGE_BAD PAGE_TYPES
# define trace_page_is_big(page) ((page)->size_class >= SIZE_CLASS_BIG_PAGE) # define trace_page_is_big(page) ((page)->size_class >= SIZE_CLASS_BIG_PAGE)
# define trace_backpointer get_backtrace # define trace_backpointer get_backtrace