"PROGHDR", // 0x03
"SECTION", // 0x04
"OBJFILE", // 0x05
- "FUNCTION", // 0x06
- "OBJECT", // 0x07
-
- "COMMON", // 0x08
- "TLS", // 0x09
- "REL", // 0x0a
- "", // 0x0b
- "", // 0x0c
+ "TYPE:MUL", // 0x06
+ "TYPE:SIG", // 0x07
+
+ "FUNCTION", // 0x08
+ "OBJECT", // 0x09
+ "COMMON", // 0x0a
+ "TLS", // 0x0b
+ "REL", // 0x0d
"", // 0x0d
- "TYPE(SIG)", // 0x0e
- "TYPE(MUL)", // 0x0f
+ "", // 0x0e
+ "", // 0x0f
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
return;
}
+/*--------------------------------------------------------------------*/
+void
+ Debug_ObjectInfo_Print_Type_Single(
+ LibGoblin_ObjectInfo *p_obj,
+ char *pstr_space,
+ Byte b_level )
+{
+ printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n",
+ pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id );
+ printf(" %s\t\t[TYPE(Single)] size= %u, encoding= %xh\n",
+ pstr_space, p_obj->info.type.dw_size, p_obj->info.type.b_encoding );
+
+ return;
+}
+
+/*--------------------------------------------------------------------*/
+void
+ Debug_ObjectInfo_Print_Type_Multi(
+ LibGoblin_ObjectInfo *p_obj,
+ char *pstr_space,
+ Byte b_level )
+{
+ printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n",
+ pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id );
+
+ return;
+}
/*====================================================================*/
/*--------------------------------------------------------------------*/
Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level );
break;
+ case OBJINFO_TYPE_TYPE_SINGLE:
+ Debug_ObjectInfo_Print_Type_Single( p_obj, pstr_space, b_level );
+ break;
+
+ case OBJINFO_TYPE_TYPE_MULTI:
+ Debug_ObjectInfo_Print_Type_Multi( p_obj, pstr_space, b_level );
+ break;
+
case OBJINFO_TYPE_FUNCTION:
Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level );
break;
}
t_ancestry[i_childlv].pb_dwinfo = pb_now;
- t_ancestry[i_childlv].i_objid = i_result;
+ t_ancestry[i_childlv].i_objid = i_objid;
Debug_DWARF_PrintDIE( p_binfo, p_abbrev, dw_arvid, i_childlv );
{ DW_TAG_subrange_type, DWARF_Tag_Array_UnImplement }, // 0x21: array
{ DW_TAG_with_stmt, DWARF_Tag_NotClang_UnImplement }, // 0x22: notclang
{ DW_TAG_access_declaration, DWARF_Tag_Class_UnImplement }, // 0x23: class
-{ DW_TAG_base_type, DWARF_Tag_Type_UnImplement }, // 0x24: type
+{ 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_UnImplement }, // 0x26: type
{ DW_TAG_constant, DWARF_Tag_Parameter_UnImplement }, // 0x27: parameter
#include"drd64_libgoblin.h"
/*----------------------------------------------------------------------
-DW_TAG_base_type
DW_TAG_unspecified_type
DW_TAG_const_type
DW_TAG_pointer_type
return 0x00;
}
+
/*----------------------------------------------------------------------
+ DW_TAG_base_type
+ DW_AT_name
+ DW_AT_encoding
+ DW_AT_byte_size
----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+int
+ DWARF_Tag_Type_base_type(
+ DWord dw_tag,
+ LibGoblin_BinaryInfo *p_binfo,
+ int i_childlv,
+ LibGoblin_DWARF_Info_Ancestry *p_ancestry,
+ LibGoblin_DWARF_Info_CUHeader *p_cuheader )
+{
+ 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_byte_size;
+ LibGoblin_DWARF_DIEValue *pval_encoding;
+
+ // Data Extract
+ pval_name = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_name );
+ pval_byte_size = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_byte_size );
+ pval_encoding = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_encoding );
+
+ i_obj_parent = p_ancestry[i_childlv - 1].i_objid;
+
+ p_pginfo = ProgInfo_GetProgInfo( p_binfo->i_pginfo );
+ assert( NULL != p_pginfo );
+
+ pobj_parent = ObjectInfo_GetObjectInfo( p_pginfo, i_obj_parent );
+ ptrval_start = pobj_parent->addr.ptr_addr.value;
+
+ pobj_now = ObjectInfo_InsetObject(
+ p_pginfo, ptrval_start, (QWord)0, pobj_parent,
+ OBJINFO_INSETMODE_ADOPT, OBJINFO_TYPE_TYPE_SINGLE );
+ if( NULL == pobj_now ) {
+ return NO_OBJ;
+ }
+
+ pobj_now->pstr_name = pval_name->value.pstr_value;
+ pobj_now->info.type.dw_size = (DWord)pval_byte_size->value.b_value;
+ pobj_now->info.type.b_encoding = pval_encoding->value.b_value;
+
+ return pobj_now->i_id;
+}
+
DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
LibGoblin_DWARF_Info_CUHeader *p_cuheader );
+LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+ int DWARF_Tag_Type_base_type(
+ DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
+ int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
+ LibGoblin_DWARF_Info_CUHeader *p_cuheader );
#endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
&& ( ptr_value < (p_objnow->addr.ptr_addr.value + p_objnow->addr.qw_size)) )) {
if(( ptr_value == p_objnow->addr.ptr_addr.value )
- && ( qw_size == p_objnow->addr.qw_size )) {
+ && ( qw_size <= p_objnow->addr.qw_size )) {
if( b_type >= p_objnow->b_type ) {
if( p_objnow->addr.qw_size <= p_objover->addr.qw_size )
{ p_objover = p_objnow; }
if( ptr_value == p_objnow->addr.ptr_addr.value ) {
if( qw_size > p_objnow->addr.qw_size )
{ break; }
- else if( qw_size == p_objnow->addr.qw_size ) {
+ else if( qw_size <= p_objnow->addr.qw_size ) {
if( b_type < p_objnow->b_type ) { break; }
}
}
if( ptr_value == p_objnow->addr.ptr_addr.value ) {
if( qw_size > p_objnow->addr.qw_size )
{ break; }
- else if( qw_size == p_objnow->addr.qw_size ) {
+ else if( qw_size <= p_objnow->addr.qw_size ) {
if( b_type < p_objnow->b_type ) { break; }
}
}
#define OBJINFO_TYPE_PROGHDR 0x03
#define OBJINFO_TYPE_SECTION 0x04
#define OBJINFO_TYPE_OBJFILE 0x05
-#define OBJINFO_TYPE_FUNCTION 0x06
-#define OBJINFO_TYPE_OBJECT 0x07
-#define OBJINFO_TYPE_COMMON 0x08
-#define OBJINFO_TYPE_TLS 0x09
-#define OBJINFO_TYPE_REL 0x0a
-#define OBJINFO_TYPE_TYPE_SINGLE 0x0e
-#define OBJINFO_TYPE_TYPE_MULTI 0x0f
+#define OBJINFO_TYPE_TYPE_MULTI 0x06
+#define OBJINFO_TYPE_TYPE_SINGLE 0x07
+#define OBJINFO_TYPE_FUNCTION 0x08
+#define OBJINFO_TYPE_OBJECT 0x09
+#define OBJINFO_TYPE_COMMON 0x0a
+#define OBJINFO_TYPE_TLS 0x0b
+#define OBJINFO_TYPE_REL 0x0c
#define OBJINFO_TYPE_NONE 0x7f
typedef struct {
struct {
DWord dw_size;
+ Byte b_encoding;
LibGoblin_ObjInfo_Link t_link;
} type;