160484Sobrien/* DWARF 1 find nearest line (_bfd_dwarf1_find_nearest_line).
2218822Sdim   Copyright 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2007
3218822Sdim   Free Software Foundation, Inc.
460484Sobrien
5218822Sdim   Written by Gavin Romig-Koch of Cygnus Solutions (gavin@cygnus.com).
660484Sobrien
7218822Sdim   This file is part of BFD.
860484Sobrien
9218822Sdim   This program is free software; you can redistribute it and/or modify
10218822Sdim   it under the terms of the GNU General Public License as published by
11218822Sdim   the Free Software Foundation; either version 2 of the License, or (at
12218822Sdim   your option) any later version.
1360484Sobrien
14218822Sdim   This program is distributed in the hope that it will be useful, but
15218822Sdim   WITHOUT ANY WARRANTY; without even the implied warranty of
16218822Sdim   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17218822Sdim   General Public License for more details.
1860484Sobrien
19218822Sdim   You should have received a copy of the GNU General Public License
20218822Sdim   along with this program; if not, write to the Free Software
21218822Sdim   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
2260484Sobrien
23218822Sdim#include "sysdep.h"
2460484Sobrien#include "bfd.h"
2560484Sobrien#include "libiberty.h"
2660484Sobrien#include "libbfd.h"
2760484Sobrien#include "elf-bfd.h"
2860484Sobrien#include "elf/dwarf.h"
2960484Sobrien
3077298Sobrien/* dwarf1_debug is the starting point for all dwarf1 info.  */
3160484Sobrien
32218822Sdimstruct dwarf1_debug
33218822Sdim{
3477298Sobrien  /* The bfd we are working with.  */
3560484Sobrien  bfd* abfd;
3660484Sobrien
3777298Sobrien  /* List of already parsed compilation units.  */
3860484Sobrien  struct dwarf1_unit* lastUnit;
3960484Sobrien
4077298Sobrien  /* The buffer for the .debug section.
4177298Sobrien     Zero indicates that the .debug section failed to load.  */
4260484Sobrien  char* debug_section;
4360484Sobrien
4477298Sobrien  /* Pointer to the end of the .debug_info section memory buffer.  */
4560484Sobrien  char* debug_section_end;
4660484Sobrien
4777298Sobrien  /* The buffer for the .line section.  */
4860484Sobrien  char* line_section;
4960484Sobrien
5077298Sobrien  /* End of that buffer.  */
5160484Sobrien  char* line_section_end;
5260484Sobrien
5377298Sobrien  /* The current or next unread die within the .debug section.  */
5460484Sobrien  char* currentDie;
5560484Sobrien};
5660484Sobrien
5777298Sobrien/* One dwarf1_unit for each parsed compilation unit die.  */
5860484Sobrien
59218822Sdimstruct dwarf1_unit
60218822Sdim{
6177298Sobrien  /* Linked starting from stash->lastUnit.  */
6260484Sobrien  struct dwarf1_unit* prev;
6360484Sobrien
6477298Sobrien  /* Name of the compilation unit.  */
6560484Sobrien  char* name;
6660484Sobrien
6777298Sobrien  /* The highest and lowest address used in the compilation unit.  */
6860484Sobrien  unsigned long low_pc;
6960484Sobrien  unsigned long high_pc;
7060484Sobrien
71218822Sdim  /* Does this unit have a statement list?  */
7260484Sobrien  int has_stmt_list;
7360484Sobrien
7477298Sobrien  /* If any, the offset of the line number table in the .line section.  */
7560484Sobrien  unsigned long stmt_list_offset;
7660484Sobrien
7777298Sobrien  /* If non-zero, a pointer to the first child of this unit.  */
7860484Sobrien  char* first_child;
7960484Sobrien
80218822Sdim  /* How many line entries?  */
8160484Sobrien  unsigned long line_count;
8260484Sobrien
8377298Sobrien  /* The decoded line number table (line_count entries).  */
8460484Sobrien  struct linenumber* linenumber_table;
8560484Sobrien
8677298Sobrien  /* The list of functions in this unit.  */
8760484Sobrien  struct dwarf1_func* func_list;
8860484Sobrien};
8960484Sobrien
9060484Sobrien/* One dwarf1_func for each parsed function die.  */
9160484Sobrien
92218822Sdimstruct dwarf1_func
93218822Sdim{
9477298Sobrien  /* Linked starting from aUnit->func_list.  */
9560484Sobrien  struct dwarf1_func* prev;
9677298Sobrien
9777298Sobrien  /* Name of function.  */
9860484Sobrien  char* name;
9977298Sobrien
10077298Sobrien  /* The highest and lowest address used in the compilation unit.  */
10160484Sobrien  unsigned long low_pc;
10260484Sobrien  unsigned long high_pc;
10360484Sobrien};
10460484Sobrien
10577298Sobrien/* Used to return info about a parsed die.  */
106218822Sdimstruct die_info
107218822Sdim{
10860484Sobrien  unsigned long length;
10960484Sobrien  unsigned long sibling;
11060484Sobrien  unsigned long low_pc;
11160484Sobrien  unsigned long high_pc;
11260484Sobrien  unsigned long stmt_list_offset;
11377298Sobrien
11477298Sobrien  char* name;
11577298Sobrien
11660484Sobrien  int has_stmt_list;
11760484Sobrien
11860484Sobrien  unsigned short tag;
11960484Sobrien};
12060484Sobrien
12177298Sobrien/* Parsed line number information.  */
122218822Sdimstruct linenumber
123218822Sdim{
12477298Sobrien  /* First address in the line.  */
12560484Sobrien  unsigned long addr;
12660484Sobrien
12777298Sobrien  /* The line number.  */
12860484Sobrien  unsigned long linenumber;
12960484Sobrien};
13060484Sobrien
13177298Sobrien/* Find the form of an attr, from the attr field.  */
132218822Sdim#define FORM_FROM_ATTR(attr)	((attr) & 0xF)	/* Implicitly specified.  */
13360484Sobrien
13460484Sobrien/* Return a newly allocated dwarf1_unit.  It should be cleared and
13577298Sobrien   then attached into the 'stash' at 'stash->lastUnit'.  */
13660484Sobrien
13760484Sobrienstatic struct dwarf1_unit*
138218822Sdimalloc_dwarf1_unit (struct dwarf1_debug* stash)
13960484Sobrien{
14089857Sobrien  bfd_size_type amt = sizeof (struct dwarf1_unit);
14189857Sobrien
142218822Sdim  struct dwarf1_unit* x = bfd_zalloc (stash->abfd, amt);
14360484Sobrien  x->prev = stash->lastUnit;
14460484Sobrien  stash->lastUnit = x;
14560484Sobrien
14660484Sobrien  return x;
14760484Sobrien}
14860484Sobrien
14960484Sobrien/* Return a newly allocated dwarf1_func.  It must be cleared and
15077298Sobrien   attached into 'aUnit' at 'aUnit->func_list'.  */
15160484Sobrien
152218822Sdimstatic struct dwarf1_func *
153218822Sdimalloc_dwarf1_func (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
15460484Sobrien{
15589857Sobrien  bfd_size_type amt = sizeof (struct dwarf1_func);
15689857Sobrien
157218822Sdim  struct dwarf1_func* x = bfd_zalloc (stash->abfd, amt);
15860484Sobrien  x->prev = aUnit->func_list;
15960484Sobrien  aUnit->func_list = x;
16077298Sobrien
16160484Sobrien  return x;
16260484Sobrien}
16360484Sobrien
16460484Sobrien/* parse_die - parse a Dwarf1 die.
16560484Sobrien   Parse the die starting at 'aDiePtr' into 'aDieInfo'.
16660484Sobrien   'abfd' must be the bfd from which the section that 'aDiePtr'
16777298Sobrien   points to was pulled from.
16860484Sobrien
169130561Sobrien   Return FALSE if the die is invalidly formatted; TRUE otherwise.  */
17060484Sobrien
171130561Sobrienstatic bfd_boolean
172218822Sdimparse_die (bfd *             abfd,
173218822Sdim	   struct die_info * aDieInfo,
174218822Sdim	   char *            aDiePtr,
175218822Sdim	   char *            aDiePtrEnd)
17660484Sobrien{
17760484Sobrien  char* this_die = aDiePtr;
17860484Sobrien  char* xptr = this_die;
17960484Sobrien
180218822Sdim  memset (aDieInfo, 0, sizeof (* aDieInfo));
18160484Sobrien
18277298Sobrien  /* First comes the length.  */
18377298Sobrien  aDieInfo->length = bfd_get_32 (abfd, (bfd_byte *) xptr);
18460484Sobrien  xptr += 4;
18589857Sobrien  if (aDieInfo->length == 0
18689857Sobrien      || (this_die + aDieInfo->length) >= aDiePtrEnd)
187130561Sobrien    return FALSE;
18860484Sobrien  if (aDieInfo->length < 6)
18960484Sobrien    {
19077298Sobrien      /* Just padding bytes.  */
19160484Sobrien      aDieInfo->tag = TAG_padding;
192130561Sobrien      return TRUE;
19360484Sobrien    }
19460484Sobrien
19577298Sobrien  /* Then the tag.  */
19677298Sobrien  aDieInfo->tag = bfd_get_16 (abfd, (bfd_byte *) xptr);
19760484Sobrien  xptr += 2;
19877298Sobrien
19977298Sobrien  /* Then the attributes.  */
20060484Sobrien  while (xptr < (this_die + aDieInfo->length))
20160484Sobrien    {
20260484Sobrien      unsigned short attr;
20377298Sobrien
20477298Sobrien      /* Parse the attribute based on its form.  This section
20560484Sobrien         must handle all dwarf1 forms, but need only handle the
20677298Sobrien	 actual attributes that we care about.  */
20777298Sobrien      attr = bfd_get_16 (abfd, (bfd_byte *) xptr);
20860484Sobrien      xptr += 2;
20977298Sobrien
21060484Sobrien      switch (FORM_FROM_ATTR (attr))
21160484Sobrien	{
21260484Sobrien	case FORM_DATA2:
21360484Sobrien	  xptr += 2;
21460484Sobrien	  break;
21560484Sobrien	case FORM_DATA4:
21660484Sobrien	case FORM_REF:
21760484Sobrien	  if (attr == AT_sibling)
21877298Sobrien	    aDieInfo->sibling = bfd_get_32 (abfd, (bfd_byte *) xptr);
21960484Sobrien	  else if (attr == AT_stmt_list)
22060484Sobrien	    {
22177298Sobrien	      aDieInfo->stmt_list_offset = bfd_get_32 (abfd, (bfd_byte *) xptr);
22260484Sobrien	      aDieInfo->has_stmt_list = 1;
22360484Sobrien	    }
22460484Sobrien	  xptr += 4;
22560484Sobrien	  break;
22660484Sobrien	case FORM_DATA8:
22760484Sobrien	  xptr += 8;
22860484Sobrien	  break;
22960484Sobrien	case FORM_ADDR:
23060484Sobrien	  if (attr == AT_low_pc)
23177298Sobrien	    aDieInfo->low_pc = bfd_get_32 (abfd, (bfd_byte *) xptr);
23260484Sobrien	  else if (attr == AT_high_pc)
23377298Sobrien	    aDieInfo->high_pc = bfd_get_32 (abfd, (bfd_byte *) xptr);
23460484Sobrien	  xptr += 4;
23560484Sobrien	  break;
23660484Sobrien	case FORM_BLOCK2:
23777298Sobrien	  xptr += 2 + bfd_get_16 (abfd, (bfd_byte *) xptr);
23860484Sobrien	  break;
23960484Sobrien	case FORM_BLOCK4:
24077298Sobrien	  xptr += 4 + bfd_get_32 (abfd, (bfd_byte *) xptr);
24160484Sobrien	  break;
24260484Sobrien	case FORM_STRING:
24360484Sobrien	  if (attr == AT_name)
24460484Sobrien	    aDieInfo->name = xptr;
24560484Sobrien	  xptr += strlen (xptr) + 1;
24660484Sobrien	  break;
24760484Sobrien	}
24860484Sobrien    }
24960484Sobrien
250130561Sobrien  return TRUE;
25160484Sobrien}
25260484Sobrien
25360484Sobrien/* Parse a dwarf1 line number table for 'aUnit->stmt_list_offset'
254130561Sobrien   into 'aUnit->linenumber_table'.  Return FALSE if an error
255130561Sobrien   occurs; TRUE otherwise.  */
25677298Sobrien
257130561Sobrienstatic bfd_boolean
258218822Sdimparse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
25960484Sobrien{
26060484Sobrien  char* xptr;
26160484Sobrien
26277298Sobrien  /* Load the ".line" section from the bfd if we haven't already.  */
26360484Sobrien  if (stash->line_section == 0)
26460484Sobrien    {
26560484Sobrien      asection *msec;
26689857Sobrien      bfd_size_type size;
26777298Sobrien
26860484Sobrien      msec = bfd_get_section_by_name (stash->abfd, ".line");
26960484Sobrien      if (! msec)
270130561Sobrien	return FALSE;
27177298Sobrien
272218822Sdim      size = msec->rawsize ? msec->rawsize : msec->size;
273218822Sdim      stash->line_section = bfd_alloc (stash->abfd, size);
27477298Sobrien
27560484Sobrien      if (! stash->line_section)
276130561Sobrien	return FALSE;
27760484Sobrien
27889857Sobrien      if (! bfd_get_section_contents (stash->abfd, msec, stash->line_section,
279218822Sdim				      0, size))
28060484Sobrien	{
28160484Sobrien	  stash->line_section = 0;
282130561Sobrien	  return FALSE;
28360484Sobrien	}
28460484Sobrien
28560484Sobrien      stash->line_section_end = stash->line_section + size;
28660484Sobrien    }
28760484Sobrien
28860484Sobrien  xptr = stash->line_section + aUnit->stmt_list_offset;
28960484Sobrien  if (xptr < stash->line_section_end)
29060484Sobrien    {
29160484Sobrien      unsigned long eachLine;
29289857Sobrien      char *tblend;
29360484Sobrien      unsigned long base;
29489857Sobrien      bfd_size_type amt;
29560484Sobrien
29677298Sobrien      /* First comes the length.  */
29777298Sobrien      tblend = bfd_get_32 (stash->abfd, (bfd_byte *) xptr) + xptr;
29860484Sobrien      xptr += 4;
29960484Sobrien
30077298Sobrien      /* Then the base address for each address in the table.  */
30177298Sobrien      base = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
30260484Sobrien      xptr += 4;
30360484Sobrien
30460484Sobrien      /* How many line entrys?
305218822Sdim	 10 = 4 (line number) + 2 (pos in line) + 4 (address in line).  */
30660484Sobrien      aUnit->line_count = (tblend - xptr) / 10;
30760484Sobrien
30877298Sobrien      /* Allocate an array for the entries.  */
30989857Sobrien      amt = sizeof (struct linenumber) * aUnit->line_count;
310218822Sdim      aUnit->linenumber_table = bfd_alloc (stash->abfd, amt);
31177298Sobrien
31260484Sobrien      for (eachLine = 0; eachLine < aUnit->line_count; eachLine++)
31360484Sobrien	{
31477298Sobrien	  /* A line number.  */
31560484Sobrien	  aUnit->linenumber_table[eachLine].linenumber
31677298Sobrien	    = bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
31760484Sobrien	  xptr += 4;
31860484Sobrien
31977298Sobrien	  /* Skip the position within the line.  */
32060484Sobrien	  xptr += 2;
32160484Sobrien
32277298Sobrien	  /* And finally the address.  */
32377298Sobrien	  aUnit->linenumber_table[eachLine].addr
32477298Sobrien	    = base + bfd_get_32 (stash->abfd, (bfd_byte *) xptr);
32560484Sobrien	  xptr += 4;
32660484Sobrien	}
32760484Sobrien    }
32860484Sobrien
329130561Sobrien  return TRUE;
33060484Sobrien}
33160484Sobrien
33260484Sobrien/* Parse each function die in a compilation unit 'aUnit'.
33360484Sobrien   The first child die of 'aUnit' should be in 'aUnit->first_child',
33460484Sobrien   the result is placed in 'aUnit->func_list'.
335130561Sobrien   Return FALSE if error; TRUE otherwise.  */
33660484Sobrien
337130561Sobrienstatic bfd_boolean
338218822Sdimparse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
33960484Sobrien{
34060484Sobrien  char* eachDie;
34160484Sobrien
34260484Sobrien  if (aUnit->first_child)
34360484Sobrien    for (eachDie = aUnit->first_child;
344218822Sdim 	 eachDie < stash->debug_section_end;
34560484Sobrien	 )
34660484Sobrien      {
34760484Sobrien	struct die_info eachDieInfo;
34877298Sobrien
34989857Sobrien	if (! parse_die (stash->abfd, &eachDieInfo, eachDie,
35089857Sobrien			 stash->debug_section_end))
351130561Sobrien	  return FALSE;
35277298Sobrien
35360484Sobrien	if (eachDieInfo.tag == TAG_global_subroutine
35460484Sobrien	    || eachDieInfo.tag == TAG_subroutine
35560484Sobrien	    || eachDieInfo.tag == TAG_inlined_subroutine
35660484Sobrien	    || eachDieInfo.tag == TAG_entry_point)
35760484Sobrien	  {
35860484Sobrien	    struct dwarf1_func* aFunc = alloc_dwarf1_func (stash,aUnit);
35977298Sobrien
36060484Sobrien	    aFunc->name = eachDieInfo.name;
36160484Sobrien	    aFunc->low_pc = eachDieInfo.low_pc;
36260484Sobrien	    aFunc->high_pc = eachDieInfo.high_pc;
36360484Sobrien	  }
36477298Sobrien
36560484Sobrien	/* Move to next sibling, if none, end loop */
36660484Sobrien	if (eachDieInfo.sibling)
36760484Sobrien	  eachDie = stash->debug_section + eachDieInfo.sibling;
36860484Sobrien	else
36960484Sobrien	  break;
37060484Sobrien      }
37177298Sobrien
372130561Sobrien  return TRUE;
37360484Sobrien}
37460484Sobrien
37560484Sobrien/* Find the nearest line to 'addr' in 'aUnit'.
37677298Sobrien   Return whether we found the line (or a function) without error.  */
37760484Sobrien
378130561Sobrienstatic bfd_boolean
379218822Sdimdwarf1_unit_find_nearest_line (struct dwarf1_debug* stash,
380218822Sdim			       struct dwarf1_unit* aUnit,
381218822Sdim			       unsigned long addr,
382218822Sdim			       const char **filename_ptr,
383218822Sdim			       const char **functionname_ptr,
384218822Sdim			       unsigned int *linenumber_ptr)
38560484Sobrien{
386130561Sobrien  int line_p = FALSE;
387130561Sobrien  int func_p = FALSE;
38860484Sobrien
38960484Sobrien  if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
39060484Sobrien    {
39160484Sobrien      if (aUnit->has_stmt_list)
39260484Sobrien	{
39360484Sobrien	  unsigned long i;
39460484Sobrien	  struct dwarf1_func* eachFunc;
39560484Sobrien
39660484Sobrien	  if (! aUnit->linenumber_table)
39760484Sobrien	    {
39860484Sobrien	      if (! parse_line_table (stash, aUnit))
399130561Sobrien		return FALSE;
40060484Sobrien	    }
40160484Sobrien
40260484Sobrien	  if (! aUnit->func_list)
40360484Sobrien	    {
40460484Sobrien	      if (! parse_functions_in_unit (stash, aUnit))
405130561Sobrien		return FALSE;
40660484Sobrien	    }
40760484Sobrien
40860484Sobrien	  for (i = 0; i < aUnit->line_count; i++)
40960484Sobrien	    {
41060484Sobrien	      if (aUnit->linenumber_table[i].addr <= addr
41160484Sobrien		  && addr < aUnit->linenumber_table[i+1].addr)
41260484Sobrien		{
41360484Sobrien		  *filename_ptr = aUnit->name;
41460484Sobrien		  *linenumber_ptr = aUnit->linenumber_table[i].linenumber;
415130561Sobrien		  line_p = TRUE;
41660484Sobrien		  break;
41760484Sobrien		}
41860484Sobrien	    }
41960484Sobrien
42077298Sobrien	  for (eachFunc = aUnit->func_list;
42177298Sobrien	       eachFunc;
42260484Sobrien	       eachFunc = eachFunc->prev)
42360484Sobrien	    {
42460484Sobrien	      if (eachFunc->low_pc <= addr
42560484Sobrien		  && addr < eachFunc->high_pc)
42660484Sobrien		{
42760484Sobrien		  *functionname_ptr = eachFunc->name;
428130561Sobrien		  func_p = TRUE;
42960484Sobrien		  break;
43060484Sobrien		}
43160484Sobrien	    }
43260484Sobrien	}
43360484Sobrien    }
43460484Sobrien
43560484Sobrien  return line_p || func_p;
43660484Sobrien}
43760484Sobrien
43860484Sobrien/* The DWARF 1 version of find_nearest line.
439130561Sobrien   Return TRUE if the line is found without error.  */
44060484Sobrien
441130561Sobrienbfd_boolean
442218822Sdim_bfd_dwarf1_find_nearest_line (bfd *abfd,
443218822Sdim			       asection *section,
444218822Sdim			       asymbol **symbols ATTRIBUTE_UNUSED,
445218822Sdim			       bfd_vma offset,
446218822Sdim			       const char **filename_ptr,
447218822Sdim			       const char **functionname_ptr,
448218822Sdim			       unsigned int *linenumber_ptr)
44960484Sobrien{
45060484Sobrien  struct dwarf1_debug *stash = elf_tdata (abfd)->dwarf1_find_line_info;
45160484Sobrien
45260484Sobrien  struct dwarf1_unit* eachUnit;
45360484Sobrien
45460484Sobrien  /* What address are we looking for? */
45578828Sobrien  unsigned long addr = (unsigned long)(offset + section->vma);
45660484Sobrien
45760484Sobrien  *filename_ptr = NULL;
45860484Sobrien  *functionname_ptr = NULL;
45960484Sobrien  *linenumber_ptr = 0;
46060484Sobrien
46160484Sobrien  if (! stash)
46260484Sobrien    {
46360484Sobrien      asection *msec;
46489857Sobrien      bfd_size_type size = sizeof (struct dwarf1_debug);
46577298Sobrien
46689857Sobrien      stash = elf_tdata (abfd)->dwarf1_find_line_info
467218822Sdim	= bfd_zalloc (abfd, size);
46877298Sobrien
46960484Sobrien      if (! stash)
470130561Sobrien	return FALSE;
47177298Sobrien
47260484Sobrien      msec = bfd_get_section_by_name (abfd, ".debug");
47360484Sobrien      if (! msec)
474218822Sdim	/* No dwarf1 info.  Note that at this point the stash
475218822Sdim	   has been allocated, but contains zeros, this lets
476218822Sdim	   future calls to this function fail quicker.  */
477218822Sdim	return FALSE;
47860484Sobrien
479218822Sdim      size = msec->rawsize ? msec->rawsize : msec->size;
480218822Sdim      stash->debug_section = bfd_alloc (abfd, size);
48177298Sobrien
48260484Sobrien      if (! stash->debug_section)
483130561Sobrien	return FALSE;
48460484Sobrien
48589857Sobrien      if (! bfd_get_section_contents (abfd, msec, stash->debug_section,
486218822Sdim				      0, size))
48760484Sobrien	{
48860484Sobrien	  stash->debug_section = 0;
489130561Sobrien	  return FALSE;
49060484Sobrien	}
49160484Sobrien
49260484Sobrien      stash->debug_section_end = stash->debug_section + size;
49360484Sobrien      stash->currentDie = stash->debug_section;
49460484Sobrien      stash->abfd = abfd;
49560484Sobrien    }
49660484Sobrien
49760484Sobrien  /* A null debug_section indicates that there was no dwarf1 info
49877298Sobrien     or that an error occured while setting up the stash.  */
49960484Sobrien
50060484Sobrien  if (! stash->debug_section)
501130561Sobrien    return FALSE;
50260484Sobrien
50360484Sobrien  /* Look at the previously parsed units to see if any contain
50477298Sobrien     the addr.  */
50560484Sobrien  for (eachUnit = stash->lastUnit; eachUnit; eachUnit = eachUnit->prev)
506218822Sdim    if (eachUnit->low_pc <= addr && addr < eachUnit->high_pc)
507218822Sdim      return dwarf1_unit_find_nearest_line (stash, eachUnit, addr,
508218822Sdim					    filename_ptr,
509218822Sdim					    functionname_ptr,
510218822Sdim					    linenumber_ptr);
51160484Sobrien
51260484Sobrien  while (stash->currentDie < stash->debug_section_end)
51360484Sobrien    {
51460484Sobrien      struct die_info aDieInfo;
51560484Sobrien
51689857Sobrien      if (! parse_die (stash->abfd, &aDieInfo, stash->currentDie,
51789857Sobrien		       stash->debug_section_end))
518130561Sobrien	return FALSE;
51977298Sobrien
52060484Sobrien      if (aDieInfo.tag == TAG_compile_unit)
52160484Sobrien	{
52260484Sobrien	  struct dwarf1_unit* aUnit
52360484Sobrien	    = alloc_dwarf1_unit (stash);
52477298Sobrien
52560484Sobrien	  aUnit->name = aDieInfo.name;
52660484Sobrien	  aUnit->low_pc = aDieInfo.low_pc;
52760484Sobrien	  aUnit->high_pc = aDieInfo.high_pc;
52860484Sobrien	  aUnit->has_stmt_list = aDieInfo.has_stmt_list;
52960484Sobrien	  aUnit->stmt_list_offset = aDieInfo.stmt_list_offset;
53077298Sobrien
53160484Sobrien	  /* A die has a child if it's followed by a die that is
53277298Sobrien	     not it's sibling.  */
53377298Sobrien	  if (aDieInfo.sibling
53477298Sobrien	      && stash->currentDie + aDieInfo.length
53560484Sobrien                    < stash->debug_section_end
53677298Sobrien	      && stash->currentDie + aDieInfo.length
53760484Sobrien	            != stash->debug_section + aDieInfo.sibling)
53860484Sobrien	    aUnit->first_child = stash->currentDie + aDieInfo.length;
53960484Sobrien	  else
54060484Sobrien	    aUnit->first_child = 0;
54160484Sobrien
54260484Sobrien	  if (aUnit->low_pc <= addr && addr < aUnit->high_pc)
54377298Sobrien	    return dwarf1_unit_find_nearest_line (stash, aUnit, addr,
54477298Sobrien						  filename_ptr,
54577298Sobrien						  functionname_ptr,
54660484Sobrien						  linenumber_ptr);
54760484Sobrien	}
54877298Sobrien
54960484Sobrien      if (aDieInfo.sibling != 0)
55060484Sobrien	stash->currentDie = stash->debug_section + aDieInfo.sibling;
55160484Sobrien      else
55260484Sobrien	stash->currentDie += aDieInfo.length;
55360484Sobrien    }
55460484Sobrien
555130561Sobrien  return FALSE;
55660484Sobrien}
557