This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Checked in as obvious. Sterling 2011-10-11 ?Sterling Augustine ?<saugustine@google.com> * dwarf2read.c: Undo inadvertent changes in previous commit. On Tue, Oct 11, 2011 at 4:23 PM, Keith Seitz <keiths@redhat.com> wrote: > On 10/11/2011 03:55 PM, David Miller wrote: >> >> The recent commit which claims to rearrange conditional logic >> in partial_die_parent_scope() does a lot of other things to >> dwarf2read.c > > $ cvs log dwarf2read.c > [snip] > revision 1.569 > date: 2011/10/11 19:19:07; ?author: sterling; ?state: Exp; ?lines: +52 -408 > gdb/ChangeLog > 2011-10-11 ?Sterling Augustine ?<saugustine@google.com> > > ? ? ? ?* dwarf2read.c (partial_die_parent_scope): Rearrange conditional > ? ? ? ?logic. > > gdb/testsuite/ChangeLog > 2011-10-11 ?Sterling Augustine ?<saugustine@google.com> > > ? ? ? ?* gdb.cp/Makefile.in: Add namespace-enum test. > ? ? ? ?* gdb.cp/namespace-enum.exp: New file. > ? ? ? ?* gdb.cp/namespace-enum.c: New file. > ? ? ? ?* gdb.cp/namespace-enum-main.c: New file. > [snip] > > $ cvs diff -r 1.568 -r 1.569 dwarf2read.c > Index: dwarf2read.c > =================================================================== > RCS file: /cvs/src/src/gdb/dwarf2read.c,v > retrieving revision 1.568 > retrieving revision 1.569 > diff -u -p -r1.568 -r1.569 > --- dwarf2read.c ? ? ? ?9 Oct 2011 19:34:18 -0000 ? ? ? 1.568 > +++ dwarf2read.c ? ? ? ?11 Oct 2011 19:19:07 -0000 ? ? ?1.569 > @@ -407,9 +407,6 @@ struct dwarf2_cu > ? ? ?after all type information has been read. ?*/ > ? VEC (delayed_method_info) *method_list; > > - ?/* To be copied to symtab->call_site_htab. ?*/ > - ?htab_t call_site_htab; > - > ? /* Mark used when releasing cached dies. ?*/ > ? unsigned int mark : 1; > > @@ -1082,8 +1079,6 @@ static void read_func_scope (struct die_ > > ?static void read_lexical_block_scope (struct die_info *, struct dwarf2_cu > *); > > -static void read_call_site_scope (struct die_info *die, struct dwarf2_cu > *cu); > - > ?static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct dwarf2_cu *, struct partial_symtab *); > > @@ -2655,21 +2650,7 @@ dw2_find_symbol_file (struct objfile *ob > > ? /* index_table is NULL if OBJF_READNOW. ?*/ > ? if (!dwarf2_per_objfile->index_table) > - ? ?{ > - ? ? ?struct symtab *s; > - > - ? ? ?ALL_OBJFILE_SYMTABS (objfile, s) > - ? ? ? if (s->primary) > - ? ? ? ? { > - ? ? ? ? ? struct blockvector *bv = BLOCKVECTOR (s); > - ? ? ? ? ? const struct block *block = BLOCKVECTOR_BLOCK (bv, > GLOBAL_BLOCK); > - ? ? ? ? ? struct symbol *sym = lookup_block_symbol (block, name, > VAR_DOMAIN); > - > - ? ? ? ? ? if (sym) > - ? ? ? ? ? ? return sym->symtab->filename; > - ? ? ? ? } > - ? ? ?return NULL; > - ? ?} > + ? ?return NULL; > > ? if (!find_slot_in_mapped_hash (dwarf2_per_objfile->index_table, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? name, &vec)) > @@ -3897,7 +3878,10 @@ partial_die_parent_scope (struct partial > ? ? ? return NULL; > ? ? } > > - ?if (parent->tag == DW_TAG_namespace > + ?if (pdi->tag == DW_TAG_enumerator) > + ? ?/* Enumerators should not get the name of the enumeration as a prefix. > ?*/ > + ? ?parent->scope = grandparent_scope; > + ?else if (parent->tag == DW_TAG_namespace > ? ? ? || parent->tag == DW_TAG_module > ? ? ? || parent->tag == DW_TAG_structure_type > ? ? ? || parent->tag == DW_TAG_class_type > @@ -3912,9 +3896,6 @@ partial_die_parent_scope (struct partial > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? grandparent_scope, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? parent->name, 0, cu); > ? ? } > - ?else if (parent->tag == DW_TAG_enumerator) > - ? ?/* Enumerators should not get the name of the enumeration as a prefix. > ?*/ > - ? ?parent->scope = grandparent_scope; > ? else > ? ? { > ? ? ? /* FIXME drow/2004-04-01: What should we be doing with > @@ -4804,8 +4785,6 @@ process_full_comp_unit (struct dwarf2_pe > > ? ? ? if (gcc_4_minor >= 5) > ? ? ? ?symtab->epilogue_unwind_valid = 1; > - > - ? ? ?symtab->call_site_htab = cu->call_site_htab; > ? ? } > > ? if (dwarf2_per_objfile->using_index) > @@ -4844,9 +4823,6 @@ process_die (struct die_info *die, struc > ? ? case DW_TAG_catch_block: > ? ? ? read_lexical_block_scope (die, cu); > ? ? ? break; > - ? ?case DW_TAG_GNU_call_site: > - ? ? ?read_call_site_scope (die, cu); > - ? ? ?break; > ? ? case DW_TAG_class_type: > ? ? case DW_TAG_interface_type: > ? ? case DW_TAG_structure_type: > @@ -6141,258 +6117,6 @@ read_lexical_block_scope (struct die_inf > ? using_directives = new->using_directives; > ?} > > -/* Read in DW_TAG_GNU_call_site and insert it to CU->call_site_htab. ?*/ > - > -static void > -read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) > -{ > - ?struct objfile *objfile = cu->objfile; > - ?struct gdbarch *gdbarch = get_objfile_arch (objfile); > - ?CORE_ADDR pc, baseaddr; > - ?struct attribute *attr; > - ?struct call_site *call_site, call_site_local; > - ?void **slot; > - ?int nparams; > - ?struct die_info *child_die; > - > - ?baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); > - > - ?attr = dwarf2_attr (die, DW_AT_low_pc, cu); > - ?if (!attr) > - ? ?{ > - ? ? ?complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ?_("missing DW_AT_low_pc for DW_TAG_GNU_call_site " > - ? ? ? ? ? ? ? ? ?"DIE 0x%x [in module %s]"), > - ? ? ? ? ? ? ? ?die->offset, cu->objfile->name); > - ? ? ?return; > - ? ?} > - ?pc = DW_ADDR (attr) + baseaddr; > - > - ?if (cu->call_site_htab == NULL) > - ? ?cu->call_site_htab = htab_create_alloc_ex (16, core_addr_hash, > core_addr_eq, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL, > &objfile->objfile_obstack, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hashtab_obstack_allocate, > NULL); > - ?call_site_local.pc = pc; > - ?slot = htab_find_slot (cu->call_site_htab, &call_site_local, INSERT); > - ?if (*slot != NULL) > - ? ?{ > - ? ? ?complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ?_("Duplicate PC %s for DW_TAG_GNU_call_site " > - ? ? ? ? ? ? ? ? ?"DIE 0x%x [in module %s]"), > - ? ? ? ? ? ? ? ?paddress (gdbarch, pc), die->offset, cu->objfile->name); > - ? ? ?return; > - ? ?} > - > - ?/* Count parameters at the caller. ?*/ > - > - ?nparams = 0; > - ?for (child_die = die->child; child_die && child_die->tag; > - ? ? ? child_die = sibling_die (child_die)) > - ? ?{ > - ? ? ?if (child_die->tag != DW_TAG_GNU_call_site_parameter) > - ? ? ? { > - ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ?_("Tag %d is not DW_TAG_GNU_call_site_parameter in " > - ? ? ? ? ? ? ? ? ? ? ?"DW_TAG_GNU_call_site child DIE 0x%x [in module > %s]"), > - ? ? ? ? ? ? ? ? ? ?child_die->tag, child_die->offset, cu->objfile->name); > - ? ? ? ? continue; > - ? ? ? } > - > - ? ? ?nparams++; > - ? ?} > - > - ?call_site = obstack_alloc (&objfile->objfile_obstack, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ?(sizeof (*call_site) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? + (sizeof (*call_site->parameter) > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* (nparams - 1)))); > - ?*slot = call_site; > - ?memset (call_site, 0, sizeof (*call_site) - sizeof > (*call_site->parameter)); > - ?call_site->pc = pc; > - > - ?if (dwarf2_flag_true_p (die, DW_AT_GNU_tail_call, cu)) > - ? ?{ > - ? ? ?struct die_info *func_die; > - > - ? ? ?/* Skip also over DW_TAG_inlined_subroutine. ?*/ > - ? ? ?for (func_die = die->parent; > - ? ? ? ? ?func_die && func_die->tag != DW_TAG_subprogram > - ? ? ? ? ?&& func_die->tag != DW_TAG_subroutine_type; > - ? ? ? ? ?func_die = func_die->parent); > - > - ? ? ?/* DW_AT_GNU_all_call_sites is a superset > - ? ? ? ?of DW_AT_GNU_all_tail_call_sites. ?*/ > - ? ? ?if (func_die > - ? ? ? ? ?&& !dwarf2_flag_true_p (func_die, DW_AT_GNU_all_call_sites, cu) > - ? ? ? ? && !dwarf2_flag_true_p (func_die, DW_AT_GNU_all_tail_call_sites, > cu)) > - ? ? ? { > - ? ? ? ? /* TYPE_TAIL_CALL_LIST is not interesting in functions where it is > - ? ? ? ? ? ?not complete. ?But keep CALL_SITE for look ups via > call_site_htab, > - ? ? ? ? ? ?both the initial caller containing the real return address PC > and > - ? ? ? ? ? ?the final callee containing the current PC of a chain of tail > - ? ? ? ? ? ?calls do not need to have the tail call list complete. ?But any > - ? ? ? ? ? ?function candidate for a virtual tail call frame searched via > - ? ? ? ? ? ?TYPE_TAIL_CALL_LIST must have the tail call list complete to be > - ? ? ? ? ? ?determined unambiguously. ?*/ > - ? ? ? } > - ? ? ?else > - ? ? ? { > - ? ? ? ? struct type *func_type = NULL; > - > - ? ? ? ? if (func_die) > - ? ? ? ? ? func_type = get_die_type (func_die, cu); > - ? ? ? ? if (func_type != NULL) > - ? ? ? ? ? { > - ? ? ? ? ? ? gdb_assert (TYPE_CODE (func_type) == TYPE_CODE_FUNC); > - > - ? ? ? ? ? ? /* Enlist this call site to the function. ?*/ > - ? ? ? ? ? ? call_site->tail_call_next = TYPE_TAIL_CALL_LIST (func_type); > - ? ? ? ? ? ? TYPE_TAIL_CALL_LIST (func_type) = call_site; > - ? ? ? ? ? } > - ? ? ? ? else > - ? ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ? ?_("Cannot find function owning DW_TAG_GNU_call_site " > - ? ? ? ? ? ? ? ? ? ? ? ?"DIE 0x%x [in module %s]"), > - ? ? ? ? ? ? ? ? ? ? ?die->offset, cu->objfile->name); > - ? ? ? } > - ? ?} > - > - ?attr = dwarf2_attr (die, DW_AT_GNU_call_site_target, cu); > - ?if (attr == NULL) > - ? ?attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); > - ?SET_FIELD_DWARF_BLOCK (call_site->target, NULL); > - ?if (!attr || (attr_form_is_block (attr) && DW_BLOCK (attr)->size == 0)) > - ? ?/* Keep NULL DWARF_BLOCK. ?*/; > - ?else if (attr_form_is_block (attr)) > - ? ?{ > - ? ? ?struct dwarf2_locexpr_baton *dlbaton; > - > - ? ? ?dlbaton = obstack_alloc (&objfile->objfile_obstack, sizeof > (*dlbaton)); > - ? ? ?dlbaton->data = DW_BLOCK (attr)->data; > - ? ? ?dlbaton->size = DW_BLOCK (attr)->size; > - ? ? ?dlbaton->per_cu = cu->per_cu; > - > - ? ? ?SET_FIELD_DWARF_BLOCK (call_site->target, dlbaton); > - ? ?} > - ?else if (is_ref_attr (attr)) > - ? ?{ > - ? ? ?struct objfile *objfile = cu->objfile; > - ? ? ?struct dwarf2_cu *target_cu = cu; > - ? ? ?struct die_info *target_die; > - > - ? ? ?target_die = follow_die_ref_or_sig (die, attr, &target_cu); > - ? ? ?gdb_assert (target_cu->objfile == objfile); > - ? ? ?if (die_is_declaration (target_die, target_cu)) > - ? ? ? { > - ? ? ? ? const char *target_physname; > - > - ? ? ? ? target_physname = dwarf2_physname (NULL, target_die, target_cu); > - ? ? ? ? if (target_physname == NULL) > - ? ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ? ?_("DW_AT_GNU_call_site_target target DIE has invalid > " > - ? ? ? ? ? ? ? ? ? ? ? ?"physname, for referencing DIE 0x%x [in module > %s]"), > - ? ? ? ? ? ? ? ? ? ? ?die->offset, cu->objfile->name); > - ? ? ? ? else > - ? ? ? ? ? SET_FIELD_PHYSNAME (call_site->target, (char *) > target_physname); > - ? ? ? } > - ? ? ?else > - ? ? ? { > - ? ? ? ? CORE_ADDR lowpc; > - > - ? ? ? ? /* DW_AT_entry_pc should be preferred. ?*/ > - ? ? ? ? if (!dwarf2_get_pc_bounds (target_die, &lowpc, NULL, target_cu, > NULL)) > - ? ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ? ?_("DW_AT_GNU_call_site_target target DIE has invalid > " > - ? ? ? ? ? ? ? ? ? ? ? ?"low pc, for referencing DIE 0x%x [in module %s]"), > - ? ? ? ? ? ? ? ? ? ? ?die->offset, cu->objfile->name); > - ? ? ? ? else > - ? ? ? ? ? SET_FIELD_PHYSADDR (call_site->target, lowpc + baseaddr); > - ? ? ? } > - ? ?} > - ?else > - ? ?complaint (&symfile_complaints, > - ? ? ? ? ? ? ?_("DW_TAG_GNU_call_site DW_AT_GNU_call_site_target is neither > " > - ? ? ? ? ? ? ? ?"block nor reference, for DIE 0x%x [in module %s]"), > - ? ? ? ? ? ? ?die->offset, cu->objfile->name); > - > - ?call_site->per_cu = cu->per_cu; > - > - ?for (child_die = die->child; > - ? ? ? child_die && child_die->tag; > - ? ? ? child_die = sibling_die (child_die)) > - ? ?{ > - ? ? ?struct dwarf2_locexpr_baton *dlbaton; > - ? ? ?struct call_site_parameter *parameter; > - > - ? ? ?if (child_die->tag != DW_TAG_GNU_call_site_parameter) > - ? ? ? { > - ? ? ? ? /* Already printed the complaint above. ?*/ > - ? ? ? ? continue; > - ? ? ? } > - > - ? ? ?gdb_assert (call_site->parameter_count < nparams); > - ? ? ?parameter = &call_site->parameter[call_site->parameter_count]; > - > - ? ? ?/* DW_AT_location specifies the register number. ?Value of the data > - ? ? ? ?assumed for the register is contained in DW_AT_GNU_call_site_value. > ?*/ > - > - ? ? ?attr = dwarf2_attr (child_die, DW_AT_location, cu); > - ? ? ?if (!attr || !attr_form_is_block (attr)) > - ? ? ? { > - ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ?_("No DW_FORM_block* DW_AT_location for " > - ? ? ? ? ? ? ? ? ? ? ?"DW_TAG_GNU_call_site child DIE 0x%x [in module > %s]"), > - ? ? ? ? ? ? ? ? ? ?child_die->offset, cu->objfile->name); > - ? ? ? ? continue; > - ? ? ? } > - ? ? ?parameter->dwarf_reg = dwarf_block_to_dwarf_reg (DW_BLOCK > (attr)->data, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&DW_BLOCK (attr)->data[DW_BLOCK > (attr)->size]); > - ? ? ?if (parameter->dwarf_reg == -1 > - ? ? ? ? && !dwarf_block_to_sp_offset (gdbarch, DW_BLOCK (attr)->data, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &DW_BLOCK (attr)->data[DW_BLOCK > (attr)->size], > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ¶meter->fb_offset)) > - ? ? ? { > - ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ?_("Only single DW_OP_reg or DW_OP_fbreg is supported " > - ? ? ? ? ? ? ? ? ? ? ?"for DW_FORM_block* DW_AT_location for " > - ? ? ? ? ? ? ? ? ? ? ?"DW_TAG_GNU_call_site child DIE 0x%x [in module > %s]"), > - ? ? ? ? ? ? ? ? ? ?child_die->offset, cu->objfile->name); > - ? ? ? ? continue; > - ? ? ? } > - > - ? ? ?attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_value, cu); > - ? ? ?if (!attr_form_is_block (attr)) > - ? ? ? { > - ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ?_("No DW_FORM_block* DW_AT_GNU_call_site_value for " > - ? ? ? ? ? ? ? ? ? ? ?"DW_TAG_GNU_call_site child DIE 0x%x [in module > %s]"), > - ? ? ? ? ? ? ? ? ? ?child_die->offset, cu->objfile->name); > - ? ? ? ? continue; > - ? ? ? } > - ? ? ?parameter->value = DW_BLOCK (attr)->data; > - ? ? ?parameter->value_size = DW_BLOCK (attr)->size; > - > - ? ? ?/* Parameters are not pre-cleared by memset above. ?*/ > - ? ? ?parameter->data_value = NULL; > - ? ? ?parameter->data_value_size = 0; > - ? ? ?call_site->parameter_count++; > - > - ? ? ?attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_data_value, cu); > - ? ? ?if (attr) > - ? ? ? { > - ? ? ? ? if (!attr_form_is_block (attr)) > - ? ? ? ? ? complaint (&symfile_complaints, > - ? ? ? ? ? ? ? ? ? ? ?_("No DW_FORM_block* DW_AT_GNU_call_site_data_value > for " > - ? ? ? ? ? ? ? ? ? ? ? ?"DW_TAG_GNU_call_site child DIE 0x%x [in module > %s]"), > - ? ? ? ? ? ? ? ? ? ? ?child_die->offset, cu->objfile->name); > - ? ? ? ? else > - ? ? ? ? ? { > - ? ? ? ? ? ? parameter->data_value = DW_BLOCK (attr)->data; > - ? ? ? ? ? ? parameter->data_value_size = DW_BLOCK (attr)->size; > - ? ? ? ? ? } > - ? ? ? } > - ? ?} > -} > - > ?/* Get low and high pc attributes from DW_AT_ranges attribute value OFFSET. > ? ?Return 1 if the attributes are present and valid, otherwise, return 0. > ? ?If RANGES_PST is not NULL we should setup `objfile->psymtabs_addrmap'. > ?*/ > @@ -6592,8 +6316,7 @@ dwarf2_get_pc_bounds (struct die_info *d > ? ? return 0; > > ? *lowpc = low; > - ?if (highpc) > - ? ?*highpc = high; > + ?*highpc = high; > ? return ret; > ?} > > @@ -10078,10 +9801,9 @@ fixup_partial_die (struct partial_die_in > ? /* GCC might emit a nameless struct or union that has a linkage > ? ? ?name. ?See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47510. ?*/ > ? if (part_die->name == NULL > - ? ? ?&& (part_die->tag == DW_TAG_class_type > - ? ? ? ? || part_die->tag == DW_TAG_interface_type > - ? ? ? ? || part_die->tag == DW_TAG_structure_type > - ? ? ? ? || part_die->tag == DW_TAG_union_type) > + ? ? ?&& (part_die->tag == DW_TAG_structure_type > + ? ? ? ? || part_die->tag == DW_TAG_union_type > + ? ? ? ? || part_die->tag == DW_TAG_class_type) > ? ? ? && part_die->linkage_name != NULL) > ? ? { > ? ? ? char *demangled; > @@ -10089,17 +9811,7 @@ fixup_partial_die (struct partial_die_in > ? ? ? demangled = cplus_demangle (part_die->linkage_name, DMGL_TYPES); > ? ? ? if (demangled) > ? ? ? ?{ > - ? ? ? ? const char *base; > - > - ? ? ? ? /* Strip any leading namespaces/classes, keep only the base name. > - ? ? ? ? ? ?DW_AT_name for named DIEs does not contain the prefixes. ?*/ > - ? ? ? ? base = strrchr (demangled, ':'); > - ? ? ? ? if (base && base > demangled && base[-1] == ':') > - ? ? ? ? ? base++; > - ? ? ? ? else > - ? ? ? ? ? base = demangled; > - > - ? ? ? ? part_die->name = obsavestring (base, strlen (base), > + ? ? ? ? part_die->name = obsavestring (demangled, strlen (demangled), > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &cu->objfile->objfile_obstack); > ? ? ? ? ?xfree (demangled); > ? ? ? ?} > @@ -12448,42 +12160,6 @@ guess_full_die_structure_name (struct di > ? return NULL; > ?} > > -/* GCC might emit a nameless typedef that has a linkage name. Determine the > - ? prefix part in such case. ?See > - ? http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47510. ?*/ > - > -static char * > -anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu) > -{ > - ?struct attribute *attr; > - ?char *base; > - > - ?if (die->tag != DW_TAG_class_type && die->tag != DW_TAG_interface_type > - ? ? ?&& die->tag != DW_TAG_structure_type && die->tag != > DW_TAG_union_type) > - ? ?return NULL; > - > - ?attr = dwarf2_attr (die, DW_AT_name, cu); > - ?if (attr != NULL && DW_STRING (attr) != NULL) > - ? ?return NULL; > - > - ?attr = dwarf2_attr (die, DW_AT_linkage_name, cu); > - ?if (attr == NULL) > - ? ?attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); > - ?if (attr == NULL || DW_STRING (attr) == NULL) > - ? ?return NULL; > - > - ?/* dwarf2_name had to be already called. ?*/ > - ?gdb_assert (DW_STRING_IS_CANONICAL (attr)); > - > - ?/* Strip the base name, keep any leading namespaces/classes. ?*/ > - ?base = strrchr (DW_STRING (attr), ':'); > - ?if (base == NULL || base == DW_STRING (attr) || base[-1] != ':') > - ? ?return ""; > - > - ?return obsavestring (DW_STRING (attr), &base[-1] - DW_STRING (attr), > - ? ? ? ? ? ? ? ? ? ? ?&cu->objfile->objfile_obstack); > -} > - > ?/* Return the name of the namespace/class that DIE is defined within, > ? ?or "" if we can't tell. ?The caller should not xfree the result. > > @@ -12505,16 +12181,11 @@ determine_prefix (struct die_info *die, > ? struct die_info *parent, *spec_die; > ? struct dwarf2_cu *spec_cu; > ? struct type *parent_type; > - ?char *retval; > > ? if (cu->language != language_cplus && cu->language != language_java > ? ? ? && cu->language != language_fortran) > ? ? return ""; > > - ?retval = anonymous_struct_prefix (die, cu); > - ?if (retval) > - ? ?return retval; > - > ? /* We have to be careful in the presence of DW_AT_specification. > ? ? ?For example, with GCC 3.4, given the code > > @@ -12806,21 +12477,12 @@ dwarf2_name (struct die_info *die, struc > > ? ? ? ? ?if (demangled) > ? ? ? ? ? ?{ > - ? ? ? ? ? ? char *base; > - > ? ? ? ? ? ? ?/* FIXME: we already did this for the partial symbol... */ > - ? ? ? ? ? ? DW_STRING (attr) = obsavestring (demangled, strlen > (demangled), > - > ?&cu->objfile->objfile_obstack); > + ? ? ? ? ? ? DW_STRING (attr) > + ? ? ? ? ? ? ? = obsavestring (demangled, strlen (demangled), > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &cu->objfile->objfile_obstack); > ? ? ? ? ? ? ?DW_STRING_IS_CANONICAL (attr) = 1; > ? ? ? ? ? ? ?xfree (demangled); > - > - ? ? ? ? ? ? /* Strip any leading namespaces/classes, keep only the base > name. > - ? ? ? ? ? ? ? ?DW_AT_name for named DIEs does not contain the prefixes. > ?*/ > - ? ? ? ? ? ? base = strrchr (DW_STRING (attr), ':'); > - ? ? ? ? ? ? if (base && base > DW_STRING (attr) && base[-1] == ':') > - ? ? ? ? ? ? ? return &base[1]; > - ? ? ? ? ? ? else > - ? ? ? ? ? ? ? return DW_STRING (attr); > ? ? ? ? ? ?} > ? ? ? ?} > ? ? ? break; > @@ -13004,8 +12666,6 @@ dwarf_tag_name (unsigned tag) > ? ? ? return "DW_TAG_PGI_kanji_type"; > ? ? case DW_TAG_PGI_interface_block: > ? ? ? return "DW_TAG_PGI_interface_block"; > - ? ?case DW_TAG_GNU_call_site: > - ? ? ?return "DW_TAG_GNU_call_site"; > ? ? default: > ? ? ? return "DW_TAG_<unknown>"; > ? ? } > @@ -14488,7 +14148,6 @@ decode_locdesc (struct dwarf_block *blk, > > ? ctx->gdbarch = get_objfile_arch (objfile); > ? ctx->addr_size = cu->header.addr_size; > - ?ctx->ref_addr_size = dwarf2_per_cu_ref_addr_size (cu->per_cu); > ? ctx->offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT > (objfile)); > ? ctx->baton = ctx; > ? ctx->funcs = &decode_locdesc_ctx_funcs; > @@ -15528,42 +15187,26 @@ dwarf2_per_cu_objfile (struct dwarf2_per > ? return objfile; > ?} > > -/* Return comp_unit_head for PER_CU, either already available in PER_CU->CU > - ? (CU_HEADERP is unused in such case) or prepare a temporary copy at > - ? CU_HEADERP first. ?*/ > - > -static const struct comp_unit_head * > -per_cu_header_read_in (struct comp_unit_head *cu_headerp, > - ? ? ? ? ? ? ? ? ? ? ?struct dwarf2_per_cu_data *per_cu) > -{ > - ?struct objfile *objfile; > - ?struct dwarf2_per_objfile *per_objfile; > - ?gdb_byte *info_ptr; > - > - ?if (per_cu->cu) > - ? ?return &per_cu->cu->header; > - > - ?objfile = per_cu->objfile; > - ?per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); > - ?info_ptr = per_objfile->info.buffer + per_cu->offset; > - > - ?memset (cu_headerp, 0, sizeof (*cu_headerp)); > - ?read_comp_unit_head (cu_headerp, info_ptr, objfile->obfd); > - > - ?return cu_headerp; > -} > - > ?/* Return the address size given in the compilation unit header for CU. ?*/ > > ?CORE_ADDR > ?dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *per_cu) > ?{ > - ?struct comp_unit_head cu_header_local; > - ?const struct comp_unit_head *cu_headerp; > - > - ?cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu); > - > - ?return cu_headerp->addr_size; > + ?if (per_cu->cu) > + ? ?return per_cu->cu->header.addr_size; > + ?else > + ? ?{ > + ? ? ?/* If the CU is not currently read in, we re-read its header. ?*/ > + ? ? ?struct objfile *objfile = per_cu->objfile; > + ? ? ?struct dwarf2_per_objfile *per_objfile > + ? ? ? = objfile_data (objfile, dwarf2_objfile_data_key); > + ? ? ?gdb_byte *info_ptr = per_objfile->info.buffer + per_cu->offset; > + ? ? ?struct comp_unit_head cu_header; > + > + ? ? ?memset (&cu_header, 0, sizeof cu_header); > + ? ? ?read_comp_unit_head (&cu_header, info_ptr, objfile->obfd); > + ? ? ?return cu_header.addr_size; > + ? ?} > ?} > > ?/* Return the offset size given in the compilation unit header for CU. ?*/ > @@ -15571,28 +15214,21 @@ dwarf2_per_cu_addr_size (struct dwarf2_p > ?int > ?dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *per_cu) > ?{ > - ?struct comp_unit_head cu_header_local; > - ?const struct comp_unit_head *cu_headerp; > - > - ?cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu); > - > - ?return cu_headerp->offset_size; > -} > - > -/* See its dwarf2loc.h declaration. ?*/ > - > -int > -dwarf2_per_cu_ref_addr_size (struct dwarf2_per_cu_data *per_cu) > -{ > - ?struct comp_unit_head cu_header_local; > - ?const struct comp_unit_head *cu_headerp; > - > - ?cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu); > - > - ?if (cu_headerp->version == 2) > - ? ?return cu_headerp->addr_size; > + ?if (per_cu->cu) > + ? ?return per_cu->cu->header.offset_size; > ? else > - ? ?return cu_headerp->offset_size; > + ? ?{ > + ? ? ?/* If the CU is not currently read in, we re-read its header. ?*/ > + ? ? ?struct objfile *objfile = per_cu->objfile; > + ? ? ?struct dwarf2_per_objfile *per_objfile > + ? ? ? = objfile_data (objfile, dwarf2_objfile_data_key); > + ? ? ?gdb_byte *info_ptr = per_objfile->info.buffer + per_cu->offset; > + ? ? ?struct comp_unit_head cu_header; > + > + ? ? ?memset (&cu_header, 0, sizeof cu_header); > + ? ? ?read_comp_unit_head (&cu_header, info_ptr, objfile->obfd); > + ? ? ?return cu_header.offset_size; > + ? ?} > ?} > > ?/* Return the text offset of the CU. ?The returned offset comes from > @@ -16691,6 +16327,14 @@ write_one_signatured_type (void **slot, > ? return 1; > ?} > > +/* A cleanup function for an htab_t. ?*/ > + > +static void > +cleanup_htab (void *arg) > +{ > + ?htab_delete (arg); > +} > + > ?/* Create an index file for OBJFILE in the directory DIR. ?*/ > > ?static void > @@ -16747,7 +16391,7 @@ write_psymtabs_to_index (struct objfile > > ? psyms_seen = htab_create_alloc (100, htab_hash_pointer, htab_eq_pointer, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL, xcalloc, xfree); > - ?make_cleanup_htab_delete (psyms_seen); > + ?make_cleanup (cleanup_htab, psyms_seen); > > ? /* While we're scanning CU's create a table that maps a psymtab pointer > ? ? ?(which is what addrmap records) to its index (which is what is recorded > @@ -16757,7 +16401,7 @@ write_psymtabs_to_index (struct objfile > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hash_psymtab_cu_index, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? eq_psymtab_cu_index, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NULL, xcalloc, xfree); > - ?make_cleanup_htab_delete (cu_index_htab); > + ?make_cleanup (cleanup_htab, cu_index_htab); > ? psymtab_cu_index_map = (struct psymtab_cu_index_map *) > ? ? xmalloc (sizeof (struct psymtab_cu_index_map) > ? ? ? ? ? ? * dwarf2_per_objfile->n_comp_units); >
Attachment:
fix-patch
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |