OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_dwarf_attrform.c
index 88da054..f1033fc 100644 (file)
@@ -296,7 +296,6 @@ Byte *
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
-LIBGOBLIN_DWARF_ATTRFORM_EXTERN
 Byte *
        DWARF_AttrForm_ReadFormat_Data(
                LibGoblin_DWARF_DIEValue        *p_val,
@@ -306,6 +305,8 @@ Byte *
                LibGoblin_BinaryInfo    *p_binfo,
                LibGoblin_DWARF_Info_CUHeader   *p_cuheader )
 {
+       p_val->dw_format        = dw_format;
+
        switch( dw_format )     {
                case DW_FORM_addr:              // 0x01: address
                        pb_info = DWARF_AttrForm_ReadFormat_Address(
@@ -444,7 +445,7 @@ Byte *
 {
        int                                                     i_cnt;
        DWord                                           dw_attribute;
-       DWord                                           dw_format;
+       DWord                                           dw_ext;
        LibGoblin_DWARF_DIEValue        *p_val;
 
        // Read Debug Information Entry (DIE) ---
@@ -452,13 +453,26 @@ Byte *
        p_val   = p_binfo->dwarf.p_infoval;
 
        memset( p_binfo->dwarf.t_attr, 0x00, sizeof( p_binfo->dwarf.t_attr) );
+       p_binfo->dwarf.i_extattrs       = 0;
 
        for( i_cnt = 0; i_cnt < p_abbrev->i_items; i_cnt++, p_val++ )   {
-               dw_attribute    = p_abbrev->dw_attribute[ i_cnt ];
-               dw_format       = p_abbrev->dw_format[ i_cnt ];
-
                pb_info = DWARF_AttrForm_ReadFormat_Data(
-                                               p_val, pb_info, pqw_remains, dw_format, p_binfo, p_cuheader );
+                                               p_val, pb_info, pqw_remains, p_abbrev->dw_format[i_cnt], p_binfo, p_cuheader );
+
+               dw_attribute    = p_abbrev->dw_attribute[ i_cnt ];
+               if( LIBGOBLIN_DWARF_ATTR_DEF_MAX >= dw_attribute )      {
+                       p_binfo->dwarf.t_attr[dw_attribute].dw_attribute        = dw_attribute;
+                       p_binfo->dwarf.t_attr[dw_attribute].p_val                       = p_val;
+               }
+               else if( LIBGOBLIN_DWARF_ATTR_MAX >= dw_attribute )     {
+                       dw_ext  = LIBGOBLIN_DWARF_ATTR_DEF_MAX + 1 + p_binfo->dwarf.i_extattrs;
+                       p_binfo->dwarf.t_attr[dw_ext].dw_attribute      = dw_attribute;
+                       p_binfo->dwarf.t_attr[dw_ext].p_val                     = p_val;
+                       p_binfo->dwarf.i_extattrs++;
+               }
+               //else  {
+               //              XXX: ERROR!!
+               //}
        }
 
        return pb_info;