OSDN Git Service

(LibGoblin)
authorKoine Yuusuke <koinec@users.osdn.me>
Mon, 26 Aug 2019 00:03:54 +0000 (09:03 +0900)
committerKoine Yuusuke <koinec@users.osdn.me>
Mon, 26 Aug 2019 00:03:54 +0000 (09:03 +0900)
  * Implement: DWARF_Tag_Type_pointer_type()

libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h
libgoblin/drd64_libgoblin_dwarf_tag_type.c
libgoblin/drd64_libgoblin_dwarf_tag_type.h

index cd0b73f..b26f561 100644 (file)
@@ -92,7 +92,7 @@ DWARF_TagFunction     dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { 0x0c,                                                        NULL },
 { DW_TAG_member,                               DWARF_Tag_Struct_UnImplement },         // 0x0d: struct
 { 0x0e,                                                        NULL },
-{ DW_TAG_pointer_type,                 DWARF_Tag_Type_UnImplement },           // 0x0f: type
+{ DW_TAG_pointer_type,                 DWARF_Tag_Type_pointer_type },          // 0x0f: type
 
 { DW_TAG_reference_type,               DWARF_Tag_Type_UnImplement },           // 0x10: type
 { DW_TAG_compile_unit,                 DWARF_Tag_CompileUnit_compile_unit },// 0x11: compileunit
index 7401345..b58ddb1 100644 (file)
@@ -68,8 +68,78 @@ int
 
 
 /*----------------------------------------------------------------------
+  DW_TAG_pointer_type
+       DW_AT_type
+       DW_AT_name
+       DW_AT_address_class
+       DW_AT_count             (for UPC lnag. only)
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+int
+       DWARF_Tag_Type_pointer_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;
+       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;
+
+       // Data Extract
+       pval_type       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
+       pval_name       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_nem);
+
+       if( NULL == pval_type ) {
+               return -0x02;
+       }
+
+       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 );
+       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 -0x03;
+       }
+
+       if( NULL != pval_name )
+               { pobj_now->pstr_name   = pval_name->value.pstr_value; }
+       else
+               { pobj_now->pstr_name   = "*"; }
+
+       pobj_now->info.type.i_objid_type        = NO_OBJ;
+       pobj_now->info.type.p_dwtype            = pb_link;
+       pobj_now->info.type.dw_size                     = 0;
+       pobj_now->info.type.b_encoding          = 0x00;
+       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;
+
+       return pobj_now->i_id;
+}
+
+
+/*----------------------------------------------------------------------
   DW_TAG_const_type
        DW_AT_type
+       DW_AT_name
+       DW_AT_address_class
+       DW_AT_count             (for UPC lnag. only)
 ----------------------------------------------------------------------*/
 LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
 int
index dffd8b9..fb3b3fa 100644 (file)
@@ -51,6 +51,11 @@ LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
                                int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,
                                LibGoblin_DWARF_Info_CUHeader *p_cuheader );
 LIBGOBLIN_DWARF_TAG_TYPE_EXTERN
+       int DWARF_Tag_Type_pointer_type(
+                               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_const_type(
                                DWord dw_tag, LibGoblin_BinaryInfo *p_binfo,
                                int i_childlv, LibGoblin_DWARF_Info_Ancestry *p_ancestry,