OSDN Git Service

(LibGoblin)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 20 Oct 2019 12:25:06 +0000 (21:25 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Sun, 20 Oct 2019 12:25:06 +0000 (21:25 +0900)
  * WorkBackup

libgoblin/drd64_libgoblin_dwarf_tag_function.c
libgoblin/drd64_libgoblin_elf_symtab.c
libgoblin/drd64_libgoblin_type.h

index ab7ee87..636a08c 100644 (file)
@@ -62,25 +62,24 @@ int
 
 /*----------------------------------------------------------------------
   DW_TAG_subprogram
-    (Not Used)
       DW_AT_name
       DW_AT_decl_file
       DW_AT_decl_line
-
-      DW_AT_prototyped
-      DW_AT_inline
-      DW_AT_external
-
       DW_AT_low_pc
       DW_AT_high_pc
       DW_AT_ranges
-      DW_AT_entry_pc
-      DW_AT_segment & DW_AT_address_class
+      DW_AT_type
+      DW_AT_prototyped
+      DW_AT_inline
+      DW_AT_external
       DW_AT_return_addr
       DW_AT_frame_base
       DW_AT_static_link
-      DW_AT_type
       DW_AT_calling_convention
+
+       // UnImplement
+      DW_AT_entry_pc   // for OBJ-file
+      DW_AT_segment & DW_AT_address_class      // for IA-32(segment)
       DW_AT_elemental   // for FORTRAN only.
       DW_AT_pure        // for FORTRAN only.
       DW_AT_recursive   // for FORTRAN only.
@@ -121,9 +120,9 @@ int
        LibGoblin_DWARF_DIEValue        *pval_name;
        LibGoblin_DWARF_DIEValue        *pval_declfile;
        LibGoblin_DWARF_DIEValue        *pval_declline;
-       LibGoblin_DWARF_DIEValue        *pval_prototyped;
-       LibGoblin_DWARF_DIEValue        *pval_inline;
-       LibGoblin_DWARF_DIEValue        *pval_external;
+       LibGoblin_DWARF_DIEValue        *pval_prototyped;       // flag
+       LibGoblin_DWARF_DIEValue        *pval_inline;           // constant - DW_INL_xxx
+       LibGoblin_DWARF_DIEValue        *pval_external;         // flag
        LibGoblin_DWARF_DIEValue        *pval_lowpc;
        LibGoblin_DWARF_DIEValue        *pval_highpc;
        LibGoblin_DWARF_DIEValue        *pval_ranges;
@@ -143,20 +142,20 @@ int
        pval_lowpc                      = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_low_pc );
        pval_highpc                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_high_pc );
        pval_ranges                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_ranges );
-       pval_inline                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
        pval_declfile           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_file );
        pval_declline           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_decl_line );
        pval_type                       = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_type );
-       // UnImplement
+       pval_inline                     = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_inline );
        pval_prototyped         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_prototyped );
        pval_external           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_external );
-       pval_entry_pc           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
-       pval_segment            = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
-       pval_addr_class         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
-       pval_return_addr        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
        pval_frame_base         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_frame_base );
+       pval_return_addr        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_return_addr );
        pval_static_link        = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_static_link );
        pval_calling_convention = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_calling_convention );
+       // UnImplement
+       pval_entry_pc           = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_entry_pc );
+       pval_segment            = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_segment );
+       pval_addr_class         = DWARF_AttrForm_GetDIEValue( p_binfo, DW_AT_address_class );
 
        if( NULL == pval_name )
                { goto  goto_DWARF_Tag_Function_subprogram_post; }
@@ -194,9 +193,6 @@ int
        }
        // Pattern D ---
        else    {
-               if( NULL == pval_inline )
-                       { goto  goto_DWARF_Tag_Function_subprogram_post; }
-
                t_ranges.i_ranges                       = 1;
                t_ranges.ptr_low[0].value       = (PtrValue)pobj_parent->addr.ptr_addr.value;
                t_ranges.ptr_high[0].value      = (PtrValue)pobj_parent->addr.ptr_addr.value;
@@ -231,6 +227,38 @@ int
                pobj_now->dwarf.i_objid_type    = NO_OBJ;
                pobj_now->dwarf.pb_dwinfo_type  = pb_link;
 
+               pobj_now->info.function.flag.external   = ((NULL != pval_external) ? 1 : 0 );
+               pobj_now->info.function.flag.prototyped = ((NULL != pval_prototyped) ? 1 : 0 );
+
+               pobj_now->info.function.b_convention    = ((NULL != pval_calling_convention)
+                                                                                                       ? pval_calling_convention->value.b_value
+                                                                                                       : DW_CC_normal ); 
+
+               if( NULL != pval_frame_base )   {
+                       pobj_now->info.function.dw_sz_frame_base        = (DWord)pval_frame_base->qw_size;
+                       pobj_now->info.function.pb_frame_base           = pval_frame_base->value.pb_data;
+               }
+
+               if( NULL != pval_return_addr )  {
+                       pobj_now->info.function.dw_sz_return_addr       = (DWord)pval_return_addr->qw_size;
+                       pobj_now->info.function.pb_return_addr          = pval_return_addr->value.pb_data;
+               }
+
+               if( NULL != pval_static_link )  {
+                       pobj_now->info.function.dw_sz_static_link       = (DWord)pval_static_link->qw_size;
+                       pobj_now->info.function.pb_static_link          = pval_static_link->value.pb_data;
+               }
+
+               if( NULL != pval_inline )       {
+                       if(( DW_INL_inlined == pval_inline->value.b_value )
+                                       || ( DW_INL_declared_inlined == pval_inline->value.b_value ))
+                               { pobj_now->info.function.flag.inlined  = 1; }
+       
+                       if(( DW_INL_declared_not_inlined == pval_inline->value.b_value )
+                                       || ( DW_INL_declared_inlined == pval_inline->value.b_value ))
+                               { pobj_now->info.function.flag.inline_def       = 1; }
+               }
+
                if( 0 == i_cnt )        {
                        pobj_parent     = pobj_now;
                        pobj_now->info.function.i_objid_parent  = NO_OBJ;
@@ -240,17 +268,9 @@ int
                }
        }
 
-/*
-       p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
-       assert( NULL != p_bfile );
-*/
 goto_DWARF_Tag_Function_subprogram_post:
-       printf( "  UnImplement DW_TAG_subprogram: %s [%02xh]\n",
-                                                       Debug_DWARF_GetTAGname( dw_tag ), dw_tag );
-       return NO_OBJ;
+       return  i_objid_parent; 
 }
 
 
-
-
 /* EOF of drd64_.c ----------------------------------- */
index c1ee503..fd546bd 100644 (file)
@@ -122,6 +122,9 @@ LibGoblin_ObjectInfo *
        if(( SHN_UNDEF == p_sym->st_shndx ) && ( STT_NOTYPE != ELF64_ST_TYPE( p_sym->st_info ) ))
                { p_obj->dw_status      |=      OBJINFO_STATUS_DYNAMIC; }
 
+       if( b_objtype == OBJINFO_TYPE_FUNCTION )
+               { p_obj->info.function.i_objid_parent   = NO_OBJ; }
+
 goto_ELF64_Symtab_RegistSymbol_toObjectInfo_post:
        return  p_obj;
 }
index 99cbe01..32178ba 100644 (file)
@@ -201,10 +201,23 @@ typedef   struct  {
 
                struct  {
                        int             i_objid_parent;
-                       Byte    b_prototyped;
-                       Byte    b_external;
-                       Byte    b_inline;
 
+                       DWord   dw_sz_frame_base;
+                       DWord   dw_sz_return_addr;
+                       DWord   dw_sz_static_link;
+
+                       Byte    *pb_frame_base;
+                       Byte    *pb_return_addr;
+                       Byte    *pb_static_link;
+
+                       Byte    b_convention;
+                       
+                       struct  {
+                               unsigned        inline_def:     1;
+                               unsigned        inlined:        1;
+                               unsigned        external:       1;
+                               unsigned        prototyped:     1;
+                       } flag;
                } function;
        } info;