? err ? 1 Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.60 diff -c -p -r1.60 dwarf2read.c *** dwarf2read.c 22 Jun 2002 00:05:59 -0000 1.60 --- dwarf2read.c 3 Jul 2002 20:35:37 -0000 *************** unsigned int dwarf_eh_frame_size; *** 162,167 **** --- 162,172 ---- /* local data types */ + /* We hold several abbreviation tables at the same time in memory */ + #ifndef ABBREV_HASH_SIZE + #define ABBREV_HASH_SIZE 121 + #endif + /* The data in a compilation unit header, after target2host translation, looks like this. */ struct comp_unit_head *************** struct comp_unit_head *** 174,179 **** --- 179,193 ---- unsigned int offset_size; /* size of file offsets; either 4 or 8 */ unsigned int initial_length_size; /* size of the length field; either 4 or 12 */ + /* New information for the comp unit head so as to keep a list + of available ones for a program. */ + unsigned int offset; /* Offset of the cu_header in .debug_info */ + char *base_offset; /* Base offset after cu_header into program */ + char *begin_offset; /* Base offset of cu_header into program */ + struct comp_unit_head *next; /* Next comp unit head in program */ + + struct abbrev_info *dwarf2_abbrevs[ABBREV_HASH_SIZE]; /* DWARF abbrev + table */ }; /* The line number information for a compilation unit (found in the *************** struct dwarf_block *** 312,327 **** char *data; }; - /* We only hold one compilation unit's abbrevs in - memory at any one time. */ - #ifndef ABBREV_HASH_SIZE - #define ABBREV_HASH_SIZE 121 - #endif #ifndef ATTR_ALLOC_CHUNK #define ATTR_ALLOC_CHUNK 4 #endif ! static struct abbrev_info *dwarf2_abbrevs[ABBREV_HASH_SIZE]; /* A hash table of die offsets for following references. */ #ifndef REF_HASH_SIZE --- 326,337 ---- char *data; }; #ifndef ATTR_ALLOC_CHUNK #define ATTR_ALLOC_CHUNK 4 #endif ! /* First comp unit head in the program */ ! struct comp_unit_head *first_cu_header = NULL; /* A hash table of die offsets for following references. */ #ifndef REF_HASH_SIZE *************** static struct die_info *die_ref_table[RE *** 333,342 **** /* Obstack for allocating temporary storage used during symbol reading. */ static struct obstack dwarf2_tmp_obstack; - /* Offset to the first byte of the current compilation unit header, - for resolving relative reference dies. */ - static unsigned int cu_header_offset; - /* Allocate fields for structs, unions and enums in this size. */ #ifndef DW_FIELD_ALLOC_CHUNK #define DW_FIELD_ALLOC_CHUNK 4 --- 343,348 ---- *************** static void psymtab_to_symtab_1 (struct *** 682,692 **** char *dwarf2_read_section (struct objfile *, file_ptr, unsigned int); ! static void dwarf2_read_abbrevs (bfd *, unsigned int); ! static void dwarf2_empty_abbrev_table (PTR); ! static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int); static char *read_partial_die (struct partial_die_info *, bfd *, char *, --- 688,699 ---- char *dwarf2_read_section (struct objfile *, file_ptr, unsigned int); ! static void dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header); ! static void dwarf2_empty_abbrev_table (struct comp_unit_head *cu_header); ! static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int, ! const struct comp_unit_head *cu_header); static char *read_partial_die (struct partial_die_info *, bfd *, char *, *************** static long read_signed_leb128 (bfd *, c *** 733,741 **** static void set_cu_language (unsigned int); ! static struct attribute *dwarf_attr (struct die_info *, unsigned int); ! static int die_is_declaration (struct die_info *); static void free_line_header (struct line_header *lh); --- 740,750 ---- static void set_cu_language (unsigned int); ! static struct attribute *dwarf_attr (struct die_info *, unsigned int, ! const struct comp_unit_head *); ! static int die_is_declaration (struct die_info *, ! const struct comp_unit_head *); static void free_line_header (struct line_header *lh); *************** static void read_type_die (struct die_in *** 778,784 **** static void read_typedef (struct die_info *, struct objfile *, const struct comp_unit_head *); ! static void read_base_type (struct die_info *, struct objfile *); static void read_file_scope (struct die_info *, struct objfile *, const struct comp_unit_head *); --- 787,794 ---- static void read_typedef (struct die_info *, struct objfile *, const struct comp_unit_head *); ! static void read_base_type (struct die_info *, struct objfile *, ! const struct comp_unit_head *); static void read_file_scope (struct die_info *, struct objfile *, const struct comp_unit_head *); *************** static void read_lexical_block_scope (st *** 790,796 **** const struct comp_unit_head *); static int dwarf2_get_pc_bounds (struct die_info *, ! CORE_ADDR *, CORE_ADDR *, struct objfile *); static void dwarf2_add_field (struct field_info *, struct die_info *, struct objfile *, const struct comp_unit_head *); --- 800,807 ---- const struct comp_unit_head *); static int dwarf2_get_pc_bounds (struct die_info *, ! CORE_ADDR *, CORE_ADDR *, struct objfile *, ! const struct comp_unit_head *); static void dwarf2_add_field (struct field_info *, struct die_info *, struct objfile *, const struct comp_unit_head *); *************** static void read_tag_const_type (struct *** 837,843 **** static void read_tag_volatile_type (struct die_info *, struct objfile *, const struct comp_unit_head *); ! static void read_tag_string_type (struct die_info *, struct objfile *); static void read_subroutine_type (struct die_info *, struct objfile *, const struct comp_unit_head *); --- 848,855 ---- static void read_tag_volatile_type (struct die_info *, struct objfile *, const struct comp_unit_head *); ! static void read_tag_string_type (struct die_info *, struct objfile *, ! const struct comp_unit_head *); static void read_subroutine_type (struct die_info *, struct objfile *, const struct comp_unit_head *); *************** static struct cleanup *make_cleanup_free *** 852,858 **** static void process_die (struct die_info *, struct objfile *, const struct comp_unit_head *); ! static char *dwarf2_linkage_name (struct die_info *); static char *dwarf_tag_name (unsigned int); --- 864,871 ---- static void process_die (struct die_info *, struct objfile *, const struct comp_unit_head *); ! static char *dwarf2_linkage_name (struct die_info *, ! const struct comp_unit_head *); static char *dwarf_tag_name (unsigned int); *************** static void store_in_ref_table (unsigned *** 882,893 **** static void dwarf2_empty_hash_tables (void); ! static unsigned int dwarf2_get_ref_die_offset (struct attribute *); static struct die_info *follow_die_ref (unsigned int); static struct type *dwarf2_fundamental_type (struct objfile *, int); /* memory allocation interface */ static void dwarf2_free_tmp_obstack (PTR); --- 895,917 ---- static void dwarf2_empty_hash_tables (void); ! static unsigned int dwarf2_get_ref_die_offset (struct attribute *, ! const struct comp_unit_head *); static struct die_info *follow_die_ref (unsigned int); static struct type *dwarf2_fundamental_type (struct objfile *, int); + static struct die_info *build_die_ref (struct attribute *, struct objfile *, + const struct comp_unit_head *); + static struct die_info *find_die_ref (unsigned int target_offset, bfd *abfd, + const struct comp_unit_head *cu_header); + static struct comp_unit_head *find_cu_header_from_begin_offset (char *); + static struct comp_unit_head *find_cu_header (unsigned int); + static void register_cu_header (const struct comp_unit_head *); + static void free_cu_header_list (void); + void dwarf_new_init (void); + /* memory allocation interface */ static void dwarf2_free_tmp_obstack (PTR); *************** static void dwarf_decode_macros (struct *** 906,911 **** --- 930,942 ---- char *, bfd *, const struct comp_unit_head *, struct objfile *); + /* Initialize DWARF environment for new binary */ + void + dwarf_new_init (void) + { + free_cu_header_list (); + } + /* Try to locate the sections we need for DWARF 2 debugging information and return true if we have enough to do something. */ *************** dwarf2_build_psymtabs_hard (struct objfi *** 1201,1208 **** return; } /* Read the abbrevs for this compilation unit into a table */ ! dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset); ! make_cleanup (dwarf2_empty_abbrev_table, NULL); /* Read the compilation unit die */ info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr, --- 1232,1244 ---- return; } /* Read the abbrevs for this compilation unit into a table */ ! dwarf2_read_abbrevs (abfd, &cu_header); ! ! cu_header.offset = beg_of_comp_unit - dwarf_info_buffer; ! cu_header.base_offset = info_ptr; ! cu_header.begin_offset = beg_of_comp_unit; ! ! register_cu_header (&cu_header); /* Read the compilation unit die */ info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr, *************** dwarf2_build_psymtabs_hard (struct objfi *** 1220,1226 **** pst->read_symtab_private = (char *) obstack_alloc (&objfile->psymbol_obstack, sizeof (struct dwarf2_pinfo)); ! cu_header_offset = beg_of_comp_unit - dwarf_info_buffer; DWARF_INFO_BUFFER (pst) = dwarf_info_buffer; DWARF_INFO_OFFSET (pst) = beg_of_comp_unit - dwarf_info_buffer; DWARF_ABBREV_BUFFER (pst) = dwarf_abbrev_buffer; --- 1256,1262 ---- pst->read_symtab_private = (char *) obstack_alloc (&objfile->psymbol_obstack, sizeof (struct dwarf2_pinfo)); ! DWARF_INFO_BUFFER (pst) = dwarf_info_buffer; DWARF_INFO_OFFSET (pst) = beg_of_comp_unit - dwarf_info_buffer; DWARF_ABBREV_BUFFER (pst) = dwarf_abbrev_buffer; *************** psymtab_to_symtab_1 (struct partial_symt *** 1515,1521 **** { struct objfile *objfile = pst->objfile; bfd *abfd = objfile->obfd; ! struct comp_unit_head cu_header; struct die_info *dies; unsigned long offset; CORE_ADDR lowpc, highpc; --- 1551,1557 ---- { struct objfile *objfile = pst->objfile; bfd *abfd = objfile->obfd; ! struct comp_unit_head *cu_header; struct die_info *dies; unsigned long offset; CORE_ADDR lowpc, highpc; *************** psymtab_to_symtab_1 (struct partial_symt *** 1536,1542 **** dwarf_macinfo_buffer = DWARF_MACINFO_BUFFER (pst); dwarf_macinfo_size = DWARF_MACINFO_SIZE (pst); baseaddr = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (objfile)); - cu_header_offset = offset; info_ptr = dwarf_info_buffer + offset; obstack_init (&dwarf2_tmp_obstack); --- 1572,1577 ---- *************** psymtab_to_symtab_1 (struct partial_symt *** 1545,1565 **** buildsym_init (); make_cleanup (really_free_pendings, NULL); ! /* read in the comp_unit header */ ! info_ptr = read_comp_unit_head (&cu_header, info_ptr, abfd); ! /* Read the abbrevs for this compilation unit */ ! dwarf2_read_abbrevs (abfd, cu_header.abbrev_offset); ! make_cleanup (dwarf2_empty_abbrev_table, NULL); ! dies = read_comp_unit (info_ptr, abfd, &cu_header); make_cleanup_free_die_list (dies); /* Do line number decoding in read_file_scope () */ ! process_die (dies, objfile, &cu_header); ! if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile)) { /* Some compilers don't define a DW_AT_high_pc attribute for the compilation unit. If the DW_AT_high_pc is missing, --- 1580,1603 ---- buildsym_init (); make_cleanup (really_free_pendings, NULL); ! cu_header = find_cu_header_from_begin_offset (info_ptr); ! ! if (cu_header == NULL) ! { ! error ("Failed to find cu_header at base offset[0x%lx]\n", info_ptr); ! } ! /* Update the info ptr */ ! info_ptr = cu_header->base_offset; ! dies = read_comp_unit (info_ptr, abfd, cu_header); make_cleanup_free_die_list (dies); /* Do line number decoding in read_file_scope () */ ! process_die (dies, objfile, cu_header); ! if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile, cu_header)) { /* Some compilers don't define a DW_AT_high_pc attribute for the compilation unit. If the DW_AT_high_pc is missing, *************** psymtab_to_symtab_1 (struct partial_symt *** 1574,1580 **** { CORE_ADDR low, high; ! if (dwarf2_get_pc_bounds (child_die, &low, &high, objfile)) { highpc = max (highpc, high); } --- 1612,1619 ---- { CORE_ADDR low, high; ! if (dwarf2_get_pc_bounds (child_die, &low, &high, objfile, ! cu_header)) { highpc = max (highpc, high); } *************** process_die (struct die_info *die, struc *** 1649,1659 **** read_tag_reference_type (die, objfile, cu_header); break; case DW_TAG_string_type: ! read_tag_string_type (die, objfile); break; case DW_TAG_base_type: ! read_base_type (die, objfile); ! if (dwarf_attr (die, DW_AT_name)) { /* Add a typedef symbol for the base type definition. */ new_symbol (die, die->type, objfile, cu_header); --- 1688,1698 ---- read_tag_reference_type (die, objfile, cu_header); break; case DW_TAG_string_type: ! read_tag_string_type (die, objfile, cu_header); break; case DW_TAG_base_type: ! read_base_type (die, objfile, cu_header); ! if (dwarf_attr (die, DW_AT_name, cu_header)) { /* Add a typedef symbol for the base type definition. */ new_symbol (die, die->type, objfile, cu_header); *************** read_file_scope (struct die_info *die, s *** 1690,1696 **** bfd *abfd = objfile->obfd; struct line_header *line_header = 0; ! if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile)) { if (die->has_children) { --- 1729,1735 ---- bfd *abfd = objfile->obfd; struct line_header *line_header = 0; ! if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header)) { if (die->has_children) { *************** read_file_scope (struct die_info *die, s *** 1701,1707 **** { CORE_ADDR low, high; ! if (dwarf2_get_pc_bounds (child_die, &low, &high, objfile)) { lowpc = min (lowpc, low); highpc = max (highpc, high); --- 1740,1747 ---- { CORE_ADDR low, high; ! if (dwarf2_get_pc_bounds (child_die, &low, &high, objfile, ! cu_header)) { lowpc = min (lowpc, low); highpc = max (highpc, high); *************** read_file_scope (struct die_info *die, s *** 1719,1730 **** lowpc += baseaddr; highpc += baseaddr; ! attr = dwarf_attr (die, DW_AT_name); if (attr) { name = DW_STRING (attr); } ! attr = dwarf_attr (die, DW_AT_comp_dir); if (attr) { comp_dir = DW_STRING (attr); --- 1759,1770 ---- lowpc += baseaddr; highpc += baseaddr; ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr) { name = DW_STRING (attr); } ! attr = dwarf_attr (die, DW_AT_comp_dir, cu_header); if (attr) { comp_dir = DW_STRING (attr); *************** read_file_scope (struct die_info *die, s *** 1746,1752 **** objfile->ei.entry_file_highpc = highpc; } ! attr = dwarf_attr (die, DW_AT_language); if (attr) { set_cu_language (DW_UNSND (attr)); --- 1786,1792 ---- objfile->ei.entry_file_highpc = highpc; } ! attr = dwarf_attr (die, DW_AT_language, cu_header); if (attr) { set_cu_language (DW_UNSND (attr)); *************** read_file_scope (struct die_info *die, s *** 1783,1789 **** } /* Decode line number information if present. */ ! attr = dwarf_attr (die, DW_AT_stmt_list); if (attr) { unsigned int line_offset = DW_UNSND (attr); --- 1823,1829 ---- } /* Decode line number information if present. */ ! attr = dwarf_attr (die, DW_AT_stmt_list, cu_header); if (attr) { unsigned int line_offset = DW_UNSND (attr); *************** read_file_scope (struct die_info *die, s *** 1801,1807 **** refers to information in the line number info statement program header, so we can only read it if we've read the header successfully. */ ! attr = dwarf_attr (die, DW_AT_macro_info); if (attr) { unsigned int macro_offset = DW_UNSND (attr); --- 1841,1847 ---- refers to information in the line number info statement program header, so we can only read it if we've read the header successfully. */ ! attr = dwarf_attr (die, DW_AT_macro_info, cu_header); if (attr) { unsigned int macro_offset = DW_UNSND (attr); *************** read_func_scope (struct die_info *die, s *** 1843,1853 **** struct attribute *attr; char *name; ! name = dwarf2_linkage_name (die); /* Ignore functions with missing or empty names and functions with missing or invalid low and high pc attributes. */ ! if (name == NULL || !dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile)) return; lowpc += baseaddr; --- 1883,1894 ---- struct attribute *attr; char *name; ! name = dwarf2_linkage_name (die, cu_header); /* Ignore functions with missing or empty names and functions with missing or invalid low and high pc attributes. */ ! if (name == NULL || ! !dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header)) return; lowpc += baseaddr; *************** read_func_scope (struct die_info *die, s *** 1867,1873 **** for DW_OP_fbreg operands in decode_locdesc. */ frame_base_reg = -1; frame_base_offset = 0; ! attr = dwarf_attr (die, DW_AT_frame_base); if (attr) { CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); --- 1908,1914 ---- for DW_OP_fbreg operands in decode_locdesc. */ frame_base_reg = -1; frame_base_offset = 0; ! attr = dwarf_attr (die, DW_AT_frame_base, cu_header); if (attr) { CORE_ADDR addr = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); *************** read_lexical_block_scope (struct die_inf *** 1917,1923 **** struct die_info *child_die; /* Ignore blocks with missing or invalid low and high pc attributes. */ ! if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile)) return; lowpc += baseaddr; highpc += baseaddr; --- 1958,1964 ---- struct die_info *child_die; /* Ignore blocks with missing or invalid low and high pc attributes. */ ! if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header)) return; lowpc += baseaddr; highpc += baseaddr; *************** read_lexical_block_scope (struct die_inf *** 1947,1964 **** static int dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, CORE_ADDR *highpc, ! struct objfile *objfile) { struct attribute *attr; CORE_ADDR low; CORE_ADDR high; ! attr = dwarf_attr (die, DW_AT_low_pc); if (attr) low = DW_ADDR (attr); else return 0; ! attr = dwarf_attr (die, DW_AT_high_pc); if (attr) high = DW_ADDR (attr); else --- 1988,2006 ---- static int dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, CORE_ADDR *highpc, ! struct objfile *objfile, ! const struct comp_unit_head *cu_header) { struct attribute *attr; CORE_ADDR low; CORE_ADDR high; ! attr = dwarf_attr (die, DW_AT_low_pc, cu_header); if (attr) low = DW_ADDR (attr); else return 0; ! attr = dwarf_attr (die, DW_AT_high_pc, cu_header); if (attr) high = DW_ADDR (attr); else *************** dwarf2_add_field (struct field_info *fip *** 2012,2023 **** new_field->accessibility = DW_ACCESS_private; new_field->virtuality = DW_VIRTUALITY_none; ! attr = dwarf_attr (die, DW_AT_accessibility); if (attr) new_field->accessibility = DW_UNSND (attr); if (new_field->accessibility != DW_ACCESS_public) fip->non_public_fields = 1; ! attr = dwarf_attr (die, DW_AT_virtuality); if (attr) new_field->virtuality = DW_UNSND (attr); --- 2054,2065 ---- new_field->accessibility = DW_ACCESS_private; new_field->virtuality = DW_VIRTUALITY_none; ! attr = dwarf_attr (die, DW_AT_accessibility, cu_header); if (attr) new_field->accessibility = DW_UNSND (attr); if (new_field->accessibility != DW_ACCESS_public) fip->non_public_fields = 1; ! attr = dwarf_attr (die, DW_AT_virtuality, cu_header); if (attr) new_field->virtuality = DW_UNSND (attr); *************** dwarf2_add_field (struct field_info *fip *** 2028,2034 **** fp->type = die_type (die, objfile, cu_header); /* Get bit size of field (zero if none). */ ! attr = dwarf_attr (die, DW_AT_bit_size); if (attr) { FIELD_BITSIZE (*fp) = DW_UNSND (attr); --- 2070,2076 ---- fp->type = die_type (die, objfile, cu_header); /* Get bit size of field (zero if none). */ ! attr = dwarf_attr (die, DW_AT_bit_size, cu_header); if (attr) { FIELD_BITSIZE (*fp) = DW_UNSND (attr); *************** dwarf2_add_field (struct field_info *fip *** 2039,2045 **** } /* Get bit offset of field. */ ! attr = dwarf_attr (die, DW_AT_data_member_location); if (attr) { FIELD_BITPOS (*fp) = --- 2081,2087 ---- } /* Get bit offset of field. */ ! attr = dwarf_attr (die, DW_AT_data_member_location, cu_header); if (attr) { FIELD_BITPOS (*fp) = *************** dwarf2_add_field (struct field_info *fip *** 2047,2053 **** } else FIELD_BITPOS (*fp) = 0; ! attr = dwarf_attr (die, DW_AT_bit_offset); if (attr) { if (BITS_BIG_ENDIAN) --- 2089,2095 ---- } else FIELD_BITPOS (*fp) = 0; ! attr = dwarf_attr (die, DW_AT_bit_offset, cu_header); if (attr) { if (BITS_BIG_ENDIAN) *************** dwarf2_add_field (struct field_info *fip *** 2070,2076 **** int anonymous_size; int bit_offset = DW_UNSND (attr); ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { /* The size of the anonymous object containing --- 2112,2118 ---- int anonymous_size; int bit_offset = DW_UNSND (attr); ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { /* The size of the anonymous object containing *************** dwarf2_add_field (struct field_info *fip *** 2092,2098 **** } /* Get name of field. */ ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); fp->name = obsavestring (fieldname, strlen (fieldname), --- 2134,2140 ---- } /* Get name of field. */ ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); fp->name = obsavestring (fieldname, strlen (fieldname), *************** dwarf2_add_field (struct field_info *fip *** 2100,2106 **** /* Change accessibility for artificial fields (e.g. virtual table pointer or virtual base class pointer) to private. */ ! if (dwarf_attr (die, DW_AT_artificial)) { new_field->accessibility = DW_ACCESS_private; fip->non_public_fields = 1; --- 2142,2148 ---- /* Change accessibility for artificial fields (e.g. virtual table pointer or virtual base class pointer) to private. */ ! if (dwarf_attr (die, DW_AT_artificial, cu_header)) { new_field->accessibility = DW_ACCESS_private; fip->non_public_fields = 1; *************** dwarf2_add_field (struct field_info *fip *** 2112,2125 **** /* C++ static member. Get name of field. */ ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); else return; /* Get physical name. */ ! physname = dwarf2_linkage_name (die); SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname), &objfile->type_obstack)); --- 2154,2167 ---- /* C++ static member. Get name of field. */ ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); else return; /* Get physical name. */ ! physname = dwarf2_linkage_name (die, cu_header); SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname), &objfile->type_obstack)); *************** dwarf2_add_field (struct field_info *fip *** 2130,2136 **** else if (die->tag == DW_TAG_inheritance) { /* C++ base class field. */ ! attr = dwarf_attr (die, DW_AT_data_member_location); if (attr) FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), objfile, cu_header) * bits_per_byte); --- 2172,2178 ---- else if (die->tag == DW_TAG_inheritance) { /* C++ base class field. */ ! attr = dwarf_attr (die, DW_AT_data_member_location, cu_header); if (attr) FIELD_BITPOS (*fp) = (decode_locdesc (DW_BLOCK (attr), objfile, cu_header) * bits_per_byte); *************** dwarf2_add_member_fn (struct field_info *** 2244,2257 **** struct nextfnfield *new_fnfield; /* Get name of member function. */ ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); else return; /* Get the mangled name. */ ! physname = dwarf2_linkage_name (die); /* Look up member function name in fieldlist. */ for (i = 0; i < fip->nfnfields; i++) --- 2286,2299 ---- struct nextfnfield *new_fnfield; /* Get name of member function. */ ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) fieldname = DW_STRING (attr); else return; /* Get the mangled name. */ ! physname = dwarf2_linkage_name (die, cu_header); /* Look up member function name in fieldlist. */ for (i = 0; i < fip->nfnfields; i++) *************** dwarf2_add_member_fn (struct field_info *** 2319,2332 **** complain (&dwarf2_missing_member_fn_type_complaint, physname); /* Get fcontext from DW_AT_containing_type if present. */ ! if (dwarf_attr (die, DW_AT_containing_type) != NULL) fnp->fcontext = die_containing_type (die, objfile, cu_header); /* dwarf2 doesn't have stubbed physical names, so the setting of is_const and is_volatile is irrelevant, as it is needed by gdb_mangle_name only. */ /* Get accessibility. */ ! attr = dwarf_attr (die, DW_AT_accessibility); if (attr) { switch (DW_UNSND (attr)) --- 2361,2374 ---- complain (&dwarf2_missing_member_fn_type_complaint, physname); /* Get fcontext from DW_AT_containing_type if present. */ ! if (dwarf_attr (die, DW_AT_containing_type, cu_header) != NULL) fnp->fcontext = die_containing_type (die, objfile, cu_header); /* dwarf2 doesn't have stubbed physical names, so the setting of is_const and is_volatile is irrelevant, as it is needed by gdb_mangle_name only. */ /* Get accessibility. */ ! attr = dwarf_attr (die, DW_AT_accessibility, cu_header); if (attr) { switch (DW_UNSND (attr)) *************** dwarf2_add_member_fn (struct field_info *** 2341,2352 **** } /* Check for artificial methods. */ ! attr = dwarf_attr (die, DW_AT_artificial); if (attr && DW_UNSND (attr) != 0) fnp->is_artificial = 1; /* Get index in virtual function table if it is a virtual member function. */ ! attr = dwarf_attr (die, DW_AT_vtable_elem_location); if (attr) fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2; } --- 2383,2394 ---- } /* Check for artificial methods. */ ! attr = dwarf_attr (die, DW_AT_artificial, cu_header); if (attr && DW_UNSND (attr) != 0) fnp->is_artificial = 1; /* Get index in virtual function table if it is a virtual member function. */ ! attr = dwarf_attr (die, DW_AT_vtable_elem_location, cu_header); if (attr) fnp->voffset = decode_locdesc (DW_BLOCK (attr), objfile, cu_header) + 2; } *************** read_structure_scope (struct die_info *d *** 2411,2417 **** type = alloc_type (objfile); INIT_CPLUS_SPECIFIC (type); ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) { TYPE_TAG_NAME (type) = obsavestring (DW_STRING (attr), --- 2453,2459 ---- type = alloc_type (objfile); INIT_CPLUS_SPECIFIC (type); ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) { TYPE_TAG_NAME (type) = obsavestring (DW_STRING (attr), *************** read_structure_scope (struct die_info *d *** 2434,2440 **** TYPE_CODE (type) = TYPE_CODE_CLASS; } ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); --- 2476,2482 ---- TYPE_CODE (type) = TYPE_CODE_CLASS; } ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); *************** read_structure_scope (struct die_info *d *** 2449,2455 **** type within the structure itself. */ die->type = type; ! if (die->has_children && ! die_is_declaration (die)) { struct field_info fi; struct die_info *child_die; --- 2491,2497 ---- type within the structure itself. */ die->type = type; ! if (die->has_children && ! die_is_declaration (die, cu_header)) { struct field_info fi; struct die_info *child_die; *************** read_structure_scope (struct die_info *d *** 2499,2505 **** class itself) which contains the vtable pointer for the current class from the DW_AT_containing_type attribute. */ ! if (dwarf_attr (die, DW_AT_containing_type) != NULL) { struct type *t = die_containing_type (die, objfile, cu_header); --- 2541,2547 ---- class itself) which contains the vtable pointer for the current class from the DW_AT_containing_type attribute. */ ! if (dwarf_attr (die, DW_AT_containing_type, cu_header) != NULL) { struct type *t = die_containing_type (die, objfile, cu_header); *************** read_enumeration (struct die_info *die, *** 2572,2578 **** type = alloc_type (objfile); TYPE_CODE (type) = TYPE_CODE_ENUM; ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) { TYPE_TAG_NAME (type) = obsavestring (DW_STRING (attr), --- 2614,2620 ---- type = alloc_type (objfile); TYPE_CODE (type) = TYPE_CODE_ENUM; ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) { TYPE_TAG_NAME (type) = obsavestring (DW_STRING (attr), *************** read_enumeration (struct die_info *die, *** 2580,2586 **** &objfile->type_obstack); } ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); --- 2622,2628 ---- &objfile->type_obstack); } ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); *************** read_enumeration (struct die_info *die, *** 2603,2609 **** } else { ! attr = dwarf_attr (child_die, DW_AT_name); if (attr) { sym = new_symbol (child_die, type, objfile, cu_header); --- 2645,2651 ---- } else { ! attr = dwarf_attr (child_die, DW_AT_name, cu_header); if (attr) { sym = new_symbol (child_die, type, objfile, cu_header); *************** read_array_type (struct die_info *die, s *** 2698,2704 **** } index_type = die_type (child_die, objfile, cu_header); ! attr = dwarf_attr (child_die, DW_AT_lower_bound); if (attr) { if (attr->form == DW_FORM_sdata) --- 2740,2746 ---- } index_type = die_type (child_die, objfile, cu_header); ! attr = dwarf_attr (child_die, DW_AT_lower_bound, cu_header); if (attr) { if (attr->form == DW_FORM_sdata) *************** read_array_type (struct die_info *die, s *** 2725,2731 **** #endif } } ! attr = dwarf_attr (child_die, DW_AT_upper_bound); if (attr) { if (attr->form == DW_FORM_sdata) --- 2767,2773 ---- #endif } } ! attr = dwarf_attr (child_die, DW_AT_upper_bound, cu_header); if (attr) { if (attr->form == DW_FORM_sdata) *************** read_array_type (struct die_info *die, s *** 2788,2794 **** custom vendor extension. The main difference between a regular array and the vector variant is that vectors are passed by value to functions. */ ! attr = dwarf_attr (die, DW_AT_GNU_vector); if (attr) TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR; --- 2830,2836 ---- custom vendor extension. The main difference between a regular array and the vector variant is that vectors are passed by value to functions. */ ! attr = dwarf_attr (die, DW_AT_GNU_vector, cu_header); if (attr) TYPE_FLAGS (type) |= TYPE_FLAG_VECTOR; *************** read_common_block (struct die_info *die, *** 2809,2815 **** struct symbol *sym; CORE_ADDR base = (CORE_ADDR) 0; ! attr = dwarf_attr (die, DW_AT_location); if (attr) { base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); --- 2851,2857 ---- struct symbol *sym; CORE_ADDR base = (CORE_ADDR) 0; ! attr = dwarf_attr (die, DW_AT_location, cu_header); if (attr) { base = decode_locdesc (DW_BLOCK (attr), objfile, cu_header); *************** read_common_block (struct die_info *die, *** 2820,2826 **** while (child_die && child_die->tag) { sym = new_symbol (child_die, NULL, objfile, cu_header); ! attr = dwarf_attr (child_die, DW_AT_data_member_location); if (attr) { SYMBOL_VALUE_ADDRESS (sym) = --- 2862,2868 ---- while (child_die && child_die->tag) { sym = new_symbol (child_die, NULL, objfile, cu_header); ! attr = dwarf_attr (child_die, DW_AT_data_member_location, cu_header); if (attr) { SYMBOL_VALUE_ADDRESS (sym) = *************** read_tag_pointer_type (struct die_info * *** 2848,2854 **** } type = lookup_pointer_type (die_type (die, objfile, cu_header)); ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); --- 2890,2896 ---- } type = lookup_pointer_type (die_type (die, objfile, cu_header)); ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); *************** read_tag_reference_type (struct die_info *** 2900,2906 **** } type = lookup_reference_type (die_type (die, objfile, cu_header)); ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); --- 2942,2948 ---- } type = lookup_reference_type (die_type (die, objfile, cu_header)); ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { TYPE_LENGTH (type) = DW_UNSND (attr); *************** read_tag_volatile_type (struct die_info *** 2948,2954 **** attribute to reference it. */ static void ! read_tag_string_type (struct die_info *die, struct objfile *objfile) { struct type *type, *range_type, *index_type, *char_type; struct attribute *attr; --- 2990,2997 ---- attribute to reference it. */ static void ! read_tag_string_type (struct die_info *die, struct objfile *objfile, ! const struct comp_unit_head *cu_header) { struct type *type, *range_type, *index_type, *char_type; struct attribute *attr; *************** read_tag_string_type (struct die_info *d *** 2959,2965 **** return; } ! attr = dwarf_attr (die, DW_AT_string_length); if (attr) { length = DW_UNSND (attr); --- 3002,3008 ---- return; } ! attr = dwarf_attr (die, DW_AT_string_length, cu_header); if (attr) { length = DW_UNSND (attr); *************** read_tag_string_type (struct die_info *d *** 2967,2973 **** else { /* check for the DW_AT_byte_size attribute */ ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { length = DW_UNSND (attr); --- 3010,3016 ---- else { /* check for the DW_AT_byte_size attribute */ ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { length = DW_UNSND (attr); *************** read_subroutine_type (struct die_info *d *** 3021,3027 **** ftype = lookup_function_type (type); /* All functions in C++ have prototypes. */ ! attr = dwarf_attr (die, DW_AT_prototyped); if ((attr && (DW_UNSND (attr) != 0)) || cu_language == language_cplus) TYPE_FLAGS (ftype) |= TYPE_FLAG_PROTOTYPED; --- 3064,3070 ---- ftype = lookup_function_type (type); /* All functions in C++ have prototypes. */ ! attr = dwarf_attr (die, DW_AT_prototyped, cu_header); if ((attr && (DW_UNSND (attr) != 0)) || cu_language == language_cplus) TYPE_FLAGS (ftype) |= TYPE_FLAG_PROTOTYPED; *************** read_subroutine_type (struct die_info *d *** 3060,3066 **** parameter for non-static member functions (which is the this pointer) as artificial. We pass this information to dwarf2_add_member_fn via TYPE_FIELD_ARTIFICIAL. */ ! attr = dwarf_attr (child_die, DW_AT_artificial); if (attr) TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr); else --- 3103,3109 ---- parameter for non-static member functions (which is the this pointer) as artificial. We pass this information to dwarf2_add_member_fn via TYPE_FIELD_ARTIFICIAL. */ ! attr = dwarf_attr (child_die, DW_AT_artificial, cu_header); if (attr) TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr); else *************** read_typedef (struct die_info *die, stru *** 3085,3091 **** if (!die->type) { ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) { name = DW_STRING (attr); --- 3128,3134 ---- if (!die->type) { ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) { name = DW_STRING (attr); *************** read_typedef (struct die_info *die, stru *** 3099,3105 **** it in the TYPE field of the die. */ static void ! read_base_type (struct die_info *die, struct objfile *objfile) { struct type *type; struct attribute *attr; --- 3142,3149 ---- it in the TYPE field of the die. */ static void ! read_base_type (struct die_info *die, struct objfile *objfile, ! const struct comp_unit_head *cu_header) { struct type *type; struct attribute *attr; *************** read_base_type (struct die_info *die, st *** 3111,3127 **** return; } ! attr = dwarf_attr (die, DW_AT_encoding); if (attr) { encoding = DW_UNSND (attr); } ! attr = dwarf_attr (die, DW_AT_byte_size); if (attr) { size = DW_UNSND (attr); } ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) { enum type_code code = TYPE_CODE_INT; --- 3155,3171 ---- return; } ! attr = dwarf_attr (die, DW_AT_encoding, cu_header); if (attr) { encoding = DW_UNSND (attr); } ! attr = dwarf_attr (die, DW_AT_byte_size, cu_header); if (attr) { size = DW_UNSND (attr); } ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) { enum type_code code = TYPE_CODE_INT; *************** read_comp_unit (char *info_ptr, bfd *abf *** 3227,3232 **** --- 3271,3416 ---- return first_die; } + /* Register a cu_header, by making a copy of the header and then + adding it to the cu_header list. */ + static void + register_cu_header (const struct comp_unit_head *cu_header) + { + struct comp_unit_head *head; + + head = xmalloc (sizeof (struct comp_unit_head)); + memcpy (head, cu_header, sizeof (struct comp_unit_head)); + + head->next = first_cu_header; + first_cu_header = head; + } + + /* Attempt to find matching cu_header from given offset */ + static struct comp_unit_head * + find_cu_header_from_begin_offset (char *begin_offset) + { + struct comp_unit_head *cu_header; + + for (cu_header = first_cu_header; + cu_header != NULL; + cu_header = cu_header->next) + { + if (begin_offset == cu_header->begin_offset) + { + return cu_header; + } + } + + /* Failed to find cu_header at the given offset. */ + return NULL; + } + + /* Attempt to find matching cu_header from given offset + within the cu_header range. */ + static struct comp_unit_head * + find_cu_header (unsigned int offset) + { + struct comp_unit_head *cu_header; + + for (cu_header = first_cu_header; + cu_header != NULL; + cu_header = cu_header->next) + { + if (offset >= cu_header->offset + && offset < cu_header->offset + cu_header->length) + { + return cu_header; + } + } + + /* Failed to find in cu_header range the given offset. */ + return NULL; + } + + static struct die_info * + find_die_ref (unsigned int target_offset, bfd *abfd, + const struct comp_unit_head *cu_header) + { + struct die_info *die, *target_die; + char *cur_ptr; + int nesting_level; + + cur_ptr = cu_header->base_offset; + nesting_level = 0; + target_die = NULL; + do + { + cur_ptr = read_full_die (&die, abfd, cur_ptr, cu_header); + + if (die->has_children) + { + nesting_level++; + } + if (die->tag == 0) + { + nesting_level--; + } + + die->next = NULL; + + /* Enter die in reference hash table */ + store_in_ref_table (die->offset, die); + + if (die->offset == target_offset) + { + /* Found the requested die */ + target_die = die; + } + } + while (nesting_level > 0); + + return target_die; + } + + static struct die_info * + build_die_ref (struct attribute *attr, struct objfile *objfile, + const struct comp_unit_head *base_cu_header) + { + struct comp_unit_head *cu_header = NULL; + struct die_info *die_ref = NULL; + unsigned int offset = 0; + + /* Get the offset */ + offset = dwarf2_get_ref_die_offset (attr, base_cu_header); + + /* If not a DW_FORM_ref_addr, use current settings to return + the offset */ + if (attr->form != DW_FORM_ref_addr) + { + return follow_die_ref (offset); + } + + /* Check whether die has been constructed before */ + die_ref = follow_die_ref (offset); + + if (die_ref != NULL && die_ref->type != NULL) + { + return die_ref; + } + + /* Find the appropriate cu_header */ + cu_header = find_cu_header (offset); + + /* Find the correct die */ + die_ref = find_die_ref (offset, objfile->obfd, cu_header); + + /* Make sure that the cu_header has its dwarf abbreviation table */ + if (cu_header->dwarf2_abbrevs == NULL) + { + error ("No DWARF abbreviation table for comp unit header"); + } + + /* Construct the die's type */ + die_type (die_ref, objfile, cu_header); + + return die_ref; + } + /* Free a linked list of dies. */ static void *************** make_cleanup_free_die_list (struct die_i *** 3256,3261 **** --- 3440,3464 ---- return make_cleanup (do_free_die_list_cleanup, dies); } + /* Free linked list of cu_headers */ + static void + free_cu_header_list (void) + { + struct comp_unit_head *head = first_cu_header; + struct comp_unit_head *thead; + + while (head != NULL) + { + thead = head; + head = head->next; + + /* empty the abbrev table */ + dwarf2_empty_abbrev_table (thead); + xfree (thead); + } + + first_cu_header = NULL; + } /* Read the contents of the section at OFFSET and of size SIZE from the object file specified by OBJFILE into the psymbol_obstack and return it. */ *************** dwarf2_read_section (struct objfile *obj *** 3287,3306 **** in a hash table. */ static void ! dwarf2_read_abbrevs (bfd *abfd, unsigned int offset) { char *abbrev_ptr; struct abbrev_info *cur_abbrev; unsigned int abbrev_number, bytes_read, abbrev_name; unsigned int abbrev_form, hash_number; ! /* empty the table */ ! dwarf2_empty_abbrev_table (NULL); ! ! abbrev_ptr = dwarf_abbrev_buffer + offset; abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; /* loop until we reach an abbrev number of 0 */ while (abbrev_number) { --- 3490,3510 ---- in a hash table. */ static void ! dwarf2_read_abbrevs (bfd *abfd, struct comp_unit_head *cu_header) { char *abbrev_ptr; struct abbrev_info *cur_abbrev; unsigned int abbrev_number, bytes_read, abbrev_name; unsigned int abbrev_form, hash_number; ! abbrev_ptr = dwarf_abbrev_buffer + cu_header->abbrev_offset; abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; + /* Initialize dwarf2 abbrevs */ + memset (cu_header->dwarf2_abbrevs, 0, + ABBREV_HASH_SIZE*sizeof (struct abbrev_info *)); + /* loop until we reach an abbrev number of 0 */ while (abbrev_number) { *************** dwarf2_read_abbrevs (bfd *abfd, unsigned *** 3336,3343 **** } hash_number = abbrev_number % ABBREV_HASH_SIZE; ! cur_abbrev->next = dwarf2_abbrevs[hash_number]; ! dwarf2_abbrevs[hash_number] = cur_abbrev; /* Get next abbreviation. Under Irix6 the abbreviations for a compilation unit are not --- 3540,3547 ---- } hash_number = abbrev_number % ABBREV_HASH_SIZE; ! cur_abbrev->next = cu_header->dwarf2_abbrevs[hash_number]; ! cu_header->dwarf2_abbrevs[hash_number] = cur_abbrev; /* Get next abbreviation. Under Irix6 the abbreviations for a compilation unit are not *************** dwarf2_read_abbrevs (bfd *abfd, unsigned *** 3351,3358 **** break; abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; ! if (dwarf2_lookup_abbrev (abbrev_number) != NULL) ! break; } } --- 3555,3565 ---- break; abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; ! if (dwarf2_lookup_abbrev (abbrev_number, cu_header) != NULL) ! { ! /* Could not find abbrev just created */ ! break; ! } } } *************** dwarf2_read_abbrevs (bfd *abfd, unsigned *** 3360,3366 **** /* ARGSUSED */ static void ! dwarf2_empty_abbrev_table (PTR ignore) { int i; struct abbrev_info *abbrev, *next; --- 3567,3573 ---- /* ARGSUSED */ static void ! dwarf2_empty_abbrev_table (struct comp_unit_head *cu_header) { int i; struct abbrev_info *abbrev, *next; *************** dwarf2_empty_abbrev_table (PTR ignore) *** 3368,3374 **** for (i = 0; i < ABBREV_HASH_SIZE; ++i) { next = NULL; ! abbrev = dwarf2_abbrevs[i]; while (abbrev) { next = abbrev->next; --- 3575,3581 ---- for (i = 0; i < ABBREV_HASH_SIZE; ++i) { next = NULL; ! abbrev = cu_header->dwarf2_abbrevs[i]; while (abbrev) { next = abbrev->next; *************** dwarf2_empty_abbrev_table (PTR ignore) *** 3376,3395 **** xfree (abbrev); abbrev = next; } ! dwarf2_abbrevs[i] = NULL; } } /* Lookup an abbrev_info structure in the abbrev hash table. */ static struct abbrev_info * ! dwarf2_lookup_abbrev (unsigned int number) { unsigned int hash_number; struct abbrev_info *abbrev; hash_number = number % ABBREV_HASH_SIZE; ! abbrev = dwarf2_abbrevs[hash_number]; while (abbrev) { --- 3583,3603 ---- xfree (abbrev); abbrev = next; } ! cu_header->dwarf2_abbrevs[i] = NULL; } } /* Lookup an abbrev_info structure in the abbrev hash table. */ static struct abbrev_info * ! dwarf2_lookup_abbrev (unsigned int number, ! const struct comp_unit_head *cu_header) { unsigned int hash_number; struct abbrev_info *abbrev; hash_number = number % ABBREV_HASH_SIZE; ! abbrev = cu_header->dwarf2_abbrevs[hash_number]; while (abbrev) { *************** read_partial_die (struct partial_die_inf *** 3421,3427 **** if (!abbrev_number) return info_ptr; ! abbrev = dwarf2_lookup_abbrev (abbrev_number); if (!abbrev) { error ("Dwarf Error: Could not find abbrev number %d.", abbrev_number); --- 3629,3635 ---- if (!abbrev_number) return info_ptr; ! abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header); if (!abbrev) { error ("Dwarf Error: Could not find abbrev number %d.", abbrev_number); *************** read_partial_die (struct partial_die_inf *** 3484,3490 **** complain (&dwarf2_absolute_sibling_complaint); else part_die->sibling = ! dwarf_info_buffer + dwarf2_get_ref_die_offset (&attr); break; default: break; --- 3692,3698 ---- complain (&dwarf2_absolute_sibling_complaint); else part_die->sibling = ! dwarf_info_buffer + dwarf2_get_ref_die_offset (&attr, cu_header); break; default: break; *************** read_partial_die (struct partial_die_inf *** 3500,3506 **** char *spec_ptr; int dummy; ! spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr); read_partial_die (&spec_die, abfd, spec_ptr, cu_header); if (spec_die.name) { --- 3708,3715 ---- char *spec_ptr; int dummy; ! spec_ptr = dwarf_info_buffer + dwarf2_get_ref_die_offset (&spec_attr, ! cu_header); read_partial_die (&spec_die, abfd, spec_ptr, cu_header); if (spec_die.name) { *************** read_full_die (struct die_info **diep, b *** 3552,3558 **** return info_ptr; } ! abbrev = dwarf2_lookup_abbrev (abbrev_number); if (!abbrev) { error ("Dwarf Error: could not find abbrev number %d.", abbrev_number); --- 3761,3767 ---- return info_ptr; } ! abbrev = dwarf2_lookup_abbrev (abbrev_number, cu_header); if (!abbrev) { error ("Dwarf Error: could not find abbrev number %d.", abbrev_number); *************** set_cu_language (unsigned int lang) *** 4031,4037 **** /* Return the named attribute or NULL if not there. */ static struct attribute * ! dwarf_attr (struct die_info *die, unsigned int name) { unsigned int i; struct attribute *spec = NULL; --- 4240,4247 ---- /* Return the named attribute or NULL if not there. */ static struct attribute * ! dwarf_attr (struct die_info *die, unsigned int name, ! const struct comp_unit_head *cu_header) { unsigned int i; struct attribute *spec = NULL; *************** dwarf_attr (struct die_info *die, unsign *** 4049,4071 **** if (spec) { struct die_info *ref_die = ! follow_die_ref (dwarf2_get_ref_die_offset (spec)); if (ref_die) ! return dwarf_attr (ref_die, name); } return NULL; } static int ! die_is_declaration (struct die_info *die) { ! return (dwarf_attr (die, DW_AT_declaration) ! && ! dwarf_attr (die, DW_AT_specification)); } - /* Free the line_header structure *LH, and any arrays and strings it refers to. */ static void --- 4259,4281 ---- if (spec) { struct die_info *ref_die = ! follow_die_ref (dwarf2_get_ref_die_offset (spec, cu_header)); if (ref_die) ! return dwarf_attr (ref_die, name, cu_header); } return NULL; } static int ! die_is_declaration (struct die_info *die, ! const struct comp_unit_head *cu_header) { ! return (dwarf_attr (die, DW_AT_declaration, cu_header) ! && ! dwarf_attr (die, DW_AT_specification, cu_header)); } /* Free the line_header structure *LH, and any arrays and strings it refers to. */ static void *************** new_symbol (struct die_info *die, struct *** 4524,4530 **** struct attribute *attr2 = NULL; CORE_ADDR addr; ! name = dwarf2_linkage_name (die); if (name) { sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, --- 4734,4740 ---- struct attribute *attr2 = NULL; CORE_ADDR addr; ! name = dwarf2_linkage_name (die, cu_header); if (name) { sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, *************** new_symbol (struct die_info *die, struct *** 4542,4548 **** SYMBOL_TYPE (sym) = type; else SYMBOL_TYPE (sym) = die_type (die, objfile, cu_header); ! attr = dwarf_attr (die, DW_AT_decl_line); if (attr) { SYMBOL_LINE (sym) = DW_UNSND (attr); --- 4752,4758 ---- SYMBOL_TYPE (sym) = type; else SYMBOL_TYPE (sym) = die_type (die, objfile, cu_header); ! attr = dwarf_attr (die, DW_AT_decl_line, cu_header); if (attr) { SYMBOL_LINE (sym) = DW_UNSND (attr); *************** new_symbol (struct die_info *die, struct *** 4559,4565 **** switch (die->tag) { case DW_TAG_label: ! attr = dwarf_attr (die, DW_AT_low_pc); if (attr) { SYMBOL_VALUE_ADDRESS (sym) = DW_ADDR (attr) + baseaddr; --- 4769,4775 ---- switch (die->tag) { case DW_TAG_label: ! attr = dwarf_attr (die, DW_AT_low_pc, cu_header); if (attr) { SYMBOL_VALUE_ADDRESS (sym) = DW_ADDR (attr) + baseaddr; *************** new_symbol (struct die_info *die, struct *** 4570,4576 **** /* SYMBOL_BLOCK_VALUE (sym) will be filled in later by finish_block. */ SYMBOL_CLASS (sym) = LOC_BLOCK; ! attr2 = dwarf_attr (die, DW_AT_external); if (attr2 && (DW_UNSND (attr2) != 0)) { add_symbol_to_list (sym, &global_symbols); --- 4780,4786 ---- /* SYMBOL_BLOCK_VALUE (sym) will be filled in later by finish_block. */ SYMBOL_CLASS (sym) = LOC_BLOCK; ! attr2 = dwarf_attr (die, DW_AT_external, cu_header); if (attr2 && (DW_UNSND (attr2) != 0)) { add_symbol_to_list (sym, &global_symbols); *************** new_symbol (struct die_info *die, struct *** 4589,4609 **** TARGET_INT_BIT / HOST_CHAR_BIT, 0, "", objfile); ! attr = dwarf_attr (die, DW_AT_const_value); if (attr) { dwarf2_const_value (attr, sym, objfile, cu_header); ! attr2 = dwarf_attr (die, DW_AT_external); if (attr2 && (DW_UNSND (attr2) != 0)) add_symbol_to_list (sym, &global_symbols); else add_symbol_to_list (sym, list_in_scope); break; } ! attr = dwarf_attr (die, DW_AT_location); if (attr) { ! attr2 = dwarf_attr (die, DW_AT_external); if (attr2 && (DW_UNSND (attr2) != 0)) { SYMBOL_VALUE_ADDRESS (sym) = --- 4799,4819 ---- TARGET_INT_BIT / HOST_CHAR_BIT, 0, "", objfile); ! attr = dwarf_attr (die, DW_AT_const_value, cu_header); if (attr) { dwarf2_const_value (attr, sym, objfile, cu_header); ! attr2 = dwarf_attr (die, DW_AT_external, cu_header); if (attr2 && (DW_UNSND (attr2) != 0)) add_symbol_to_list (sym, &global_symbols); else add_symbol_to_list (sym, list_in_scope); break; } ! attr = dwarf_attr (die, DW_AT_location, cu_header); if (attr) { ! attr2 = dwarf_attr (die, DW_AT_external, cu_header); if (attr2 && (DW_UNSND (attr2) != 0)) { SYMBOL_VALUE_ADDRESS (sym) = *************** new_symbol (struct die_info *die, struct *** 4670,4678 **** The address of the variable will then be determined from the minimal symbol table whenever the variable is referenced. */ ! attr2 = dwarf_attr (die, DW_AT_external); if (attr2 && (DW_UNSND (attr2) != 0) ! && dwarf_attr (die, DW_AT_type) != NULL) { SYMBOL_CLASS (sym) = LOC_UNRESOLVED; add_symbol_to_list (sym, &global_symbols); --- 4880,4888 ---- The address of the variable will then be determined from the minimal symbol table whenever the variable is referenced. */ ! attr2 = dwarf_attr (die, DW_AT_external, cu_header); if (attr2 && (DW_UNSND (attr2) != 0) ! && dwarf_attr (die, DW_AT_type, cu_header) != NULL) { SYMBOL_CLASS (sym) = LOC_UNRESOLVED; add_symbol_to_list (sym, &global_symbols); *************** new_symbol (struct die_info *die, struct *** 4680,4686 **** } break; case DW_TAG_formal_parameter: ! attr = dwarf_attr (die, DW_AT_location); if (attr) { SYMBOL_VALUE (sym) = --- 4890,4896 ---- } break; case DW_TAG_formal_parameter: ! attr = dwarf_attr (die, DW_AT_location, cu_header); if (attr) { SYMBOL_VALUE (sym) = *************** new_symbol (struct die_info *die, struct *** 4710,4716 **** SYMBOL_CLASS (sym) = LOC_ARG; } } ! attr = dwarf_attr (die, DW_AT_const_value); if (attr) { dwarf2_const_value (attr, sym, objfile, cu_header); --- 4920,4926 ---- SYMBOL_CLASS (sym) = LOC_ARG; } } ! attr = dwarf_attr (die, DW_AT_const_value, cu_header); if (attr) { dwarf2_const_value (attr, sym, objfile, cu_header); *************** new_symbol (struct die_info *die, struct *** 4755,4761 **** add_symbol_to_list (sym, list_in_scope); break; case DW_TAG_enumerator: ! attr = dwarf_attr (die, DW_AT_const_value); if (attr) { dwarf2_const_value (attr, sym, objfile, cu_header); --- 4965,4971 ---- add_symbol_to_list (sym, list_in_scope); break; case DW_TAG_enumerator: ! attr = dwarf_attr (die, DW_AT_const_value, cu_header); if (attr) { dwarf2_const_value (attr, sym, objfile, cu_header); *************** die_type (struct die_info *die, struct o *** 4880,4886 **** struct die_info *type_die; unsigned int ref; ! type_attr = dwarf_attr (die, DW_AT_type); if (!type_attr) { /* A missing DW_AT_type represents a void type. */ --- 5090,5096 ---- struct die_info *type_die; unsigned int ref; ! type_attr = dwarf_attr (die, DW_AT_type, cu_header); if (!type_attr) { /* A missing DW_AT_type represents a void type. */ *************** die_type (struct die_info *die, struct o *** 4888,4899 **** } else { ! ref = dwarf2_get_ref_die_offset (type_attr); type_die = follow_die_ref (ref); if (!type_die) { ! error ("Dwarf Error: Cannot find referent at offset %d.", ref); ! return NULL; } } type = tag_type_to_type (type_die, objfile, cu_header); --- 5098,5115 ---- } else { ! ref = dwarf2_get_ref_die_offset (type_attr, cu_header); type_die = follow_die_ref (ref); if (!type_die) { ! /* Attempt to find the die in another comp unit */ ! type_die = build_die_ref (type_attr, objfile, cu_header); ! ! if (!type_die) ! { ! error ("Dwarf Error: Cannot find referent at offset %d.", ref); ! return NULL; ! } } } type = tag_type_to_type (type_die, objfile, cu_header); *************** die_containing_type (struct die_info *di *** 4917,4926 **** struct die_info *type_die = NULL; unsigned int ref; ! type_attr = dwarf_attr (die, DW_AT_containing_type); if (type_attr) { ! ref = dwarf2_get_ref_die_offset (type_attr); type_die = follow_die_ref (ref); if (!type_die) { --- 5133,5142 ---- struct die_info *type_die = NULL; unsigned int ref; ! type_attr = dwarf_attr (die, DW_AT_containing_type, cu_header); if (type_attr) { ! ref = dwarf2_get_ref_die_offset (type_attr, cu_header); type_die = follow_die_ref (ref); if (!type_die) { *************** read_type_die (struct die_info *die, str *** 5013,5025 **** read_tag_volatile_type (die, objfile, cu_header); break; case DW_TAG_string_type: ! read_tag_string_type (die, objfile); break; case DW_TAG_typedef: read_typedef (die, objfile, cu_header); break; case DW_TAG_base_type: ! read_base_type (die, objfile); break; default: complain (&dwarf2_unexpected_tag, dwarf_tag_name (die->tag)); --- 5229,5241 ---- read_tag_volatile_type (die, objfile, cu_header); break; case DW_TAG_string_type: ! read_tag_string_type (die, objfile, cu_header); break; case DW_TAG_typedef: read_typedef (die, objfile, cu_header); break; case DW_TAG_base_type: ! read_base_type (die, objfile, cu_header); break; default: complain (&dwarf2_unexpected_tag, dwarf_tag_name (die->tag)); *************** sibling_die (struct die_info *die) *** 5183,5196 **** /* Get linkage name of a die, return NULL if not found. */ static char * ! dwarf2_linkage_name (struct die_info *die) { struct attribute *attr; ! attr = dwarf_attr (die, DW_AT_MIPS_linkage_name); if (attr && DW_STRING (attr)) return DW_STRING (attr); ! attr = dwarf_attr (die, DW_AT_name); if (attr && DW_STRING (attr)) return DW_STRING (attr); return NULL; --- 5399,5413 ---- /* Get linkage name of a die, return NULL if not found. */ static char * ! dwarf2_linkage_name (struct die_info *die, ! const struct comp_unit_head *cu_header) { struct attribute *attr; ! attr = dwarf_attr (die, DW_AT_MIPS_linkage_name, cu_header); if (attr && DW_STRING (attr)) return DW_STRING (attr); ! attr = dwarf_attr (die, DW_AT_name, cu_header); if (attr && DW_STRING (attr)) return DW_STRING (attr); return NULL; *************** dwarf2_empty_hash_tables (void) *** 6043,6049 **** } static unsigned int ! dwarf2_get_ref_die_offset (struct attribute *attr) { unsigned int result = 0; --- 6260,6267 ---- } static unsigned int ! dwarf2_get_ref_die_offset (struct attribute *attr, ! const struct comp_unit_head *cu_header) { unsigned int result = 0; *************** dwarf2_get_ref_die_offset (struct attrib *** 6057,6063 **** case DW_FORM_ref4: case DW_FORM_ref8: case DW_FORM_ref_udata: ! result = cu_header_offset + DW_UNSND (attr); break; default: complain (&dwarf2_unsupported_die_ref_attr, dwarf_form_name (attr->form)); --- 6275,6281 ---- case DW_FORM_ref4: case DW_FORM_ref8: case DW_FORM_ref_udata: ! result = cu_header->offset + DW_UNSND (attr); break; default: complain (&dwarf2_unsupported_die_ref_attr, dwarf_form_name (attr->form)); Index: elfread.c =================================================================== RCS file: /cvs/src/src/gdb/elfread.c,v retrieving revision 1.22 diff -c -p -r1.22 elfread.c *** elfread.c 22 Jun 2002 00:05:59 -0000 1.22 --- elfread.c 3 Jul 2002 20:35:38 -0000 *************** *** 36,41 **** --- 36,42 ---- #include "demangle.h" extern void _initialize_elfread (void); + extern void dwarf_new_init (void); /* The struct elfinfo is available only during ELF symbol table and psymtab reading. It is destroyed at the completion of psymtab-reading. *************** elf_new_init (struct objfile *ignore) *** 664,669 **** --- 665,671 ---- { stabsread_new_init (); buildsym_new_init (); + dwarf_new_init (); } /* Perform any local cleanups required when we are done with a particular