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