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]

Re: build broken by dwarf2read.c changes


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],
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &parameter->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]