From 430db7d6d481c6c0f92e6d57d5816eff468884f2 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Tue, 22 Oct 2019 20:35:43 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup (Implement DWARF info. TAG_subprogram) --- libgoblin/drd64_libgoblin_debug_objinfo.c | 61 ++++++++++++++++++++++++---- libgoblin/drd64_libgoblin_objinfo.c | 2 + libgoblin/drd64_libgoblin_objinfo_postproc.c | 4 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/libgoblin/drd64_libgoblin_debug_objinfo.c b/libgoblin/drd64_libgoblin_debug_objinfo.c index d2f0c3d..c445291 100644 --- a/libgoblin/drd64_libgoblin_debug_objinfo.c +++ b/libgoblin/drd64_libgoblin_debug_objinfo.c @@ -199,17 +199,64 @@ void char *pstr_space, Byte b_level ) { - //Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level ); + DWord dw_size; + DWord dw_cnt; printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d) .debug_info=%8ph\n", pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id, p_obj->dwarf.pb_info ); -/* - printf(" %s\t\t[TYPE(Single)] size= %u, encoding= %xh, BitOffset=%d, BitSize=%d, Endianity=%x\n", - pstr_space, p_obj->info.type.dw_size, p_obj->info.type.b_encoding, - p_obj->info.type.b_bit_offset, p_obj->info.type.b_bit_size, - p_obj->info.type.b_endianity ); -*/ + if( NO_OBJ == p_obj->info.function.i_objid_master ) { + printf(" %s\t\t[FUNCTION] Master (%s:%s:%s:%s) Convention= %d\n", + pstr_space, + ((0 != p_obj->info.function.flag.inline_def) ? "inline def." : " - "), + ((0 != p_obj->info.function.flag.inlined) ? " inlined " : " - "), + ((0 != p_obj->info.function.flag.external) ? " external " : " - "), + ((0 != p_obj->info.function.flag.prototyped) ? "prototyped " : " - "), + p_obj->info.function.b_convention ); + } + else { + printf(" %s\t\t[FUNCTION] Slave(%2d) (%s:%s:%s:%s) Convention= %d\\n", + pstr_space, p_obj->info.function.i_objid_master, + ((0 != p_obj->info.function.flag.inline_def) ? "inline def." : " - "), + ((0 != p_obj->info.function.flag.inlined) ? " inlined " : " - "), + ((0 != p_obj->info.function.flag.external) ? " external " : " - "), + ((0 != p_obj->info.function.flag.prototyped) ? "prototyped " : " - "), + p_obj->info.function.b_convention ); + } + + dw_size = ((16 < p_obj->info.function.dw_sz_frame_base) + ? 16 : p_obj->info.function.dw_sz_frame_base); + if( 0 < dw_size ) { + printf(" %s\t\t[FUNCTION] FrameBase (%2lu): ", + pstr_space, p_obj->info.function.dw_sz_frame_base ); + + for( dw_cnt = 0; dw_cnt < dw_size; dw_cnt++ ) + { printf( "%02xh ", *(p_obj->info.function.pb_frame_base + dw_cnt) ); } + puts(""); + } + + dw_size = ((16 < p_obj->info.function.dw_sz_return_addr) + ? 16 : p_obj->info.function.dw_sz_return_addr); + if( 0 < dw_size ) { + printf(" %s\t\t[FUNCTION] ReturnAddr. (%2lu): ", + pstr_space, p_obj->info.function.dw_sz_return_addr ); + + for( dw_cnt = 0; dw_cnt < dw_size; dw_cnt++ ) + { printf( "%02xh ", *(p_obj->info.function.pb_return_addr + dw_cnt) ); } + puts(""); + } + + dw_size = ((16 < p_obj->info.function.dw_sz_static_link) + ? 16 : p_obj->info.function.dw_sz_static_link); + if( 0 < dw_size ) { + printf(" %s\t\t[FUNCTION] StaticLink (%2lu): ", + pstr_space, p_obj->info.function.dw_sz_static_link ); + + for( dw_cnt = 0; dw_cnt < dw_size; dw_cnt++ ) + { printf( "%02xh ", *(p_obj->info.function.pb_static_link + dw_cnt) ); } + puts(""); + } + printf(" %s\t\t[FUNCTION] ReturnType: Link Addr= %8ph -> ObjID= %d\n", pstr_space, p_obj->dwarf.pb_dwinfo_type, p_obj->dwarf.i_objid_type ); return; diff --git a/libgoblin/drd64_libgoblin_objinfo.c b/libgoblin/drd64_libgoblin_objinfo.c index 176735f..f1ed52c 100644 --- a/libgoblin/drd64_libgoblin_objinfo.c +++ b/libgoblin/drd64_libgoblin_objinfo.c @@ -133,6 +133,8 @@ void p_objinfo->typelink.i_prev_id = NO_OBJ; p_objinfo->typelink.i_next_id = NO_OBJ; + p_objinfo->dwarf.i_objid_type = NO_OBJ; + p_objinfo->i_srcid = NO_SRC; return; diff --git a/libgoblin/drd64_libgoblin_objinfo_postproc.c b/libgoblin/drd64_libgoblin_objinfo_postproc.c index 9a4c25a..5327ddc 100644 --- a/libgoblin/drd64_libgoblin_objinfo_postproc.c +++ b/libgoblin/drd64_libgoblin_objinfo_postproc.c @@ -63,11 +63,11 @@ int i_objid_parent, pobj_now->grplink.i_parent_id ); */ + pobj_now->dwarf.i_objid_type = i_objid_type; + if(( NO_OBJ != i_objid_type ) && ( OBJINFO_TYPE_FUNCTION != pobj_now->b_type )) { pobj_parent = OBJINFO( p_pginfo, i_objid_type ); i_result = ObjectInfo_AdoptObjectInfo( p_pginfo, pobj_parent, pobj_now ); - - pobj_now->dwarf.i_objid_type = i_objid_type; } goto_ObjectInfo_PostProc_ResolvTypeLink_post: -- 2.11.0