OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 21 Aug 2019 11:49:58 +0000 (20:49 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 21 Aug 2019 11:49:58 +0000 (20:49 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_debug_objinfo.c
libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h
libgoblin/drd64_libgoblin_dwarf_tag_type.c
libgoblin/drd64_libgoblin_dwarf_tag_type.h
libgoblin/drd64_libgoblin_objinfo.c
libgoblin/drd64_libgoblin_type.h

index 1e5734b..5b682ab 100644 (file)
@@ -44,17 +44,17 @@ static char gstr_type[256][9]       = {
        "PROGHDR",              // 0x03
        "SECTION",              // 0x04
        "OBJFILE",              // 0x05
-       "FUNCTION",             // 0x06
-       "OBJECT",               // 0x07
-
-       "COMMON",               // 0x08
-       "TLS",                  // 0x09
-       "REL",                  // 0x0a
-       "",                             // 0x0b
-       "",                             // 0x0c
+       "TYPE:MUL",             // 0x06
+       "TYPE:SIG",             // 0x07
+
+       "FUNCTION",             // 0x08
+       "OBJECT",               // 0x09
+       "COMMON",               // 0x0a
+       "TLS",                  // 0x0b
+       "REL",                  // 0x0d
        "",                             // 0x0d
-       "TYPE(SIG)",    // 0x0e
-       "TYPE(MUL)",    // 0x0f
+       "",                             // 0x0e
+       "",                             // 0x0f
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
@@ -466,6 +466,33 @@ void
        return;
 }
 
+/*--------------------------------------------------------------------*/
+void
+       Debug_ObjectInfo_Print_Type_Single(
+                       LibGoblin_ObjectInfo    *p_obj,
+                       char    *pstr_space,
+                       Byte    b_level )
+{
+       printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n",
+                               pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id );
+       printf(" %s\t\t[TYPE(Single)] size= %u, encoding= %xh\n",
+                               pstr_space, p_obj->info.type.dw_size, p_obj->info.type.b_encoding );
+
+       return;
+}
+
+/*--------------------------------------------------------------------*/
+void
+       Debug_ObjectInfo_Print_Type_Multi(
+                       LibGoblin_ObjectInfo    *p_obj,
+                       char    *pstr_space,
+                       Byte    b_level )
+{
+       printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n",
+                               pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id );
+
+       return;
+}
 
 /*====================================================================*/
 /*--------------------------------------------------------------------*/
@@ -521,6 +548,14 @@ void
                        Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level );
                        break;
 
+               case OBJINFO_TYPE_TYPE_SINGLE:
+                       Debug_ObjectInfo_Print_Type_Single( p_obj, pstr_space, b_level );
+                       break;
+
+               case OBJINFO_TYPE_TYPE_MULTI:
+                       Debug_ObjectInfo_Print_Type_Multi( p_obj, pstr_space, b_level );
+                       break;
+
                case OBJINFO_TYPE_FUNCTION:
                        Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level );
                        break;
index a05e1b5..e951a98 100644 (file)
@@ -244,7 +244,7 @@ int
                        }
 
                        t_ancestry[i_childlv].pb_dwinfo = pb_now;
-                       t_ancestry[i_childlv].i_objid   = i_result;
+                       t_ancestry[i_childlv].i_objid   = i_objid;
 
                        Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
 
index 9d202e5..bae5685 100644 (file)
@@ -115,7 +115,7 @@ DWARF_TagFunction   dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { DW_TAG_subrange_type,                        DWARF_Tag_Array_UnImplement },          // 0x21: array
 { DW_TAG_with_stmt,                            DWARF_Tag_NotClang_UnImplement },       // 0x22: notclang
 { DW_TAG_access_declaration,   DWARF_Tag_Class_UnImplement },          // 0x23: class
-{ DW_TAG_base_type,                            DWARF_Tag_Type_UnImplement },           // 0x24: type
+{ DW_TAG_base_type,                            DWARF_Tag_Type_base_type },                     // 0x24: type
 { DW_TAG_catch_block,                  DWARF_Tag_Exception_UnImplement },      // 0x25: exception
 { DW_TAG_const_type,                   DWARF_Tag_Type_UnImplement },           // 0x26: type
 { DW_TAG_constant,                             DWARF_Tag_Parameter_UnImplement },      // 0x27: parameter
index 6e89fb6..40a552e 100644 (file)
@@ -38,7 +38,6 @@ Comment:
 #include"drd64_libgoblin.h"
 
 /*----------------------------------------------------------------------
-DW_TAG_base_type
 DW_TAG_unspecified_type
 DW_TAG_const_type
 DW_TAG_pointer_type
@@ -67,8 +66,58 @@ int
        return 0x00;
 }
 
+
 /*----------------------------------------------------------------------
+  DW_TAG_base_type
+       DW_AT_name
+       DW_AT_encoding
+       DW_AT_byte_size
 ----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+int
+       DWARF_Tag_Type_base_type(
+               DWord                                   dw_tag,
+               LibGoblin_BinaryInfo    *p_binfo,
+               int                                             i_childlv,
+        LibGoblin_DWARF_Info_Ancestry  *p_ancestry,
+               LibGoblin_DWARF_Info_CUHeader   *p_cuheader )
+{
+       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_byte_size;
+       LibGoblin_DWARF_DIEValue        *pval_encoding;
+
+       // Data Extract
+       pval_name       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+       pval_byte_size  = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_byte_size );
+       pval_encoding   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_encoding );
+
+       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_TYPE_SINGLE );
+       if( NULL == pobj_now )  {
+               return NO_OBJ;
+       }
+
+       pobj_now->pstr_name     = pval_name->value.pstr_value;
+       pobj_now->info.type.dw_size             = (DWord)pval_byte_size->value.b_value;
+       pobj_now->info.type.b_encoding  = pval_encoding->value.b_value;
+
+       return pobj_now->i_id;
+}
+
 
 
 
index 627b7e8..e035320 100644 (file)
@@ -50,6 +50,11 @@ LIBGOBLIN_DWARF_TAG_TYPE_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_TYPE_EXTERN
+       int DWARF_Tag_Type_base_type(
+                               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 */
index 6862f66..75cca77 100644 (file)
@@ -388,7 +388,7 @@ LibGoblin_ObjectInfo *
                                && ( ptr_value < (p_objnow->addr.ptr_addr.value + p_objnow->addr.qw_size)) ))   {
 
                        if(( ptr_value == p_objnow->addr.ptr_addr.value )
-                                       && ( qw_size == p_objnow->addr.qw_size ))       {
+                                       && ( qw_size <= p_objnow->addr.qw_size ))       {
                                if( b_type >= p_objnow->b_type )                {
                                        if( p_objnow->addr.qw_size <= p_objover->addr.qw_size )
                                                { p_objover     = p_objnow; }
@@ -403,7 +403,7 @@ LibGoblin_ObjectInfo *
                if( ptr_value == p_objnow->addr.ptr_addr.value )        {
                        if( qw_size > p_objnow->addr.qw_size )
                                { break; }
-                       else if( qw_size == p_objnow->addr.qw_size )    {
+                       else if( qw_size <= p_objnow->addr.qw_size )    {
                                if( b_type < p_objnow->b_type )         { break; }
                        }
                }
@@ -442,7 +442,7 @@ LibGoblin_ObjectInfo *
                if( ptr_value == p_objnow->addr.ptr_addr.value )        {
                        if( qw_size > p_objnow->addr.qw_size )
                                { break; }
-                       else if( qw_size == p_objnow->addr.qw_size )    {
+                       else if( qw_size <= p_objnow->addr.qw_size )    {
                                if( b_type < p_objnow->b_type )         { break; }
                        }
                }
index 7a078c7..3fd4fcc 100644 (file)
@@ -95,13 +95,13 @@ typedef struct      {
 #define        OBJINFO_TYPE_PROGHDR            0x03
 #define        OBJINFO_TYPE_SECTION            0x04
 #define        OBJINFO_TYPE_OBJFILE            0x05
-#define        OBJINFO_TYPE_FUNCTION           0x06
-#define        OBJINFO_TYPE_OBJECT                     0x07
-#define        OBJINFO_TYPE_COMMON                     0x08
-#define        OBJINFO_TYPE_TLS                        0x09
-#define        OBJINFO_TYPE_REL                        0x0a
-#define        OBJINFO_TYPE_TYPE_SINGLE        0x0e
-#define        OBJINFO_TYPE_TYPE_MULTI         0x0f
+#define        OBJINFO_TYPE_TYPE_MULTI         0x06
+#define        OBJINFO_TYPE_TYPE_SINGLE        0x07
+#define        OBJINFO_TYPE_FUNCTION           0x08
+#define        OBJINFO_TYPE_OBJECT                     0x09
+#define        OBJINFO_TYPE_COMMON                     0x0a
+#define        OBJINFO_TYPE_TLS                        0x0b
+#define        OBJINFO_TYPE_REL                        0x0c
 #define        OBJINFO_TYPE_NONE                       0x7f
 
 typedef        struct  {
@@ -196,6 +196,7 @@ typedef     struct  {
 
                struct  {
                        DWord   dw_size;
+                       Byte    b_encoding;
                        LibGoblin_ObjInfo_Link          t_link;
                } type;