OSDN Git Service

*** empty log message ***
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_dwarf_abbrev.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
11  1. Redistributions of source code must retain the above copyright notice,
12     this list of conditions and the following disclaimer.
13  2. Redistributions in binary form must reproduce the above copyright
14     notice, this list of conditions and the following disclaimer in the
15     documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBGOBLIN_DWARF_ABBREV
38 #include"drd64_libgoblin.h"
39
40 /*----------------------------------------------------------------------
41 ----------------------------------------------------------------------*/
42 LIBGOBLIN_DWARF_ABBREV_EXTERN
43 int
44         LibGoblin_DwarfAbbrev_Read(
45                 LibGoblin_BinaryInfo    *p_bin )
46 {
47         int             i_abbrev_nums;
48         Byte    *pb_data;
49         Byte    *pb_now;
50         Byte    b_children;
51         QWord   qw_size_abbrev;
52         DWord   dw_abbrev_num;
53         DWord   dw_tag;
54         DWord   dw_attribute;
55         DWord   dw_format;
56         LibGoblin_Dwarf_AbbrevInfo      *p_abbrev;
57         LibGoblin_Dwarf_AbbrevInfo      *p_parent;
58         LibGoblin_Debug_Dwarf           *p_dwarf;
59
60         assert( NULL != p_bin );
61
62         p_dwarf = (LibGoblin_Debug_Dwarf *)p_bin->p_debug;
63         assert( NULL != p_dwarf );
64
65         /* Get .debug_abbrev section Info */
66         pb_data = LibGoblin_Elf_GetSection(
67                                         &qw_size_abbrev, p_bin,
68                                         LIBGOBLIN_ELF_SEC_ID_DEBUG_ABBREV );
69         if( NULL == pb_data )   { return 0x01; }
70
71         /* Alloc Abbrev Info. for debug_dwarf_info struct */
72         i_abbrev_nums   = (qw_size_abbrev / 5) + 1;
73         p_abbrev        = (LibGoblin_Dwarf_AbbrevInfo *)malloc(
74                                         sizeof(LibGoblin_Dwarf_AbbrevInfo) * i_abbrev_nums );
75         if( NULL == p_abbrev )  { return 0x02; }
76         memset( p_abbrev, 0x00,
77                                 sizeof(LibGoblin_Dwarf_AbbrevInfo) * i_abbrev_nums);
78         
79         p_dwarf->p_abbrev_info  = p_abbrev;
80         p_parent                                = NULL;
81
82         do      {
83                 /* Set Abbrev Data to AbbrevInfo Struct - Phase 1*/
84                 p_abbrev->pb_pos                = pb_data;
85
86                 /* Read Abbrev Number */
87                 pb_now  = LibGoblin_DwarfCommon_Decode_ULEB128(
88                                         &dw_abbrev_num, pb_data, qw_size_abbrev );
89                 qw_size_abbrev -= (DWord)(pb_now - pb_data);
90                 pb_data = pb_now;
91
92                 /* Read TAG */
93                 pb_now  = LibGoblin_DwarfCommon_Decode_ULEB128(
94                                         &dw_tag, pb_data, qw_size_abbrev );
95                 qw_size_abbrev -= (DWord)(pb_now - pb_data);
96                 pb_data = pb_now;
97
98                 /* Read IsChildren */
99                 b_children      = *pb_data++;
100                 qw_size_abbrev--;
101
102                 /* Set Abbrev Data to AbbrevInfo Struct */
103                 p_abbrev->dw_tag        = dw_tag;
104                 p_abbrev->dw_id         = dw_abbrev_num;
105                 if( DW_CHILDREN_yes == b_children )     
106                         { p_parent      = p_abbrev; }
107                 else
108                         { p_abbrev->p_parent    = (void *)p_parent; }
109
110                 /*printf("%04x : TAG=%04x (Children=%x) %ld\n",
111                                         dw_abbrev_num, dw_tag, b_children, qw_size_abbrev);*/
112
113                 do      {
114                         /* Read Attribute */
115                         pb_now  = LibGoblin_DwarfCommon_Decode_ULEB128(
116                                                 &dw_attribute, pb_data, qw_size_abbrev );
117                         qw_size_abbrev -= (DWord)(pb_now - pb_data);
118                         pb_data = pb_now;
119         
120                         /* Read Format */
121                         pb_now  = LibGoblin_DwarfCommon_Decode_ULEB128(
122                                                 &dw_format, pb_data, qw_size_abbrev );
123                         qw_size_abbrev -= (DWord)(pb_now - pb_data);
124                         pb_data = pb_now;
125
126 /*                      printf("    Attiribute=%02x Format=%02x\n",
127                                                 dw_attribute, dw_format);*/
128
129                 }while((0x00 != dw_attribute) && (0x00 != dw_format)
130                                         && (qw_size_abbrev > 0) );
131
132                 p_abbrev++;
133
134                 /* Skip Byte for Next Compile-Unit Abbrev. */
135                 if( 0x00 == *pb_data )  {
136                         pb_data++;
137                         qw_size_abbrev--;
138                 }
139
140         }while((qw_size_abbrev > 0) && (dw_tag != 0x00));
141         
142         return 0x00;
143 }
144
145
146
147 /* EOF of drd64_.c ----------------------------------- */