/*----------------------------------------------------------------------
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.
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;
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_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
- // UnImplement
+ 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_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_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_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; }
}
// 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;
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;
+ }
+
+ 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 ) {
pobj_parent = pobj_now;
pobj_now->info.function.i_objid_parent = NO_OBJ;
}
}
-/*
- p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
- assert( NULL != p_bfile );
-*/
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 ----------------------------------- */