msvcrt: Share the dump_function_descr() helper between platforms.

This commit is contained in:
Alexandre Julliard 2024-05-31 15:33:08 +02:00
parent e7546542ab
commit df09103ab6
4 changed files with 48 additions and 78 deletions

View file

@ -278,6 +278,7 @@ static inline void copy_exception( void *object, uintptr_t frame, int offset, UI
} \
} while(0)
extern void dump_function_descr( const cxx_function_descr *descr, uintptr_t base );
extern void *find_catch_handler( void *object, uintptr_t frame, uintptr_t exc_base,
const tryblock_info *tryblock,
cxx_exception_type *exc_type, uintptr_t image_base );

View file

@ -46,6 +46,52 @@ static MSVCRT_security_error_handler security_error_handler;
static __sighandler_t sighandlers[NSIG] = { SIG_DFL };
void dump_function_descr( const cxx_function_descr *descr, uintptr_t base )
{
unwind_info *unwind_table = rtti_rva( descr->unwind_table, base );
tryblock_info *tryblock = rtti_rva( descr->tryblock, base );
ipmap_info *ipmap = rtti_rva( descr->ipmap, base );
UINT i, j;
TRACE( "magic %x\n", descr->magic );
TRACE( "unwind table: %p %d\n", unwind_table, descr->unwind_count );
for (i = 0; i < descr->unwind_count; i++)
{
TRACE(" %d: prev %d func %p\n", i, unwind_table[i].prev,
unwind_table[i].handler ? rtti_rva( unwind_table[i].handler, base ) : NULL );
}
TRACE( "try table: %p %d\n", tryblock, descr->tryblock_count );
for (i = 0; i < descr->tryblock_count; i++)
{
catchblock_info *catchblock = rtti_rva( tryblock[i].catchblock, base );
TRACE( " %d: start %d end %d catchlevel %d catch %p %d\n", i,
tryblock[i].start_level, tryblock[i].end_level,
tryblock[i].catch_level, catchblock, tryblock[i].catchblock_count);
for (j = 0; j < tryblock[i].catchblock_count; j++)
{
type_info *type_info = catchblock[j].type_info ? rtti_rva( catchblock[j].type_info, base ) : NULL;
TRACE( " %d: flags %x offset %d handler %p",
j, catchblock[j].flags, catchblock[j].offset,
catchblock[j].handler ? rtti_rva(catchblock[j].handler, base) : NULL );
#ifdef RTTI_USE_RVA
TRACE( " frame %x", catchblock[j].frame );
#endif
TRACE( " type %p %s\n", type_info, dbgstr_type_info(type_info) );
}
}
TRACE( "ipmap: %p %d\n", ipmap, descr->ipmap_count );
for (i = 0; i < descr->ipmap_count; i++)
TRACE( " %d: ip %x state %d\n", i, ipmap[i].ip, ipmap[i].state );
#ifdef RTTI_USE_RVA
TRACE( "unwind_help %+d\n", descr->unwind_help );
#endif
if (descr->magic <= CXX_FRAME_MAGIC_VC6) return;
TRACE( "expect list: %p\n", rtti_rva( descr->expect_list, base ) );
if (descr->magic <= CXX_FRAME_MAGIC_VC7) return;
TRACE( "flags: %08x\n", descr->flags );
}
void *find_catch_handler( void *object, uintptr_t frame, uintptr_t exc_base,
const tryblock_info *tryblock,
cxx_exception_type *exc_type, uintptr_t image_base )

View file

@ -152,39 +152,6 @@ __ASM_GLOBAL_FUNC( call_handler,
"popl %ebp\n\t"
"ret" );
static void dump_function_descr( const cxx_function_descr *descr )
{
UINT i;
int j;
TRACE( "magic %x\n", descr->magic );
TRACE( "unwind table: %p %d\n", descr->unwind_table, descr->unwind_count );
for (i = 0; i < descr->unwind_count; i++)
{
TRACE( " %d: prev %d func %p\n", i,
descr->unwind_table[i].prev, descr->unwind_table[i].handler );
}
TRACE( "try table: %p %d\n", descr->tryblock, descr->tryblock_count );
for (i = 0; i < descr->tryblock_count; i++)
{
TRACE( " %d: start %d end %d catchlevel %d catch %p %d\n", i,
descr->tryblock[i].start_level, descr->tryblock[i].end_level,
descr->tryblock[i].catch_level, descr->tryblock[i].catchblock,
descr->tryblock[i].catchblock_count );
for (j = 0; j < descr->tryblock[i].catchblock_count; j++)
{
const catchblock_info *ptr = &descr->tryblock[i].catchblock[j];
TRACE( " %d: flags %x offset %d handler %p type %p %s\n",
j, ptr->flags, ptr->offset, ptr->handler,
ptr->type_info, dbgstr_type_info( ptr->type_info ) );
}
}
if (descr->magic <= CXX_FRAME_MAGIC_VC6) return;
TRACE( "expect list: %p\n", descr->expect_list );
if (descr->magic <= CXX_FRAME_MAGIC_VC7) return;
TRACE( "flags: %08x\n", descr->flags );
}
/* unwind the local function up to a given trylevel */
static void cxx_local_unwind( cxx_exception_frame* frame, const cxx_function_descr *descr, int last_level)
{
@ -468,7 +435,7 @@ DWORD CDECL cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame
TRACE("handling C++ exception rec %p frame %p trylevel %d descr %p nested_frame %p\n",
rec, frame, frame->trylevel, descr, nested_frame );
TRACE_EXCEPTION_TYPE( exc_type, 0 );
dump_function_descr( descr );
dump_function_descr( descr, 0 );
}
}
else

View file

@ -61,50 +61,6 @@ static inline void* rva_to_ptr(UINT rva, ULONG64 base)
return rva ? (void*)(base+rva) : NULL;
}
static void dump_function_descr(const cxx_function_descr *descr, ULONG64 image_base)
{
unwind_info *unwind_table = rva_to_ptr(descr->unwind_table, image_base);
tryblock_info *tryblock = rva_to_ptr(descr->tryblock, image_base);
ipmap_info *ipmap = rva_to_ptr(descr->ipmap, image_base);
UINT i, j;
TRACE("magic %x\n", descr->magic);
TRACE("unwind table: %x(%p) %d\n", descr->unwind_table, unwind_table, descr->unwind_count);
for (i=0; i<descr->unwind_count; i++)
{
TRACE(" %d: prev %d func %x(%p)\n", i, unwind_table[i].prev,
unwind_table[i].handler, rva_to_ptr(unwind_table[i].handler, image_base));
}
TRACE("try table: %x(%p) %d\n", descr->tryblock, tryblock, descr->tryblock_count);
for (i=0; i<descr->tryblock_count; i++)
{
catchblock_info *catchblock = rva_to_ptr(tryblock[i].catchblock, image_base);
TRACE(" %d: start %d end %d catchlevel %d catch %x(%p) %d\n", i,
tryblock[i].start_level, tryblock[i].end_level,
tryblock[i].catch_level, tryblock[i].catchblock,
catchblock, tryblock[i].catchblock_count);
for (j=0; j<tryblock[i].catchblock_count; j++)
{
TRACE(" %d: flags %x offset %d handler %x(%p) frame %x type %x %s\n",
j, catchblock[j].flags, catchblock[j].offset, catchblock[j].handler,
rva_to_ptr(catchblock[j].handler, image_base), catchblock[j].frame,
catchblock[j].type_info,
dbgstr_type_info(rva_to_ptr(catchblock[j].type_info, image_base)));
}
}
TRACE("ipmap: %x(%p) %d\n", descr->ipmap, ipmap, descr->ipmap_count);
for (i=0; i<descr->ipmap_count; i++)
{
TRACE(" %d: ip %x state %d\n", i, ipmap[i].ip, ipmap[i].state);
}
TRACE("unwind_help %d\n", descr->unwind_help);
if (descr->magic <= CXX_FRAME_MAGIC_VC6) return;
TRACE("expect list: %x\n", descr->expect_list);
if (descr->magic <= CXX_FRAME_MAGIC_VC7) return;
TRACE("flags: %08x\n", descr->flags);
}
static inline int ip_to_state(ipmap_info *ipmap, UINT count, int ip)
{
UINT low = 0, high = count-1, med;