OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 23 Sep 2019 12:21:48 +0000 (21:21 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Mon, 23 Sep 2019 12:21:48 +0000 (21:21 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_api.c
libgoblin/drd64_libgoblin_debug_objinfo.c
libgoblin/drd64_libgoblin_dwarf_attrform.c
libgoblin/drd64_libgoblin_dwarf_attrform.h
libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h
libgoblin/drd64_libgoblin_dwarf_tag_type.c
libgoblin/drd64_libgoblin_type.h

index 60bbb6d..5cca00f 100644 (file)
@@ -102,7 +102,7 @@ int
        //Debug_Index_DWARFInfo_DumpObjectInfo( p_binfo, 0xff );
 
        // XXX: for DEBUG!
-       //Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff );
+       Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff );
 
        return  i_result;
 }
index ca841b3..aef5b61 100644 (file)
@@ -515,7 +515,6 @@ void
                        int             i_len,
                        Byte    b_level )
 {
-
        // Set Space String ---
        if( 0 < i_depth )       {
                *(pstr_space + i_len - 2)       = '+';
@@ -590,6 +589,12 @@ void
                default:
                        break;
        }
+
+       if( NO_SRC != p_obj->i_srcid )  {
+               printf(" %s\t\t[SrcFile] SrcFileID= %d,  Line= %u\n",
+                                       pstr_space, p_obj->i_srcid, p_obj->dw_srcline );
+       }
+
        printf(" %s\n", pstr_space );
 
        *(pstr_space + i_len)   = '\0';
index ea5ec7f..a25188b 100644 (file)
@@ -513,4 +513,32 @@ goto_DWARF_AttrForm_GetDIEValue_post:
 }
 
 
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_ATTRFORM_EXTERN
+void
+       DWARF_AttrForm_ExtensionDIEValue(
+               LibGoblin_DWARF_DIEValue *p_val )
+{
+       QWord   qw_value;
+
+       if( LIBGOBLIN_DWARF_INFO_TYPE_BYTE == p_val->b_type )
+               { qw_value      = (QWord)p_val->value.b_value; }
+       else if( LIBGOBLIN_DWARF_INFO_TYPE_WORD == p_val->b_type )
+               { qw_value      = (QWord)p_val->value.w_value; }
+       else if( LIBGOBLIN_DWARF_INFO_TYPE_DWORD == p_val->b_type )
+               { qw_value      = (QWord)p_val->value.dw_value; }
+       else if( LIBGOBLIN_DWARF_INFO_TYPE_QWORD == p_val->b_type )
+               { qw_value      = (QWord)p_val->value.qw_value; }
+       else
+               { return; }
+
+       p_val->b_type                   = LIBGOBLIN_DWARF_INFO_TYPE_QWORD;
+       p_val->value.qw_value   = qw_value;
+       p_val->qw_size                  = 8;
+
+       return;
+}
+
+
 /* EOF of drd64_.c ----------------------------------- */
index 0aeb657..c447f09 100644 (file)
@@ -57,6 +57,10 @@ LIBGOBLIN_DWARF_ATTRFORM_EXTERN
 LIBGOBLIN_DWARF_ATTRFORM_EXTERN
        LibGoblin_DWARF_DIEValue *DWARF_AttrForm_GetDIEValue(
                LibGoblin_BinaryInfo *p_binfo, DWord dw_attribute );
+LIBGOBLIN_DWARF_ATTRFORM_EXTERN
+       void DWARF_AttrForm_ExtensionDIEValue(
+               LibGoblin_DWARF_DIEValue *p_val );
+
 
 #ifdef DRD64_SRC_LIBGOBLIN_DWARF_ATTRFORM
 Byte *DWARF_AttrForm_ReadFormat_Data(
index 250970f..222a275 100644 (file)
@@ -262,7 +262,7 @@ int
                        t_ancestry[i_childlv].i_objid   = i_objid;
        
 
-                       //Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
+                       Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
 
                        if( 0x00 != p_arvnow->b_children )      {
                                i_childlv++;
index 7637bd2..e671ffb 100644 (file)
@@ -99,7 +99,7 @@ DWARF_TagFunction     dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { DW_TAG_string_type,                  DWARF_Tag_NotClang_UnImplement },       // 0x12: notclang
 { DW_TAG_structure_type,               DWARF_Tag_Struct_UnImplement },         // 0x13: struct
 { 0x14,                                                        NULL },
-{ DW_TAG_subroutine_type,              DWARF_Tag_Type_UnImplement },           // 0x15: type
+{ DW_TAG_subroutine_type,              DWARF_Tag_Type_Common_type },           // 0x15: type
 { DW_TAG_typedef,                              DWARF_Tag_Type_typedef },                       // 0x16: type
 { DW_TAG_union_type,                   DWARF_Tag_Struct_UnImplement },         // 0x17: struct
 { DW_TAG_unspecified_parameters,DWARF_Tag_Parameter_UnImplement },     // 0x18: parameter
index 2dc8655..e90a818 100644 (file)
@@ -114,7 +114,16 @@ int
                return -0x03;
        }
 
-       // XXX: TODO   support for DW_AT_decl_file/line --- (2019/08/27)
+       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; }
@@ -162,11 +171,13 @@ int
        LibGoblin_DWARF_DIEValue        *pval_name;
        LibGoblin_DWARF_DIEValue        *pval_type;
        LibGoblin_DWARF_DIEValue        *pval_addr_class;
+       LibGoblin_DWARF_DIEValue        *pval_prototyped;
 
        // Data Extract
        pval_type       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
        pval_name       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
        pval_addr_class = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
+       pval_prototyped = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
 
        if( NULL != pval_type ) {
                pb_link = pval_type->value.pb_link;
@@ -213,6 +224,9 @@ int
        pobj_now->info.type.b_bit_offset        = 0;
        pobj_now->info.type.b_endianity         = DW_END_default;
 
+       if( NULL != pval_prototyped )
+               { pobj_now->info.type.b_prototyped      = 0x01; }
+
        return pobj_now->i_id;
 }
 
index f1f81cc..3564566 100644 (file)
@@ -202,6 +202,7 @@ typedef     struct  {
                        Byte    b_bit_size;
                        Byte    b_endianity;
                        Byte    b_addr_class;
+                       Byte    b_prototyped;
                        int             i_objid_type;
                        Byte    *p_dwtype;
                } type;
@@ -225,6 +226,7 @@ typedef     struct  {
 
        int             i_secid;
        int             i_srcid;                // SourceInfo struct ID
+       DWord   dw_srcline;
 
        Byte    b_elf_flags;
        Word    w_secid;                // ==OLD== SectionInfo ItemIndex belong with this object.