diff options
Diffstat (limited to 'rts/Printer.c')
-rw-r--r-- | rts/Printer.c | 122 |
1 files changed, 99 insertions, 23 deletions
diff --git a/rts/Printer.c b/rts/Printer.c index f077814ba9..7f7e83cb8b 100644 --- a/rts/Printer.c +++ b/rts/Printer.c @@ -13,6 +13,7 @@ #include "rts/Bytecodes.h" /* for InstrPtr */ #include "sm/Storage.h" +#include "sm/GCThread.h" #include "Hash.h" #include "Printer.h" #include "RtsUtils.h" @@ -23,6 +24,8 @@ #include <string.h> +void findPtr(P_ p, int follow); + #if defined(DEBUG) #include "Disassembler.h" @@ -308,8 +311,8 @@ printClosure( const StgClosure *obj ) debugBelch("MUT_ARR_PTRS_DIRTY(size=%" FMT_Word ")\n", (W_)((StgMutArrPtrs *)obj)->ptrs); break; - case MUT_ARR_PTRS_FROZEN: - debugBelch("MUT_ARR_PTRS_FROZEN(size=%" FMT_Word ")\n", (W_)((StgMutArrPtrs *)obj)->ptrs); + case MUT_ARR_PTRS_FROZEN_CLEAN: + debugBelch("MUT_ARR_PTRS_FROZEN_CLEAN(size=%" FMT_Word ")\n", (W_)((StgMutArrPtrs *)obj)->ptrs); break; case SMALL_MUT_ARR_PTRS_CLEAN: @@ -322,8 +325,8 @@ printClosure( const StgClosure *obj ) (W_)((StgSmallMutArrPtrs *)obj)->ptrs); break; - case SMALL_MUT_ARR_PTRS_FROZEN: - debugBelch("SMALL_MUT_ARR_PTRS_FROZEN(size=%" FMT_Word ")\n", + case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: + debugBelch("SMALL_MUT_ARR_PTRS_FROZEN_CLEAN(size=%" FMT_Word ")\n", (W_)((StgSmallMutArrPtrs *)obj)->ptrs); break; @@ -331,7 +334,29 @@ printClosure( const StgClosure *obj ) case MVAR_DIRTY: { StgMVar* mv = (StgMVar*)obj; - debugBelch("MVAR(head=%p, tail=%p, value=%p)\n", mv->head, mv->tail, mv->value); + + debugBelch("MVAR(head="); + if ((StgClosure*)mv->head == &stg_END_TSO_QUEUE_closure) { + debugBelch("END_TSO_QUEUE"); + } else { + debugBelch("%p", mv->head); + } + + debugBelch(", tail="); + if ((StgClosure*)mv->tail == &stg_END_TSO_QUEUE_closure) { + debugBelch("END_TSO_QUEUE"); + } else { + debugBelch("%p", mv->tail); + } + + debugBelch(", value="); + if ((StgClosure*)mv->value == &stg_END_TSO_QUEUE_closure) { + debugBelch("END_TSO_QUEUE"); + } else { + debugBelch("%p", mv->value); + } + debugBelch(")\n"); + break; } @@ -358,7 +383,7 @@ printClosure( const StgClosure *obj ) case WEAK: debugBelch("WEAK("); - debugBelch(" key=%p value=%p finalizer=%p", + debugBelch("key=%p value=%p finalizer=%p", (StgPtr)(((StgWeak*)obj)->key), (StgPtr)(((StgWeak*)obj)->value), (StgPtr)(((StgWeak*)obj)->finalizer)); @@ -373,7 +398,7 @@ printClosure( const StgClosure *obj ) break; case STACK: - debugBelch("STACK"); + debugBelch("STACK\n"); break; #if 0 @@ -387,9 +412,12 @@ printClosure( const StgClosure *obj ) case COMPACT_NFDATA: debugBelch("COMPACT_NFDATA(size=%" FMT_Word ")\n", - (W_)((StgCompactNFData *)obj)->totalW * sizeof(W_)); + (W_)((StgCompactNFData *)obj)->totalW * (W_)sizeof(W_)); break; + case TREC_CHUNK: + debugBelch("TREC_CHUNK\n"); + break; default: //barf("printClosure %d",get_itbl(obj)->type); @@ -400,6 +428,21 @@ printClosure( const StgClosure *obj ) } } +void +printMutableList(bdescr *bd) +{ + StgPtr p; + + debugBelch("mutable list %p: ", bd); + + for (; bd != NULL; bd = bd->link) { + for (p = bd->start; p < bd->free; p++) { + debugBelch("%p (%s), ", (void *)*p, info_type((StgClosure *)*p)); + } + } + debugBelch("\n"); +} + // If you know you have an UPDATE_FRAME, but want to know exactly which. const char *info_update_frame(const StgClosure *closure) { @@ -419,13 +462,6 @@ const char *info_update_frame(const StgClosure *closure) } } -/* -void printGraph( StgClosure *obj ) -{ - printClosure(obj); -} -*/ - static void printSmallBitmap( StgPtr spBottom, StgPtr payload, StgWord bitmap, uint32_t size ) @@ -520,6 +556,18 @@ printStackChunk( StgPtr sp, StgPtr spBottom ) debugBelch("stg_ap_ppppp_info\n" ); } else if (c == (StgWord)&stg_ap_pppppp_info) { debugBelch("stg_ap_pppppp_info\n" ); + } else if (c == (StgWord)&stg_ret_v_info) { + debugBelch("stg_ret_v_info\n" ); + } else if (c == (StgWord)&stg_ret_p_info) { + debugBelch("stg_ret_p_info\n" ); + } else if (c == (StgWord)&stg_ret_n_info) { + debugBelch("stg_ret_n_info\n" ); + } else if (c == (StgWord)&stg_ret_f_info) { + debugBelch("stg_ret_f_info\n" ); + } else if (c == (StgWord)&stg_ret_d_info) { + debugBelch("stg_ret_d_info\n" ); + } else if (c == (StgWord)&stg_ret_l_info) { + debugBelch("stg_ret_l_info\n" ); #if defined(PROFILING) } else if (c == (StgWord)&stg_restore_cccs_info) { debugBelch("stg_restore_cccs_info\n" ); @@ -590,10 +638,14 @@ printStackChunk( StgPtr sp, StgPtr spBottom ) } } +static void printStack( StgStack *stack ) +{ + printStackChunk( stack->sp, stack->stack + stack->stack_size ); +} + void printTSO( StgTSO *tso ) { - printStackChunk( tso->stackobj->sp, - tso->stackobj->stack+tso->stackobj->stack_size); + printStack( tso->stackobj ); } /* -------------------------------------------------------------------------- @@ -725,8 +777,6 @@ extern void DEBUG_LoadSymbols( const char *name STG_UNUSED ) #endif /* USING_LIBBFD */ -void findPtr(P_ p, int); /* keep gcc -Wall happy */ - int searched = 0; static int @@ -776,11 +826,16 @@ findPtr(P_ p, int follow) int i = 0; searched = 0; +#if 0 + // We can't search the nursery, because we don't know which blocks contain + // valid data, because the bd->free pointers in the nursery are only reset + // just before a block is used. for (n = 0; n < n_capabilities; n++) { bd = nurseries[i].blocks; i = findPtrBlocks(p,bd,arr,arr_size,i); if (i >= arr_size) return; } +#endif for (g = 0; g < RtsFlags.GcFlags.generations; g++) { bd = generations[g].blocks; @@ -788,6 +843,13 @@ findPtr(P_ p, int follow) bd = generations[g].large_objects; i = findPtrBlocks(p,bd,arr,arr_size,i); if (i >= arr_size) return; + for (n = 0; n < n_capabilities; n++) { + i = findPtrBlocks(p, gc_threads[n]->gens[g].part_list, + arr, arr_size, i); + i = findPtrBlocks(p, gc_threads[n]->gens[g].todo_bd, + arr, arr_size, i); + } + if (i >= arr_size) return; } if (follow && i == 1) { debugBelch("-->\n"); @@ -814,13 +876,19 @@ void printObj( StgClosure *obj ) debugBelch("obj 0x%p (enable -DDEBUG for more info) " , obj ); } - +void findPtr(P_ p, int follow) +{ + // we're printing the arguments just to silence the unused parameter warning + debugBelch("recompile your program with -debug in order to run "); + debugBelch("findPtr(0x%p, %d)\n", p, follow); +} #endif /* DEBUG */ /* ----------------------------------------------------------------------------- Closure types - NOTE: must be kept in sync with the closure types in includes/ClosureTypes.h + NOTE: must be kept in sync with the closure types in + includes/rts/storage/ClosureTypes.h -------------------------------------------------------------------------- */ const char *closure_type_names[] = { @@ -869,8 +937,8 @@ const char *closure_type_names[] = { [ARR_WORDS] = "ARR_WORDS", [MUT_ARR_PTRS_CLEAN] = "MUT_ARR_PTRS_CLEAN", [MUT_ARR_PTRS_DIRTY] = "MUT_ARR_PTRS_DIRTY", - [MUT_ARR_PTRS_FROZEN0] = "MUT_ARR_PTRS_FROZEN0", - [MUT_ARR_PTRS_FROZEN] = "MUT_ARR_PTRS_FROZEN", + [MUT_ARR_PTRS_FROZEN_DIRTY] = "MUT_ARR_PTRS_FROZEN_DIRTY", + [MUT_ARR_PTRS_FROZEN_CLEAN] = "MUT_ARR_PTRS_FROZEN_CLEAN", [MUT_VAR_CLEAN] = "MUT_VAR_CLEAN", [MUT_VAR_DIRTY] = "MUT_VAR_DIRTY", [WEAK] = "WEAK", @@ -883,9 +951,17 @@ const char *closure_type_names[] = { [CATCH_RETRY_FRAME] = "CATCH_RETRY_FRAME", [CATCH_STM_FRAME] = "CATCH_STM_FRAME", [WHITEHOLE] = "WHITEHOLE", + [SMALL_MUT_ARR_PTRS_CLEAN] = "SMALL_MUT_ARR_PTRS_CLEAN", + [SMALL_MUT_ARR_PTRS_DIRTY] = "SMALL_MUT_ARR_PTRS_DIRTY", + [SMALL_MUT_ARR_PTRS_FROZEN_DIRTY] = "SMALL_MUT_ARR_PTRS_FROZEN_DIRTY", + [SMALL_MUT_ARR_PTRS_FROZEN_CLEAN] = "SMALL_MUT_ARR_PTRS_FROZEN_CLEAN", [COMPACT_NFDATA] = "COMPACT_NFDATA" }; +#if N_CLOSURE_TYPES != 64 +#error Closure types changed: update Printer.c! +#endif + const char * info_type(const StgClosure *closure){ return closure_type_names[get_itbl(closure)->type]; |