OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 31 Aug 2019 12:17:02 +0000 (21:17 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sat, 31 Aug 2019 12:17:02 +0000 (21:17 +0900)
  * WorkBackup (Corrected Bug: .debug_line dir/file table to SrcFile )

libgoblin/drd64_libgoblin_dwarf_info.c
libgoblin/drd64_libgoblin_dwarf_line.c
libgoblin/drd64_libgoblin_dwarf_tag_compileunit.c
libgoblin/drd64_libgoblin_dwarf_tag_dispatch.c
libgoblin/drd64_libgoblin_objinfo.c
libgoblin/drd64_libgoblin_srcfile.h

index 4050d4b..222a275 100644 (file)
@@ -149,6 +149,7 @@ int
        int                                                     i_objid;
        int                                                     i_objfiles;
        int                                                     i_abbrevs;
+       int                                                     i_srcid_objfile;
        Byte                                            *pb_info;
        Byte                                            *pb_now;
        Byte                                            *pb_custart;
@@ -185,6 +186,9 @@ int
        qw_size_info    = psec_info->qw_size;
 
        do      {
+               // Init. for Compile Unit ----
+               i_srcid_objfile = NO_SRC;
+
                // Read Compile Unit Header ---
                pb_custart      = pb_info;
                pb_info = DWARF_Info_ReadCUHeader( &t_cuheader, pb_info, &qw_size_info );
@@ -240,8 +244,14 @@ int
                                        p_obj->info.objfile.p_abbrev    = p_abbrev;
                                        memcpy( &(p_obj->info.objfile.t_cuheader), &t_cuheader,
                                                                                        sizeof( LibGoblin_DWARF_Info_CUHeader ) );
+
+                                       i_srcid_objfile         = p_obj->i_srcid;
+                                       assert( NO_SRC != i_srcid_objfile );
                                }
 
+                               if( NO_SRC == p_obj->i_srcid )
+                                       { p_obj->i_srcid        = i_srcid_objfile; }
+
                                i_result        = Index_DWARFInfo_RegistObjectInfo( p_binfo, p_obj, pb_now );
                                if( 0x00 != i_result )  {
                                        return -0x03;
index 52f8334..e4f8531 100644 (file)
@@ -42,13 +42,16 @@ Comment:
 ----------------------------------------------------------------------*/
 char *
        DWARF_Line_GetPath_fromLineHeader(
+               LibGoblin_BinaryFile    *p_bfile,
                Byte    *pb_path,
                DWord   dw_dirindex )
 {
        char    *pstr_path;
 
-       if( 0 == dw_dirindex )
-               { return NULL; }
+       if( 0 == dw_dirindex )  {
+               pstr_path       = p_bfile->str_remotepath;
+               goto    goto_DWARF_Line_GetPath_fromLineHeader_post;
+       }
 
        dw_dirindex--;
        pstr_path       = (char *)pb_path;
@@ -59,9 +62,16 @@ char *
                dw_dirindex--;
        }
 
-       if( '\0' == *pb_path )
-               { pstr_path     = NULL; }
+       if( '\0' == *pb_path )  {
+               pstr_path       = NULL;
+               goto    goto_DWARF_Line_GetPath_fromLineHeader_post;
+       }
+       else if(( '.' == *pb_path ) && ( '\0' == *(pb_path + 1) ))      {
+               pstr_path       = p_bfile->str_remotepath;
+               goto    goto_DWARF_Line_GetPath_fromLineHeader_post;
+       }
 
+goto_DWARF_Line_GetPath_fromLineHeader_post:
        return pstr_path;
 }
 
@@ -262,10 +272,7 @@ int
                if( NULL == pb_line )   { return -0x01; }
                qw_filesize     = qw_qword;
 
-               if( 0 == dw_dirindex )
-                       { pstr_path     = p_bfile->str_remotepath; }
-               else
-                       { pstr_path     = DWARF_Line_GetPath_fromLineHeader( t_linehdr.pb_path, dw_dirindex ); }
+               pstr_path       = DWARF_Line_GetPath_fromLineHeader( p_bfile, t_linehdr.pb_path, dw_dirindex );
 
                p_srcfile       = SrcFile_DispenseSrcFile( p_bfile, str_filename, pstr_path );
                if( NULL == p_srcfile ) { return -0x02; }
@@ -280,6 +287,7 @@ int
        }
 
 // for DEBUG
+/*
        for( i_pos = 0; i_pos < i_files; i_pos++ )      {
                i_result        = SrcFile_GetSrcFileTable_inBinaryInfo( p_binfo, i_pos );
                p_srcfile       = SrcFile_GetSrcFile( p_bfile, i_result );
@@ -287,7 +295,7 @@ int
                printf("  Debug SrcFileTable: %2d > [%2d] %s/%s\n",
                        i_pos, p_srcfile->i_id, p_srcfile->str_srcpath, p_srcfile->str_filename );
        }
-
+*/
 
        return 0x00;
 }
index 898c64b..86c6c36 100644 (file)
@@ -166,7 +166,27 @@ int
                { goto  goto_DWARF_Tag_CompileUnit_compile_unit_post; }
 
 
-       // (Phase2) Regist ObjInfo as ObjFile =========================================
+       // (Phase2) Regist SrcFile from .dwarf_line ===================================
+       SrcFile_ClearSrcFileTable_inBinaryInfo( p_binfo );
+
+       p_srcfile       = SrcFile_DispenseSrcFile( p_bfile, pstr_filename, pstr_path);
+       if( NULL == p_srcfile ) {
+               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
+       }
+
+       i_result        = SrcFile_RegistSrcFileTable_inBinaryInfo( p_binfo, p_srcfile );
+       if( 0x00 != i_result )  {
+               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
+       }
+
+       dw_lineoffset   = pval_linestmt->value.dw_value;
+       i_result                = DWARF_Line_ReadSrcFile( p_binfo, dw_lineoffset );
+       if( 0x00 != i_result )  {
+               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
+       }
+
+
+       // (Phase3) Regist ObjInfo as ObjFile =========================================
        p_pginfo        = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
        assert( NULL != p_pginfo );
 
@@ -187,26 +207,10 @@ int
                else    {
                        p_obj->info.objfile.i_objid_parent      = p_obj_parent->i_id;
                }
+               p_obj->i_srcid  = p_srcfile->i_id;
        }
        i_objid = p_obj_parent->i_id;
 
-
-       // (Phase3) Regist SrcFile from .dwarf_line ===================================
-       SrcFile_ClearSrcFileTable_inBinaryInfo( p_binfo );
-
-       p_srcfile       = SrcFile_DispenseSrcFile( p_bfile, pstr_filename, pstr_path);
-       if( NULL == p_srcfile ) {
-               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
-       }
-
-       i_result        = SrcFile_RegistSrcFileTable_inBinaryInfo( p_binfo, p_srcfile );
-       if( 0x00 != i_result )  {
-               goto    goto_DWARF_Tag_CompileUnit_compile_unit_post;
-       }
-
-       dw_lineoffset   = pval_linestmt->value.dw_value;
-       i_result                = DWARF_Line_ReadSrcFile( p_binfo, dw_lineoffset );
-
 goto_DWARF_Tag_CompileUnit_compile_unit_post:
        return i_objid;
 }
index 78a91fc..405ed48 100644 (file)
@@ -72,6 +72,7 @@ int
                                        DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
                                        int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
                                        LibGoblin_DWARF_Info_CUHeader *p_cuheader );
+       LibGoblin_ObjectInfo    *pobj_now;
 
        DWARF_Tag_Proc  = NULL;
        dw_tag                  = p_abbrev->dw_tag;
index 6a46238..4ec9c01 100644 (file)
@@ -133,6 +133,8 @@ void
        p_objinfo->typelink.i_prev_id           = NO_OBJ;
        p_objinfo->typelink.i_next_id           = NO_OBJ;
 
+       p_objinfo->i_srcid                                      = NO_SRC;
+
        return;
 }
 
index 3dd3b01..af14721 100644 (file)
@@ -56,6 +56,8 @@ Comment:
 #ifdef DRD64_SRC_LIBGOBLIN_SRCFILE
 #endif
 
+#define        NO_SRC  -0x01
+
 #define        SRCFILE(m,n)    ((LibGoblin_SrcFile *)((m)->srcfile.p_srcfile + (n)))
 
 LIBGOBLIN_SRCFILE_EXTERN