/* * Generic stack scanning function * * This currently only scans the last 32 levels of the current stack. */ #ifdef __GNUC__ #include "private.h" #include "node.h" /*--------------------------------------------------------- */ void lub_heap_scan_stack(void) { char *start, *end; #define FRAME_ADDRESS(n) \ { \ char *fn = __builtin_return_address(n); \ if(!fn || (fn > lub_heap_data_start)) \ { \ break; \ } \ end = __builtin_frame_address(n); \ } \ start = end = __builtin_frame_address(0); do { FRAME_ADDRESS(0); FRAME_ADDRESS(1); FRAME_ADDRESS(2); FRAME_ADDRESS(3); FRAME_ADDRESS(4); FRAME_ADDRESS(5); FRAME_ADDRESS(6); FRAME_ADDRESS(7); FRAME_ADDRESS(8); FRAME_ADDRESS(9); FRAME_ADDRESS(10); FRAME_ADDRESS(11); FRAME_ADDRESS(12); FRAME_ADDRESS(13); FRAME_ADDRESS(14); FRAME_ADDRESS(15); FRAME_ADDRESS(16); FRAME_ADDRESS(17); FRAME_ADDRESS(18); FRAME_ADDRESS(19); FRAME_ADDRESS(20); FRAME_ADDRESS(21); FRAME_ADDRESS(22); FRAME_ADDRESS(23); FRAME_ADDRESS(24); FRAME_ADDRESS(25); FRAME_ADDRESS(26); FRAME_ADDRESS(27); FRAME_ADDRESS(28); FRAME_ADDRESS(29); FRAME_ADDRESS(30); FRAME_ADDRESS(31); } while (0); /* now scan the memory */ lub_heap_scan_memory(start, end - start); } /*--------------------------------------------------------- */ #else /* not __GNUC__ */ #warning "Generic stack scanning not implemented for non-GCC compiler..." #endif /* not __GNUC__ */