OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 24 Oct 2019 13:57:15 +0000 (22:57 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 24 Oct 2019 13:57:15 +0000 (22:57 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h
libgoblin/drd64_libgoblin_dwarf_tag_struct.c
libgoblin/drd64_libgoblin_dwarf_tag_struct.h

index e5a2198..e4b3a9e 100644 (file)
@@ -90,14 +90,14 @@ DWARF_TagFunction   dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { DW_TAG_label,                                        DWARF_Tag_Function_UnImplement },       // 0x0a: function
 { DW_TAG_lexical_block,                        DWARF_Tag_Function_UnImplement },       // 0x0b: function
 { 0x0c,                                                        NULL },
-{ DW_TAG_member,                               DWARF_Tag_Struct_UnImplement },         // 0x0d: struct
+{ DW_TAG_member,                               DWARF_Tag_Struct_member },                      // 0x0d: struct
 { 0x0e,                                                        NULL },
 { DW_TAG_pointer_type,                 DWARF_Tag_Type_Common_type },           // 0x0f: type
 
 { DW_TAG_reference_type,               DWARF_Tag_Type_UnImplement },           // 0x10: type
 { DW_TAG_compile_unit,                 DWARF_Tag_CompileUnit_compile_unit },// 0x11: compileunit
 { DW_TAG_string_type,                  DWARF_Tag_NotClang_UnImplement },       // 0x12: notclang
-{ DW_TAG_structure_type,               DWARF_Tag_Struct_UnImplement },         // 0x13: struct
+{ DW_TAG_structure_type,               DWARF_Tag_Struct_structure_type },      // 0x13: struct
 { 0x14,                                                        NULL },
 { DW_TAG_subroutine_type,              DWARF_Tag_Type_Common_type },           // 0x15: type
 { DW_TAG_typedef,                              DWARF_Tag_Type_typedef },                       // 0x16: type
index cc9609e..be6c3fa 100644 (file)
@@ -68,11 +68,109 @@ int
        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
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN
+int
+       DWARF_Tag_Struct_structure_type(
+               DWord                                   dw_tag,
+               LibGoblin_BinaryInfo    *p_binfo,
+               int                                             i_childlv,
+        LibGoblin_DWARF_Info_Ancestry  *p_ancestry,
+               LibGoblin_DWARF_Info_CUHeader   *p_cuheader )
+{
+       LibGoblin_DWARF_DIEValue        *pval_name;
+       LibGoblin_DWARF_DIEValue        *pval_declfile;
+       LibGoblin_DWARF_DIEValue        *pval_declline;
+       LibGoblin_DWARF_DIEValue        *pval_byte_size;
+
+       // Data Extract
+       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 );
+
+
+/*
+       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;
+*/
+       printf( "  Implementing DWARF Tag(Struct): %s [%02xh]\n",
+                                                       Debug_DWARF_GetTAGname( dw_tag ), dw_tag );
+
+       return NO_OBJ;
+}
+
+
+/*----------------------------------------------------------------------
+  DW_TAG_member
+       DW_AT_name
+       DW_AT_type
        DW_AT_accessibility
        DW_AT_mutable
        DW_AT_data_member_location
@@ -82,7 +180,7 @@ int
 ----------------------------------------------------------------------*/
 LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN
 int
-       DWARF_Tag_Struct_typedef(
+       DWARF_Tag_Struct_member(
                DWord                                   dw_tag,
                LibGoblin_BinaryInfo    *p_binfo,
                int                                             i_childlv,
@@ -156,6 +254,8 @@ int
 
        return pobj_now->i_id;
 */
+       printf( "  Implementing DWARF Tag(Struct): %s [%02xh]\n",
+                                                       Debug_DWARF_GetTAGname( dw_tag ), dw_tag );
 
        return NO_OBJ;
 }
index c2d0c3c..8c491ae 100644 (file)
@@ -50,6 +50,16 @@ LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN
                                DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
                                int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
                                LibGoblin_DWARF_Info_CUHeader *p_cuheader );
+LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN
+       int DWARF_Tag_Struct_structure_type(
+                               DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
+                               int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
+                               LibGoblin_DWARF_Info_CUHeader *p_cuheader );
+LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN
+       int DWARF_Tag_Struct_member(
+                               DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
+                               int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
+                               LibGoblin_DWARF_Info_CUHeader *p_cuheader );
 
 
 #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */