OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 21 Aug 2019 05:10:31 +0000 (14:10 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Wed, 21 Aug 2019 05:10:31 +0000 (14:10 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_line.c
libgoblin/drd64_libgoblin_srcfile.c
libgoblin/drd64_libgoblin_srcfile.h
libgoblin/drd64_libgoblin_type.h

index b74f3cd..9762b64 100644 (file)
@@ -262,6 +262,7 @@ int
        int             i_pos;
        int             i_path;
        int             i_files;
+       int             i_result;
        Byte    b_byte;
        Byte    *pb_line;
        DWord   dw_dirindex;
@@ -271,9 +272,10 @@ int
        QWord   qw_remain;
        char    *pstr_path;
        char    str_filename[DRD64_MAX_PATH + 1];
-       LibGoblin_SectionInfo   *psec_line;
-       LibGoblin_DWARF_Line_Header             t_linehdr;
-       LibGoblin_BinaryFile    *p_bfile;
+       LibGoblin_SectionInfo           *psec_line;
+       LibGoblin_DWARF_Line_Header     t_linehdr;
+       LibGoblin_BinaryFile            *p_bfile;
+       LibGoblin_SrcFile                       *p_srcfile;
 
        psec_line       = Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_LINE );
        assert( NULL != psec_line );
@@ -306,14 +308,15 @@ int
                }
        }
        t_linehdr.i_path        = i_path;
-       //printf("  path nums: %d\n", t_linehdr.i_path );
 
 
        // (Phase3) Read FileName Section in .debug_line Header ===========
        if( 1 > qw_remain-- )   { return -0x01; }
        b_byte  = *pb_line++;
 
-       i_files = 0;
+       SrcFile_ClearSrcFileTable_inBinaryInfo( p_binfo );
+
+       i_files = 1;
        while( '\0' != b_byte)  {
                // Read FileName ---
                i_pos   = 0;
@@ -344,10 +347,11 @@ int
                else
                        { pstr_path     = DWARF_Line_GetPath_fromLineHeader( t_linehdr.pb_path, dw_dirindex ); }
 
-/*
-               printf("    SrcFile[%2d] %30s  Dir.Index: %d  Date: %ld  Size: %ld  Path: %s\n", 
-                                               i_files, str_filename, dw_dirindex, qw_date, qw_filesize, pstr_path );
-*/
+               p_srcfile       = SrcFile_DispenseSrcFile( p_bfile, str_filename, pstr_path );
+               if( NULL == p_srcfile ) { return -0x02; }
+
+               i_result        = SrcFile_RegistSrcFileTable_inBinaryInfo( p_binfo, p_srcfile, i_files );
+               if( 0x00 != i_result )  { return -0x03; }
 
                i_files++;
 
@@ -355,6 +359,15 @@ int
                b_byte  = *pb_line++;
        }
 
+/* for DEBUG
+       for( i_pos = 1; i_pos < i_files; i_pos++ )      {
+               i_result        = SrcFile_GetSrcFileTable_inBinaryInfo( p_binfo, i_pos );
+               p_srcfile       = SrcFile_GetSrcFile( p_bfile, i_result );
+
+               printf("  debug: %d > %s/%s\n", i_pos, p_srcfile->str_srcpath, p_srcfile->str_filename );
+       }
+*/
+
        return 0x00;
 }
 
index f2c5187..df3283a 100644 (file)
@@ -44,6 +44,86 @@ Comment:
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+#define        FUNCID_LibGoblin_SrcFile_GetSrcFileTable_inBinaryInfo   0x32
+LIBGOBLIN_SRCFILE_EXTERN
+int
+       SrcFile_GetSrcFileTable_inBinaryInfo(
+                       LibGoblin_BinaryInfo    *p_binfo,
+                       int             i_dwline_index )
+{
+       int     i_srcid;
+
+       assert( NULL != p_binfo );
+
+       if( 0 == i_dwline_index )       { return -0x01; }
+
+       i_srcid = *(p_binfo->dwarf.pi_srctbl + (i_dwline_index - 1));
+
+       return i_srcid;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+#define        FUNCID_LibGoblin_SrcFile_RegistSrcFileTable_inBinaryInfo        0x31
+LIBGOBLIN_SRCFILE_EXTERN
+int
+       SrcFile_RegistSrcFileTable_inBinaryInfo(
+                       LibGoblin_BinaryInfo    *p_binfo,
+                       LibGoblin_SrcFile               *p_srcfile,
+                       int             i_dwline_index )
+{
+       int             *pi_srctbl      = NULL;
+       int             i_alloc;
+
+       assert( NULL != p_binfo );
+
+       if( 0 == i_dwline_index )       { return -0x01; }
+
+       if(( NULL == p_binfo->dwarf.pi_srctbl )
+                       && ( 0 == p_binfo->dwarf.i_alloc_srctbl ))      {
+               i_alloc = LIBGOBLIN_SRCFILE_SRCTBL_UNITS;
+               pi_srctbl       = (int *)malloc( sizeof(int) * i_alloc);
+       }
+       else if( p_binfo->dwarf.i_max_srctbl == p_binfo->dwarf.i_alloc_srctbl ) {
+               i_alloc = p_binfo->dwarf.i_alloc_srctbl + LIBGOBLIN_SRCFILE_SRCTBL_UNITS;
+               pi_srctbl       = (int *)realloc( p_binfo->dwarf.pi_srctbl, sizeof(int) * i_alloc );
+       }
+       else
+               { pi_srctbl     = p_binfo->dwarf.pi_srctbl; }
+
+       if( NULL == pi_srctbl ) {
+               return -0x02;
+       }
+
+       p_binfo->dwarf.i_alloc_srctbl   = i_alloc;
+       p_binfo->dwarf.pi_srctbl                = pi_srctbl;
+
+       *(pi_srctbl + (i_dwline_index - 1))     = p_srcfile->i_id;
+       p_binfo->dwarf.i_max_srctbl++;
+
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+#define        FUNCID_LibGoblin_SrcFile_ClearSrcFileTable_inBinaryInfo 0x32
+LIBGOBLIN_SRCFILE_EXTERN
+int
+       SrcFile_ClearSrcFileTable_inBinaryInfo(
+                       LibGoblin_BinaryInfo    *p_binfo )
+{
+       assert( NULL != p_binfo );
+
+       p_binfo->dwarf.i_max_srctbl     = 0;
+
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
 #define        FUNCID_LibGoblin_SrcFile_GetSrcFile     0x14
 LIBGOBLIN_SRCFILE_EXTERN
 LibGoblin_SrcFile      *
index 0b3147e..c2c1cc5 100644 (file)
@@ -49,8 +49,9 @@ Comment:
        #define LIBGOBLIN_SRCFILE_INTERNALFUNC
 #endif
 
-#define LIBGOBLIN_SRCFILE_UNITS                128
-#define LIBGOBLIN_SRCFILE_MAX_BINFO    128
+#define LIBGOBLIN_SRCFILE_UNITS                        128
+#define LIBGOBLIN_SRCFILE_MAX_BINFO            128
+#define        LIBGOBLIN_SRCFILE_SRCTBL_UNITS  64
 
 #ifdef DRD64_SRC_LIBGOBLIN_SRCFILE
 #endif
@@ -58,6 +59,14 @@ Comment:
 #define        SRCFILE(m,n)    ((LibGoblin_SrcFile *)((m)->srcfile.p_srcfile + (n)))
 
 LIBGOBLIN_SRCFILE_EXTERN
+       int SrcFile_GetSrcFileTable_inBinaryInfo( LibGoblin_BinaryInfo *p_binfo, int i_dwline_index );
+LIBGOBLIN_SRCFILE_EXTERN
+       int SrcFile_RegistSrcFileTable_inBinaryInfo(
+                       LibGoblin_BinaryInfo *p_binfo, LibGoblin_SrcFile *p_srcfile, int i_dwline_index );
+LIBGOBLIN_SRCFILE_EXTERN
+       int SrcFile_ClearSrcFileTable_inBinaryInfo( LibGoblin_BinaryInfo *p_binfo );
+
+LIBGOBLIN_SRCFILE_EXTERN
        LibGoblin_SrcFile *SrcFile_GetSrcFile( LibGoblin_BinaryFile *p_bfile, int i_srcid );
 LIBGOBLIN_SRCFILE_EXTERN
        LibGoblin_SrcFile *SrcFile_AllocSrcFile( LibGoblin_BinaryFile *p_bfile );
index c40c244..7a078c7 100644 (file)
@@ -404,7 +404,8 @@ typedef struct      {
                int                                                     i_extattrs;
                LibGoblin_DWARF_Attribute       t_attr[LIBGOBLIN_DWARF_ATTR_MAX+1];
 
-               int                                                     i_max_srcfiles;
+               int                                                     i_alloc_srctbl;
+               int                                                     i_max_srctbl;
                int                                                     *pi_srctbl; 
        } dwarf;