{ DW_TAG_structure_type, DWARF_Tag_Struct_UnImplement }, // 0x13: struct
{ 0x14, NULL },
{ DW_TAG_subroutine_type, DWARF_Tag_Type_UnImplement }, // 0x15: type
-{ DW_TAG_typedef, DWARF_Tag_Type_UnImplement }, // 0x16: type
+{ DW_TAG_typedef, DWARF_Tag_Type_typedef }, // 0x16: type
{ DW_TAG_union_type, DWARF_Tag_Struct_UnImplement }, // 0x17: struct
{ DW_TAG_unspecified_parameters,DWARF_Tag_Parameter_UnImplement }, // 0x18: parameter
{ DW_TAG_variant, DWARF_Tag_Struct_UnImplement }, // 0x19: struct
{ DW_TAG_access_declaration, DWARF_Tag_Class_UnImplement }, // 0x23: class
{ DW_TAG_base_type, DWARF_Tag_Type_base_type }, // 0x24: type
{ DW_TAG_catch_block, DWARF_Tag_Exception_UnImplement }, // 0x25: exception
-{ DW_TAG_const_type, DWARF_Tag_Type_const_type }, // 0x26: type
+{ DW_TAG_const_type, DWARF_Tag_Type_Common_type }, // 0x26: type
{ DW_TAG_constant, DWARF_Tag_Parameter_UnImplement }, // 0x27: parameter
{ DW_TAG_enumerator, DWARF_Tag_Array_UnImplement }, // 0x28: array
{ 0x29, NULL },
/*----------------------------------------------------------------------
DW_TAG_unspecified_type
-DW_TAG_const_type
-DW_TAG_pointer_type
DW_TAG_reference_type
-DW_TAG_restrict_type
-DW_TAG_volatile_type
DW_TAG_typedef
DW_TAG_subroutine_type
DW_TAG_ptr_to_member_type
/*----------------------------------------------------------------------
- DW_TAG_pointer_type
- DW_TAG_volatile_type
- DW_TAG_restrict_type
- DW_TAG_const_type
+ DW_TAG_typedef
DW_AT_type
- DW_AT_name (except DW_TAG_const_type)
- DW_AT_address_class
- DW_AT_count (for UPC lnag. only)
+ DW_AT_name (excepet DW_TAG_const_type)
+ DW_AT_decl_file
+ DW_AT_decl_line
----------------------------------------------------------------------*/
LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
int
- DWARF_Tag_Type_Common_type(
+ DWARF_Tag_Type_typedef(
DWord dw_tag,
LibGoblin_BinaryInfo *p_binfo,
int i_childlv,
LibGoblin_ProgramInfo *p_pginfo;
LibGoblin_DWARF_DIEValue *pval_name;
LibGoblin_DWARF_DIEValue *pval_type;
+ LibGoblin_DWARF_DIEValue *pval_declfile;
+ LibGoblin_DWARF_DIEValue *pval_declline;
// Data Extract
pval_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+ pval_declfile = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
+ pval_declline = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
- if( NULL != pval_type ) {
- pb_link = pval_type->value.pb_link;
- }
+ if( NULL != pval_type )
+ { pb_link = pval_type->value.pb_link; }
i_obj_parent = p_ancestry[i_childlv - 1].i_objid;
return -0x03;
}
+ // XXX: TODO support for DW_AT_decl_file/line --- (2019/08/27)
+
if( NULL != pval_name )
{ pobj_now->pstr_name = pval_name->value.pstr_value; }
- else {
- if( DW_TAG_pointer_type == dw_tag )
- { pobj_now->pstr_name = "*"; }
- else if( DW_TAG_const_type == dw_tag )
- { pobj_now->pstr_name = "const"; }
- else if( DW_TAG_restrict_type == dw_tag )
- { pobj_now->pstr_name = "restrict"; }
- else if( DW_TAG_volatile_type == dw_tag )
- { pobj_now->pstr_name = "volatile"; }
- }
+ else
+ { pobj_now->pstr_name = NULL; }
pobj_now->info.type.i_objid_type = NO_OBJ;
pobj_now->info.type.p_dwtype = pb_link;
pobj_now->info.type.b_bit_size = 0;
pobj_now->info.type.b_bit_offset = 0;
pobj_now->info.type.b_endianity = DW_END_default;
+ pobj_now->info.type.b_addr_class = 0x00;
return pobj_now->i_id;
}
/*----------------------------------------------------------------------
+ DW_TAG_pointer_type
+ DW_TAG_volatile_type
+ DW_TAG_restrict_type
DW_TAG_const_type
DW_AT_type
- DW_AT_name
+ DW_AT_name (except DW_TAG_const_type)
DW_AT_address_class
DW_AT_count (for UPC lnag. only)
----------------------------------------------------------------------*/
LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
int
- DWARF_Tag_Type_const_type(
+ DWARF_Tag_Type_Common_type(
DWord dw_tag,
LibGoblin_BinaryInfo *p_binfo,
int i_childlv,
LibGoblin_DWARF_Info_Ancestry *p_ancestry,
LibGoblin_DWARF_Info_CUHeader *p_cuheader )
{
- Byte *pb_link;
+ Byte *pb_link = NULL;
int i_obj_parent;
PtrValue ptrval_start;
LibGoblin_ObjectInfo *pobj_now;
LibGoblin_ObjectInfo *pobj_parent;
LibGoblin_ProgramInfo *p_pginfo;
+ LibGoblin_DWARF_DIEValue *pval_name;
LibGoblin_DWARF_DIEValue *pval_type;
+ LibGoblin_DWARF_DIEValue *pval_addr_class;
// Data Extract
- pval_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
+ pval_type = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
+ pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+ pval_addr_class = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
- if( NULL == pval_type ) {
- return -0x02;
+ if( NULL != pval_type ) {
+ pb_link = pval_type->value.pb_link;
}
- pb_link = pval_type->value.pb_link;
-
i_obj_parent = p_ancestry[i_childlv - 1].i_objid;
p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
return -0x03;
}
- pobj_now->pstr_name = "const";
+ if( NULL != pval_name )
+ { pobj_now->pstr_name = pval_name->value.pstr_value; }
+ else {
+ if( DW_TAG_pointer_type == dw_tag )
+ { pobj_now->pstr_name = "*"; }
+ else if( DW_TAG_const_type == dw_tag )
+ { pobj_now->pstr_name = "const"; }
+ else if( DW_TAG_restrict_type == dw_tag )
+ { pobj_now->pstr_name = "restrict"; }
+ else if( DW_TAG_volatile_type == dw_tag )
+ { pobj_now->pstr_name = "volatile"; }
+ }
+
+ if( NULL != pval_addr_class )
+ { pobj_now->info.type.b_addr_class = pval_addr_class->value.b_value; }
+ else
+ { pobj_now->info.type.b_addr_class = 0x00; }
+
pobj_now->info.type.i_objid_type = NO_OBJ;
pobj_now->info.type.p_dwtype = pb_link;
pobj_now->info.type.dw_size = 0;