1*a9fa9459Szrj /* DWARF 1 find nearest line (_bfd_dwarf1_find_nearest_line).
2*a9fa9459Szrj Copyright (C) 1998-2016 Free Software Foundation, Inc.
3*a9fa9459Szrj
4*a9fa9459Szrj Written by Gavin Romig-Koch of Cygnus Solutions (gavin@cygnus.com).
5*a9fa9459Szrj
6*a9fa9459Szrj This file is part of BFD.
7*a9fa9459Szrj
8*a9fa9459Szrj This program is free software; you can redistribute it and/or modify
9*a9fa9459Szrj it under the terms of the GNU General Public License as published by
10*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or (at
11*a9fa9459Szrj your option) any later version.
12*a9fa9459Szrj
13*a9fa9459Szrj This program is distributed in the hope that it will be useful, but
14*a9fa9459Szrj WITHOUT ANY WARRANTY; without even the implied warranty of
15*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16*a9fa9459Szrj General Public License for more details.
17*a9fa9459Szrj
18*a9fa9459Szrj You should have received a copy of the GNU General Public License
19*a9fa9459Szrj along with this program; if not, write to the Free Software
20*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21*a9fa9459Szrj MA 02110-1301, USA. */
22*a9fa9459Szrj
23*a9fa9459Szrj #include "sysdep.h"
24*a9fa9459Szrj #include "bfd.h"
25*a9fa9459Szrj #include "libiberty.h"
26*a9fa9459Szrj #include "libbfd.h"
27*a9fa9459Szrj #include "elf-bfd.h"
28*a9fa9459Szrj #include "elf/dwarf.h"
29*a9fa9459Szrj
30*a9fa9459Szrj /* dwarf1_debug is the starting point for all dwarf1 info. */
31*a9fa9459Szrj
32*a9fa9459Szrj struct dwarf1_debug
33*a9fa9459Szrj {
34*a9fa9459Szrj /* The bfd we are working with. */
35*a9fa9459Szrj bfd* abfd;
36*a9fa9459Szrj
37*a9fa9459Szrj /* Pointer to the symbol table. */
38*a9fa9459Szrj asymbol** syms;
39*a9fa9459Szrj
40*a9fa9459Szrj /* List of already parsed compilation units. */
41*a9fa9459Szrj struct dwarf1_unit* lastUnit;
42*a9fa9459Szrj
43*a9fa9459Szrj /* The buffer for the .debug section.
44*a9fa9459Szrj Zero indicates that the .debug section failed to load. */
45*a9fa9459Szrj bfd_byte *debug_section;
46*a9fa9459Szrj
47*a9fa9459Szrj /* Pointer to the end of the .debug_info section memory buffer. */
48*a9fa9459Szrj bfd_byte *debug_section_end;
49*a9fa9459Szrj
50*a9fa9459Szrj /* The buffer for the .line section. */
51*a9fa9459Szrj bfd_byte *line_section;
52*a9fa9459Szrj
53*a9fa9459Szrj /* End of that buffer. */
54*a9fa9459Szrj bfd_byte *line_section_end;
55*a9fa9459Szrj
56*a9fa9459Szrj /* The current or next unread die within the .debug section. */
57*a9fa9459Szrj bfd_byte *currentDie;
58*a9fa9459Szrj };
59*a9fa9459Szrj
60*a9fa9459Szrj /* One dwarf1_unit for each parsed compilation unit die. */
61*a9fa9459Szrj
62*a9fa9459Szrj struct dwarf1_unit
63*a9fa9459Szrj {
64*a9fa9459Szrj /* Linked starting from stash->lastUnit. */
65*a9fa9459Szrj struct dwarf1_unit* prev;
66*a9fa9459Szrj
67*a9fa9459Szrj /* Name of the compilation unit. */
68*a9fa9459Szrj char *name;
69*a9fa9459Szrj
70*a9fa9459Szrj /* The highest and lowest address used in the compilation unit. */
71*a9fa9459Szrj unsigned long low_pc;
72*a9fa9459Szrj unsigned long high_pc;
73*a9fa9459Szrj
74*a9fa9459Szrj /* Does this unit have a statement list? */
75*a9fa9459Szrj int has_stmt_list;
76*a9fa9459Szrj
77*a9fa9459Szrj /* If any, the offset of the line number table in the .line section. */
78*a9fa9459Szrj unsigned long stmt_list_offset;
79*a9fa9459Szrj
80*a9fa9459Szrj /* If non-zero, a pointer to the first child of this unit. */
81*a9fa9459Szrj bfd_byte *first_child;
82*a9fa9459Szrj
83*a9fa9459Szrj /* How many line entries? */
84*a9fa9459Szrj unsigned long line_count;
85*a9fa9459Szrj
86*a9fa9459Szrj /* The decoded line number table (line_count entries). */
87*a9fa9459Szrj struct linenumber* linenumber_table;
88*a9fa9459Szrj
89*a9fa9459Szrj /* The list of functions in this unit. */
90*a9fa9459Szrj struct dwarf1_func* func_list;
91*a9fa9459Szrj };
92*a9fa9459Szrj
93*a9fa9459Szrj /* One dwarf1_func for each parsed function die. */
94*a9fa9459Szrj
95*a9fa9459Szrj struct dwarf1_func
96*a9fa9459Szrj {
97*a9fa9459Szrj /* Linked starting from aUnit->func_list. */
98*a9fa9459Szrj struct dwarf1_func* prev;
99*a9fa9459Szrj
100*a9fa9459Szrj /* Name of function. */
101*a9fa9459Szrj char* name;
102*a9fa9459Szrj
103*a9fa9459Szrj /* The highest and lowest address used in the compilation unit. */
104*a9fa9459Szrj unsigned long low_pc;
105*a9fa9459Szrj unsigned long high_pc;
106*a9fa9459Szrj };
107*a9fa9459Szrj
108*a9fa9459Szrj /* Used to return info about a parsed die. */
109*a9fa9459Szrj struct die_info
110*a9fa9459Szrj {
111*a9fa9459Szrj unsigned long length;
112*a9fa9459Szrj unsigned long sibling;
113*a9fa9459Szrj unsigned long low_pc;
114*a9fa9459Szrj unsigned long high_pc;
115*a9fa9459Szrj unsigned long stmt_list_offset;
116*a9fa9459Szrj
117*a9fa9459Szrj char* name;
118*a9fa9459Szrj
119*a9fa9459Szrj int has_stmt_list;
120*a9fa9459Szrj
121*a9fa9459Szrj unsigned short tag;
122*a9fa9459Szrj };
123*a9fa9459Szrj
124*a9fa9459Szrj /* Parsed line number information. */
125*a9fa9459Szrj struct linenumber
126*a9fa9459Szrj {
127*a9fa9459Szrj /* First address in the line. */
128*a9fa9459Szrj unsigned long addr;
129*a9fa9459Szrj
130*a9fa9459Szrj /* The line number. */
131*a9fa9459Szrj unsigned long linenumber;
132*a9fa9459Szrj };
133*a9fa9459Szrj
134*a9fa9459Szrj /* Find the form of an attr, from the attr field. */
135*a9fa9459Szrj #define FORM_FROM_ATTR(attr) ((attr) & 0xF) /* Implicitly specified. */
136*a9fa9459Szrj
137*a9fa9459Szrj /* Return a newly allocated dwarf1_unit. It should be cleared and
138*a9fa9459Szrj then attached into the 'stash' at 'stash->lastUnit'. */
139*a9fa9459Szrj
140*a9fa9459Szrj static struct dwarf1_unit*
alloc_dwarf1_unit(struct dwarf1_debug * stash)141*a9fa9459Szrj alloc_dwarf1_unit (struct dwarf1_debug* stash)
142*a9fa9459Szrj {
143*a9fa9459Szrj bfd_size_type amt = sizeof (struct dwarf1_unit);
144*a9fa9459Szrj
145*a9fa9459Szrj struct dwarf1_unit* x = (struct dwarf1_unit *) bfd_zalloc (stash->abfd, amt);
146*a9fa9459Szrj if (x)
147*a9fa9459Szrj {
148*a9fa9459Szrj x->prev = stash->lastUnit;
149*a9fa9459Szrj stash->lastUnit = x;
150*a9fa9459Szrj }
151*a9fa9459Szrj
152*a9fa9459Szrj return x;
153*a9fa9459Szrj }
154*a9fa9459Szrj
155*a9fa9459Szrj /* Return a newly allocated dwarf1_func. It must be cleared and
156*a9fa9459Szrj attached into 'aUnit' at 'aUnit->func_list'. */
157*a9fa9459Szrj
158*a9fa9459Szrj static struct dwarf1_func *
alloc_dwarf1_func(struct dwarf1_debug * stash,struct dwarf1_unit * aUnit)159*a9fa9459Szrj alloc_dwarf1_func (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
160*a9fa9459Szrj {
161*a9fa9459Szrj bfd_size_type amt = sizeof (struct dwarf1_func);
162*a9fa9459Szrj
163*a9fa9459Szrj struct dwarf1_func* x = (struct dwarf1_func *) bfd_zalloc (stash->abfd, amt);
164*a9fa9459Szrj if (x)
165*a9fa9459Szrj {
166*a9fa9459Szrj x->prev = aUnit->func_list;
167*a9fa9459Szrj aUnit->func_list = x;
168*a9fa9459Szrj }
169*a9fa9459Szrj
170*a9fa9459Szrj return x;
171*a9fa9459Szrj }
172*a9fa9459Szrj
173*a9fa9459Szrj /* parse_die - parse a Dwarf1 die.
174*a9fa9459Szrj Parse the die starting at 'aDiePtr' into 'aDieInfo'.
175*a9fa9459Szrj 'abfd' must be the bfd from which the section that 'aDiePtr'
176*a9fa9459Szrj points to was pulled from.
177*a9fa9459Szrj
178*a9fa9459Szrj Return FALSE if the die is invalidly formatted; TRUE otherwise. */
179*a9fa9459Szrj
180*a9fa9459Szrj static bfd_boolean
parse_die(bfd * abfd,struct die_info * aDieInfo,bfd_byte * aDiePtr,bfd_byte * aDiePtrEnd)181*a9fa9459Szrj parse_die (bfd * abfd,
182*a9fa9459Szrj struct die_info * aDieInfo,
183*a9fa9459Szrj bfd_byte * aDiePtr,
184*a9fa9459Szrj bfd_byte * aDiePtrEnd)
185*a9fa9459Szrj {
186*a9fa9459Szrj bfd_byte *this_die = aDiePtr;
187*a9fa9459Szrj bfd_byte *xptr = this_die;
188*a9fa9459Szrj
189*a9fa9459Szrj memset (aDieInfo, 0, sizeof (* aDieInfo));
190*a9fa9459Szrj
191*a9fa9459Szrj /* First comes the length. */
192*a9fa9459Szrj aDieInfo->length = bfd_get_32 (abfd, (bfd_byte *) xptr);
193*a9fa9459Szrj xptr += 4;
194*a9fa9459Szrj if (aDieInfo->length == 0
195*a9fa9459Szrj || (this_die + aDieInfo->length) >= aDiePtrEnd)
196*a9fa9459Szrj return FALSE;
197*a9fa9459Szrj if (aDieInfo->length < 6)
198*a9fa9459Szrj {
199*a9fa9459Szrj /* Just padding bytes. */
200*a9fa9459Szrj aDieInfo->tag = TAG_padding;
201*a9fa9459Szrj return TRUE;
202*a9fa9459Szrj }
203*a9fa9459Szrj
204*a9fa9459Szrj /* Then the tag. */
205*a9fa9459Szrj aDieInfo->tag = bfd_get_16 (abfd, (bfd_byte *) xptr);
206*a9fa9459Szrj xptr += 2;
207*a9fa9459Szrj
208*a9fa9459Szrj /* Then the attributes. */
209*a9fa9459Szrj while (xptr < (this_die + aDieInfo->length))
210*a9fa9459Szrj {
211*a9fa9459Szrj unsigned short attr;
212*a9fa9459Szrj
213*a9fa9459Szrj /* Parse the attribute based on its form. This section
214*a9fa9459Szrj must handle all dwarf1 forms, but need only handle the
215*a9fa9459Szrj actual attributes that we care about. */
216*a9fa9459Szrj attr = bfd_get_16 (abfd, (bfd_byte *) xptr);
217*a9fa9459Szrj xptr += 2;
218*a9fa9459Szrj
219*a9fa9459Szrj switch (FORM_FROM_ATTR (attr))
220*a9fa9459Szrj {
221*a9fa9459Szrj case FORM_DATA2:
222*a9fa9459Szrj xptr += 2;
223*a9fa9459Szrj break;
224*a9fa9459Szrj case FORM_DATA4:
225*a9fa9459Szrj case FORM_REF:
226*a9fa9459Szrj if (attr == AT_sibling)
227*a9fa9459Szrj aDieInfo->sibling = bfd_get_32 (abfd, (bfd_byte *) xptr);
228*a9fa9459Szrj else if (attr == AT_stmt_list)
229*a9fa9459Szrj {
230*a9fa9459Szrj aDieInfo->stmt_list_offset = bfd_get_32 (abfd, (bfd_byte *) xptr);
231*a9fa9459Szrj aDieInfo->has_stmt_list = 1;
232*a9fa9459Szrj }
233*a9fa9459Szrj xptr += 4;
234*a9fa9459Szrj break;
235*a9fa9459Szrj case FORM_DATA8:
236*a9fa9459Szrj xptr += 8;
237*a9fa9459Szrj break;
238*a9fa9459Szrj case FORM_ADDR:
239*a9fa9459Szrj if (attr == AT_low_pc)
240*a9fa9459Szrj aDieInfo->low_pc = bfd_get_32 (abfd, (bfd_byte *) xptr);
241*a9fa9459Szrj else if (attr == AT_high_pc)
242*a9fa9459Szrj aDieInfo->high_pc = bfd_get_32 (abfd, (bfd_byte *) xptr);
243*a9fa9459Szrj xptr += 4;
244*a9fa9459Szrj break;
245*a9fa9459Szrj case FORM_BLOCK2:
246*a9fa9459Szrj xptr += 2 + bfd_get_16 (abfd, (bfd_byte *) xptr);
247*a9fa9459Szrj break;
248*a9fa9459Szrj case FORM_BLOCK4:
249*a9fa9459Szrj xptr += 4 + bfd_get_32 (abfd, (bfd_byte *) xptr);
250*a9fa9459Szrj break;
251*a9fa9459Szrj case FORM_STRING:
252*a9fa9459Szrj if (attr == AT_name)
253*a9fa9459Szrj aDieInfo->name = (char *) xptr;
254*a9fa9459Szrj xptr += strlen ((char *) xptr) + 1;
255*a9fa9459Szrj break;
256*a9fa9459Szrj }
257*a9fa9459Szrj }
258*a9fa9459Szrj
259*a9fa9459Szrj return TRUE;
260*a9fa9459Szrj }
261*a9fa9459Szrj
262*a9fa9459Szrj /* Parse a dwarf1 line number table for 'aUnit->stmt_list_offset'
263*a9fa9459Szrj into 'aUnit->linenumber_table'. Return FALSE if an error
264*a9fa9459Szrj occurs; TRUE otherwise. */
265*a9fa9459Szrj
266*a9fa9459Szrj static bfd_boolean
parse_line_table(struct dwarf1_debug * stash,struct dwarf1_unit * aUnit)267*a9fa9459Szrj parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
268*a9fa9459Szrj {
269*a9fa9459Szrj bfd_byte *xptr;
270*a9fa9459Szrj
271*a9fa9459Szrj /* Load the ".line" section from the bfd if we haven't already. */
272*a9fa9459Szrj if (stash->line_section == 0)
273*a9fa9459Szrj {
274*a9fa9459Szrj asection *msec;
275*a9fa9459Szrj bfd_size_type size;
276*a9fa9459Szrj
277*a9fa9459Szrj msec = bfd_get_section_by_name (stash->abfd, ".line");
278*a9fa9459Szrj if (! msec)
279*a9fa9459Szrj return FALSE;
280*a9fa9459Szrj
281*a9fa9459Szrj size = msec->rawsize ? msec->rawsize : msec->size;
282*a9fa9459Szrj stash->line_section
283*a9fa9459Szrj = bfd_simple_get_relocated_section_contents
284*a9fa9459Szrj (stash->abfd, msec, NULL, stash->syms);
285*a9fa9459Szrj
286*a9fa9459Szrj if (! stash->line_section)
287*a9fa9459Szrj return FALSE;
288*a9fa9459Szrj
289*a9fa9459Szrj stash->line_section_end = stash->line_section + size;
290*a9fa9459Szrj }
291*a9fa9459Szrj
292*a9fa9459Szrj xptr = stash->line_section + aUnit->stmt_list_offset;
293*a9fa9459Szrj if (xptr < stash->line_section_end)
294*a9fa9459Szrj {
295*a9fa9459Szrj unsigned long eachLine;
296*a9fa9459Szrj bfd_byte *tblend;
297*a9fa9459Szrj unsigned long base;
298*a9fa9459Szrj bfd_size_type amt;
299*a9fa9459Szrj
300*a9fa9459Szrj /* First comes the length. */
301*a9fa9459Szrj tblend = bfd_get_32 (stash->abfd, (bfd_byte *) xptr) + xptr;
302*a9fa9459Szrj xptr += 4;
303*a9fa9459Szrj
304*a9fa9459Szrj /* Then the base address for each address in the table. */
305*a9fa9459Szrj base = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
306*a9fa9459Szrj xptr += 4;
307*a9fa9459Szrj
308*a9fa9459Szrj /* How many line entrys?
309*a9fa9459Szrj 10 = 4 (line number) + 2 (pos in line) + 4 (address in line). */
310*a9fa9459Szrj aUnit->line_count = (tblend - xptr) / 10;
311*a9fa9459Szrj
312*a9fa9459Szrj /* Allocate an array for the entries. */
313*a9fa9459Szrj amt = sizeof (struct linenumber) * aUnit->line_count;
314*a9fa9459Szrj aUnit->linenumber_table = (struct linenumber *) bfd_alloc (stash->abfd,
315*a9fa9459Szrj amt);
316*a9fa9459Szrj if (!aUnit->linenumber_table)
317*a9fa9459Szrj return FALSE;
318*a9fa9459Szrj
319*a9fa9459Szrj for (eachLine = 0; eachLine < aUnit->line_count; eachLine++)
320*a9fa9459Szrj {
321*a9fa9459Szrj /* A line number. */
322*a9fa9459Szrj aUnit->linenumber_table[eachLine].linenumber
323*a9fa9459Szrj = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
324*a9fa9459Szrj xptr += 4;
325*a9fa9459Szrj
326*a9fa9459Szrj /* Skip the position within the line. */
327*a9fa9459Szrj xptr += 2;
328*a9fa9459Szrj
329*a9fa9459Szrj /* And finally the address. */
330*a9fa9459Szrj aUnit->linenumber_table[eachLine].addr
331*a9fa9459Szrj = base + bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
332*a9fa9459Szrj xptr += 4;
333*a9fa9459Szrj }
334*a9fa9459Szrj }
335*a9fa9459Szrj
336*a9fa9459Szrj return TRUE;
337*a9fa9459Szrj }
338*a9fa9459Szrj
339*a9fa9459Szrj /* Parse each function die in a compilation unit 'aUnit'.
340*a9fa9459Szrj The first child die of 'aUnit' should be in 'aUnit->first_child',
341*a9fa9459Szrj the result is placed in 'aUnit->func_list'.
342*a9fa9459Szrj Return FALSE if error; TRUE otherwise. */
343*a9fa9459Szrj
344*a9fa9459Szrj static bfd_boolean
parse_functions_in_unit(struct dwarf1_debug * stash,struct dwarf1_unit * aUnit)345*a9fa9459Szrj parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
346*a9fa9459Szrj {
347*a9fa9459Szrj bfd_byte *eachDie;
348*a9fa9459Szrj
349*a9fa9459Szrj if (aUnit->first_child)
350*a9fa9459Szrj for (eachDie = aUnit->first_child;
351*a9fa9459Szrj eachDie < stash->debug_section_end;
352*a9fa9459Szrj )
353*a9fa9459Szrj {
354*a9fa9459Szrj struct die_info eachDieInfo;
355*a9fa9459Szrj
356*a9fa9459Szrj if (! parse_die (stash->abfd, &eachDieInfo, eachDie,
357*a9fa9459Szrj stash->debug_section_end))
358*a9fa9459Szrj return FALSE;
359*a9fa9459Szrj
360*a9fa9459Szrj if (eachDieInfo.tag == TAG_global_subroutine
361*a9fa9459Szrj || eachDieInfo.tag == TAG_subroutine
362*a9fa9459Szrj || eachDieInfo.tag == TAG_inlined_subroutine
363*a9fa9459Szrj || eachDieInfo.tag == TAG_entry_point)
364*a9fa9459Szrj {
365*a9fa9459Szrj struct dwarf1_func* aFunc = alloc_dwarf1_func (stash,aUnit);
366*a9fa9459Szrj if (!aFunc)
367*a9fa9459Szrj return FALSE;
368*a9fa9459Szrj
369*a9fa9459Szrj aFunc->name = eachDieInfo.name;
370*a9fa9459Szrj aFunc->low_pc = eachDieInfo.low_pc;
371*a9fa9459Szrj aFunc->high_pc = eachDieInfo.high_pc;
372*a9fa9459Szrj }
373*a9fa9459Szrj
374*a9fa9459Szrj /* Move to next sibling, if none, end loop */
375*a9fa9459Szrj if (eachDieInfo.sibling)
376*a9fa9459Szrj eachDie = stash->debug_section + eachDieInfo.sibling;
377*a9fa9459Szrj else
378*a9fa9459Szrj break;
379*a9fa9459Szrj }
380*a9fa9459Szrj
381*a9fa9459Szrj return TRUE;
382*a9fa9459Szrj }
383*a9fa9459Szrj
384*a9fa9459Szrj /* Find the nearest line to 'addr' in 'aUnit'.
385*a9fa9459Szrj Return whether we found the line (or a function) without error. */
386*a9fa9459Szrj
387*a9fa9459Szrj static bfd_boolean
dwarf1_unit_find_nearest_line(struct dwarf1_debug * stash,struct dwarf1_unit * aUnit,unsigned long addr,const char ** filename_ptr,const char ** functionname_ptr,unsigned int * linenumber_ptr)388*a9fa9459Szrj dwarf1_unit_find_nearest_line (struct dwarf1_debug* stash,
389*a9fa9459Szrj struct dwarf1_unit* aUnit,
390*a9fa9459Szrj unsigned long addr,
391*a9fa9459Szrj const char **filename_ptr,
392*a9fa9459Szrj const char **functionname_ptr,
393*a9fa9459Szrj unsigned int *linenumber_ptr)
394*a9fa9459Szrj {
395*a9fa9459Szrj int line_p = FALSE;
396*a9fa9459Szrj int func_p = FALSE;
397*a9fa9459Szrj
398*a9fa9459Szrj if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
399*a9fa9459Szrj {
400*a9fa9459Szrj if (aUnit->has_stmt_list)
401*a9fa9459Szrj {
402*a9fa9459Szrj unsigned long i;
403*a9fa9459Szrj struct dwarf1_func* eachFunc;
404*a9fa9459Szrj
405*a9fa9459Szrj if (! aUnit->linenumber_table)
406*a9fa9459Szrj {
407*a9fa9459Szrj if (! parse_line_table (stash, aUnit))
408*a9fa9459Szrj return FALSE;
409*a9fa9459Szrj }
410*a9fa9459Szrj
411*a9fa9459Szrj if (! aUnit->func_list)
412*a9fa9459Szrj {
413*a9fa9459Szrj if (! parse_functions_in_unit (stash, aUnit))
414*a9fa9459Szrj return FALSE;
415*a9fa9459Szrj }
416*a9fa9459Szrj
417*a9fa9459Szrj for (i = 0; i < aUnit->line_count; i++)
418*a9fa9459Szrj {
419*a9fa9459Szrj if (aUnit->linenumber_table[i].addr <= addr
420*a9fa9459Szrj && addr < aUnit->linenumber_table[i+1].addr)
421*a9fa9459Szrj {
422*a9fa9459Szrj *filename_ptr = aUnit->name;
423*a9fa9459Szrj *linenumber_ptr = aUnit->linenumber_table[i].linenumber;
424*a9fa9459Szrj line_p = TRUE;
425*a9fa9459Szrj break;
426*a9fa9459Szrj }
427*a9fa9459Szrj }
428*a9fa9459Szrj
429*a9fa9459Szrj for (eachFunc = aUnit->func_list;
430*a9fa9459Szrj eachFunc;
431*a9fa9459Szrj eachFunc = eachFunc->prev)
432*a9fa9459Szrj {
433*a9fa9459Szrj if (eachFunc->low_pc <= addr
434*a9fa9459Szrj && addr < eachFunc->high_pc)
435*a9fa9459Szrj {
436*a9fa9459Szrj *functionname_ptr = eachFunc->name;
437*a9fa9459Szrj func_p = TRUE;
438*a9fa9459Szrj break;
439*a9fa9459Szrj }
440*a9fa9459Szrj }
441*a9fa9459Szrj }
442*a9fa9459Szrj }
443*a9fa9459Szrj
444*a9fa9459Szrj return line_p || func_p;
445*a9fa9459Szrj }
446*a9fa9459Szrj
447*a9fa9459Szrj /* The DWARF 1 version of find_nearest line.
448*a9fa9459Szrj Return TRUE if the line is found without error. */
449*a9fa9459Szrj
450*a9fa9459Szrj bfd_boolean
_bfd_dwarf1_find_nearest_line(bfd * abfd,asymbol ** symbols,asection * section,bfd_vma offset,const char ** filename_ptr,const char ** functionname_ptr,unsigned int * linenumber_ptr)451*a9fa9459Szrj _bfd_dwarf1_find_nearest_line (bfd *abfd,
452*a9fa9459Szrj asymbol **symbols,
453*a9fa9459Szrj asection *section,
454*a9fa9459Szrj bfd_vma offset,
455*a9fa9459Szrj const char **filename_ptr,
456*a9fa9459Szrj const char **functionname_ptr,
457*a9fa9459Szrj unsigned int *linenumber_ptr)
458*a9fa9459Szrj {
459*a9fa9459Szrj struct dwarf1_debug *stash = elf_tdata (abfd)->dwarf1_find_line_info;
460*a9fa9459Szrj
461*a9fa9459Szrj struct dwarf1_unit* eachUnit;
462*a9fa9459Szrj
463*a9fa9459Szrj /* What address are we looking for? */
464*a9fa9459Szrj unsigned long addr = (unsigned long)(offset + section->vma);
465*a9fa9459Szrj
466*a9fa9459Szrj *filename_ptr = NULL;
467*a9fa9459Szrj *functionname_ptr = NULL;
468*a9fa9459Szrj *linenumber_ptr = 0;
469*a9fa9459Szrj
470*a9fa9459Szrj if (! stash)
471*a9fa9459Szrj {
472*a9fa9459Szrj asection *msec;
473*a9fa9459Szrj bfd_size_type size = sizeof (struct dwarf1_debug);
474*a9fa9459Szrj
475*a9fa9459Szrj stash = elf_tdata (abfd)->dwarf1_find_line_info
476*a9fa9459Szrj = (struct dwarf1_debug *) bfd_zalloc (abfd, size);
477*a9fa9459Szrj
478*a9fa9459Szrj if (! stash)
479*a9fa9459Szrj return FALSE;
480*a9fa9459Szrj
481*a9fa9459Szrj msec = bfd_get_section_by_name (abfd, ".debug");
482*a9fa9459Szrj if (! msec)
483*a9fa9459Szrj /* No dwarf1 info. Note that at this point the stash
484*a9fa9459Szrj has been allocated, but contains zeros, this lets
485*a9fa9459Szrj future calls to this function fail quicker. */
486*a9fa9459Szrj return FALSE;
487*a9fa9459Szrj
488*a9fa9459Szrj size = msec->rawsize ? msec->rawsize : msec->size;
489*a9fa9459Szrj stash->debug_section
490*a9fa9459Szrj = bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
491*a9fa9459Szrj symbols);
492*a9fa9459Szrj
493*a9fa9459Szrj if (! stash->debug_section)
494*a9fa9459Szrj return FALSE;
495*a9fa9459Szrj
496*a9fa9459Szrj stash->debug_section_end = stash->debug_section + size;
497*a9fa9459Szrj stash->currentDie = stash->debug_section;
498*a9fa9459Szrj stash->abfd = abfd;
499*a9fa9459Szrj stash->syms = symbols;
500*a9fa9459Szrj }
501*a9fa9459Szrj
502*a9fa9459Szrj /* A null debug_section indicates that there was no dwarf1 info
503*a9fa9459Szrj or that an error occured while setting up the stash. */
504*a9fa9459Szrj
505*a9fa9459Szrj if (! stash->debug_section)
506*a9fa9459Szrj return FALSE;
507*a9fa9459Szrj
508*a9fa9459Szrj /* Look at the previously parsed units to see if any contain
509*a9fa9459Szrj the addr. */
510*a9fa9459Szrj for (eachUnit = stash->lastUnit; eachUnit; eachUnit = eachUnit->prev)
511*a9fa9459Szrj if (eachUnit->low_pc <= addr && addr < eachUnit->high_pc)
512*a9fa9459Szrj return dwarf1_unit_find_nearest_line (stash, eachUnit, addr,
513*a9fa9459Szrj filename_ptr,
514*a9fa9459Szrj functionname_ptr,
515*a9fa9459Szrj linenumber_ptr);
516*a9fa9459Szrj
517*a9fa9459Szrj while (stash->currentDie < stash->debug_section_end)
518*a9fa9459Szrj {
519*a9fa9459Szrj struct die_info aDieInfo;
520*a9fa9459Szrj
521*a9fa9459Szrj if (! parse_die (stash->abfd, &aDieInfo, stash->currentDie,
522*a9fa9459Szrj stash->debug_section_end))
523*a9fa9459Szrj return FALSE;
524*a9fa9459Szrj
525*a9fa9459Szrj if (aDieInfo.tag == TAG_compile_unit)
526*a9fa9459Szrj {
527*a9fa9459Szrj struct dwarf1_unit* aUnit
528*a9fa9459Szrj = alloc_dwarf1_unit (stash);
529*a9fa9459Szrj if (!aUnit)
530*a9fa9459Szrj return FALSE;
531*a9fa9459Szrj
532*a9fa9459Szrj aUnit->name = aDieInfo.name;
533*a9fa9459Szrj aUnit->low_pc = aDieInfo.low_pc;
534*a9fa9459Szrj aUnit->high_pc = aDieInfo.high_pc;
535*a9fa9459Szrj aUnit->has_stmt_list = aDieInfo.has_stmt_list;
536*a9fa9459Szrj aUnit->stmt_list_offset = aDieInfo.stmt_list_offset;
537*a9fa9459Szrj
538*a9fa9459Szrj /* A die has a child if it's followed by a die that is
539*a9fa9459Szrj not it's sibling. */
540*a9fa9459Szrj if (aDieInfo.sibling
541*a9fa9459Szrj && stash->currentDie + aDieInfo.length
542*a9fa9459Szrj < stash->debug_section_end
543*a9fa9459Szrj && stash->currentDie + aDieInfo.length
544*a9fa9459Szrj != stash->debug_section + aDieInfo.sibling)
545*a9fa9459Szrj aUnit->first_child = stash->currentDie + aDieInfo.length;
546*a9fa9459Szrj else
547*a9fa9459Szrj aUnit->first_child = 0;
548*a9fa9459Szrj
549*a9fa9459Szrj if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
550*a9fa9459Szrj return dwarf1_unit_find_nearest_line (stash, aUnit, addr,
551*a9fa9459Szrj filename_ptr,
552*a9fa9459Szrj functionname_ptr,
553*a9fa9459Szrj linenumber_ptr);
554*a9fa9459Szrj }
555*a9fa9459Szrj
556*a9fa9459Szrj if (aDieInfo.sibling != 0)
557*a9fa9459Szrj stash->currentDie = stash->debug_section + aDieInfo.sibling;
558*a9fa9459Szrj else
559*a9fa9459Szrj stash->currentDie += aDieInfo.length;
560*a9fa9459Szrj }
561*a9fa9459Szrj
562*a9fa9459Szrj return FALSE;
563*a9fa9459Szrj }
564