int i_objid;
int i_objfiles;
int i_abbrevs;
+ int i_srcid_objfile;
Byte *pb_info;
Byte *pb_now;
Byte *pb_custart;
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 );
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;
----------------------------------------------------------------------*/
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;
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;
}
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; }
}
// 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 );
printf(" Debug SrcFileTable: %2d > [%2d] %s/%s\n",
i_pos, p_srcfile->i_id, p_srcfile->str_srcpath, p_srcfile->str_filename );
}
-
+*/
return 0x00;
}
{ 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 );
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;
}
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;
p_objinfo->typelink.i_prev_id = NO_OBJ;
p_objinfo->typelink.i_next_id = NO_OBJ;
+ p_objinfo->i_srcid = NO_SRC;
+
return;
}
#ifdef DRD64_SRC_LIBGOBLIN_SRCFILE
#endif
+#define NO_SRC -0x01
+
#define SRCFILE(m,n) ((LibGoblin_SrcFile *)((m)->srcfile.p_srcfile + (n)))
LIBGOBLIN_SRCFILE_EXTERN