From 8968f5863e86a387df15ab80e286ad82643ebcd9 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Wed, 21 Aug 2019 14:10:31 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup --- libgoblin/drd64_libgoblin_dwarf_line.c | 31 +++++++++---- libgoblin/drd64_libgoblin_srcfile.c | 80 ++++++++++++++++++++++++++++++++++ libgoblin/drd64_libgoblin_srcfile.h | 13 +++++- libgoblin/drd64_libgoblin_type.h | 3 +- 4 files changed, 115 insertions(+), 12 deletions(-) diff --git a/libgoblin/drd64_libgoblin_dwarf_line.c b/libgoblin/drd64_libgoblin_dwarf_line.c index b74f3cd..9762b64 100644 --- a/libgoblin/drd64_libgoblin_dwarf_line.c +++ b/libgoblin/drd64_libgoblin_dwarf_line.c @@ -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; } diff --git a/libgoblin/drd64_libgoblin_srcfile.c b/libgoblin/drd64_libgoblin_srcfile.c index f2c5187..df3283a 100644 --- a/libgoblin/drd64_libgoblin_srcfile.c +++ b/libgoblin/drd64_libgoblin_srcfile.c @@ -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 * diff --git a/libgoblin/drd64_libgoblin_srcfile.h b/libgoblin/drd64_libgoblin_srcfile.h index 0b3147e..c2c1cc5 100644 --- a/libgoblin/drd64_libgoblin_srcfile.h +++ b/libgoblin/drd64_libgoblin_srcfile.h @@ -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 ); diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index c40c244..7a078c7 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -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; -- 2.11.0