/*----------------------------------------------------------------------
DW_TAG_subprogram
- (Not Used)
DW_AT_name
DW_AT_decl_file
DW_AT_decl_line
-
- DW_AT_prototyped
- DW_AT_inline
- DW_AT_external
-
DW_AT_low_pc
DW_AT_high_pc
DW_AT_ranges
- DW_AT_entry_pc
- DW_AT_segment & DW_AT_address_class
+ DW_AT_type
+ DW_AT_prototyped
+ DW_AT_inline
+ DW_AT_external
DW_AT_return_addr
DW_AT_frame_base
DW_AT_static_link
- DW_AT_type
DW_AT_calling_convention
+
+ // UnImplement
+ DW_AT_entry_pc // for OBJ-file
+ DW_AT_segment & DW_AT_address_class // for IA-32(segment)
DW_AT_elemental // for FORTRAN only.
DW_AT_pure // for FORTRAN only.
DW_AT_recursive // for FORTRAN only.
int i_result;
int i_cnt;
+ int i_srcid = NO_SRC;
int i_objid = NO_OBJ;
int i_objid_parent = NO_OBJ;
char *pstr_filepath = NULL;
- char *pstr_path = NULL;
+ char *pstr_path = NULL;
char *pstr_filename;
char str_filename[DRD64_MAX_PATH+1];
char str_path[DRD64_MAX_PATH+1];
+ Byte *pb_link = NULL;
+ DWord dw_srcline = 0;
DWord dw_lineoffset;
QWord qw_low_pc;
QWord qw_high_pc;
LibGoblin_BinaryFile *p_bfile;
LibGoblin_ProgramInfo *p_pginfo;
LibGoblin_ObjectInfo *pobj_parent;
- LibGoblin_ObjectInfo *p_obj;
+ LibGoblin_ObjectInfo *pobj_now;
LibGoblin_DWARF_Ranges t_ranges;
LibGoblin_DWARF_DIEValue *pval_name;
LibGoblin_DWARF_DIEValue *pval_declfile;
LibGoblin_DWARF_DIEValue *pval_declline;
- LibGoblin_DWARF_DIEValue *pval_prototyped;
- LibGoblin_DWARF_DIEValue *pval_inline;
- LibGoblin_DWARF_DIEValue *pval_external;
+ LibGoblin_DWARF_DIEValue *pval_prototyped; // flag
+ LibGoblin_DWARF_DIEValue *pval_inline; // constant - DW_INL_xxx
+ LibGoblin_DWARF_DIEValue *pval_external; // flag
LibGoblin_DWARF_DIEValue *pval_lowpc;
LibGoblin_DWARF_DIEValue *pval_highpc;
LibGoblin_DWARF_DIEValue *pval_ranges;
assert( NULL != p_binfo );
- pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
- pval_lowpc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
- pval_highpc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
- pval_ranges = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
- pval_inline = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
- pval_declfile = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
- pval_declline = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
- pval_prototyped = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
- pval_external = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
- pval_entry_pc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
- pval_segment = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
- pval_addr_class = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
- pval_return_addr = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
+ pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+ pval_lowpc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
+ pval_highpc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
+ pval_ranges = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
+ pval_declfile = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
+ pval_declline = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
+ pval_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
+ pval_inline = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
+ pval_prototyped = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
+ pval_external = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
pval_frame_base = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_frame_base );
+ pval_return_addr = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
pval_static_link = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_static_link );
- pval_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
pval_calling_convention = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_calling_convention );
+ // UnImplement
+ pval_entry_pc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
+ pval_segment = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
+ pval_addr_class = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
if( NULL == pval_name )
{ goto goto_DWARF_Tag_Function_subprogram_post; }
- //if( NULL != pval_name ) { pstr_filepath = pval_name->value.pstr_value; }
p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
assert( NULL != p_pginfo );
}
// Pattern D ---
else {
- if( NULL == pval_inline )
- { goto goto_DWARF_Tag_Function_subprogram_post; }
-
t_ranges.i_ranges = 1;
t_ranges.ptr_low[0].value = (PtrValue)pobj_parent->addr.ptr_addr.value;
t_ranges.ptr_high[0].value = (PtrValue)pobj_parent->addr.ptr_addr.value;
}
-
-/*
- p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
- assert( NULL != p_bfile );
-
- // (Phase1) Data Extract from .debug_info ===============================
-
- // Data Extract (location)--- [MUST]
- pval_lowpc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
- pval_highpc = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
- pval_ranges = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
-
-
- // Data Extract (stmt_list)---
- pval_linestmt = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_stmt_list );
- if( NULL == pval_linestmt )
- { goto goto_DWARF_Tag_CompileUnit_compile_unit_post; }
-
-
- // (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;
+ if( NULL != pval_declfile ) {
+ DWARF_AttrForm_ExtensionDIEValue( pval_declfile );
+ i_srcid = SrcFile_GetSrcFileTable_inBinaryInfo(
+ p_binfo, (int)pval_declfile->value.qw_value );
}
- 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;
+ if( NULL != pval_declline ) {
+ DWARF_AttrForm_ExtensionDIEValue( pval_declline );
+ dw_srcline = (DWord)pval_declline->value.qw_value;
}
+ if( NULL != pval_type )
+ { pb_link = pval_type->value.pb_link; }
- // (Phase3) Regist ObjInfo as ObjFile =========================================
+ // Inset & Regist. ObjectInfo ------------------------------------
for( i_cnt = 0; i_cnt < t_ranges.i_ranges; i_cnt++ ) {
- p_obj = ObjectInfo_InsetObject(
- p_pginfo, t_ranges.ptr_low[i_cnt].value,
- (QWord)(t_ranges.ptr_high[i_cnt].value - t_ranges.ptr_low[i_cnt].value),
- NULL, OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_ADOPT,
- OBJINFO_TYPE_OBJFILE );
+ pobj_now = ObjectInfo_InsetObject(
+ p_pginfo, t_ranges.ptr_low[i_cnt].value,
+ (QWord)(t_ranges.ptr_high[i_cnt].value - t_ranges.ptr_low[i_cnt].value),
+ NULL,
+ OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_CHKNAME,
+ OBJINFO_TYPE_FUNCTION, pval_name->value.pstr_value );
+
+ pobj_now->i_srcid = i_srcid;
+ pobj_now->dw_srcline = dw_srcline;
+ pobj_now->dwarf.i_objid_type = NO_OBJ;
+ pobj_now->dwarf.pb_dwinfo_type = pb_link;
+
+ pobj_now->info.function.flag.external = ((NULL != pval_external) ? 1 : 0 );
+ pobj_now->info.function.flag.prototyped = ((NULL != pval_prototyped) ? 1 : 0 );
+
+ pobj_now->info.function.b_convention = ((NULL != pval_calling_convention)
+ ? pval_calling_convention->value.b_value
+ : DW_CC_normal );
+
+ if( NULL != pval_frame_base ) {
+ pobj_now->info.function.dw_sz_frame_base = (DWord)pval_frame_base->qw_size;
+ pobj_now->info.function.pb_frame_base = pval_frame_base->value.pb_data;
+ }
- p_obj->pstr_name = pval_name->value.pstr_value;
- p_obj->dw_hash = Common_CalcDJBhash( pval_name->value.pstr_value );
+ if( NULL != pval_return_addr ) {
+ pobj_now->info.function.dw_sz_return_addr = (DWord)pval_return_addr->qw_size;
+ pobj_now->info.function.pb_return_addr = pval_return_addr->value.pb_data;
+ }
+
+ if( NULL != pval_static_link ) {
+ pobj_now->info.function.dw_sz_static_link = (DWord)pval_static_link->qw_size;
+ pobj_now->info.function.pb_static_link = pval_static_link->value.pb_data;
+ }
+
+ if( NULL != pval_inline ) {
+ if(( DW_INL_inlined == pval_inline->value.b_value )
+ || ( DW_INL_declared_inlined == pval_inline->value.b_value ))
+ { pobj_now->info.function.flag.inlined = 1; }
+
+ if(( DW_INL_declared_not_inlined == pval_inline->value.b_value )
+ || ( DW_INL_declared_inlined == pval_inline->value.b_value ))
+ { pobj_now->info.function.flag.inline_def = 1; }
+ }
if( 0 == i_cnt ) {
- p_obj_parent = p_obj;
- p_obj->info.objfile.i_objid_parent = NO_OBJ;
+ pobj_parent = pobj_now;
+ pobj_now->info.function.i_objid_parent = NO_OBJ;
}
else {
- p_obj->info.objfile.i_objid_parent = p_obj_parent->i_id;
+ pobj_now->info.function.i_objid_parent = pobj_parent->i_id;
}
- p_obj->i_srcid = p_srcfile->i_id;
}
- i_objid = p_obj_parent->i_id;
-
-goto_DWARF_Tag_CompileUnit_compile_unit_post:
-*/
goto_DWARF_Tag_Function_subprogram_post:
- printf( " UnImplement DW_TAG_subprogram: %s [%02xh]\n",
- Debug_DWARF_GetTAGname( dw_tag ), dw_tag );
- return NO_OBJ;
+ return i_objid_parent;
}
-
-
/* EOF of drd64_.c ----------------------------------- */