OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 22 Oct 2019 12:31:02 +0000 (21:31 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 22 Oct 2019 12:31:02 +0000 (21:31 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_tag_dispatch.h
libgoblin/drd64_libgoblin_dwarf_tag_function.c
libgoblin/drd64_libgoblin_dwarf_tag_struct.c
libgoblin/drd64_libgoblin_type.h

index e671ffb..e5a2198 100644 (file)
@@ -80,7 +80,7 @@ DWARF_TagFunction     dwarf_tag[LIBGOBLIN_DWARF_TAG_MAX]      = {
 { 0x00,                                                        NULL },
 { DW_TAG_array_type,                   DWARF_Tag_Array_UnImplement },          // 0x01: array
 { DW_TAG_class_type,                   DWARF_Tag_Class_UnImplement },          // 0x02: class
-{ DW_TAG_entry_point,                  DWARF_Tag_NotClang_UnImplement },       // 0x03: notclang
+{ DW_TAG_entry_point,                  DWARF_Tag_Function_subprogram },        // 0x03: notclang
 { DW_TAG_enumeration_type,             DWARF_Tag_Array_UnImplement },          // 0x04: array
 { DW_TAG_formal_parameter,             DWARF_Tag_Parameter_UnImplement },      // 0x05: parameter
 { 0x06,                                                        NULL },
index ddeabc8..ff6921e 100644 (file)
@@ -38,7 +38,6 @@ Comment:
 #include"drd64_libgoblin.h"
 
 /*----------------------------------------------------------------------
-DW_TAG_inlined_subroutine
 DW_TAG_lexical_block
 DW_TAG_label
 ----------------------------------------------------------------------*/
@@ -62,6 +61,8 @@ int
 
 /*----------------------------------------------------------------------
   DW_TAG_subprogram
+  DW_TAG_inlined_subroutine
+  DW_TAG_entry_point
       DW_AT_name
       DW_AT_decl_file
       DW_AT_decl_line
@@ -219,6 +220,7 @@ int
                pobj_now->dwarf.i_objid_type    = NO_OBJ;
                pobj_now->dwarf.pb_dwinfo_type  = pb_link;
 
+               pobj_now->info.function.dw_functype             = dw_tag;
                pobj_now->info.function.flag.external   = ((NULL != pval_external) ? 1 : 0 );
                pobj_now->info.function.flag.prototyped = ((NULL != pval_prototyped) ? 1 : 0 );
 
index f8dfdf3..cc9609e 100644 (file)
@@ -61,9 +61,104 @@ int
        return NO_OBJ;
 }
 
+
 /*----------------------------------------------------------------------
+  DW_TAG_structure_type
+       DW_AT_name
+       DW_AT_decl_file
+       DW_AT_decl_line
+       DW_AT_byte_size
+
+       DW_AT_type
+       DW_AT_declaration
+       DW_AT_specification
+       DW_AT_start_scope
+       DW_AT_accessibility
+       DW_AT_mutable
+       DW_AT_data_member_location
+       DW_AT_byte_size
+       DW_AT_bit_offset
+       DW_AT_bit_size
 ----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_TAG_STRUCT_EXTERN
+int
+       DWARF_Tag_Struct_typedef(
+               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        = 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_declfile;
+       LibGoblin_DWARF_DIEValue        *pval_declline;
+       LibGoblin_DWARF_DIEValue        *pval_byte_size;
+
+       // 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 );
+       pval_byte_size  = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_byte_size );
+
 
+       if( NULL != pval_type )
+               { 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_TYPEDEF, NULL );
+       if( NULL == pobj_now )  {
+               return -0x03;
+       }
+
+       if( NULL != pval_declfile )     {
+               DWARF_AttrForm_ExtensionDIEValue( pval_declfile );
+               pobj_now->i_srcid       = SrcFile_GetSrcFileTable_inBinaryInfo(
+                                                                       p_binfo, (int)pval_declfile->value.qw_value );
+       }
+
+       if( NULL != pval_declline )     {
+               DWARF_AttrForm_ExtensionDIEValue( pval_declline );
+               pobj_now->dw_srcline    = (DWord)pval_declline->value.qw_value;
+       }
+
+       if( NULL != pval_name )
+               { pobj_now->pstr_name   = pval_name->value.pstr_value; }
+       else
+               { pobj_now->pstr_name   = NULL; }
+
+       pobj_now->dwarf.i_objid_type            = NO_OBJ;
+       pobj_now->dwarf.pb_dwinfo_type          = 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;
+       pobj_now->info.type.b_addr_class        = 0x00;
+       pobj_now->info.type.dw_size                     = (DWord)pval_byte_size->value.b_value;
+
+       return pobj_now->i_id;
+*/
+
+       return NO_OBJ;
+}
 
 
 /* EOF of drd64_.c ----------------------------------- */
index 65b641b..49b5043 100644 (file)
@@ -200,6 +200,7 @@ typedef     struct  {
                } type;
 
                struct  {
+                       DWord   dw_functype;            // for DW_TAG_xxx
                        int             i_objid_master;
 
                        DWord   dw_sz_frame_base;