OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 20 Oct 2019 07:25:20 +0000 (16:25 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 20 Oct 2019 07:25:20 +0000 (16:25 +0900)
  * WorkBackup

libgoblin/Makefile
libgoblin/drd64_libgoblin_debug_objinfo.c
libgoblin/drd64_libgoblin_dwarf_tag_function.c
libgoblin/drd64_libgoblin_dwarf_tag_type.c
libgoblin/drd64_libgoblin_objinfo_postproc.c
libgoblin/drd64_libgoblin_type.h

index 9b591d1..7cc4e9c 100644 (file)
@@ -171,7 +171,7 @@ CALLGRAPH = CallGraph.txt
 all:   $(TARGET) test
 build: $(TARGET) $(CALLGRAPH)
 test:  $(TEST_TARGET) $(TESTPROG)
-       ./$(TEST_TARGET)
+       ./$(TEST_TARGET) | tee result.log
 
 
 $(TARGET): $(OBJS) $(LIB_OBJS)
index 237575d..5d3e8f7 100644 (file)
@@ -486,7 +486,7 @@ void
                                p_obj->info.type.b_bit_offset, p_obj->info.type.b_bit_size,
                                p_obj->info.type.b_endianity );
        printf(" %s\t\t[TYPE(Single)] Link Addr= %8ph  -> ObjID= %d\n",
-                               pstr_space, p_obj->info.type.p_dwtype, p_obj->info.type.i_objid_type );
+                               pstr_space, p_obj->dwarf.pb_dwinfo_type, p_obj->dwarf.i_objid_type );
 
        return;
 }
@@ -516,7 +516,7 @@ void
                                pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
                                p_obj->dwarf.pb_info );
        printf(" %s\t\t[TYPEDEF] Link Addr= %8ph  -> ObjID= %d\n",
-                               pstr_space, p_obj->info.type.p_dwtype, p_obj->info.type.i_objid_type );
+                               pstr_space, p_obj->dwarf.pb_dwinfo_type, p_obj->dwarf.i_objid_type );
 
        return;
 }
index eea488d..ab7ee87 100644 (file)
@@ -106,6 +106,7 @@ int
        char                                            *pstr_filename;
        char                                            str_filename[DRD64_MAX_PATH+1];
        char                                            str_path[DRD64_MAX_PATH+1];
+       Byte                                            *pb_link                = NULL;
        DWord                                           dw_srcline              = 0;
        DWord                                           dw_lineoffset;
        QWord                                           qw_low_pc;
@@ -138,28 +139,27 @@ int
 
        assert( NULL != p_binfo );
 
-       pval_name               = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
-       pval_lowpc              = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
-       pval_highpc             = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
-       pval_ranges             = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
-       pval_inline             = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
-       pval_declfile   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
-       pval_declline   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
+       pval_name                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+       pval_lowpc                      = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
+       pval_highpc                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
+       pval_ranges                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
+       pval_inline                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
+       pval_declfile           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
+       pval_declline           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
+       pval_type                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
        // UnImplement
-       pval_prototyped = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
-       pval_external   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
-       pval_entry_pc   = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
-       pval_segment    = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
-       pval_addr_class = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
+       pval_prototyped         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
+       pval_external           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
+       pval_entry_pc           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
+       pval_segment            = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
+       pval_addr_class         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
        pval_return_addr        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
        pval_frame_base         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_frame_base );
        pval_static_link        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_static_link );
-       pval_type                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
        pval_calling_convention = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_calling_convention );
 
        if( NULL == pval_name )
                { goto  goto_DWARF_Tag_Function_subprogram_post; }
-       //if( NULL != pval_name )       { pstr_filepath  = pval_name->value.pstr_value; }
 
        p_pginfo        = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
        assert( NULL != p_pginfo );
@@ -213,6 +213,9 @@ int
                dw_srcline      = (DWord)pval_declline->value.qw_value;
        }
 
+       if( NULL != pval_type )
+               { pb_link       = pval_type->value.pb_link; }
+
 
        // Inset & Regist. ObjectInfo ------------------------------------
        for( i_cnt = 0; i_cnt < t_ranges.i_ranges; i_cnt++ )    {
@@ -223,8 +226,10 @@ int
                                                OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_CHKNAME,
                                                OBJINFO_TYPE_FUNCTION, pval_name->value.pstr_value );
 
-               pobj_now->i_srcid               = i_srcid;
-               pobj_now->dw_srcline    = dw_srcline;
+               pobj_now->i_srcid                               = i_srcid;
+               pobj_now->dw_srcline                    = dw_srcline;
+               pobj_now->dwarf.i_objid_type    = NO_OBJ;
+               pobj_now->dwarf.pb_dwinfo_type  = pb_link;
 
                if( 0 == i_cnt )        {
                        pobj_parent     = pobj_now;
index 821f99d..3f87d7c 100644 (file)
@@ -130,8 +130,8 @@ int
        else
                { pobj_now->pstr_name   = NULL; }
 
-       pobj_now->info.type.i_objid_type        = NO_OBJ;
-       pobj_now->info.type.p_dwtype            = pb_link;
+       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;
@@ -216,8 +216,8 @@ int
        else
                { pobj_now->info.type.b_addr_class      = 0x00; }
 
-       pobj_now->info.type.i_objid_type        = NO_OBJ;
-       pobj_now->info.type.p_dwtype            = pb_link;
+       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;
@@ -297,8 +297,8 @@ int
        pobj_now->info.type.dw_size                     = (DWord)pval_byte_size->value.b_value;
        pobj_now->info.type.b_encoding          = pval_encoding->value.b_value;
        pobj_now->info.type.b_endianity         = DW_END_default;
-       pobj_now->info.type.i_objid_type        = NO_OBJ;
-       pobj_now->info.type.p_dwtype            = NULL;
+       pobj_now->dwarf.i_objid_type            = NO_OBJ;
+       pobj_now->dwarf.pb_dwinfo_type          = NULL;
 
        if( NULL != pval_bit_size )
                { pobj_now->info.type.b_bit_size        = pval_bit_size->value.b_value; }
index c61e866..9a4c25a 100644 (file)
@@ -46,20 +46,16 @@ int
                LibGoblin_ObjectInfo    *pobj_now )
 {
        int                                             i_result;
-       int                                             i_objid_parent;
+       int                                             i_objid_type;
        Byte                                    *pb_dwinfo;
        LibGoblin_ObjectInfo    *pobj_parent;
 
-       if(( OBJINFO_TYPE_TYPE_SINGLE != pobj_now->b_type )
-                               && ( OBJINFO_TYPE_TYPE_MULTI != pobj_now->b_type )
-                               && ( OBJINFO_TYPE_TYPEDEF != pobj_now->b_type ))
-               { goto  goto_ObjectInfo_PostProc_ResolvTypeLink_post; }
 
-       if( NULL == pobj_now->info.type.p_dwtype )
+       if( NULL == pobj_now->dwarf.pb_dwinfo_type )
                { goto  goto_ObjectInfo_PostProc_ResolvTypeLink_post; }
 
-       pb_dwinfo               = pobj_now->info.type.p_dwtype;
-       i_objid_parent  = Index_DWARFInfo_SearchObjectInfo( p_binfo, pb_dwinfo );
+       pb_dwinfo               = pobj_now->dwarf.pb_dwinfo_type;
+       i_objid_type    = Index_DWARFInfo_SearchObjectInfo( p_binfo, pb_dwinfo );
 
 /*
        printf("  Link: ObjID=%d dwinfo=%8ph -> LinkAddr=%8p  => parent: %d (old: %d)\n",
@@ -67,11 +63,11 @@ int
                                i_objid_parent, pobj_now->grplink.i_parent_id );
 */
 
-       if( NO_OBJ != i_objid_parent )  {
-               pobj_parent     = OBJINFO( p_pginfo, i_objid_parent );
+       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->info.type.i_objid_type        = i_objid_parent;
+               pobj_now->dwarf.i_objid_type    = i_objid_type;
        }
 
 goto_ObjectInfo_PostProc_ResolvTypeLink_post:
index eac672e..99cbe01 100644 (file)
@@ -197,8 +197,6 @@ typedef     struct  {
                        Byte    b_endianity;
                        Byte    b_addr_class;
                        Byte    b_prototyped;
-                       int             i_objid_type;
-                       Byte    *p_dwtype;
                } type;
 
                struct  {
@@ -231,6 +229,8 @@ typedef     struct  {
        struct  {
                Byte    *pb_info;
 
+               int             i_objid_type;
+               Byte    *pb_dwinfo_type;
        } dwarf;
 
        int             i_secid;