OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 27 Aug 2019 12:57:40 +0000 (21:57 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 27 Aug 2019 12:57:40 +0000 (21:57 +0900)
  * WorkBackup ( Implementing DWARF_Tag_Type_typedef() func. )

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

index f04dd68..7637bd2 100644 (file)
@@ -100,7 +100,7 @@ DWARF_TagFunction   dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { 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
@@ -117,7 +117,7 @@ DWARF_TagFunction   dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { 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 },
index 951b2e2..2dc8655 100644 (file)
@@ -39,11 +39,7 @@ Comment:
 
 /*----------------------------------------------------------------------
 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
@@ -68,18 +64,15 @@ int
 
 
 /*----------------------------------------------------------------------
-  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,
@@ -94,14 +87,17 @@ int
        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;
 
@@ -118,18 +114,12 @@ int
                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;
@@ -138,44 +128,50 @@ int
        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 );
@@ -191,7 +187,24 @@ int
                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;
index 9ce0394..55e5407 100644 (file)
@@ -51,12 +51,12 @@ 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_Common_type(
+       int DWARF_Tag_Type_typedef(
                                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(
+       int 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 );
index a08f7e9..f1f81cc 100644 (file)
@@ -201,6 +201,7 @@ typedef     struct  {
                        Byte    b_bit_offset;
                        Byte    b_bit_size;
                        Byte    b_endianity;
+                       Byte    b_addr_class;
                        int             i_objid_type;
                        Byte    *p_dwtype;
                } type;