1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi Copyright (C) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
3*f3e7f55eSRobert Mustacchi Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
4*f3e7f55eSRobert Mustacchi
5*f3e7f55eSRobert Mustacchi This program is free software; you can redistribute it and/or modify it
6*f3e7f55eSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
7*f3e7f55eSRobert Mustacchi as published by the Free Software Foundation.
8*f3e7f55eSRobert Mustacchi
9*f3e7f55eSRobert Mustacchi This program is distributed in the hope that it would be useful, but
10*f3e7f55eSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
11*f3e7f55eSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*f3e7f55eSRobert Mustacchi
13*f3e7f55eSRobert Mustacchi Further, this software is distributed without any warranty that it is
14*f3e7f55eSRobert Mustacchi free of the rightful claim of any third person regarding infringement
15*f3e7f55eSRobert Mustacchi or the like. Any license provided herein, whether implied or
16*f3e7f55eSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
17*f3e7f55eSRobert Mustacchi any, provided herein do not apply to combinations of this program with
18*f3e7f55eSRobert Mustacchi other software, or any other product whatsoever.
19*f3e7f55eSRobert Mustacchi
20*f3e7f55eSRobert Mustacchi You should have received a copy of the GNU Lesser General Public
21*f3e7f55eSRobert Mustacchi License along with this program; if not, write the Free Software
22*f3e7f55eSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23*f3e7f55eSRobert Mustacchi USA.
24*f3e7f55eSRobert Mustacchi
25*f3e7f55eSRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
26*f3e7f55eSRobert Mustacchi Mountain View, CA 94043, or:
27*f3e7f55eSRobert Mustacchi
28*f3e7f55eSRobert Mustacchi http://www.sgi.com
29*f3e7f55eSRobert Mustacchi
30*f3e7f55eSRobert Mustacchi For further information regarding this notice, see:
31*f3e7f55eSRobert Mustacchi
32*f3e7f55eSRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan
33*f3e7f55eSRobert Mustacchi
34*f3e7f55eSRobert Mustacchi */
35*f3e7f55eSRobert Mustacchi /* The address of the Free Software Foundation is
36*f3e7f55eSRobert Mustacchi Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
37*f3e7f55eSRobert Mustacchi Boston, MA 02110-1301, USA.
38*f3e7f55eSRobert Mustacchi SGI has moved from the Crittenden Lane address.
39*f3e7f55eSRobert Mustacchi */
40*f3e7f55eSRobert Mustacchi
41*f3e7f55eSRobert Mustacchi
42*f3e7f55eSRobert Mustacchi
43*f3e7f55eSRobert Mustacchi
44*f3e7f55eSRobert Mustacchi
45*f3e7f55eSRobert Mustacchi #include "config.h"
46*f3e7f55eSRobert Mustacchi #include "dwarf_incl.h"
47*f3e7f55eSRobert Mustacchi #include <stdio.h>
48*f3e7f55eSRobert Mustacchi #include "dwarf_die_deliv.h"
49*f3e7f55eSRobert Mustacchi
50*f3e7f55eSRobert Mustacchi
51*f3e7f55eSRobert Mustacchi
52*f3e7f55eSRobert Mustacchi /*
53*f3e7f55eSRobert Mustacchi Given a form, and a pointer to the bytes encoding
54*f3e7f55eSRobert Mustacchi a value of that form, val_ptr, this function returns
55*f3e7f55eSRobert Mustacchi the length, in bytes, of a value of that form.
56*f3e7f55eSRobert Mustacchi When using this function, check for a return of 0
57*f3e7f55eSRobert Mustacchi a recursive DW_FORM_INDIRECT value.
58*f3e7f55eSRobert Mustacchi */
59*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
_dwarf_get_size_of_val(Dwarf_Debug dbg,Dwarf_Unsigned form,Dwarf_Half address_size,Dwarf_Small * val_ptr,int v_length_size)60*f3e7f55eSRobert Mustacchi _dwarf_get_size_of_val(Dwarf_Debug dbg,
61*f3e7f55eSRobert Mustacchi Dwarf_Unsigned form,
62*f3e7f55eSRobert Mustacchi Dwarf_Half address_size,
63*f3e7f55eSRobert Mustacchi Dwarf_Small * val_ptr, int v_length_size)
64*f3e7f55eSRobert Mustacchi {
65*f3e7f55eSRobert Mustacchi Dwarf_Unsigned length = 0;
66*f3e7f55eSRobert Mustacchi Dwarf_Word leb128_length = 0;
67*f3e7f55eSRobert Mustacchi Dwarf_Unsigned form_indirect = 0;
68*f3e7f55eSRobert Mustacchi Dwarf_Unsigned ret_value = 0;
69*f3e7f55eSRobert Mustacchi
70*f3e7f55eSRobert Mustacchi switch (form) {
71*f3e7f55eSRobert Mustacchi
72*f3e7f55eSRobert Mustacchi default: /* Handles form = 0. */
73*f3e7f55eSRobert Mustacchi return (form);
74*f3e7f55eSRobert Mustacchi
75*f3e7f55eSRobert Mustacchi case DW_FORM_addr:
76*f3e7f55eSRobert Mustacchi if(address_size) {
77*f3e7f55eSRobert Mustacchi return address_size;
78*f3e7f55eSRobert Mustacchi }
79*f3e7f55eSRobert Mustacchi /* This should never happen, address_size should be set. */
80*f3e7f55eSRobert Mustacchi return (dbg->de_pointer_size);
81*f3e7f55eSRobert Mustacchi
82*f3e7f55eSRobert Mustacchi /* DWARF2 was wrong on the size of the attribute for
83*f3e7f55eSRobert Mustacchi DW_FORM_ref_addr. We assume compilers are using the
84*f3e7f55eSRobert Mustacchi corrected DWARF3 text (for 32bit pointer target objects pointer and
85*f3e7f55eSRobert Mustacchi offsets are the same size anyway). */
86*f3e7f55eSRobert Mustacchi case DW_FORM_ref_addr:
87*f3e7f55eSRobert Mustacchi return (v_length_size);
88*f3e7f55eSRobert Mustacchi
89*f3e7f55eSRobert Mustacchi case DW_FORM_block1:
90*f3e7f55eSRobert Mustacchi return (*(Dwarf_Small *) val_ptr + 1);
91*f3e7f55eSRobert Mustacchi
92*f3e7f55eSRobert Mustacchi case DW_FORM_block2:
93*f3e7f55eSRobert Mustacchi READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
94*f3e7f55eSRobert Mustacchi val_ptr, sizeof(Dwarf_Half));
95*f3e7f55eSRobert Mustacchi return (ret_value + sizeof(Dwarf_Half));
96*f3e7f55eSRobert Mustacchi
97*f3e7f55eSRobert Mustacchi case DW_FORM_block4:
98*f3e7f55eSRobert Mustacchi READ_UNALIGNED(dbg, ret_value, Dwarf_Unsigned,
99*f3e7f55eSRobert Mustacchi val_ptr, sizeof(Dwarf_ufixed));
100*f3e7f55eSRobert Mustacchi return (ret_value + sizeof(Dwarf_ufixed));
101*f3e7f55eSRobert Mustacchi
102*f3e7f55eSRobert Mustacchi
103*f3e7f55eSRobert Mustacchi case DW_FORM_data1:
104*f3e7f55eSRobert Mustacchi return (1);
105*f3e7f55eSRobert Mustacchi
106*f3e7f55eSRobert Mustacchi case DW_FORM_data2:
107*f3e7f55eSRobert Mustacchi return (2);
108*f3e7f55eSRobert Mustacchi
109*f3e7f55eSRobert Mustacchi case DW_FORM_data4:
110*f3e7f55eSRobert Mustacchi return (4);
111*f3e7f55eSRobert Mustacchi
112*f3e7f55eSRobert Mustacchi case DW_FORM_data8:
113*f3e7f55eSRobert Mustacchi return (8);
114*f3e7f55eSRobert Mustacchi
115*f3e7f55eSRobert Mustacchi case DW_FORM_string:
116*f3e7f55eSRobert Mustacchi return (strlen((char *) val_ptr) + 1);
117*f3e7f55eSRobert Mustacchi
118*f3e7f55eSRobert Mustacchi case DW_FORM_block:
119*f3e7f55eSRobert Mustacchi case DW_FORM_exprloc:
120*f3e7f55eSRobert Mustacchi length = _dwarf_decode_u_leb128(val_ptr, &leb128_length);
121*f3e7f55eSRobert Mustacchi return (length + leb128_length);
122*f3e7f55eSRobert Mustacchi
123*f3e7f55eSRobert Mustacchi case DW_FORM_flag_present:
124*f3e7f55eSRobert Mustacchi return (0);
125*f3e7f55eSRobert Mustacchi case DW_FORM_flag:
126*f3e7f55eSRobert Mustacchi return (1);
127*f3e7f55eSRobert Mustacchi
128*f3e7f55eSRobert Mustacchi case DW_FORM_sec_offset:
129*f3e7f55eSRobert Mustacchi /* If 32bit dwarf, is 4. Else is 64bit dwarf and is 8. */
130*f3e7f55eSRobert Mustacchi return (v_length_size);
131*f3e7f55eSRobert Mustacchi
132*f3e7f55eSRobert Mustacchi case DW_FORM_ref_udata:
133*f3e7f55eSRobert Mustacchi length = _dwarf_decode_u_leb128(val_ptr, &leb128_length);
134*f3e7f55eSRobert Mustacchi return (leb128_length);
135*f3e7f55eSRobert Mustacchi
136*f3e7f55eSRobert Mustacchi case DW_FORM_indirect:
137*f3e7f55eSRobert Mustacchi {
138*f3e7f55eSRobert Mustacchi Dwarf_Word indir_len = 0;
139*f3e7f55eSRobert Mustacchi
140*f3e7f55eSRobert Mustacchi form_indirect = _dwarf_decode_u_leb128(val_ptr, &indir_len);
141*f3e7f55eSRobert Mustacchi if (form_indirect == DW_FORM_indirect) {
142*f3e7f55eSRobert Mustacchi return (0); /* We are in big trouble: The true form
143*f3e7f55eSRobert Mustacchi of DW_FORM_indirect is
144*f3e7f55eSRobert Mustacchi DW_FORM_indirect? Nonsense. Should
145*f3e7f55eSRobert Mustacchi never happen. */
146*f3e7f55eSRobert Mustacchi }
147*f3e7f55eSRobert Mustacchi return (indir_len + _dwarf_get_size_of_val(dbg,
148*f3e7f55eSRobert Mustacchi form_indirect,
149*f3e7f55eSRobert Mustacchi address_size,
150*f3e7f55eSRobert Mustacchi val_ptr + indir_len,
151*f3e7f55eSRobert Mustacchi v_length_size));
152*f3e7f55eSRobert Mustacchi }
153*f3e7f55eSRobert Mustacchi
154*f3e7f55eSRobert Mustacchi case DW_FORM_ref1:
155*f3e7f55eSRobert Mustacchi return (1);
156*f3e7f55eSRobert Mustacchi
157*f3e7f55eSRobert Mustacchi case DW_FORM_ref2:
158*f3e7f55eSRobert Mustacchi return (2);
159*f3e7f55eSRobert Mustacchi
160*f3e7f55eSRobert Mustacchi case DW_FORM_ref4:
161*f3e7f55eSRobert Mustacchi return (4);
162*f3e7f55eSRobert Mustacchi
163*f3e7f55eSRobert Mustacchi case DW_FORM_ref8:
164*f3e7f55eSRobert Mustacchi return (8);
165*f3e7f55eSRobert Mustacchi
166*f3e7f55eSRobert Mustacchi case DW_FORM_sdata:
167*f3e7f55eSRobert Mustacchi _dwarf_decode_s_leb128(val_ptr, &leb128_length);
168*f3e7f55eSRobert Mustacchi return (leb128_length);
169*f3e7f55eSRobert Mustacchi
170*f3e7f55eSRobert Mustacchi case DW_FORM_strp:
171*f3e7f55eSRobert Mustacchi return (v_length_size);
172*f3e7f55eSRobert Mustacchi
173*f3e7f55eSRobert Mustacchi case DW_FORM_udata:
174*f3e7f55eSRobert Mustacchi _dwarf_decode_u_leb128(val_ptr, &leb128_length);
175*f3e7f55eSRobert Mustacchi return (leb128_length);
176*f3e7f55eSRobert Mustacchi }
177*f3e7f55eSRobert Mustacchi }
178*f3e7f55eSRobert Mustacchi
179*f3e7f55eSRobert Mustacchi /* We allow an arbitrary number of HT_MULTIPLE entries
180*f3e7f55eSRobert Mustacchi before resizing. It seems up to 20 or 30
181*f3e7f55eSRobert Mustacchi would work nearly as well.
182*f3e7f55eSRobert Mustacchi We could have a different resize multiple than 'resize now'
183*f3e7f55eSRobert Mustacchi test multiple, but for now we don't do that.
184*f3e7f55eSRobert Mustacchi */
185*f3e7f55eSRobert Mustacchi #define HT_MULTIPLE 8
186*f3e7f55eSRobert Mustacchi
187*f3e7f55eSRobert Mustacchi /* Copy the old entries, updating each to be in
188*f3e7f55eSRobert Mustacchi a new list. Don't delete anything. Leave the
189*f3e7f55eSRobert Mustacchi htin with stale data. */
190*f3e7f55eSRobert Mustacchi static void
copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin,Dwarf_Hash_Table htout)191*f3e7f55eSRobert Mustacchi copy_abbrev_table_to_new_table(Dwarf_Hash_Table htin,
192*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table htout)
193*f3e7f55eSRobert Mustacchi {
194*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_Entry entry_in = htin->tb_entries;
195*f3e7f55eSRobert Mustacchi unsigned entry_in_count = htin->tb_table_entry_count;
196*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_Entry entry_out = htout->tb_entries;
197*f3e7f55eSRobert Mustacchi unsigned entry_out_count = htout->tb_table_entry_count;
198*f3e7f55eSRobert Mustacchi unsigned k = 0;
199*f3e7f55eSRobert Mustacchi for ( ; k < entry_in_count; ++k,++entry_in) {
200*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List listent = entry_in->at_head;
201*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List nextlistent = 0;
202*f3e7f55eSRobert Mustacchi
203*f3e7f55eSRobert Mustacchi for ( ; listent ; listent = nextlistent) {
204*f3e7f55eSRobert Mustacchi unsigned newtmp = listent->ab_code;
205*f3e7f55eSRobert Mustacchi unsigned newhash = newtmp%entry_out_count;
206*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_Entry e;
207*f3e7f55eSRobert Mustacchi nextlistent = listent->ab_next;
208*f3e7f55eSRobert Mustacchi e = entry_out+newhash;
209*f3e7f55eSRobert Mustacchi /* Move_entry_to_new_hash. This reverses the
210*f3e7f55eSRobert Mustacchi order of the entries, effectively, but
211*f3e7f55eSRobert Mustacchi that does not seem significant. */
212*f3e7f55eSRobert Mustacchi listent->ab_next = e->at_head;
213*f3e7f55eSRobert Mustacchi e->at_head = listent;
214*f3e7f55eSRobert Mustacchi
215*f3e7f55eSRobert Mustacchi htout->tb_total_abbrev_count++;
216*f3e7f55eSRobert Mustacchi }
217*f3e7f55eSRobert Mustacchi }
218*f3e7f55eSRobert Mustacchi }
219*f3e7f55eSRobert Mustacchi
220*f3e7f55eSRobert Mustacchi /*
221*f3e7f55eSRobert Mustacchi This function returns a pointer to a Dwarf_Abbrev_List_s
222*f3e7f55eSRobert Mustacchi struct for the abbrev with the given code. It puts the
223*f3e7f55eSRobert Mustacchi struct on the appropriate hash table. It also adds all
224*f3e7f55eSRobert Mustacchi the abbrev between the last abbrev added and this one to
225*f3e7f55eSRobert Mustacchi the hash table. In other words, the .debug_abbrev section
226*f3e7f55eSRobert Mustacchi is scanned sequentially from the top for an abbrev with
227*f3e7f55eSRobert Mustacchi the given code. All intervening abbrevs are also put
228*f3e7f55eSRobert Mustacchi into the hash table.
229*f3e7f55eSRobert Mustacchi
230*f3e7f55eSRobert Mustacchi This function hashes the given code, and checks the chain
231*f3e7f55eSRobert Mustacchi at that hash table entry to see if a Dwarf_Abbrev_List_s
232*f3e7f55eSRobert Mustacchi with the given code exists. If yes, it returns a pointer
233*f3e7f55eSRobert Mustacchi to that struct. Otherwise, it scans the .debug_abbrev
234*f3e7f55eSRobert Mustacchi section from the last byte scanned for that CU till either
235*f3e7f55eSRobert Mustacchi an abbrev with the given code is found, or an abbrev code
236*f3e7f55eSRobert Mustacchi of 0 is read. It puts Dwarf_Abbrev_List_s entries for all
237*f3e7f55eSRobert Mustacchi abbrev's read till that point into the hash table. The
238*f3e7f55eSRobert Mustacchi hash table contains both a head pointer and a tail pointer
239*f3e7f55eSRobert Mustacchi for each entry.
240*f3e7f55eSRobert Mustacchi
241*f3e7f55eSRobert Mustacchi While the lists can move and entries can be moved between
242*f3e7f55eSRobert Mustacchi lists on reallocation, any given Dwarf_Abbrev_list entry
243*f3e7f55eSRobert Mustacchi never moves once allocated, so the pointer is safe to return.
244*f3e7f55eSRobert Mustacchi
245*f3e7f55eSRobert Mustacchi Returns NULL on error.
246*f3e7f55eSRobert Mustacchi */
247*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List
_dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context,Dwarf_Unsigned code)248*f3e7f55eSRobert Mustacchi _dwarf_get_abbrev_for_code(Dwarf_CU_Context cu_context, Dwarf_Unsigned code)
249*f3e7f55eSRobert Mustacchi {
250*f3e7f55eSRobert Mustacchi Dwarf_Debug dbg = cu_context->cc_dbg;
251*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table hash_table_base = cu_context->cc_abbrev_hash_table;
252*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_Entry entry_base = 0;
253*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_Entry entry_cur = 0;
254*f3e7f55eSRobert Mustacchi Dwarf_Word hash_num = 0;
255*f3e7f55eSRobert Mustacchi Dwarf_Unsigned abbrev_code = 0;
256*f3e7f55eSRobert Mustacchi Dwarf_Unsigned abbrev_tag = 0;
257*f3e7f55eSRobert Mustacchi Dwarf_Unsigned attr_name = 0;
258*f3e7f55eSRobert Mustacchi Dwarf_Unsigned attr_form = 0;
259*f3e7f55eSRobert Mustacchi
260*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List hash_abbrev_entry = 0;
261*f3e7f55eSRobert Mustacchi
262*f3e7f55eSRobert Mustacchi Dwarf_Abbrev_List inner_list_entry = 0;
263*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_Entry inner_hash_entry = 0;
264*f3e7f55eSRobert Mustacchi
265*f3e7f55eSRobert Mustacchi Dwarf_Byte_Ptr abbrev_ptr = 0;
266*f3e7f55eSRobert Mustacchi unsigned hashable_val;
267*f3e7f55eSRobert Mustacchi
268*f3e7f55eSRobert Mustacchi if ( !hash_table_base->tb_entries ) {
269*f3e7f55eSRobert Mustacchi hash_table_base->tb_table_entry_count = HT_MULTIPLE;
270*f3e7f55eSRobert Mustacchi hash_table_base->tb_total_abbrev_count= 0;
271*f3e7f55eSRobert Mustacchi hash_table_base->tb_entries = _dwarf_get_alloc(dbg,
272*f3e7f55eSRobert Mustacchi DW_DLA_HASH_TABLE_ENTRY,
273*f3e7f55eSRobert Mustacchi hash_table_base->tb_table_entry_count);
274*f3e7f55eSRobert Mustacchi if(! hash_table_base->tb_entries) {
275*f3e7f55eSRobert Mustacchi return NULL;
276*f3e7f55eSRobert Mustacchi }
277*f3e7f55eSRobert Mustacchi
278*f3e7f55eSRobert Mustacchi } else if (hash_table_base->tb_total_abbrev_count >
279*f3e7f55eSRobert Mustacchi ( hash_table_base->tb_table_entry_count * HT_MULTIPLE) ) {
280*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_s newht;
281*f3e7f55eSRobert Mustacchi /* Effectively multiplies by >= HT_MULTIPLE */
282*f3e7f55eSRobert Mustacchi newht.tb_table_entry_count = hash_table_base->tb_total_abbrev_count;
283*f3e7f55eSRobert Mustacchi newht.tb_total_abbrev_count = 0;
284*f3e7f55eSRobert Mustacchi newht.tb_entries = _dwarf_get_alloc(dbg,
285*f3e7f55eSRobert Mustacchi DW_DLA_HASH_TABLE_ENTRY,
286*f3e7f55eSRobert Mustacchi newht.tb_table_entry_count);
287*f3e7f55eSRobert Mustacchi
288*f3e7f55eSRobert Mustacchi if(! newht.tb_entries) {
289*f3e7f55eSRobert Mustacchi return NULL;
290*f3e7f55eSRobert Mustacchi }
291*f3e7f55eSRobert Mustacchi /* Copy the existing entries to the new table,
292*f3e7f55eSRobert Mustacchi rehashing each.
293*f3e7f55eSRobert Mustacchi */
294*f3e7f55eSRobert Mustacchi copy_abbrev_table_to_new_table(hash_table_base, &newht);
295*f3e7f55eSRobert Mustacchi /* Dealloc only the entries hash table array, not the lists
296*f3e7f55eSRobert Mustacchi of things pointed to by a hash table entry array. */
297*f3e7f55eSRobert Mustacchi dwarf_dealloc(dbg, hash_table_base->tb_entries,DW_DLA_HASH_TABLE_ENTRY);
298*f3e7f55eSRobert Mustacchi hash_table_base->tb_entries = 0;
299*f3e7f55eSRobert Mustacchi /* Now overwrite the existing table descriptor with
300*f3e7f55eSRobert Mustacchi the new, newly valid, contents. */
301*f3e7f55eSRobert Mustacchi *hash_table_base = newht;
302*f3e7f55eSRobert Mustacchi } /* Else is ok as is, add entry */
303*f3e7f55eSRobert Mustacchi
304*f3e7f55eSRobert Mustacchi
305*f3e7f55eSRobert Mustacchi hashable_val = code;
306*f3e7f55eSRobert Mustacchi hash_num = hashable_val %
307*f3e7f55eSRobert Mustacchi hash_table_base->tb_table_entry_count;
308*f3e7f55eSRobert Mustacchi entry_base = hash_table_base->tb_entries;
309*f3e7f55eSRobert Mustacchi entry_cur = entry_base + hash_num;
310*f3e7f55eSRobert Mustacchi
311*f3e7f55eSRobert Mustacchi /* Determine if the 'code' is the list of synonyms already. */
312*f3e7f55eSRobert Mustacchi for (hash_abbrev_entry = entry_cur->at_head;
313*f3e7f55eSRobert Mustacchi hash_abbrev_entry != NULL && hash_abbrev_entry->ab_code != code;
314*f3e7f55eSRobert Mustacchi hash_abbrev_entry = hash_abbrev_entry->ab_next);
315*f3e7f55eSRobert Mustacchi if (hash_abbrev_entry != NULL) {
316*f3e7f55eSRobert Mustacchi /* This returns a pointer to an abbrev list entry, not
317*f3e7f55eSRobert Mustacchi the list itself. */
318*f3e7f55eSRobert Mustacchi return (hash_abbrev_entry);
319*f3e7f55eSRobert Mustacchi }
320*f3e7f55eSRobert Mustacchi
321*f3e7f55eSRobert Mustacchi abbrev_ptr = cu_context->cc_last_abbrev_ptr != NULL ?
322*f3e7f55eSRobert Mustacchi cu_context->cc_last_abbrev_ptr :
323*f3e7f55eSRobert Mustacchi dbg->de_debug_abbrev.dss_data + cu_context->cc_abbrev_offset;
324*f3e7f55eSRobert Mustacchi
325*f3e7f55eSRobert Mustacchi /* End of abbrev's for this cu, since abbrev code is 0. */
326*f3e7f55eSRobert Mustacchi if (*abbrev_ptr == 0) {
327*f3e7f55eSRobert Mustacchi return (NULL);
328*f3e7f55eSRobert Mustacchi }
329*f3e7f55eSRobert Mustacchi
330*f3e7f55eSRobert Mustacchi do {
331*f3e7f55eSRobert Mustacchi unsigned new_hashable_val;
332*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(abbrev_ptr, abbrev_code);
333*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(abbrev_ptr, abbrev_tag);
334*f3e7f55eSRobert Mustacchi
335*f3e7f55eSRobert Mustacchi inner_list_entry = (Dwarf_Abbrev_List)
336*f3e7f55eSRobert Mustacchi _dwarf_get_alloc(cu_context->cc_dbg, DW_DLA_ABBREV_LIST, 1);
337*f3e7f55eSRobert Mustacchi if (inner_list_entry == NULL)
338*f3e7f55eSRobert Mustacchi return (NULL);
339*f3e7f55eSRobert Mustacchi
340*f3e7f55eSRobert Mustacchi new_hashable_val = abbrev_code;
341*f3e7f55eSRobert Mustacchi hash_num = new_hashable_val %
342*f3e7f55eSRobert Mustacchi hash_table_base->tb_table_entry_count;
343*f3e7f55eSRobert Mustacchi inner_hash_entry = entry_base + hash_num;
344*f3e7f55eSRobert Mustacchi /* Move_entry_to_new_hash */
345*f3e7f55eSRobert Mustacchi inner_list_entry->ab_next = inner_hash_entry->at_head;
346*f3e7f55eSRobert Mustacchi inner_hash_entry->at_head = inner_list_entry;
347*f3e7f55eSRobert Mustacchi
348*f3e7f55eSRobert Mustacchi hash_table_base->tb_total_abbrev_count++;
349*f3e7f55eSRobert Mustacchi
350*f3e7f55eSRobert Mustacchi inner_list_entry->ab_code = abbrev_code;
351*f3e7f55eSRobert Mustacchi inner_list_entry->ab_tag = abbrev_tag;
352*f3e7f55eSRobert Mustacchi inner_list_entry->ab_has_child = *(abbrev_ptr++);
353*f3e7f55eSRobert Mustacchi inner_list_entry->ab_abbrev_ptr = abbrev_ptr;
354*f3e7f55eSRobert Mustacchi
355*f3e7f55eSRobert Mustacchi /* Cycle thru the abbrev content, ignoring the content except
356*f3e7f55eSRobert Mustacchi to find the end of the content. */
357*f3e7f55eSRobert Mustacchi do {
358*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(abbrev_ptr, attr_name);
359*f3e7f55eSRobert Mustacchi DECODE_LEB128_UWORD(abbrev_ptr, attr_form);
360*f3e7f55eSRobert Mustacchi } while (attr_name != 0 && attr_form != 0);
361*f3e7f55eSRobert Mustacchi
362*f3e7f55eSRobert Mustacchi } while (*abbrev_ptr != 0 && abbrev_code != code);
363*f3e7f55eSRobert Mustacchi
364*f3e7f55eSRobert Mustacchi cu_context->cc_last_abbrev_ptr = abbrev_ptr;
365*f3e7f55eSRobert Mustacchi return (abbrev_code == code ? inner_list_entry : NULL);
366*f3e7f55eSRobert Mustacchi }
367*f3e7f55eSRobert Mustacchi
368*f3e7f55eSRobert Mustacchi
369*f3e7f55eSRobert Mustacchi /* return 1 if string ends before 'endptr' else
370*f3e7f55eSRobert Mustacchi ** return 0 meaning string is not properly terminated.
371*f3e7f55eSRobert Mustacchi ** Presumption is the 'endptr' pts to end of some dwarf section data.
372*f3e7f55eSRobert Mustacchi */
373*f3e7f55eSRobert Mustacchi int
_dwarf_string_valid(void * startptr,void * endptr)374*f3e7f55eSRobert Mustacchi _dwarf_string_valid(void *startptr, void *endptr)
375*f3e7f55eSRobert Mustacchi {
376*f3e7f55eSRobert Mustacchi
377*f3e7f55eSRobert Mustacchi char *start = startptr;
378*f3e7f55eSRobert Mustacchi char *end = endptr;
379*f3e7f55eSRobert Mustacchi
380*f3e7f55eSRobert Mustacchi while (start < end) {
381*f3e7f55eSRobert Mustacchi if (*start == 0) {
382*f3e7f55eSRobert Mustacchi return 1; /* OK! */
383*f3e7f55eSRobert Mustacchi }
384*f3e7f55eSRobert Mustacchi ++start;
385*f3e7f55eSRobert Mustacchi ++end;
386*f3e7f55eSRobert Mustacchi }
387*f3e7f55eSRobert Mustacchi return 0; /* FAIL! bad string! */
388*f3e7f55eSRobert Mustacchi }
389*f3e7f55eSRobert Mustacchi
390*f3e7f55eSRobert Mustacchi /*
391*f3e7f55eSRobert Mustacchi A byte-swapping version of memcpy
392*f3e7f55eSRobert Mustacchi for cross-endian use.
393*f3e7f55eSRobert Mustacchi Only 2,4,8 should be lengths passed in.
394*f3e7f55eSRobert Mustacchi */
395*f3e7f55eSRobert Mustacchi void *
_dwarf_memcpy_swap_bytes(void * s1,const void * s2,size_t len)396*f3e7f55eSRobert Mustacchi _dwarf_memcpy_swap_bytes(void *s1, const void *s2, size_t len)
397*f3e7f55eSRobert Mustacchi {
398*f3e7f55eSRobert Mustacchi void *orig_s1 = s1;
399*f3e7f55eSRobert Mustacchi unsigned char *targ = (unsigned char *) s1;
400*f3e7f55eSRobert Mustacchi unsigned char *src = (unsigned char *) s2;
401*f3e7f55eSRobert Mustacchi
402*f3e7f55eSRobert Mustacchi if (len == 4) {
403*f3e7f55eSRobert Mustacchi targ[3] = src[0];
404*f3e7f55eSRobert Mustacchi targ[2] = src[1];
405*f3e7f55eSRobert Mustacchi targ[1] = src[2];
406*f3e7f55eSRobert Mustacchi targ[0] = src[3];
407*f3e7f55eSRobert Mustacchi } else if (len == 8) {
408*f3e7f55eSRobert Mustacchi targ[7] = src[0];
409*f3e7f55eSRobert Mustacchi targ[6] = src[1];
410*f3e7f55eSRobert Mustacchi targ[5] = src[2];
411*f3e7f55eSRobert Mustacchi targ[4] = src[3];
412*f3e7f55eSRobert Mustacchi targ[3] = src[4];
413*f3e7f55eSRobert Mustacchi targ[2] = src[5];
414*f3e7f55eSRobert Mustacchi targ[1] = src[6];
415*f3e7f55eSRobert Mustacchi targ[0] = src[7];
416*f3e7f55eSRobert Mustacchi } else if (len == 2) {
417*f3e7f55eSRobert Mustacchi targ[1] = src[0];
418*f3e7f55eSRobert Mustacchi targ[0] = src[1];
419*f3e7f55eSRobert Mustacchi }
420*f3e7f55eSRobert Mustacchi /* should NOT get below here: is not the intended use */
421*f3e7f55eSRobert Mustacchi else if (len == 1) {
422*f3e7f55eSRobert Mustacchi targ[0] = src[0];
423*f3e7f55eSRobert Mustacchi } else {
424*f3e7f55eSRobert Mustacchi memcpy(s1, s2, len);
425*f3e7f55eSRobert Mustacchi }
426*f3e7f55eSRobert Mustacchi
427*f3e7f55eSRobert Mustacchi return orig_s1;
428*f3e7f55eSRobert Mustacchi }
429*f3e7f55eSRobert Mustacchi
430*f3e7f55eSRobert Mustacchi
431*f3e7f55eSRobert Mustacchi /*
432*f3e7f55eSRobert Mustacchi This calculation used to be sprinkled all over.
433*f3e7f55eSRobert Mustacchi Now brought to one place.
434*f3e7f55eSRobert Mustacchi
435*f3e7f55eSRobert Mustacchi We try to accurately compute the size of a cu header
436*f3e7f55eSRobert Mustacchi given a known cu header location ( an offset in .debug_info).
437*f3e7f55eSRobert Mustacchi
438*f3e7f55eSRobert Mustacchi */
439*f3e7f55eSRobert Mustacchi /* ARGSUSED */
440*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
_dwarf_length_of_cu_header(Dwarf_Debug dbg,Dwarf_Unsigned offset)441*f3e7f55eSRobert Mustacchi _dwarf_length_of_cu_header(Dwarf_Debug dbg, Dwarf_Unsigned offset)
442*f3e7f55eSRobert Mustacchi {
443*f3e7f55eSRobert Mustacchi int local_length_size = 0;
444*f3e7f55eSRobert Mustacchi int local_extension_size = 0;
445*f3e7f55eSRobert Mustacchi Dwarf_Unsigned length = 0;
446*f3e7f55eSRobert Mustacchi Dwarf_Small *cuptr = dbg->de_debug_info.dss_data + offset;
447*f3e7f55eSRobert Mustacchi
448*f3e7f55eSRobert Mustacchi READ_AREA_LENGTH(dbg, length, Dwarf_Unsigned,
449*f3e7f55eSRobert Mustacchi cuptr, local_length_size, local_extension_size);
450*f3e7f55eSRobert Mustacchi
451*f3e7f55eSRobert Mustacchi return local_extension_size + /* initial extesion, if present
452*f3e7f55eSRobert Mustacchi */
453*f3e7f55eSRobert Mustacchi local_length_size + /* Size of cu length field. */
454*f3e7f55eSRobert Mustacchi sizeof(Dwarf_Half) + /* Size of version stamp field. */
455*f3e7f55eSRobert Mustacchi local_length_size + /* Size of abbrev offset field. */
456*f3e7f55eSRobert Mustacchi sizeof(Dwarf_Small); /* Size of address size field. */
457*f3e7f55eSRobert Mustacchi
458*f3e7f55eSRobert Mustacchi }
459*f3e7f55eSRobert Mustacchi
460*f3e7f55eSRobert Mustacchi /*
461*f3e7f55eSRobert Mustacchi Pretend we know nothing about the CU
462*f3e7f55eSRobert Mustacchi and just roughly compute the result.
463*f3e7f55eSRobert Mustacchi */
464*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
_dwarf_length_of_cu_header_simple(Dwarf_Debug dbg)465*f3e7f55eSRobert Mustacchi _dwarf_length_of_cu_header_simple(Dwarf_Debug dbg)
466*f3e7f55eSRobert Mustacchi {
467*f3e7f55eSRobert Mustacchi return dbg->de_length_size + /* Size of cu length field. */
468*f3e7f55eSRobert Mustacchi sizeof(Dwarf_Half) + /* Size of version stamp field. */
469*f3e7f55eSRobert Mustacchi dbg->de_length_size + /* Size of abbrev offset field. */
470*f3e7f55eSRobert Mustacchi sizeof(Dwarf_Small); /* Size of address size field. */
471*f3e7f55eSRobert Mustacchi }
472*f3e7f55eSRobert Mustacchi
473*f3e7f55eSRobert Mustacchi /* Now that we delay loading .debug_info, we need to do the
474*f3e7f55eSRobert Mustacchi load in more places. So putting the load
475*f3e7f55eSRobert Mustacchi code in one place now instead of replicating it in multiple
476*f3e7f55eSRobert Mustacchi places.
477*f3e7f55eSRobert Mustacchi
478*f3e7f55eSRobert Mustacchi */
479*f3e7f55eSRobert Mustacchi int
_dwarf_load_debug_info(Dwarf_Debug dbg,Dwarf_Error * error)480*f3e7f55eSRobert Mustacchi _dwarf_load_debug_info(Dwarf_Debug dbg, Dwarf_Error * error)
481*f3e7f55eSRobert Mustacchi {
482*f3e7f55eSRobert Mustacchi int res = DW_DLV_ERROR;
483*f3e7f55eSRobert Mustacchi
484*f3e7f55eSRobert Mustacchi /* Testing de_debug_info.dss_data allows us to avoid testing
485*f3e7f55eSRobert Mustacchi de_debug_abbrev.dss_data.
486*f3e7f55eSRobert Mustacchi One test instead of 2. .debug_info is useless
487*f3e7f55eSRobert Mustacchi without .debug_abbrev. */
488*f3e7f55eSRobert Mustacchi if (dbg->de_debug_info.dss_data) {
489*f3e7f55eSRobert Mustacchi return DW_DLV_OK;
490*f3e7f55eSRobert Mustacchi }
491*f3e7f55eSRobert Mustacchi
492*f3e7f55eSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_abbrev,error);
493*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
494*f3e7f55eSRobert Mustacchi return res;
495*f3e7f55eSRobert Mustacchi }
496*f3e7f55eSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_info, error);
497*f3e7f55eSRobert Mustacchi return res;
498*f3e7f55eSRobert Mustacchi
499*f3e7f55eSRobert Mustacchi }
500*f3e7f55eSRobert Mustacchi void
_dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg,Dwarf_Hash_Table hash_table)501*f3e7f55eSRobert Mustacchi _dwarf_free_abbrev_hash_table_contents(Dwarf_Debug dbg,Dwarf_Hash_Table hash_table)
502*f3e7f55eSRobert Mustacchi {
503*f3e7f55eSRobert Mustacchi /* A Hash Table is an array with tb_table_entry_count struct
504*f3e7f55eSRobert Mustacchi Dwarf_Hash_Table_s entries in the array. */
505*f3e7f55eSRobert Mustacchi int hashnum = 0;
506*f3e7f55eSRobert Mustacchi for (; hashnum < hash_table->tb_table_entry_count; ++hashnum) {
507*f3e7f55eSRobert Mustacchi struct Dwarf_Abbrev_List_s *abbrev = 0;
508*f3e7f55eSRobert Mustacchi struct Dwarf_Abbrev_List_s *nextabbrev = 0;
509*f3e7f55eSRobert Mustacchi struct Dwarf_Hash_Table_Entry_s *tb = &hash_table->tb_entries[hashnum];
510*f3e7f55eSRobert Mustacchi
511*f3e7f55eSRobert Mustacchi abbrev = tb->at_head;
512*f3e7f55eSRobert Mustacchi for (; abbrev; abbrev = nextabbrev) {
513*f3e7f55eSRobert Mustacchi nextabbrev = abbrev->ab_next;
514*f3e7f55eSRobert Mustacchi dwarf_dealloc(dbg, abbrev, DW_DLA_ABBREV_LIST);
515*f3e7f55eSRobert Mustacchi }
516*f3e7f55eSRobert Mustacchi }
517*f3e7f55eSRobert Mustacchi /* Frees all the entries at once: an array. */
518*f3e7f55eSRobert Mustacchi dwarf_dealloc(dbg,hash_table->tb_entries,DW_DLA_HASH_TABLE_ENTRY);
519*f3e7f55eSRobert Mustacchi }
520*f3e7f55eSRobert Mustacchi
521*f3e7f55eSRobert Mustacchi /*
522*f3e7f55eSRobert Mustacchi If no die provided the size value returned might be wrong.
523*f3e7f55eSRobert Mustacchi If different compilation units have different address sizes
524*f3e7f55eSRobert Mustacchi this may not give the correct value in all contexts if the die
525*f3e7f55eSRobert Mustacchi pointer is NULL.
526*f3e7f55eSRobert Mustacchi If the Elf offset size != address_size
527*f3e7f55eSRobert Mustacchi (for example if address_size = 4 but recorded in elf64 object)
528*f3e7f55eSRobert Mustacchi this may not give the correct value in all contexts if the die
529*f3e7f55eSRobert Mustacchi pointer is NULL.
530*f3e7f55eSRobert Mustacchi If the die pointer is non-NULL (in which case it must point to
531*f3e7f55eSRobert Mustacchi a valid DIE) this will return the correct size.
532*f3e7f55eSRobert Mustacchi */
533*f3e7f55eSRobert Mustacchi int
_dwarf_get_address_size(Dwarf_Debug dbg,Dwarf_Die die)534*f3e7f55eSRobert Mustacchi _dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Die die)
535*f3e7f55eSRobert Mustacchi {
536*f3e7f55eSRobert Mustacchi Dwarf_CU_Context context = 0;
537*f3e7f55eSRobert Mustacchi Dwarf_Half addrsize = 0;
538*f3e7f55eSRobert Mustacchi if(!die) {
539*f3e7f55eSRobert Mustacchi return dbg->de_pointer_size;
540*f3e7f55eSRobert Mustacchi }
541*f3e7f55eSRobert Mustacchi context = die->di_cu_context;
542*f3e7f55eSRobert Mustacchi addrsize = context->cc_address_size;
543*f3e7f55eSRobert Mustacchi return addrsize;
544*f3e7f55eSRobert Mustacchi }
545*f3e7f55eSRobert Mustacchi
546*f3e7f55eSRobert Mustacchi
547*f3e7f55eSRobert Mustacchi
548