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