OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 2 Jun 2019 20:30:03 +0000 (05:30 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 2 Jun 2019 20:30:03 +0000 (05:30 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_loadprog.c

index a188017..a73ae0b 100644 (file)
@@ -530,6 +530,69 @@ Byte *
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+int
+       DWARF_Info_RegistSrcFile_fromTagCompileUnit(
+               LibGoblin_BinaryInfo    *p_binfo,
+               LibGoblin_BinaryFile    *p_bfile,
+               Byte                                    *pb_info,
+               DWARF_AbbrevEntry               *p_abbrev,
+               QWord                                   qw_size_cu,
+               LibGoblin_DWARF_Info_CUHeader   *pt_cuheader )
+{
+       int                                                     i_childlv;
+       int                                                     i_cnt;
+       DWord                                           dw_arvid;
+       DWord                                           dw_attribute;
+       DWord                                           dw_format;
+       QWord                                           qw_temp;
+       DWARF_AbbrevEntry                       *p_arvnow;
+       LibGoblin_DWARF_DIEValue        *p_infoval;
+       LibGoblin_DWARF_DIEValue        *p_val;
+
+       assert( NULL != p_binfo );
+       assert( NULL != p_bfile );
+
+       p_infoval       = p_bfile->dwarf.p_infoval;
+       i_childlv       = 0;
+       do      {
+               // Read Reference Abbrev-ID ---
+               pb_info = DWARF_Common_DecodeULEB128( &qw_temp, pb_info, &qw_size_cu );
+               dw_arvid        = (DWord)qw_temp;
+
+               if( 0 == dw_arvid )     {
+                       i_childlv--;
+                       continue;
+               }
+
+               p_arvnow        = p_abbrev + (dw_arvid - 1);
+
+               // Read Debug Information Entry (DIE) ---
+               memset( p_infoval, 0x00, sizeof( LibGoblin_DWARF_DIEValue ) * p_arvnow->i_items );
+               p_val   = p_infoval;
+
+               for( i_cnt = 0; i_cnt < p_arvnow->i_items; i_cnt++, p_val++ )   {
+                       dw_attribute    = p_arvnow->dw_attribute[ i_cnt ];
+                       dw_format               = p_arvnow->dw_format[ i_cnt ];
+
+                       pb_info = DWARF_Info_ReadFormat_Data(
+                                                               p_val, pb_info, &qw_size_cu, dw_format, p_binfo, pt_cuheader );
+               }
+
+               if( 0x00 != p_arvnow->b_children )      { i_childlv++; }
+
+               // Check compile unit tag ---
+               if( DW_TAG_compile_unit == p_arvnow->dw_tag )   { break; }
+
+       }while( 0 != qw_size_cu ); 
+
+       if( DW_TAG_compile_unit != p_arvnow->dw_tag )   { return -0x01; }
+
+       return 0;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
 LIBGOBLIN_DWARF_INFO_EXTERN
 int
        DWARF_Info_Read(
@@ -538,6 +601,7 @@ int
        int                                                     i_childlv;
        int                                                     i_result;
        int                                                     i_srcfiles;
+       int                                                     i_srcid;
        int                                                     i_abbrevs;
        int                                                     i_cnt;
        Byte                                            *pb_info;
@@ -596,6 +660,9 @@ int
                                                                &p_abbrev, &i_abbrevs,
                                                                p_binfo, p_bfile, t_cuheader.qw_abbrev_offset );
 
+               i_srcid = DWARF_Info_RegistSrcFile_fromTagCompileUnit(
+                                                               p_binfo, p_bfile, pb_info, p_abbrev, qw_size_cu, &t_cuheader );
+
                i_childlv       = 0;
                do      {
                        // Read Reference Abbrev-ID ---
index 51a6c65..fd13ffd 100644 (file)
@@ -81,11 +81,13 @@ int
        int             i_result;
        char    str_filename[DRD64_MAX_PATH];
        char    str_localpath[DRD64_MAX_PATH];
+       char    str_temppath[DRD64_MAX_PATH];
        char    *pstr_remotepath;
        LibGoblin_BinaryInfo    *p_binfo;
 
-       strncpy( str_filename, basename( pstr_localfull ), DRD64_MAX_PATH );
-       strncpy( str_localpath, dirname( pstr_localfull ), DRD64_MAX_PATH );
+       strncpy( str_temppath, pstr_localfull, DRD64_MAX_PATH );
+       strncpy( str_filename, basename( str_temppath ), DRD64_MAX_PATH );
+       strncpy( str_localpath, dirname( str_temppath ), DRD64_MAX_PATH );
 
        pstr_remotepath = NULL;
        if( NULL != pstr_remotefull )   {