From 87152b9835bebb27b78724ceb6bff63fae5f88f6 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Tue, 22 Oct 2019 21:31:02 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup --- libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h | 2 +- libgoblin/drd64_libgoblin_dwarf_tag_function.c | 4 +- libgoblin/drd64_libgoblin_dwarf_tag_struct.c | 95 ++++++++++++++++++++++++++ libgoblin/drd64_libgoblin_type.h | 1 + 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h b/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h index e671ffb..e5a2198 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h +++ b/libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h @@ -80,7 +80,7 @@ DWARF_TagFunction dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX] = { { 0x00, NULL }, { DW_TAG_array_type, DWARF_Tag_Array_UnImplement }, // 0x01: array { DW_TAG_class_type, DWARF_Tag_Class_UnImplement }, // 0x02: class -{ DW_TAG_entry_point, DWARF_Tag_NotClang_UnImplement }, // 0x03: notclang +{ DW_TAG_entry_point, DWARF_Tag_Function_subprogram }, // 0x03: notclang { DW_TAG_enumeration_type, DWARF_Tag_Array_UnImplement }, // 0x04: array { DW_TAG_formal_parameter, DWARF_Tag_Parameter_UnImplement }, // 0x05: parameter { 0x06, NULL }, diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_function.c b/libgoblin/drd64_libgoblin_dwarf_tag_function.c index ddeabc8..ff6921e 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_function.c +++ b/libgoblin/drd64_libgoblin_dwarf_tag_function.c @@ -38,7 +38,6 @@ Comment: #include"drd64_libgoblin.h" /*---------------------------------------------------------------------- -DW_TAG_inlined_subroutine DW_TAG_lexical_block DW_TAG_label ----------------------------------------------------------------------*/ @@ -62,6 +61,8 @@ int /*---------------------------------------------------------------------- DW_TAG_subprogram + DW_TAG_inlined_subroutine + DW_TAG_entry_point DW_AT_name DW_AT_decl_file DW_AT_decl_line @@ -219,6 +220,7 @@ int pobj_now->dwarf.i_objid_type = NO_OBJ; pobj_now->dwarf.pb_dwinfo_type = pb_link; + pobj_now->info.function.dw_functype = dw_tag; pobj_now->info.function.flag.external = ((NULL != pval_external) ? 1 : 0 ); pobj_now->info.function.flag.prototyped = ((NULL != pval_prototyped) ? 1 : 0 ); diff --git a/libgoblin/drd64_libgoblin_dwarf_tag_struct.c b/libgoblin/drd64_libgoblin_dwarf_tag_struct.c index f8dfdf3..cc9609e 100644 --- a/libgoblin/drd64_libgoblin_dwarf_tag_struct.c +++ b/libgoblin/drd64_libgoblin_dwarf_tag_struct.c @@ -61,9 +61,104 @@ int return NO_OBJ; } + /*---------------------------------------------------------------------- + DW_TAG_structure_type + DW_AT_name + DW_AT_decl_file + DW_AT_decl_line + DW_AT_byte_size + + DW_AT_type + DW_AT_declaration + DW_AT_specification + DW_AT_start_scope + DW_AT_accessibility + DW_AT_mutable + DW_AT_data_member_location + DW_AT_byte_size + DW_AT_bit_offset + DW_AT_bit_size ----------------------------------------------------------------------*/ +LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN +int + DWARF_Tag_Struct_typedef( + DWord dw_tag, + LibGoblin_BinaryInfo *p_binfo, + int i_childlv, + LibGoblin_DWARF_Info_Ancestry *p_ancestry, + LibGoblin_DWARF_Info_CUHeader *p_cuheader ) +{ +/* + Byte *pb_link = NULL; + int i_obj_parent; + PtrValue ptrval_start; + LibGoblin_ObjectInfo *pobj_now; + LibGoblin_ObjectInfo *pobj_parent; + LibGoblin_ProgramInfo *p_pginfo; + LibGoblin_DWARF_DIEValue *pval_name; + LibGoblin_DWARF_DIEValue *pval_type; + LibGoblin_DWARF_DIEValue *pval_declfile; + LibGoblin_DWARF_DIEValue *pval_declline; + LibGoblin_DWARF_DIEValue *pval_byte_size; + + // Data Extract + pval_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type ); + pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name ); + pval_declfile = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file ); + pval_declline = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line ); + pval_byte_size = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_byte_size ); + + if( NULL != pval_type ) + { pb_link = pval_type->value.pb_link; } + + i_obj_parent = p_ancestry[i_childlv - 1].i_objid; + + p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo ); + assert( NULL != p_pginfo ); + + pobj_parent = ObjectInfo_GetObjectInfo( p_pginfo, i_obj_parent ); + ptrval_start = pobj_parent->addr.ptr_addr.value; + + pobj_now = ObjectInfo_InsetObject( + p_pginfo, ptrval_start, (QWord)0, pobj_parent, + OBJINFO_INSETMODE_ADOPT, OBJINFO_TYPE_TYPEDEF, NULL ); + if( NULL == pobj_now ) { + return -0x03; + } + + if( NULL != pval_declfile ) { + DWARF_AttrForm_ExtensionDIEValue( pval_declfile ); + pobj_now->i_srcid = SrcFile_GetSrcFileTable_inBinaryInfo( + p_binfo, (int)pval_declfile->value.qw_value ); + } + + if( NULL != pval_declline ) { + DWARF_AttrForm_ExtensionDIEValue( pval_declline ); + pobj_now->dw_srcline = (DWord)pval_declline->value.qw_value; + } + + if( NULL != pval_name ) + { pobj_now->pstr_name = pval_name->value.pstr_value; } + else + { pobj_now->pstr_name = NULL; } + + pobj_now->dwarf.i_objid_type = NO_OBJ; + pobj_now->dwarf.pb_dwinfo_type = pb_link; + pobj_now->info.type.dw_size = 0; + pobj_now->info.type.b_encoding = 0x00; + pobj_now->info.type.b_bit_size = 0; + pobj_now->info.type.b_bit_offset = 0; + pobj_now->info.type.b_endianity = DW_END_default; + pobj_now->info.type.b_addr_class = 0x00; + pobj_now->info.type.dw_size = (DWord)pval_byte_size->value.b_value; + + return pobj_now->i_id; +*/ + + return NO_OBJ; +} /* EOF of drd64_.c ----------------------------------- */ diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index 65b641b..49b5043 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -200,6 +200,7 @@ typedef struct { } type; struct { + DWord dw_functype; // for DW_TAG_xxx int i_objid_master; DWord dw_sz_frame_base; -- 2.11.0