xref: /dflybsd-src/contrib/binutils-2.27/bfd/dwarf1.c (revision e656dc90e3d65d744d534af2f5ea88cf8101ebcf)
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