From: Koine Yuusuke(koinec) Date: Tue, 22 Oct 2019 11:35:43 +0000 (+0900) Subject: (LibGoblin) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=430db7d6d481c6c0f92e6d57d5816eff468884f2;p=drdeamon64%2Fdrdeamon64.git (LibGoblin) * WorkBackup (Implement DWARF info. TAG_subprogram) --- 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: