int i_pos;
int i_path;
int i_files;
+ int i_result;
Byte b_byte;
Byte *pb_line;
DWord dw_dirindex;
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 );
}
}
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;
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++;
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;
}
/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+#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 *
#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
#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 );
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;