OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_dwarf_abbrev.c
index ad33387..77e2479 100644 (file)
@@ -57,7 +57,7 @@ void
        assert( NULL != p_bfile );
 
        p_arvnow        = p_bfile->dwarf.p_abbrev;
-       for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs; i_cnt++, p_arvnow++ ) {
+       for( i_cnt = 0; i_cnt < p_bfile->dwarf.i_abbrevs_max; i_cnt++, p_arvnow++ )     {
                
                printf("  [ID= %2d] TAG= %02xh Child=%s\n",
                                                p_arvnow->dw_id, p_arvnow->dw_tag,
@@ -101,8 +101,7 @@ Byte *
        memset( p_entry, 0x00, sizeof( LibGoblin_Dwarf_AbbrevEntry ) );
 
        /* Read Abbrev Number */
-       pb_src  = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                       &qw_temp, pb_src, pqw_remain );
+       pb_src  = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
 
        p_entry->dw_id  = (DWord)qw_temp;
        if( 0x00000000 == p_entry->dw_id )      {
@@ -110,13 +109,11 @@ Byte *
        }
 
        /* Read TAG */
-       pb_src  = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                       &qw_temp, pb_src, pqw_remain );
+       pb_src  = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
        p_entry->dw_tag = (DWord)qw_temp;
 
        /* Read IsChildren */
-       pb_src  = LibGoblin_DwarfCommon_Read_Byte(
-                                       &(p_entry->b_children), pb_src, pqw_remain );
+       pb_src  = DWARF_Common_Read_Byte( &(p_entry->b_children), pb_src, pqw_remain );
        if( NULL == pb_src )    { return NULL; }
 
 /*
@@ -126,14 +123,12 @@ Byte *
 
        do      {
                /* Read Attribute */
-               pb_src  = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                               &qw_temp, pb_src, pqw_remain );
+               pb_src  = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
                dw_attribute    = (DWord)qw_temp;
                p_entry->dw_attribute[i_items]  = dw_attribute;
        
                /* Read Format */
-               pb_src  = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                               &qw_temp, pb_src, pqw_remain );
+               pb_src  = DWARF_Common_DecodeULEB128( &qw_temp, pb_src, pqw_remain );
                dw_format               = (DWord)qw_temp;
                p_entry->dw_format[i_items]     = dw_format;
 
@@ -155,70 +150,77 @@ Byte *
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_ABBREV_EXTERN
 int
        DWARF_Abbrev_ReadAbbrevEntry(
+               DWARF_AbbrevEntry               **pp_abbrev,
+               int                                             *pi_abbrevs,
                LibGoblin_BinaryInfo    *p_binfo,
-               LibGoblin_BinaryFile    *p_bfile )
+               LibGoblin_BinaryFile    *p_bfile,
+               QWord   qw_offset )
 {
        int             i_abbrevs;
        int             i_items;
+       int             i_count;
        Byte    *pb_data;
        Byte    b_children;
        QWord   qw_temp;
        QWord   qw_remain;
        DWord   dw_abbrev_num;
+       DWord   dw_before_num;
        DWord   dw_tag;
        DWord   dw_attribute;
        DWord   dw_format;
        LibGoblin_SectionInfo           *psec_abbrev;
        DWARF_AbbrevEntry                       *p_arvnow;
 
+       assert( NULL != pp_abbrev );
+       assert( NULL != pi_abbrevs );
        assert( NULL != p_binfo );
        assert( NULL != p_bfile );
 
+       *pp_abbrev      = NULL;
+       *pi_abbrevs     = 0;
+
        // Get .debug_abbrev section Info ---
        psec_abbrev     =       Section_GetSectionInfo( p_binfo, LIBGOBLIN_SECTION_ID_DEBUG_ABBREV );
        assert( NULL != psec_abbrev );
        if( NULL == psec_abbrev->pb_data )      {
                return 0x01;
        }
-       pb_data         = psec_abbrev->pb_data;
-       qw_remain       = psec_abbrev->qw_size;
+       pb_data         = psec_abbrev->pb_data + qw_offset;
+       qw_remain       = p_bfile->dwarf.qw_abbrev_unreadsz;
 
-       i_abbrevs       = p_bfile->dwarf.i_abbrevs;
-       p_arvnow        = p_bfile->dwarf.p_abbrev;
+       i_abbrevs       = p_bfile->dwarf.i_abbrevs_max;
+       p_arvnow        = p_bfile->dwarf.p_abbrev + i_abbrevs;
 
+       i_count                 = 0;
+       dw_before_num   = 0;
        do      {
                // Read Abbrev Number ---
-               pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                                       &qw_temp, pb_data, &qw_remain );
+               pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
                dw_abbrev_num   = (DWord)qw_temp;
 
                /* Read TAG */
-               pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                                       &qw_temp, pb_data, &qw_remain );
+               pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
                dw_tag  = (DWord)qw_temp;
 
+               if(( 0x00 == dw_tag ) || (dw_abbrev_num < dw_before_num ))      { break; }
+
                /* Read IsChildren */
                b_children      = *pb_data++;
                qw_remain--;
 
-               p_arvnow->dw_id                 = dw_abbrev_num;
-               p_arvnow->dw_tag                = dw_tag;
-               p_arvnow->b_children    = b_children;
-
                i_items = -1;
                do      {
                        i_items++;
 
                        /* Read Attribute */
-                       pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                               &qw_temp, pb_data, &qw_remain );
+                       pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
                        dw_attribute    = (DWord)qw_temp;
        
                        /* Read Format */
-                       pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                               &qw_temp, pb_data, &qw_remain );
+                       pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_remain );
                        dw_format       = (DWord)qw_temp;
 
                        p_arvnow->dw_attribute[ i_items ]       = dw_attribute;
@@ -226,17 +228,27 @@ int
 
                }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_remain > 0) );
 
-               p_arvnow->i_items       = i_items;
-               p_arvnow++;
-
-               /* Skip Byte for Next Compile-Unit Abbrev. */
+               // Skip Byte for Abbrev
                if( 0x00 == *pb_data )  {
                        pb_data++;
                        qw_remain--;
                }
 
+               p_arvnow->dw_id                 = dw_abbrev_num;
+               p_arvnow->dw_tag                = dw_tag;
+               p_arvnow->b_children    = b_children;
+               p_arvnow->i_items               = i_items;
+               p_arvnow++;
+               p_bfile->dwarf.i_abbrevs_max++;
+               p_bfile->dwarf.qw_abbrev_unreadsz       = qw_remain;
+               dw_before_num   = dw_abbrev_num;
+               i_count++;
+
        }while((qw_remain > 0) && (dw_tag != 0x00));
        
+       *pp_abbrev      = p_bfile->dwarf.p_abbrev + i_abbrevs;
+       *pi_abbrevs     = i_count;
+
        return 0x00;
 }
 
@@ -247,8 +259,12 @@ int
        DWARF_Abbrev_GetItems(
                int             *pi_filenum,
                int             *pi_abbrevs,
+               int             *pi_maxitems,
+               QWord   *pqw_size,
                LibGoblin_BinaryInfo    *p_binfo )
 {
+       int             i_maxitems;
+       int             i_items;
        Byte    *pb_data;
        Byte    b_children;
        QWord   qw_temp;
@@ -267,23 +283,23 @@ int
        if( NULL == psec_abbrev->pb_data )      {
                return 0x01;
        }
-       pb_data = psec_abbrev->pb_data;
-       qw_size = psec_abbrev->qw_size;
+       pb_data         = psec_abbrev->pb_data;
+       qw_size         = psec_abbrev->qw_size;
+       *pqw_size       = psec_abbrev->qw_size;
 
        *pi_filenum     = 0;
        *pi_abbrevs     = 0;
 
+       i_maxitems      = 0;
        do      {
                (*pi_abbrevs)++;
 
                /* Read Abbrev Number */
-               pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                       &qw_temp, pb_data, &qw_size );
+               pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
                dw_abbrev_num   = (DWord)qw_temp;
 
                /* Read TAG */
-               pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                       &qw_temp, pb_data, &qw_size );
+               pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
                dw_tag  = (DWord)qw_temp;
                if( DW_TAG_compile_unit == dw_tag )             {
                        (*pi_filenum)++;
@@ -293,19 +309,20 @@ int
                b_children      = *pb_data++;
                qw_size--;
 
+               i_items = -1;
                do      {
+                       i_items++;
                        /* Read Attribute */
-                       pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                               &qw_temp, pb_data, &qw_size );
+                       pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
                        dw_attribute    = (DWord)qw_temp;
        
                        /* Read Format */
-                       pb_data = LibGoblin_DwarfCommon_Decode_ULEB128(
-                                               &qw_temp, pb_data, &qw_size );
+                       pb_data = DWARF_Common_DecodeULEB128( &qw_temp, pb_data, &qw_size );
                        dw_format       = (DWord)qw_temp;
 
-               }while((0x00 != dw_attribute) && (0x00 != dw_format)
-                                       && (qw_size > 0) );
+               }while((0x00 != dw_attribute) && (0x00 != dw_format) && (qw_size > 0) );
+
+               if( i_maxitems < i_items )      { i_maxitems    = i_items; }
 
                /* Skip Byte for Next Compile-Unit Abbrev. */
                if( 0x00 == *pb_data )  {
@@ -314,6 +331,8 @@ int
                }
 
        }while((qw_size > 0) && (dw_tag != 0x00));
+
+       *pi_maxitems    = i_maxitems;
        
        return 0x00;
 }
@@ -323,20 +342,23 @@ int
 ----------------------------------------------------------------------*/
 LIBGOBLIN_DWARF_ABBREV_EXTERN
 int
-       DWARF_Abbrev_Read(
+       DWARF_Abbrev_AllocMemory(
                LibGoblin_BinaryInfo    *p_binfo )
 {
        int             i_result;
+       int             i_maxitems      = 0;
        int             i_filenums      = 0;
        int             i_abbrevs       = 0;
+       QWord   qw_size;
        DWARF_AbbrevEntry       *p_abbrev;
+       LibGoblin_DWARF_DIEValue        *p_dievalue;
        LibGoblin_BinaryFile    *p_bfile;
 
        p_bfile = BinaryFile_GetBinaryFile( p_binfo->i_binfile );
        assert( NULL != p_bfile );
        
        // Count Abbrevs ---
-       i_result        = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, p_binfo );
+       i_result        = DWARF_Abbrev_GetItems( &i_filenums, &i_abbrevs, &i_maxitems, &qw_size, p_binfo );
        if( 0x00 != i_result )  {
                return 0x01;
        }
@@ -346,14 +368,23 @@ int
        if( NULL == p_abbrev )  {
                return 0x02;
        }
-       p_bfile->dwarf.p_abbrev         = p_abbrev;
-       p_bfile->dwarf.i_abbrevs        = i_abbrevs;
+       p_bfile->dwarf.p_abbrev                         = p_abbrev;
+       p_bfile->dwarf.i_abbrevs_alloc          = i_abbrevs;
+       p_bfile->dwarf.i_abbrevs_max            = 0;
+       p_bfile->dwarf.qw_abbrev_unreadsz       = qw_size;
 
-       // Read Abbrev ---
-       i_result        = DWARF_Abbrev_ReadAbbrevEntry( p_binfo, p_bfile );
-       if( 0x00 != i_result )  {
-               return 0x01;
+       p_bfile->dwarf.i_objfiles                       = i_filenums;
+
+       // Alloc Abbrev Memory ---
+       p_dievalue      = (LibGoblin_DWARF_DIEValue *)malloc(
+                                                               sizeof( LibGoblin_DWARF_DIEValue ) * i_maxitems );
+       if( NULL == p_dievalue )        {
+               return 0x03;
        }
+       p_bfile->dwarf.i_maxvals        = i_maxitems;
+
+       p_binfo->dwarf.i_maxvals        = i_maxitems;
+       p_binfo->dwarf.p_infoval        = p_dievalue;
 
        return 0x00;
 }