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